git.fiddlerwoaroof.com
Raw Blame History
#!/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()