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: