Removing a lot of global state

Using 'with' to open and close files
This commit is contained in:
Andrés Reyes Monge 2013-07-31 15:35:53 -06:00
parent 2d89aabf1a
commit cc963c3b13

View file

@ -90,12 +90,6 @@ class Render(object):
result = engine.render() result = engine.render()
""" """
_template = None
_environment = None
_working_template = None
_unpacked_template = None
_packed_template = None
_mimetype = ''
@ -112,6 +106,7 @@ class Render(object):
self.template = template self.template = template
self.environment = Environment(undefined=UndefinedSilently, autoescape=True) self.environment = Environment(undefined=UndefinedSilently, autoescape=True)
self.environment.filters['pad'] = pad_string self.environment.filters['pad'] = pad_string
self.file_list = {}
def unpack_template(self): def unpack_template(self):
@ -120,25 +115,18 @@ class Render(object):
CRUD operations into the ZIP archive. CRUD operations into the ZIP archive.
""" """
self._unpacked_template = zipfile.ZipFile(self.template, 'r') with zipfile.ZipFile(self.template, 'r') as unpacked_template:
# go through the files in source # go through the files in source
for zi in self._unpacked_template.filelist: for zi in unpacked_template.filelist:
file_contents = self._unpacked_template.read( zi.filename ) file_contents = unpacked_template.read( zi.filename )
self.file_list[zi.filename] = file_contents
if zi.filename == 'content.xml': if zi.filename == 'content.xml':
self.content = parseString( file_contents ) self.content = parseString( file_contents )
elif zi.filename == 'styles.xml': elif zi.filename == 'styles.xml':
self.styles = parseString( file_contents ) self.styles = parseString( file_contents )
elif zi.filename == 'mimetype':
self._mimetype = file_contents
# Load content.xml and style.xml file
body = self.content.getElementsByTagName('office:body')
self.content_body = body and body[0]
body = self.styles.getElementsByTagName('office:master-styles')
self.headers = body and body[0]
def pack_document(self): def pack_document(self):
@ -147,30 +135,21 @@ class Render(object):
""" """
# Save rendered content and headers # Save rendered content and headers
self.rendered = StringIO.StringIO() self.rendered = StringIO.StringIO()
self._packed_template = zipfile.ZipFile(self.rendered, 'a')
for zip_file in self._unpacked_template.filelist: with zipfile.ZipFile(self.rendered, 'a') as packed_template:
out = self._unpacked_template.read( zip_file.filename ) for filename, content in self.file_list.items():
if filename == 'content.xml':
content = self.content.toxml().encode('ascii', 'xmlcharrefreplace')
if zip_file.filename == 'mimetype': if filename == 'styles.xml':
# mimetype is stored within the ODF content = self.styles.toxml().encode('ascii', 'xmlcharrefreplace')
mimetype = self._mimetype
if zip_file.filename == 'content.xml':
out = self.content.toxml().encode('ascii', 'xmlcharrefreplace')
if zip_file.filename == 'styles.xml':
out = self.styles.toxml().encode('ascii', 'xmlcharrefreplace')
if sys.version_info >= (2, 7): if sys.version_info >= (2, 7):
self._packed_template.writestr(zip_file.filename, out, zipfile.ZIP_DEFLATED) packed_template.writestr(filename, content, zipfile.ZIP_DEFLATED)
else: else:
self._packed_template.writestr(zip_file.filename, out) packed_template.writestr(filename, content)
self._packed_template.close()
self._unpacked_template.close()
def render(self, **kwargs): def render(self, **kwargs):
@ -187,7 +166,6 @@ class Render(object):
result = template.render(**kwargs) result = template.render(**kwargs)
result = result.replace('\n', '<text:line-break/>') result = result.replace('\n', '<text:line-break/>')
self.content = parseString(result.encode('ascii', 'xmlcharrefreplace')) self.content = parseString(result.encode('ascii', 'xmlcharrefreplace'))
self.content_body = self.content.getElementsByTagName('office:body')
# Render style.xml # Render style.xml
self.prepare_template_tags(self.styles) self.prepare_template_tags(self.styles)
@ -195,7 +173,6 @@ class Render(object):
result = template.render(**kwargs) result = template.render(**kwargs)
result = result.replace('\n', '<text:line-break/>') result = result.replace('\n', '<text:line-break/>')
self.styles = parseString(result.encode('ascii', 'xmlcharrefreplace')) self.styles = parseString(result.encode('ascii', 'xmlcharrefreplace'))
self.headers = None
self.pack_document() self.pack_document()
return self.rendered.getvalue() return self.rendered.getvalue()