git.fiddlerwoaroof.com
Raw Blame History
#!/usr/bin/env python2
from __future__ import division
import argparse
import collections
import os

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()
    return expr,var,desc

def eval_line(expr,variables):
    return eval(expr, {}, variables)

def run_template(t, values):
    with open(t) as f:
        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' % (desc, var, res)

def get_template_info(t, verbose=False):
    with open(t) as f:
        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 args.template:
        template = '%s.tmpl' % os.path.join(args.td, args.template)

    if args.i:
        if template:
            get_template_info(template, args.v)
        else:
            print 'You must supply a template to get info about'
    elif args.template:
        try:
            run_template(template, 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]


if __name__ == '__main__':
    main()