Mercurial > hg > MakeItSo
comparison makeitso/makeitso.py @ 90:26b9c3bba04e
make the api for substitute() variables, output
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Mon, 10 Jan 2011 21:33:03 -0800 |
parents | e055447376ab |
children | d5da38fabdf7 |
comparison
equal
deleted
inserted
replaced
89:e055447376ab | 90:26b9c3bba04e |
---|---|
173 | 173 |
174 def substitute(self, **variables): | 174 def substitute(self, **variables): |
175 """interactive (for now) substitution""" | 175 """interactive (for now) substitution""" |
176 vars = self.get_variables(**variables) | 176 vars = self.get_variables(**variables) |
177 self.check_missing(vars) | 177 self.check_missing(vars) |
178 return self._substitute(**vars) | 178 return tempita.Template.substitute(self, **vars) |
179 | |
180 def _substitute(self, **variables): | |
181 return tempita.Template.substitute(self, **variables) | |
182 | 179 |
183 def read_variables(self, variables): | 180 def read_variables(self, variables): |
184 """read variables from stdin""" | 181 """read variables from stdin""" |
185 # TODO: variables should (optionally) be richer objects | 182 # TODO: variables should (optionally) be richer objects |
186 retval = {} | 183 retval = {} |
208 | 205 |
209 ContentTemplate.__init__(self, content, name=uri, | 206 ContentTemplate.__init__(self, content, name=uri, |
210 interactive=interactive, | 207 interactive=interactive, |
211 variables=variables) | 208 variables=variables) |
212 | 209 |
213 def substitute(self, output=None, **variables): | 210 def substitute(self, variables, output=None): |
214 content = ContentTemplate.substitute(self, **variables) | 211 content = ContentTemplate.substitute(self, **variables) |
212 | |
213 # write output | |
215 output = output or sys.stdout | 214 output = output or sys.stdout |
216 | |
217 if isinstance(output, basestring): | 215 if isinstance(output, basestring): |
218 path = output | 216 path = output |
219 if os.path.isdir(output): | 217 if os.path.isdir(output): |
220 path = os.path.join(path, basename(self.name)) | 218 path = os.path.join(path, basename(self.name)) |
221 f = file(path, 'w') | 219 f = file(path, 'w') |
263 missing.update(missed) | 261 missing.update(missed) |
264 variables.update(dict([(i, '') for i in missed])) | 262 variables.update(dict([(i, '') for i in missed])) |
265 | 263 |
266 # find variables from files | 264 # find variables from files |
267 for f in filenames: | 265 for f in filenames: |
266 missed = ContentTemplate(d).missing(**vars) | |
267 missing.update(missed) | |
268 variables.update(dict([(i, '') for i in missed])) | |
269 | |
268 path = os.path.join(dirpath, f) | 270 path = os.path.join(dirpath, f) |
269 template = URITemplate(path, interactive=self.interactive) | 271 template = URITemplate(path, interactive=self.interactive) |
270 missed = template.missing(**vars) | 272 missed = template.missing(**vars) |
271 missing.update(missed) | 273 missing.update(missed) |
272 variables.update(dict([(i, '') for i in missed])) | 274 variables.update(dict([(i, '') for i in missed])) |
273 | 275 |
274 return missing | 276 return missing |
275 | 277 |
276 def substitute(self, output, **variables): | 278 def substitute(self, variables, output): |
277 self.check_output(output) | 279 self.check_output(output) |
278 vars = self.get_variables(**variables) | 280 vars = self.get_variables(**variables) |
279 self.check_missing(vars) | 281 self.check_missing(vars) |
280 | 282 |
281 # TODO: do this with recursion instead of os.walk so that | 283 # TODO: do this with recursion instead of os.walk so that |
300 else: | 302 else: |
301 os.makedirs(target) | 303 os.makedirs(target) |
302 | 304 |
303 # interpolate files | 305 # interpolate files |
304 for filename in filenames: | 306 for filename in filenames: |
307 | |
308 # interpolate filenames | |
305 path = os.path.join(dirname, filename) | 309 path = os.path.join(dirname, filename) |
306 interpolated = ContentTemplate(path).substitute(**variables) | 310 interpolated = ContentTemplate(path).substitute(**variables) |
307 target = os.path.join(output, interpolated.split(self.name, 1)[-1].strip(os.path.sep)) | 311 target = os.path.join(output, interpolated.split(self.name, 1)[-1].strip(os.path.sep)) |
308 | 312 |
313 # interpolate their contents | |
309 if os.path.exists(target): | 314 if os.path.exists(target): |
310 # ensure its a directory | 315 # ensure its a directory |
311 # TODO: check this first before interpolation is in progress | |
312 assert os.path.isfile(target), "Can't substitute a file on top of a directory" | 316 assert os.path.isfile(target), "Can't substitute a file on top of a directory" |
313 template = URITemplate(path, interactive=False) | 317 template = URITemplate(path, interactive=False) |
314 template.substitute(target, **variables) | 318 template.substitute(variables, target) |
315 | 319 |
316 | 320 |
317 class PolyTemplate(ContentTemplate): | 321 class PolyTemplate(ContentTemplate): |
318 """template for several files/directories""" | 322 """template for several files/directories""" |
319 | 323 |
343 assert os.path.isdir(output), "Must specify a directory for multiple templates" | 347 assert os.path.isdir(output), "Must specify a directory for multiple templates" |
344 for template in self.templates: | 348 for template in self.templates: |
345 if hasattr(template, 'check_output'): | 349 if hasattr(template, 'check_output'): |
346 template.check_output(output) | 350 template.check_output(output) |
347 | 351 |
348 def substitute(self, output=None, **variables): | 352 def substitute(self, variables, output=None): |
349 | 353 |
350 # determine where the hell to put these things | 354 # determine where the hell to put these things |
351 self.check_output(output) | 355 self.check_output(output) |
352 | 356 |
353 # get the variables | 357 # get the variables |
358 if output and len(self.templates) > 1 and not os.path.exists(output): | 362 if output and len(self.templates) > 1 and not os.path.exists(output): |
359 os.makedirs(output) | 363 os.makedirs(output) |
360 | 364 |
361 # do the substitution | 365 # do the substitution |
362 for template in self.templates: | 366 for template in self.templates: |
363 template.substitute(output, **vars) | 367 template.substitute(vars, output) |
364 | 368 |
365 ### command line interface | 369 ### command line interface |
366 | 370 |
367 def invocation(url, **variables): | 371 def invocation(url, **variables): |
368 """returns a string appropriate for TTW invocation""" | 372 """returns a string appropriate for TTW invocation""" |