annotate makeitso/main.py @ 4:08a50935e941

add a directory for single-file templates
author Jeff Hammel <jhammel@mozilla.com>
date Wed, 10 Nov 2010 15:43:00 -0800
parents 8931be6d2c8a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 #!/usr/bin/env python
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2 """
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 filesystem template interpreter
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4 """
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6 import os
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7 import subprocess
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 import sys
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10 from optparse import OptionParser
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
11 from tempita import Template
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
13 def call(command, *args, **kw):
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 code = subprocess.call(command, *args, **kw)
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15 if code:
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
16 if isinstance(command, basestring):
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
17 cmdstr = command
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18 else:
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19 cmdstr = ' '.join(command)
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 raise SystemExit("Command `%s` exited with code %d" % (cmdstr, code))
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21
3
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
22 def get_missing(name_error):
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
23 """
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
24 This is a horrible hack because python doesn't do the proper thing
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
25 via eval and return the name of the variable; instead, it just gives
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
26 you a message:
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
27 >>> try:
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
28 ... eval('2*foo')
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
29 ... except Exception, e:
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
30 ... pass
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
31 """
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
32 message = name_error.args[0]
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
33 varname = message.split("'")[1]
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
34 return varname
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
35
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
36 def missing_variables(template, variables):
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
37 """return additional variables needed"""
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
38 vars = variables.copy()
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
39 missing = set([])
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
40 while True:
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
41 try:
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
42 template.substitute(**missing)
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
43 return missing
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
44 except NameError, e:
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
45 missed = get_missing(e)
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
46 missing.add(missed)
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
47 vars[missed] = ''
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
48
0
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
49 def template_variables(template):
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50 """return the variables needed for a template"""
3
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
51 return missing_variables(template, {})
0
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
52
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
53 def main(args=sys.argv[1:]):
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
54
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
55 # create option parser
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56 usage = '%prog [options]'
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 parser = OptionParser(usage, description=__doc__)
3
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
58 parser.add_option('--variables', dest='variables', action='store_true',
0
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59 help='print the variables in a template')
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
60 options, args = parser.parse_args(args)
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
61
3
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
62 if options.variables:
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
63 variables = template_variables() # TODO: pass template
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
64 return
8931be6d2c8a stub for getting missing variables
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
65
0
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
66 # template variables
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67 variables = {}
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68 _vars = []
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
69 _args = []
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
70 for arg in args:
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 if '=' in arg:
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 key, value = arg.split('=')
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73 variables[key] = value
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
74 else:
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75 _args.append(arg)
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
76 args = _args
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
77
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78 # get the content
2
825922315ce6 make shebang work
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
79 if args:
825922315ce6 make shebang work
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
80 for arg in args:
825922315ce6 make shebang work
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
81 content = file(arg).read()
825922315ce6 make shebang work
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
82 template = Template(content)
825922315ce6 make shebang work
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
83 print template.substitute(**variables)
825922315ce6 make shebang work
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
84 else:
825922315ce6 make shebang work
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
85 content = sys.stdin.read()
825922315ce6 make shebang work
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
86 template = Template(content)
825922315ce6 make shebang work
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
87 print template.substitute(**variables)
0
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
88
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
89 if __name__ == '__main__':
7a76836b50a7 initial (non-working) commit to makeitso
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
90 main()