Mercurial > hg > MakeItSo
comparison makeitso/makeitso.py @ 55:b087a14a664b
fix several issues involving variable interpolation
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Thu, 06 Jan 2011 14:15:19 -0800 |
parents | d3e1e5745f24 |
children | 728cae02a6ed |
comparison
equal
deleted
inserted
replaced
54:d3e1e5745f24 | 55:b087a14a664b |
---|---|
121 class ContentTemplate(tempita.Template): | 121 class ContentTemplate(tempita.Template): |
122 """MakeItSo's extension of tempita's Template class""" | 122 """MakeItSo's extension of tempita's Template class""" |
123 | 123 |
124 defaults = {'include': include} | 124 defaults = {'include': include} |
125 | 125 |
126 def __init__(self, content, name=None, interactive=True, **variables): | 126 def __init__(self, content, name=None, interactive=True, variables=None): |
127 | 127 |
128 # default variables | 128 # default variables |
129 self.defaults = self.__class__.defaults.copy() | 129 self.defaults = self.__class__.defaults.copy() |
130 self.defaults.update(variables) | 130 self.defaults.update(variables or {}) |
131 | 131 |
132 # TODO: automagically tell if the program is interactive or not | 132 # TODO: automagically tell if the program is interactive or not |
133 self.interactive = interactive | 133 self.interactive = interactive |
134 | 134 |
135 tempita.Template.__init__(self, content, name=name) | 135 tempita.Template.__init__(self, content, name=name) |
136 | 136 |
137 def missing(self, **variables): | 137 def missing(self, **variables): |
138 """return additional variables needed""" | 138 """return additional variables needed""" |
139 vars = variables.copy() | 139 vars = self.get_variables(**variables) |
140 missing = set([]) | 140 missing = set([]) |
141 while True: | 141 while True: |
142 try: | 142 try: |
143 tempita.Template.substitute(self, **vars) | 143 tempita.Template.substitute(self, **vars) |
144 return missing | 144 return missing |
190 | 190 |
191 | 191 |
192 class URITemplate(ContentTemplate): | 192 class URITemplate(ContentTemplate): |
193 """template for a file or URL""" | 193 """template for a file or URL""" |
194 | 194 |
195 def __init__(self, uri, output=None, interactive=True, **variables): | 195 def __init__(self, uri, output=None, interactive=True, variables=None): |
196 self.output = output or sys.stdout | 196 self.output = output or sys.stdout |
197 content = include(uri) | 197 content = include(uri) |
198 | 198 |
199 # remove makeitso shebang if it has one | 199 # remove makeitso shebang if it has one |
200 if shebang_re.match(content): | 200 if shebang_re.match(content): |
201 content = os.linesep.join(content.splitlines()[1:]) | 201 content = os.linesep.join(content.splitlines()[1:]) |
202 | 202 |
203 variables['here'] = parent_uri(uri) | 203 variables['here'] = parent_uri(uri) |
204 ContentTemplate.__init__(self, content, name=uri, | 204 ContentTemplate.__init__(self, content, name=uri, |
205 interactive=interactive, | 205 interactive=interactive, |
206 **variables) | 206 variables=variables) |
207 | 207 |
208 def substitute(self, **variables): | 208 def substitute(self, **variables): |
209 output = ContentTemplate.substitute(self, **variables) | 209 output = ContentTemplate.substitute(self, **variables) |
210 f = self.output | 210 f = self.output |
211 | 211 |
219 print >> f, output | 219 print >> f, output |
220 | 220 |
221 class DirectoryTemplate(ContentTemplate): | 221 class DirectoryTemplate(ContentTemplate): |
222 """template for a directory structure""" | 222 """template for a directory structure""" |
223 | 223 |
224 def __init__(self, directory, output=None, interactive=True, **variables): | 224 def __init__(self, directory, output=None, interactive=True, variables=None): |
225 """ | 225 """ |
226 - output : output directory; if None will render in place | 226 - output : output directory; if None will render in place |
227 """ | 227 """ |
228 assert os.path.isdir(directory) | 228 assert os.path.isdir(directory) |
229 self.name = directory | 229 self.name = directory |
231 self.output = output | 231 self.output = output |
232 if output is not None: | 232 if output is not None: |
233 if os.path.exists(output): | 233 if os.path.exists(output): |
234 assert os.path.isdir(output), "%s: Must be a directory" % self.name | 234 assert os.path.isdir(output), "%s: Must be a directory" % self.name |
235 self.defaults = ContentTemplate.defaults.copy() | 235 self.defaults = ContentTemplate.defaults.copy() |
236 self.defaults.update(variables) | 236 self.defaults.update(variables or {}) |
237 | 237 |
238 | 238 |
239 def missing(self, **variables): | 239 def missing(self, **variables): |
240 variables = variables.copy() | 240 vars = self.defaults.copy() |
241 vars.update(variables) | |
241 missing = set([]) | 242 missing = set([]) |
242 for dirpath, dirnames, filenames in os.walk(self.name): | 243 for dirpath, dirnames, filenames in os.walk(self.name): |
243 | 244 |
244 # find variables from directory names | 245 # find variables from directory names |
245 for d in dirnames: | 246 for d in dirnames: |
246 missed = ContentTemplate(d).missing(**variables) | 247 missed = ContentTemplate(d).missing(**vars) |
247 missing.update(missed) | 248 missing.update(missed) |
248 variables.update(dict([(i, '') for i in missed])) | 249 variables.update(dict([(i, '') for i in missed])) |
249 | 250 |
250 # find variables from files | 251 # find variables from files |
251 for f in filenames: | 252 for f in filenames: |
252 path = os.path.join(dirpath, f) | 253 path = os.path.join(dirpath, f) |
253 template = URITemplate(path, interactive=self.interactive) | 254 template = URITemplate(path, interactive=self.interactive) |
254 missed = template.missing(**variables) | 255 missed = template.missing(**vars) |
255 missing.update(missed) | 256 missing.update(missed) |
256 variables.update(dict([(i, '') for i in missed])) | 257 variables.update(dict([(i, '') for i in missed])) |
257 | 258 |
258 return missing | 259 return missing |
259 | 260 |
296 | 297 |
297 | 298 |
298 class PolyTemplate(ContentTemplate): | 299 class PolyTemplate(ContentTemplate): |
299 """template for several files/directories""" | 300 """template for several files/directories""" |
300 | 301 |
301 def __init__(self, templates, output=None, interactive=True, **variables): | 302 def __init__(self, templates, output=None, interactive=True, variables=None): |
302 | 303 |
303 assert templates, "No templates given!" | 304 assert templates, "No templates given!" |
304 | 305 |
305 self.interactive = interactive | 306 self.interactive = interactive |
306 self._templates = templates[:] | 307 self._templates = templates[:] |
307 self.templates = [] | 308 self.templates = [] |
308 self.output = output | 309 self.output = output |
309 for template in templates: | 310 for template in templates: |
310 # TODO: check if the template is a [e.g] PasteScript.template entry point | 311 # TODO: check if the template is a [e.g] PasteScript.template entry point |
311 if os.path.isdir(template): | 312 if os.path.isdir(template): |
312 self.templates.append(DirectoryTemplate(template, interactive=self.interactive, output=output, **variables)) | 313 self.templates.append(DirectoryTemplate(template, interactive=self.interactive, output=output, variables=variables)) |
313 else: | 314 else: |
314 self.templates.append(URITemplate(template, interactive=self.interactive, output=output, **variables)) | 315 self.templates.append(URITemplate(template, interactive=self.interactive, output=output, variables=variables)) |
315 | 316 |
316 def missing(self, **variables): | 317 def missing(self, **variables): |
317 vars = variables.copy() | 318 vars = variables.copy() |
318 missing = set([]) | 319 missing = set([]) |
319 for template in self.templates: | 320 for template in self.templates: |