Mercurial > hg > MakeItSo
comparison makeitso/template.py @ 44:6e08cca7d656
do API variable reading and stubbing a bit for control flow
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Tue, 04 Jan 2011 18:07:18 -0800 |
parents | 73dac34d2692 |
children | 728cae02a6ed |
comparison
equal
deleted
inserted
replaced
43:554f916cef13 | 44:6e08cca7d656 |
---|---|
5 import os | 5 import os |
6 import sys | 6 import sys |
7 from makeitso import ContentTemplate | 7 from makeitso import ContentTemplate |
8 from makeitso import PolyTemplate | 8 from makeitso import PolyTemplate |
9 | 9 |
10 class Undefined(object): | |
11 """marker class for variables""" | |
12 Undefined = Undefined() # singleton | |
13 | |
10 class Variable(object): | 14 class Variable(object): |
11 """variable object for MakeItSo templates""" | 15 """variable object for MakeItSo templates""" |
12 | 16 |
13 def __init__(self, name, default=None, description=None, | 17 def __init__(self, name, default=Undefined, description=None, |
14 cast=None): | 18 cast=None): |
15 self.name = name | 19 self.name = name |
16 self.default = default | 20 self.default = default |
17 self.description = description | 21 self.description = description |
18 | 22 |
54 vars = [] | 58 vars = [] |
55 | 59 |
56 # inspect the templates for more variables | 60 # inspect the templates for more variables |
57 look = False | 61 look = False |
58 | 62 |
59 def __init__(self, output=None, interactive=True, **variables): | 63 def __init__(self, output=None, interactive=True, usedefaults=False, **variables): |
64 """ | |
65 - output : output file or directory | |
66 - interactive : whether tointeractively get variables | |
67 - usedefaults : try to use the default values if not specified | |
68 """ | |
69 | |
60 assert self.templates | 70 assert self.templates |
61 self.output = output | 71 self.output = output |
62 self.interactive = interactive | 72 self.interactive = interactive |
63 self.location = os.path.dirnme(os.path.abspath(__file__)) | 73 self.location = os.path.dirnme(os.path.abspath(__file__)) |
64 self.defaults = variables.copy | 74 self.defaults = variables.copy |
75 | |
76 # make a dictionary of the variables | |
77 self.vardict = {} | |
78 for i in self.vars: | |
79 self.vardict[i.name] = i | |
65 | 80 |
66 # ensure all of these templates exist | 81 # ensure all of these templates exist |
67 for template in self.templates: | 82 for template in self.templates: |
68 if template.startswith('http://') or template.startswith('https://'): | 83 if template.startswith('http://') or template.startswith('https://'): |
69 continue | 84 continue |
71 path = template | 86 path = template |
72 else: | 87 else: |
73 path = os.path.join(self.location, template) | 88 path = os.path.join(self.location, template) |
74 assert os.path.exists(template) | 89 assert os.path.exists(template) |
75 | 90 |
91 def missing(self, **variables): | |
92 if self.look: | |
93 pass | |
94 else: | |
95 if self.usedefaults: | |
96 pass | |
97 | |
76 def pre(self, **variables): | 98 def pre(self, **variables): |
77 """do stuff before interpolation""" | 99 """do stuff before interpolation""" |
100 | |
101 def substitute(self, **variables): | |
102 """do the substitution""" | |
103 vars = self.get_variables(**variables) | |
104 self.pre(**variables) | |
105 self.check_missing(vars) | |
106 self.post(**variables) | |
78 | 107 |
79 def post(self, **variables): | 108 def post(self, **variables): |
80 """do stuff after interpolation""" | 109 """do stuff after interpolation""" |
81 | 110 |
111 def read_variables(self, variables): | |
112 """read variables from stdin""" | |
113 retval = {} | |
114 for i in variables: | |
115 if i in self.vardict: | |
116 self.vardict[i].read() | |
117 else: | |
118 retval.update(ContentTemplate.read_variables(self, (i,))) | |
119 return retval | |
82 | 120 |
83 class PasteScriptTemplate(MakeItSoTemplate): | 121 class PasteScriptTemplate(MakeItSoTemplate): |
84 """template for backwards compatability with PasteScript""" | 122 """template for backwards compatability with PasteScript""" |