#!/usr/bin/env python2 from __future__ import division import argparse import collections import os import sys def parse_line(line): line = line.split(':') if len(line) > 2: expr = line.pop().strip() var = line.pop().strip() desc = ':'.join(line).strip() else: expr = '' var = line.pop().strip() desc = ':'.join(line).strip() expr = expr.partition(' = ')[0] return expr,var,desc def eval_line(expr,variables): return eval(expr, {}, variables) def run_template(f, values): variables = {} for line in f: line = line.strip() if line == '': print;continue expr, var, desc = parse_line(line) if expr == '': if values != []: expr = values.pop(0) else: expr = raw_input('%s? ' % desc) res = variables[var] = eval_line(expr, variables) else: res = variables[var] = eval_line(expr, variables) print '%s: %s: %s = %s' % (desc, var, expr, res) def get_template_info(f, verbose=False): tmpl = f.read() variables = ' '.join(var for expr,var,desc in map(parse_line, tmpl.split('\n')) if expr == '' and var != '') print 'Template Usage: %s %s' % (os.path.basename(t).rpartition('.')[0], variables) if verbose: print print 'Template Source:' print tmpl def main(): template_dir = os.environ.get('SYMBCALC_TEMPLATES', 'templates') argparser = argparse.ArgumentParser() argparser.add_argument('--template-dir', dest='td', default=template_dir) argparser.add_argument('template', nargs='?') argparser.add_argument('values', nargs='*') argparser.add_argument('-i', action='store_true') argparser.add_argument('-v', action='store_true') args = argparser.parse_args() template = None if len(sys.argv) > 1: if args.template: template = '%s.tmpl' % os.path.join(args.td, args.template) if args.i: if template: with open(template) as file_: get_template_info(file_, args.v) else: print 'You must supply a template to get info about' elif args.template: try: with open(template) as file_: run_template(file_, args.values) except (KeyboardInterrupt, EOFError): pass else: print 'Available Templates:' print '---' for x in os.listdir(args.td): if not x.endswith('.tmpl'): continue print x.rpartition('.')[0] else: run_template(sys.stdin, []) if __name__ == '__main__': main()