diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-02-21 11:45:24 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-02-21 11:45:24 -0500 |
commit | 76f27c8002f7200a12a23e2b6f5dd7a38bc4c293 (patch) | |
tree | 87fe19a195cf40d35df5c1ce1cec229753d82bc3 | |
parent | 1936fc61ef6d61b32324fbdc1e49b44241473b62 (diff) | |
download | external_python_mako-76f27c8002f7200a12a23e2b6f5dd7a38bc4c293.tar.gz external_python_mako-76f27c8002f7200a12a23e2b6f5dd7a38bc4c293.tar.bz2 external_python_mako-76f27c8002f7200a12a23e2b6f5dd7a38bc4c293.zip |
- the "ascii encoding by default" approach doesn't work in Py3K,
because a string and an ascii encoded string are of course
different things, and we'd like render() by default to return a
string. So go the other way, use FEB in all cases,
add a new flag bytestring_passthrough which goes back to StringIO,
to support that one guy who wanted to force a bytestring through
in an expression.
-rw-r--r-- | CHANGES | 45 | ||||
-rw-r--r-- | mako/lookup.py | 4 | ||||
-rw-r--r-- | mako/runtime.py | 6 | ||||
-rw-r--r-- | mako/template.py | 36 | ||||
-rw-r--r-- | test/test_template.py | 6 |
5 files changed, 73 insertions, 24 deletions
@@ -1,20 +1,37 @@ 0.4.0 -- The "output encoding" now defaults - to "ascii", whereas previously - it was set to None. This has the effect - of FastEncodingBuffer being used internally - by default when render() is called, instead - of cStringIO or StringIO, which are - slower, but allow bytestrings with - unknown encoding to pass right through. - It is of course not recommended to use - bytestrings of unknown encoding. Usage of - the "disable_unicode" mode also requires - that output_encoding be set to None. +- A 20% speedup for a basic two-page + inheritance setup rendering + a table of escaped data + (see http://techspot.zzzeek.org/2010/11/19/quick-mako-vs.-jinja-speed-test/). + A few configurational changes which + affect those in the I-don't-do-unicode + camp should be noted below. + +- The FastEncodingBuffer is now used + by default instead of cStringIO or StringIO, + regardless of whether output_encoding + is set to None or not. FEB is faster than + both. Only StringIO allows bytestrings + of unknown encoding to pass right + through, however - while it is of course + not recommended to send bytestrings of unknown + encoding to the output stream, this + mode of usage can be re-enabled by + setting the flag bytestring_passthrough + to True. + +- disable_unicode mode requires that + output_encoding be set to None - it also + forces the bytestring_passthrough flag + to True. - the <%namespace> tag raises an error if the 'template' and 'module' attributes - are specified at the same time. + are specified at the same time in + one tag. A different class is used + for each case which allows a reduction in + runtime conditional logic and function + call overhead. [ticket:156] - the keys() in the Context, as well as it's internal _data dictionary, now @@ -22,6 +39,8 @@ render() as well as Mako builtins 'caller', 'capture'. The contents of __builtin__ are no longer copied. + Thanks to Daniel Lopez for pointing + this out. [ticket:159] 0.3.6 - Documentation is on Sphinx. diff --git a/mako/lookup.py b/mako/lookup.py index 3ca289a..b397d21 100644 --- a/mako/lookup.py +++ b/mako/lookup.py @@ -148,7 +148,8 @@ class TemplateLookup(TemplateCollection): format_exceptions=False, error_handler=None, disable_unicode=False, - output_encoding='ascii', + bytestring_passthrough=False, + output_encoding=None, encoding_errors='strict', cache_type=None, cache_dir=None, cache_url=None, @@ -173,6 +174,7 @@ class TemplateLookup(TemplateCollection): 'format_exceptions':format_exceptions, 'error_handler':error_handler, 'disable_unicode':disable_unicode, + 'bytestring_passthrough':bytestring_passthrough, 'output_encoding':output_encoding, 'encoding_errors':encoding_errors, 'input_encoding':input_encoding, diff --git a/mako/runtime.py b/mako/runtime.py index f57087f..dfd701a 100644 --- a/mako/runtime.py +++ b/mako/runtime.py @@ -645,13 +645,13 @@ def _render(template, callable_, args, data, as_unicode=False): if as_unicode: buf = util.FastEncodingBuffer(unicode=True) - elif template.output_encoding: + elif template.bytestring_passthrough: + buf = util.StringIO() + else: buf = util.FastEncodingBuffer( unicode=as_unicode, encoding=template.output_encoding, errors=template.encoding_errors) - else: - buf = util.StringIO() context = Context(buf, **data) context._outputting_as_unicode = as_unicode context._with_template = template diff --git a/mako/template.py b/mako/template.py index 6166895..903dc42 100644 --- a/mako/template.py +++ b/mako/template.py @@ -38,13 +38,22 @@ class Template(object): creation of default expression filters that let the output of return-valued %defs "opt out" of that filtering via passing special attributes or objects. - + + :param bytestring_passthrough: When True, and output_encoding is + set to None, and :meth:`.Template.render` is used to render, + the StringIO or cStringIO buffer will be used instead of the + default "fast" buffer. This allows raw bytestrings in the + output stream, such as in expressions, to pass straight + through to the buffer. New in 0.4 to provide the same + behavior as that of the previous series. This flag is forced + to True if disable_unicode is also configured. + :param cache_dir: Filesystem directory where cache files will be placed. See :ref:`caching_toplevel`. - + :param cache_enabled: Boolean flag which enables caching of this template. See :ref:`caching_toplevel`. - + :param cache_type: Type of Beaker caching to be applied to the template. See :ref:`caching_toplevel`. @@ -96,7 +105,7 @@ class Template(object): Python module file. For advanced usage only. :param output_encoding: The encoding to use when :meth:`.render` - is called. Defaults to ``ascii`` as of Mako 0.4.0. + is called. See :ref:`usage_unicode` as well as :ref:`unicode_toplevel`. :param preprocessor: Python callable which will be passed @@ -127,7 +136,7 @@ class Template(object): format_exceptions=False, error_handler=None, lookup=None, - output_encoding='ascii', + output_encoding=None, encoding_errors='strict', module_directory=None, cache_type=None, @@ -135,7 +144,8 @@ class Template(object): cache_url=None, module_filename=None, input_encoding=None, - disable_unicode=False, + disable_unicode=False, + bytestring_passthrough=False, default_filters=None, buffer_filters=(), strict_undefined=False, @@ -158,6 +168,7 @@ class Template(object): self.output_encoding = output_encoding self.encoding_errors = encoding_errors self.disable_unicode = disable_unicode + self.bytestring_passthrough = bytestring_passthrough or disable_unicode self.strict_undefined = strict_undefined if util.py3k and disable_unicode: @@ -348,6 +359,7 @@ class ModuleTemplate(Template): output_encoding=None, encoding_errors='strict', disable_unicode=False, + bytestring_passthrough=False, format_exceptions=False, error_handler=None, lookup=None, @@ -362,6 +374,17 @@ class ModuleTemplate(Template): self.output_encoding = output_encoding self.encoding_errors = encoding_errors self.disable_unicode = disable_unicode + self.bytestring_passthrough = bytestring_passthrough or disable_unicode + + if util.py3k and disable_unicode: + raise exceptions.UnsupportedError( + "Mako for Python 3 does not " + "support disabling Unicode") + elif output_encoding and disable_unicode: + raise exceptions.UnsupportedError( + "output_encoding must be set to " + "None when disable_unicode is used.") + self.module = module self.filename = template_filename ModuleInfo(module, @@ -393,6 +416,7 @@ class DefTemplate(Template): self.format_exceptions = parent.format_exceptions self.error_handler = parent.error_handler self.lookup = parent.lookup + self.bytestring_passthrough = parent.bytestring_passthrough def get_def(self, name): return self.parent.get_def(name) diff --git a/test/test_template.py b/test/test_template.py index 2ac4ad3..e8fd6ed 100644 --- a/test/test_template.py +++ b/test/test_template.py @@ -283,7 +283,10 @@ class EncodingTest(TemplateTest): ) def test_raw_strings(self): - """test that raw strings go straight thru with default_filters turned off""" + """test that raw strings go straight thru with default_filters turned off, + bytestring_passthrough enabled. + + """ self._do_memory_test( u"## -*- coding: utf-8 -*-\nhello ${x}", @@ -291,6 +294,7 @@ class EncodingTest(TemplateTest): default_filters=[], template_args={'x':'śląsk'}, unicode_=False, + bytestring_passthrough=True, output_encoding=None #'ascii' ) |