git.fiddlerwoaroof.com
symbcalc.py
7b09e3ac
 #!/usr/bin/env python2
2add3e2a
 from __future__ import division
 import argparse
 import collections
 import os
03c89fec
 import sys
2add3e2a
 
 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()
03c89fec
     expr = expr.partition(' = ')[0]
2add3e2a
     return expr,var,desc
 
 def eval_line(expr,variables):
     return eval(expr, {}, variables)
 
03c89fec
 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)
2add3e2a
             else:
03c89fec
                 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)
2add3e2a
 
03c89fec
 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
2add3e2a
 
 
 
 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
03c89fec
     if len(sys.argv) > 1:
         if args.template:
             template = '%s.tmpl' % os.path.join(args.td, args.template)
2add3e2a
 
03c89fec
         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
2add3e2a
         else:
03c89fec
             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, [])
2add3e2a
 
 
 if __name__ == '__main__':
     main()