summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Harland <derek.harland@finq.co.nz>2014-04-08 12:22:12 +1200
committerDerek Harland <derek.harland@finq.co.nz>2014-04-08 12:22:12 +1200
commit68c28cb42c9e8b42a3425ddf863bbafa5c80d086 (patch)
treee05802594ea96c9c7274c1c3c2951051209870ef
parent62926b5d9c3bb2d5459d8a2c78b700c33530a333 (diff)
parent76f40065e7cba19d7fa211329a859eab7c5e9111 (diff)
downloadmako-68c28cb42c9e8b42a3425ddf863bbafa5c80d086.tar.gz
Merged zzzeek/mako into master
-rwxr-xr-x.gitignore4
-rw-r--r--CHANGES935
-rw-r--r--LICENSE2
-rw-r--r--doc/build/changelog.rst1927
-rw-r--r--doc/build/conf.py11
-rw-r--r--doc/build/index.rst1
-rw-r--r--doc/build/requirements.txt2
-rw-r--r--doc/build/templates/base.mako2
-rw-r--r--mako/__init__.py4
-rw-r--r--mako/_ast_util.py2
-rw-r--r--mako/ast.py79
-rw-r--r--mako/cache.py2
-rw-r--r--mako/codegen.py6
-rw-r--r--mako/compat.py1
-rw-r--r--mako/exceptions.py2
-rw-r--r--mako/ext/autohandler.py2
-rw-r--r--mako/ext/babelplugin.py20
-rw-r--r--mako/ext/preprocessors.py2
-rw-r--r--mako/ext/pygmentplugin.py2
-rw-r--r--mako/ext/turbogears.py2
-rw-r--r--mako/filters.py2
-rw-r--r--mako/lexer.py2
-rw-r--r--mako/lookup.py2
-rw-r--r--mako/parsetree.py14
-rw-r--r--mako/pygen.py2
-rw-r--r--mako/pyparser.py23
-rw-r--r--mako/runtime.py2
-rw-r--r--mako/template.py2
-rw-r--r--mako/util.py2
-rwxr-xr-x[-rw-r--r--]scripts/mako-render18
-rw-r--r--setup.cfg5
-rw-r--r--test/__init__.py3
-rw-r--r--test/templates/gettext.mako9
-rw-r--r--test/test_ast.py19
-rw-r--r--test/test_babelplugin.py7
-rw-r--r--test/test_def.py15
-rw-r--r--test/test_template.py20
37 files changed, 2141 insertions, 1014 deletions
diff --git a/.gitignore b/.gitignore
index e2799a5..267bfc2 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
-build/
-doc/build/output
+/build
+/doc/build/output
*.pyc
*.orig
*.egg-info
diff --git a/CHANGES b/CHANGES
index eb30e38..f942ad9 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,932 +1,15 @@
-0.9.1
-- [bug] Fixed TGPlugin.render method to support unicode template
- names in Py2K - courtesy Vladimir Magamedov.
+=====
+MOVED
+=====
-- [bug] Fixed an AST issue that was preventing correct operation
- under alpha versions of Python 3.4. Pullreq courtesy Zer0-.
+Please see:
-- [bug] Changed the format of the "source encoding" header output
- by the code generator to use the format ``# -*- coding:%s -*-``
- instead of ``# -*- encoding:%s -*-``; the former is more common
- and compatible with emacs. Courtesy Martin Geisler.
+ /docs/changelog.html
-- [bug] Fixed issue where an old lexer rule prevented a template line
- which looked like "#*" from being correctly parsed. [ticket:224]
+ /docs/build/changelog.rst
-0.9.0
-- [bug] The Context.locals_() method becomes a private underscored
- method, as this method has a specific internal use. The purpose
- of Context.kwargs has been clarified, in that it only delivers
- top level keyword arguments originally passed to template.render().
- [ticket:219]
+or
-- [bug] Fixed the babel plugin to properly interpret ${} sections
- inside of a "call" tag, i.e. <%self:some_tag attr="${_('foo')}"/>.
- Code that's subject to babel escapes in here needs to be
- specified as a Python expression, not a literal. This change
- is backwards incompatible vs. code that is relying upon a _('')
- translation to be working within a call tag.
+ https://docs.makotemplates.org/en/latest/changelog.html
-- [bug] The Babel plugin has been repaired to work on Python 3.
- [ticket:187]
-
-- [bug] Using <%namespace import="*" module="somemodule"/> now
- skips over module elements that are not explcitly callable,
- avoiding TypeError when trying to produce partials.
- [ticket:207]
-
-- [bug] Fixed Py3K bug where a "lambda" expression was not
- interpreted correctly within a template tag; also
- fixed in Py2.4. [ticket:190]
-
-0.8.1
-- [bug] Changed setup.py to skip installing markupsafe
- if Python version is < 2.6 or is between 3.0 and
- less than 3.3, as Markupsafe now only supports 2.6->2.X,
- 3.3->3.X. [ticket:216]
-
-- [bug] Fixed regression where "entity" filter wasn't
- converted for py3k properly (added tests.)
- [ticket:214]
-
-- [bug] Fixed bug where mako-render script wasn't
- compatible with Py3k. [ticket:212]
-
-- [bug] Cleaned up all the various deprecation/
- file warnings when running the tests under
- various Pythons with warnings turned on.
- [ticket:213]
-
-0.8.0
-- [feature] Performance improvement to the
- "legacy" HTML escape feature, used for XML
- escaping and when markupsafe isn't present,
- courtesy George Xie.
-
-- [bug] Fixed bug whereby an exception in Python 3
- against a module compiled to the filesystem would
- fail trying to produce a RichTraceback due to the
- content being in bytes. [ticket:209]
-
-- [bug] Change default for compile()->reserved_names
- from tuple to frozenset, as this is expected to be
- a set by default. [ticket:208]
-
-- [feature] Code has been reworked to support Python 2.4->
- Python 3.xx in place. 2to3 no longer needed.
-
-- [feature] Added lexer_cls argument to Template,
- TemplateLookup, allows alternate Lexer classes
- to be used.
-
-- [feature] Added future_imports parameter to Template
- and TemplateLookup, renders the __future__ header
- with desired capabilities at the top of the generated
- template module. Courtesy Ben Trofatter.
-
-0.7.3
-- [bug] legacy_html_escape function, used when
- Markupsafe isn't installed, was using an inline-compiled
- regexp which causes major slowdowns on Python 3.3;
- is now precompiled.
-
-- [bug] AST supporting now supports tuple-packed
- function arguments inside pure-python def
- or lambda expressions. [ticket:201]
-
-- [bug] Fixed Py3K bug in the Babel extension.
-
-- [bug] Fixed the "filter" attribute of the
- <%text> tag so that it pulls locally specified
- identifiers from the context the same
- way as that of <%block> and <%filter>.
-
-- [bug] Fixed bug in plugin loader to correctly
- raise exception when non-existent plugin
- is specified.
-
-0.7.2
-- [bug] Fixed regression in 0.7.1 where AST
- parsing for Py2.4 was broken.
- [ticket:193]
-
-0.7.1
-- [feature] Control lines with no bodies will
- now succeed, as "pass" is added for these
- when no statements are otherwise present.
- Courtesy Ben Trofatter [ticket:146]
-
-- [bug] Fixed some long-broken scoping behavior
- involving variables declared in defs and such,
- which only became apparent when
- the strict_undefined flag was turned on.
- [ticket:192]
-
-- [bug] Can now use strict_undefined at the
- same time args passed to def() are used
- by other elements of the <%def> tag.
- [ticket:191]
-
-0.7.0
-- [feature] Added new "loop" variable to templates,
- is provided within a % for block to provide
- info about the loop such as index, first/last,
- odd/even, etc. A migration path is also provided
- for legacy templates via the "enable_loop" argument
- available on Template, TemplateLookup, and <%page>.
- Thanks to Ben Trofatter for all
- the work on this [ticket:125]
-
-- [feature] Added a real check for "reserved"
- names, that is names which are never pulled
- from the context and cannot be passed to
- the template.render() method. Current names
- are "context", "loop", "UNDEFINED".
-
-- [feature] The html_error_template() will now
- apply Pygments highlighting to the source
- code displayed in the traceback, if Pygments
- if available. Courtesy Ben Trofatter
- [ticket:95]
-
-- [feature] Added support for context managers,
- i.e. "% with x as e:/ % endwith" support.
- Courtesy Ben Trofatter [ticket:147]
-
-- [feature] Added class-level flag to CacheImpl
- "pass_context"; when True, the keyword argument
- 'context' will be passed to get_or_create()
- containing the Mako Context object.
- [ticket:185]
-
-- [bug] Fixed some Py3K resource warnings due
- to filehandles being implicitly closed.
- [ticket:182]
-
-- [bug] Fixed endless recursion bug when
- nesting multiple def-calls with content.
- Thanks to Jeff Dairiki. [ticket:186]
-
-- [feature] Added Jinja2 to the example
- benchmark suite, courtesy Vincent FĂ©rotin
-
-0.6.2
-- [bug] The ${{"foo":"bar"}} parsing issue is fixed!!
- The legendary Eevee has slain the dragon!
- [ticket:20]. Also fixes quoting issue
- at [ticket:86].
-
-0.6.1
-- [bug] Added special compatibility for the 0.5.0
- Cache() constructor, which was preventing file
- version checks and not allowing Mako 0.6 to
- recompile the module files.
-
-0.6.0
-
-- [feature] Template caching has been converted into a plugin
- system, whereby the usage of Beaker is just the
- default plugin. Template and TemplateLookup
- now accept a string "cache_impl" parameter which
- refers to the name of a cache plugin, defaulting
- to the name 'beaker'. New plugins can be
- registered as pkg_resources entrypoints under
- the group "mako.cache", or registered directly
- using mako.cache.register_plugin(). The
- core plugin is the mako.cache.CacheImpl
- class.
-
-- [feature] Added support for Beaker cache regions
- in templates. Usage of regions should be considered
- as superseding the very obsolete idea of passing in
- backend options, timeouts, etc. within templates.
-
-- [feature] The 'put' method on Cache is now
- 'set'. 'put' is there for backwards compatibility.
-
-- [feature] The <%def>, <%block> and <%page> tags now accept
- any argument named "cache_*", and the key
- minus the "cache_" prefix will be passed as keyword
- arguments to the CacheImpl methods.
-
-- [feature] Template and TemplateLookup now accept an argument
- cache_args, which refers to a dictionary containing
- cache parameters. The cache_dir, cache_url, cache_type,
- cache_timeout arguments are deprecated (will probably
- never be removed, however) and can be passed
- now as cache_args={'url':<some url>, 'type':'memcached',
- 'timeout':50, 'dir':'/path/to/some/directory'}
-
-- [feature/bug] Can now refer to context variables
- within extra arguments to <%block>, <%def>, i.e.
- <%block name="foo" cache_key="${somekey}">.
- Filters can also be used in this way, i.e.
- <%def name="foo()" filter="myfilter">
- then template.render(myfilter=some_callable)
- [ticket:180]
-
-- [feature] Added "--var name=value" option to the mako-render
- script, allows passing of kw to the template from
- the command line. [ticket:178]
-
-- [feature] Added module_writer argument to Template,
- TemplateLookup, allows a callable to be passed which
- takes over the writing of the template's module source
- file, so that special environment-specific steps
- can be taken. [ticket:181]
-
-- [bug] The exception message in the html_error_template
- is now escaped with the HTML filter. [ticket:142]
-
-- [bug] Added "white-space:pre" style to html_error_template()
- for code blocks so that indentation is preserved
- [ticket:173]
-
-- [bug] The "benchmark" example is now Python 3 compatible
- (even though several of those old template libs aren't
- available on Py3K, so YMMV) [ticket:175]
-
-0.5
-- A Template is explicitly disallowed
- from having a url that normalizes to relative outside
- of the root. That is, if the Lookup is based
- at /home/mytemplates, an include that would place
- the ultimate template at
- /home/mytemplates/../some_other_directory,
- i.e. outside of /home/mytemplates,
- is disallowed. This usage was never intended
- despite the lack of an explicit check.
- The main issue this causes
- is that module files can be written outside
- of the module root (or raise an error, if file perms aren't
- set up), and can also lead to the same template being
- cached in the lookup under multiple, relative roots.
- TemplateLookup instead has always supported multiple
- file roots for this purpose.
- [ticket:174]
-
-0.4.2
-- Fixed bug regarding <%call>/def calls w/ content
- whereby the identity of the "caller" callable
- inside the <%def> would be corrupted by the
- presence of another <%call> in the same block.
- [ticket:170]
-
-- Fixed the babel plugin to accommodate <%block>
- [ticket:169]
-
-0.4.1
-- New tag: <%block>. A variant on <%def> that
- evaluates its contents in-place.
- Can be named or anonymous,
- the named version is intended for inheritance
- layouts where any given section can be
- surrounded by the <%block> tag in order for
- it to become overrideable by inheriting
- templates, without the need to specify a
- top-level <%def> plus explicit call.
- Modified scoping and argument rules as well as a
- more strictly enforced usage scheme make it ideal
- for this purpose without at all replacing most
- other things that defs are still good for.
- Lots of new docs. [ticket:164]
-
-- a slight adjustment to the "highlight" logic
- for generating template bound stacktraces.
- Will stick to known template source lines
- without any extra guessing. [ticket:165]
-
-0.4.0
-- 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 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
- include just what was specified to
- 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.
- [ticket:126]
-
-- Beaker is now part of "extras" in
- setup.py instead of "install_requires".
- This to produce a lighter weight install
- for those who don't use the caching
- as well as to conform to Pyramid
- deployment practices. [ticket:154]
-
-- The Beaker import (or attempt thereof)
- is delayed until actually needed;
- this to remove the performance penalty
- from startup, particularly for
- "single execution" environments
- such as shell scripts. [ticket:153]
-
-- Patch to lexer to not generate an empty
- '' write in the case of backslash-ended
- lines. [ticket:155]
-
-- Fixed missing **extra collection in
- setup.py which prevented setup.py
- from running 2to3 on install.
- [ticket:148]
-
-- New flag on Template, TemplateLookup -
- strict_undefined=True, will cause
- variables not found in the context to
- raise a NameError immediately, instead of
- defaulting to the UNDEFINED value.
-
-- The range of Python identifiers that
- are considered "undefined", meaning they
- are pulled from the context, has been
- trimmed back to not include variables
- declared inside of expressions (i.e. from
- list comprehensions), as well as
- in the argument list of lambdas. This
- to better support the strict_undefined
- feature. The change should be
- fully backwards-compatible but involved
- a little bit of tinkering in the AST code,
- which hadn't really been touched for
- a couple of years, just FYI.
-
-0.3.5
-- The <%namespace> tag allows expressions
- for the `file` argument, i.e. with ${}.
- The `context` variable, if needed,
- must be referenced explicitly.
- [ticket:141]
-
-- ${} expressions embedded in tags,
- such as <%foo:bar x="${...}">, now
- allow multiline Python expressions.
-
-- Fixed previously non-covered regular
- expression, such that using a ${} expression
- inside of a tag element that doesn't allow
- them raises a CompileException instead of
- silently failing.
-
-- Added a try/except around "import markupsafe".
- This to support GAE which can't run markupsafe.
- [ticket:151] No idea whatsoever if the
- install_requires in setup.py also breaks GAE,
- couldn't get an answer on this.
-
-0.3.4
-- Now using MarkupSafe for HTML escaping,
- i.e. in place of cgi.escape(). Faster
- C-based implementation and also escapes
- single quotes for additional security.
- Supports the __html__ attribute for
- the given expression as well.
-
- When using "disable_unicode" mode,
- a pure Python HTML escaper function
- is used which also quotes single quotes.
-
- Note that Pylons by default doesn't
- use Mako's filter - check your
- environment.py file.
-
-- Fixed call to "unicode.strip" in
- exceptions.text_error_template which
- is not Py3k compatible. [ticket:137]
-
-0.3.3
-- Added conditional to RichTraceback
- such that if no traceback is passed
- and sys.exc_info() has been reset,
- the formatter just returns blank
- for the "traceback" portion.
- [ticket:135]
-
-- Fixed sometimes incorrect usage of
- exc.__class__.__name__
- in html/text error templates when using
- Python 2.4 [ticket:131]
-
-- Fixed broken @property decorator on
- template.last_modified
-
-- Fixed error formatting when a stacktrace
- line contains no line number, as in when
- inside an eval/exec-generated function.
- [ticket:132]
-
-- When a .py is being created, the tempfile
- where the source is stored temporarily is
- now made in the same directory as that of
- the .py file. This ensures that the two
- files share the same filesystem, thus
- avoiding cross-filesystem synchronization
- issues. Thanks to Charles Cazabon.
-
-0.3.2
-- Calling a def from the top, via
- template.get_def(...).render() now checks the
- argument signature the same way as it did in
- 0.2.5, so that TypeError is not raised.
- reopen of [ticket:116]
-
-
-0.3.1
-- Fixed incorrect dir name in setup.py
- [ticket:129]
-
-0.3
-- Python 2.3 support is dropped. [ticket:123]
-
-- Python 3 support is added ! See README.py3k
- for installation and testing notes.
- [ticket:119]
-
-- Unit tests now run with nose. [ticket:127]
-
-- Source code escaping has been simplified.
- In particular, module source files are now
- generated with the Python "magic encoding
- comment", and source code is passed through
- mostly unescaped, except for that code which
- is regenerated from parsed Python source.
- This fixes usage of unicode in
- <%namespace:defname> tags. [ticket:99]
-
-- RichTraceback(), html_error_template().render(),
- text_error_template().render() now accept "error"
- and "traceback" as optional arguments, and
- these are now actually used. [ticket:122]
-
-- The exception output generated when
- format_exceptions=True will now be as a Python
- unicode if it occurred during render_unicode(),
- or an encoded string if during render().
-
-- A percent sign can be emitted as the first
- non-whitespace character on a line by escaping
- it as in "%%". [ticket:112]
-
-- Template accepts empty control structure, i.e.
- % if: %endif, etc. [ticket:94]
-
-- The <%page args> tag can now be used in a base
- inheriting template - the full set of render()
- arguments are passed down through the inherits
- chain. Undeclared arguments go into **pageargs
- as usual. [ticket:116]
-
-- defs declared within a <%namespace> section, an
- uncommon feature, have been improved. The defs
- no longer get doubly-rendered in the body() scope,
- and now allow local variable assignment without
- breakage. [ticket:109]
-
-- Windows paths are handled correctly if a Template
- is passed only an absolute filename (i.e. with c:
- drive etc.) and no URI - the URI is converted
- to a forward-slash path and module_directory
- is treated as a windows path. [ticket:128]
-
-- TemplateLookup raises TopLevelLookupException for
- a given path that is a directory, not a filename,
- instead of passing through to the template to
- generate IOError. [ticket:73]
-
-0.2.6
-
-- Fix mako function decorators to preserve the
- original function's name in all cases. Patch
- from Scott Torborg.
-
-- Support the <%namespacename:defname> syntax in
- the babel extractor. [ticket:118]
-
-- Further fixes to unicode handling of .py files with the
- html_error_template. [ticket:88]
-
-0.2.5
-- Added a "decorator" kw argument to <%def>,
- allows custom decoration functions to wrap
- rendering callables. Mainly intended for
- custom caching algorithms, not sure what
- other uses there may be (but there may be).
- Examples are in the "filtering" docs.
-
-- When Mako creates subdirectories in which
- to store templates, it uses the more
- permissive mode of 0775 instead of 0750,
- helping out with certain multi-process
- scenarios. Note that the mode is always
- subject to the restrictions of the existing
- umask. [ticket:101]
-
-- Fixed namespace.__getattr__() to raise
- AttributeError on attribute not found
- instead of RuntimeError. [ticket:104]
-
-- Added last_modified accessor to Template,
- returns the time.time() when the module
- was created. [ticket:97]
-
-- Fixed lexing support for whitespace
- around '=' sign in defs. [ticket:102]
-
-- Removed errant "lower()" in the lexer which
- was causing tags to compile with
- case-insensitive names, thus messing up
- custom <%call> names. [ticket:108]
-
-- added "mako.__version__" attribute to
- the base module. [ticket:110]
-
-0.2.4
-- Fixed compatibility with Jython 2.5b1.
-
-0.2.3
-- the <%namespacename:defname> syntax described at
- http://techspot.zzzeek.org/?p=28 has now
- been added as a built in syntax, and is recommended
- as a more modern syntax versus <%call expr="expression">.
- The %call tag itself will always remain,
- with <%namespacename:defname> presenting a more HTML-like
- alternative to calling defs, both plain and
- nested. Many examples of the new syntax are in the
- "Calling a def with embedded content" section
- of the docs.
-
-- added support for Jython 2.5.
-
-- cache module now uses Beaker's CacheManager
- object directly, so that all cache types are included.
- memcached is available as both "ext:memcached" and
- "memcached", the latter for backwards compatibility.
-
-- added "cache" accessor to Template, Namespace.
- e.g. ${local.cache.get('somekey')} or
- template.cache.invalidate_body()
-
-- added "cache_enabled=True" flag to Template,
- TemplateLookup. Setting this to False causes cache
- operations to "pass through" and execute every time;
- this flag should be integrated in Pylons with its own
- cache_enabled configuration setting.
-
-- the Cache object now supports invalidate_def(name),
- invalidate_body(), invalidate_closure(name),
- invalidate(key), which will remove the given key
- from the cache, if it exists. The cache arguments
- (i.e. storage type) are derived from whatever has
- been already persisted for that template.
- [ticket:92]
-
-- For cache changes to work fully, Beaker 1.1 is required.
- 1.0.1 and up will work as well with the exception of
- cache expiry. Note that Beaker 1.1 is **required**
- for applications which use dynamically generated keys,
- since previous versions will permanently store state in memory
- for each individual key, thus consuming all available
- memory for an arbitrarily large number of distinct
- keys.
-
-- fixed bug whereby an <%included> template with
- <%page> args named the same as a __builtin__ would not
- honor the default value specified in <%page> [ticket:93]
-
-- fixed the html_error_template not handling tracebacks from
- normal .py files with a magic encoding comment [ticket:88]
-
-- RichTraceback() now accepts an optional traceback object
- to be used in place of sys.exc_info()[2]. html_error_template()
- and text_error_template() accept an optional
- render()-time argument "traceback" which is passed to the
- RichTraceback object.
-
-- added ModuleTemplate class, which allows the construction
- of a Template given a Python module generated by a previous
- Template. This allows Python modules alone to be used
- as templates with no compilation step. Source code
- and template source are optional but allow error reporting
- to work correctly.
-
-- fixed Python 2.3 compat. in mako.pyparser [ticket:90]
-
-- fix Babel 0.9.3 compatibility; stripping comment tags is now
- optional (and enabled by default).
-
-
-0.2.2
-- cached blocks now use the current context when rendering
-an expired section, instead of the original context
-passed in [ticket:87]
-- fixed a critical issue regarding caching, whereby
-a cached block would raise an error when called within a
-cache-refresh operation that was initiated after the
-initiating template had completed rendering.
-
-0.2.1
-- fixed bug where 'output_encoding' parameter would prevent
-render_unicode() from returning a unicode object.
-- bumped magic number, which forces template recompile for
-this version (fixes incompatible compile symbols from 0.1
-series).
-- added a few docs for cache options, specifically those that
-help with memcached.
-
-0.2.0
-- Speed improvements (as though we needed them, but people
- contributed and there you go):
-
- - added "bytestring passthru" mode, via
- `disable_unicode=True` argument passed to Template or
- TemplateLookup. All unicode-awareness and filtering is
- turned off, and template modules are generated with
- the appropriate magic encoding comment. In this mode,
- template expressions can only receive raw bytestrings
- or Unicode objects which represent straight ASCII, and
- render_unicode() may not be used if multibyte
- characters are present. When enabled, speed
- improvement around 10-20%. [ticket:77] (courtesy
- anonymous guest)
-
- - inlined the "write" function of Context into a local
- template variable. This affords a 12-30% speedup in
- template render time. (idea courtesy same anonymous
- guest) [ticket:76]
-
-- New Features, API changes:
-
- - added "attr" accessor to namespaces. Returns
- attributes configured as module level attributes, i.e.
- within <%! %> sections. [ticket:62] i.e.:
-
- # somefile.html
- <%!
- foo = 27
- %>
-
- # some other template
- <%namespace name="myns" file="somefile.html"/>
- ${myns.attr.foo}
-
- The slight backwards incompatibility here is, you
- can't have namespace defs named "attr" since the
- "attr" descriptor will occlude it.
-
- - cache_key argument can now render arguments passed
- directly to the %page or %def, i.e. <%def
- name="foo(x)" cached="True" cache_key="${x}"/>
- [ticket:78]
-
- - some functions on Context are now private:
- _push_buffer(), _pop_buffer(),
- caller_stack._push_frame(), caller_stack._pop_frame().
-
- - added a runner script "mako-render" which renders
- standard input as a template to stdout [ticket:81]
- [ticket:56]
-
-- Bugfixes:
- - can now use most names from __builtins__ as variable
- names without explicit declaration (i.e. 'id',
- 'exception', 'range', etc.) [ticket:83] [ticket:84]
-
- - can also use builtin names as local variable names
- (i.e. dict, locals) (came from fix for [ticket:84])
-
- - fixed bug in python generation when variable names are
- used with identifiers like "else", "finally", etc.
- inside them [ticket:68]
-
- - fixed codegen bug which occured when using <%page>
- level caching, combined with an expression-based
- cache_key, combined with the usage of <%namespace
- import="*"/> - fixed lexer exceptions not cleaning up
- temporary files, which could lead to a maximum number
- of file descriptors used in the process [ticket:69]
-
- - fixed issue with inline format_exceptions that was
- producing blank exception pages when an inheriting
- template is present [ticket:71]
-
- - format_exceptions will apply the encoding options of
- html_error_template() to the buffered output
-
- - rewrote the "whitespace adjuster" function to work
- with more elaborate combinations of quotes and
- comments [ticket:75]
-
-0.1.10
-- fixed propagation of 'caller' such that nested %def calls
- within a <%call> tag's argument list propigates 'caller'
- to the %call function itself (propigates to the inner
- calls too, this is a slight side effect which previously
- existed anyway)
-- fixed bug where local.get_namespace() could put an
- incorrect "self" in the current context
-- fixed another namespace bug where the namespace functions
- did not have access to the correct context containing
- their 'self' and 'parent'
-
-0.1.9
-- filters.Decode filter can also accept a non-basestring
-object and will call str() + unicode() on it [ticket:47]
-- comments can be placed at the end of control lines,
-i.e. if foo: # a comment, [ticket:53], thanks to
-Paul Colomiets
-- fixed expressions and page tag arguments and with embedded
-newlines in CRLF templates, follow up to [ticket:16], thanks
-Eric Woroshow
-- added an IOError catch for source file not found in RichTraceback
-exception reporter [ticket:51]
-
-0.1.8
-- variable names declared in render methods by internal
-codegen prefixed by "__M_" to prevent name collisions
-with user code
-- added a Babel (http://babel.edgewall.org/) extractor entry
-point, allowing extraction of gettext messages directly from
-mako templates via Babel [ticket:45]
-- fix to turbogears plugin to work with dot-separated names
-(i.e. load_template('foo.bar')). also takes file extension
-as a keyword argument (default is 'mak').
-- more tg fix: fixed [ticket:35], allowing string-based
-templates with tgplugin even if non-compatible args were sent
-
-0.1.7
-- one small fix to the unit tests to support python 2.3
-- a slight hack to how cache.py detects Beaker's memcached,
-works around unexplained import behavior observed on some
-python 2.3 installations
-
-0.1.6
-- caching is now supplied directly by Beaker, which has
- all of MyghtyUtils merged into it now. The latest Beaker
- (0.7.1) also fixes a bug related to how Mako was using the
- cache API.
-- fix to module_directory path generation when the path is "./"
- [ticket:34]
-- TGPlugin passes options to string-based templates [ticket:35]
-- added an explicit stack frame step to template runtime, which
- allows much simpler and hopefully bug-free tracking of 'caller',
- fixes #28
-- if plain Python defs are used with <%call>, a decorator
- @runtime.supports_callable exists to ensure that the "caller"
- stack is properly handled for the def.
-- fix to RichTraceback and exception reporting to get template
- source code as a unicode object #37
-- html_error_template includes options "full=True", "css=True"
- which control generation of HTML tags, CSS [ticket:39]
-- added the 'encoding_errors' parameter to Template/TemplateLookup
- for specifying the error handler associated with encoding to
- 'output_encoding' [ticket:40]
-- the Template returned by html_error_template now defaults to
- output_encoding=sys.getdefaultencoding(),
- encoding_errors='htmlentityreplace' [ticket:37]
-- control lines, i.e. % lines, support backslashes to continue long
- lines (#32)
-- fixed codegen bug when defining <%def> within <%call> within <%call>
-- leading utf-8 BOM in template files is honored according to pep-0263
-
-0.1.5
-- AST expression generation - added in just about everything
- expression-wise from the AST module [ticket:26]
-- AST parsing, properly detects imports of the form "import foo.bar"
- [ticket:27]
-- fix to lexing of <%docs> tag nested in other tags
-- fix to context-arguments inside of <%include> tag which broke
-during 0.1.4 [ticket:29]
-- added "n" filter, disables *all* filters normally applied to an expression
-via <%page> or default_filters (but not those within the filter)
-- added buffer_filters argument, defines filters applied to the return value
-of buffered/cached/filtered %defs, after all filters defined with the %def
-itself have been applied. allows the creation of default expression filters
-that let the output of return-valued %defs "opt out" of that filtering
-via passing special attributes or objects.
-
-0.1.4
-- got defs-within-defs to be cacheable
-- fixes to code parsing/whitespace adjusting where plain python comments
- may contain quote characters [ticket:23]
-- fix to variable scoping for identifiers only referenced within
- functions
-- added a path normalization step to lookup so URIs like
- "/foo/bar/../etc/../foo" pre-process the ".." tokens before checking
- the filesystem
-- fixed/improved "caller" semantics so that undefined caller is
- "UNDEFINED", propigates __nonzero__ method so it evaulates to False if
- not present, True otherwise. this way you can say % if caller:\n
- ${caller.body()}\n% endif
-- <%include> has an "args" attribute that can pass arguments to the
- called template (keyword arguments only, must be declared in that
- page's <%page> tag.)
-- <%include> plus arguments is also programmatically available via
- self.include_file(<filename>, **kwargs)
-- further escaping added for multibyte expressions in %def, %call
- attributes [ticket:24]
-
-
-0.1.3
-- ***Small Syntax Change*** - the single line comment character is now
-*two* hash signs, i.e. "## this is a comment". This avoids a common
-collection with CSS selectors.
-- the magic "coding" comment (i.e. # coding:utf-8) will still work with
-either one "#" sign or two for now; two is preferred going forward, i.e.
-## coding:<someencoding>.
-- new multiline comment form: "<%doc> a comment </%doc>"
-- UNDEFINED evaluates to False
-- improvement to scoping of "caller" variable when using <%call> tag
-- added lexer error for unclosed control-line (%) line
-- added "preprocessor" argument to Template, TemplateLookup - is a single
- callable or list of callables which will be applied to the template text
- before lexing. given the text as an argument, returns the new text.
-- added mako.ext.preprocessors package, contains one preprocessor so far:
- 'convert_comments', which will convert single # comments to the new ##
- format
-
-0.1.2
-- fix to parsing of code/expression blocks to insure that non-ascii
- characters, combined with a template that indicates a non-standard
- encoding, are expanded into backslash-escaped glyphs before being AST
- parsed [ticket:11]
-- all template lexing converts the template to unicode first, to
- immediately catch any encoding issues and ensure internal unicode
- representation.
-- added module_filename argument to Template to allow specification of a
- specific module file
-- added modulename_callable to TemplateLookup to allow a function to
- determine module filenames (takes filename, uri arguments). used for
- [ticket:14]
-- added optional input_encoding flag to Template, to allow sending a
- unicode() object with no magic encoding comment
-- "expression_filter" argument in <%page> applies only to expressions
-- added "default_filters" argument to Template, TemplateLookup. applies only
- to expressions, gets prepended to "expression_filter" arg from <%page>.
- defaults to ["unicode"], so that all expressions get stringified into u''
- by default (this is what Mako already does). By setting to [], expressions
- are passed through raw.
-- added "imports" argument to Template, TemplateLookup. so you can predefine
- a list of import statements at the top of the template. can be used in
- conjunction with default_filters.
-- support for CRLF templates...whoops ! welcome to all the windows users.
- [ticket:16]
-- small fix to local variable propigation for locals that are conditionally
- declared
-- got "top level" def calls to work, i.e. template.get_def("somedef").render()
-
-0.1.1
-- buffet plugin supports string-based templates, allows ToscaWidgets to work
- [ticket:8]
-- AST parsing fixes: fixed TryExcept identifier parsing
-- removed textmate tmbundle from contrib and into separate SVN location;
- windows users cant handle those files, setuptools not very good at
- "pruning" certain directories
-- fix so that "cache_timeout" parameter is propigated
-- fix to expression filters so that string conversion (actually unicode)
- properly occurs before filtering
-- better error message when a lookup is attempted with a template that has no
- lookup
-- implemented "module" attribute for namespace
-- fix to code generation to correctly track multiple defs with the same name
-- "directories" can be passed to TemplateLookup as a scalar in which case it
- gets converted to a list [ticket:9]
-
-0.1.0
-
-Initial release.
+for the current CHANGES.
diff --git a/LICENSE b/LICENSE
index 38a3124..4a62c62 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
This is the MIT license: http://www.opensource.org/licenses/mit-license.php
-Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>.
+Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>.
Mako is a trademark of Michael Bayer.
Permission is hereby granted, free of charge, to any person obtaining a copy of this
diff --git a/doc/build/changelog.rst b/doc/build/changelog.rst
new file mode 100644
index 0000000..2a0e5f3
--- /dev/null
+++ b/doc/build/changelog.rst
@@ -0,0 +1,1927 @@
+=========
+Changelog
+=========
+
+0.9
+===
+
+.. changelog::
+ :version: 0.9.2
+ :released:
+
+ .. change::
+ :tags: feature, py3k
+ :pullreq: github:7
+
+ Support is added for Python 3 "keyword only" arguments, as used in
+ defs. Pull request courtesy Eevee.
+
+ .. change::
+ :tags: bug
+ :pullreq: bitbucket:2
+
+ A rework of the mako-render script allows the script to run
+ correctly when given a file pathname that is outside of the current
+ directory, e.g. ``mako-render ../some_template.mako``. In this case,
+ the "template root" defaults to the directory in which the template
+ is located, instead of ".". The script also accepts a new argument
+ ``--template-dir`` which can be specified multiple times to establish
+ template lookup directories. Standard input for templates also works
+ now too. Pull request courtesy Derek Harland.
+
+.. changelog::
+ :version: 0.9.1
+ :released: Thu Dec 26 2013
+
+ .. change::
+ :tags: bug
+ :tickets: 225
+
+ Fixed bug in Babel plugin where translator comments
+ would be lost if intervening text nodes were encountered.
+ Fix courtesy Ned Batchelder.
+
+ .. change::
+ :tags: bug
+ :tickets:
+
+ Fixed TGPlugin.render method to support unicode template
+ names in Py2K - courtesy Vladimir Magamedov.
+
+ .. change::
+ :tags: bug
+ :tickets:
+
+ Fixed an AST issue that was preventing correct operation
+ under alpha versions of Python 3.4. Pullreq courtesy Zer0-.
+
+ .. change::
+ :tags: bug
+ :tickets:
+
+ Changed the format of the "source encoding" header output
+ by the code generator to use the format ``# -*- coding:%s -*-``
+ instead of ``# -*- encoding:%s -*-``; the former is more common
+ and compatible with emacs. Courtesy Martin Geisler.
+
+ .. change::
+ :tags: bug
+ :tickets: 224
+
+ Fixed issue where an old lexer rule prevented a template line
+ which looked like "#*" from being correctly parsed.
+
+.. changelog::
+ :version: 0.9.0
+ :released: Tue Aug 27 2013
+
+ .. change::
+ :tags: bug
+ :tickets: 219
+
+ The Context.locals_() method becomes a private underscored
+ method, as this method has a specific internal use. The purpose
+ of Context.kwargs has been clarified, in that it only delivers
+ top level keyword arguments originally passed to template.render().
+
+ .. change::
+ :tags: bug
+ :tickets:
+
+ Fixed the babel plugin to properly interpret ${} sections
+ inside of a "call" tag, i.e. <%self:some_tag attr="${_('foo')}"/>.
+ Code that's subject to babel escapes in here needs to be
+ specified as a Python expression, not a literal. This change
+ is backwards incompatible vs. code that is relying upon a _('')
+ translation to be working within a call tag.
+
+ .. change::
+ :tags: bug
+ :tickets: 187
+
+ The Babel plugin has been repaired to work on Python 3.
+
+ .. change::
+ :tags: bug
+ :tickets: 207
+
+ Using <%namespace import="*" module="somemodule"/> now
+ skips over module elements that are not explcitly callable,
+ avoiding TypeError when trying to produce partials.
+
+ .. change::
+ :tags: bug
+ :tickets: 190
+
+ Fixed Py3K bug where a "lambda" expression was not
+ interpreted correctly within a template tag; also
+ fixed in Py2.4.
+
+0.8
+===
+
+.. changelog::
+ :version: 0.8.1
+ :released: Fri May 24 2013
+
+ .. change::
+ :tags: bug
+ :tickets: 216
+
+ Changed setup.py to skip installing markupsafe
+ if Python version is < 2.6 or is between 3.0 and
+ less than 3.3, as Markupsafe now only supports 2.6->2.X,
+ 3.3->3.X.
+
+ .. change::
+ :tags: bug
+ :tickets: 214
+
+ Fixed regression where "entity" filter wasn't
+ converted for py3k properly (added tests.)
+
+ .. change::
+ :tags: bug
+ :tickets: 212
+
+ Fixed bug where mako-render script wasn't
+ compatible with Py3k.
+
+ .. change::
+ :tags: bug
+ :tickets: 213
+
+ Cleaned up all the various deprecation/
+ file warnings when running the tests under
+ various Pythons with warnings turned on.
+
+.. changelog::
+ :version: 0.8.0
+ :released: Wed Apr 10 2013
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ Performance improvement to the
+ "legacy" HTML escape feature, used for XML
+ escaping and when markupsafe isn't present,
+ courtesy George Xie.
+
+ .. change::
+ :tags: bug
+ :tickets: 209
+
+ Fixed bug whereby an exception in Python 3
+ against a module compiled to the filesystem would
+ fail trying to produce a RichTraceback due to the
+ content being in bytes.
+
+ .. change::
+ :tags: bug
+ :tickets: 208
+
+ Change default for compile()->reserved_names
+ from tuple to frozenset, as this is expected to be
+ a set by default.
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ Code has been reworked to support Python 2.4->
+ Python 3.xx in place. 2to3 no longer needed.
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ Added lexer_cls argument to Template,
+ TemplateLookup, allows alternate Lexer classes
+ to be used.
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ Added future_imports parameter to Template
+ and TemplateLookup, renders the __future__ header
+ with desired capabilities at the top of the generated
+ template module. Courtesy Ben Trofatter.
+
+0.7
+===
+
+.. changelog::
+ :version: 0.7.3
+ :released: Wed Nov 7 2012
+
+ .. change::
+ :tags: bug
+ :tickets:
+
+ legacy_html_escape function, used when
+ Markupsafe isn't installed, was using an inline-compiled
+ regexp which causes major slowdowns on Python 3.3;
+ is now precompiled.
+
+ .. change::
+ :tags: bug
+ :tickets: 201
+
+ AST supporting now supports tuple-packed
+ function arguments inside pure-python def
+ or lambda expressions.
+
+ .. change::
+ :tags: bug
+ :tickets:
+
+ Fixed Py3K bug in the Babel extension.
+
+ .. change::
+ :tags: bug
+ :tickets:
+
+ Fixed the "filter" attribute of the
+ <%text> tag so that it pulls locally specified
+ identifiers from the context the same
+ way as that of <%block> and <%filter>.
+
+ .. change::
+ :tags: bug
+ :tickets:
+
+ Fixed bug in plugin loader to correctly
+ raise exception when non-existent plugin
+ is specified.
+
+.. changelog::
+ :version: 0.7.2
+ :released: Fri Jul 20 2012
+
+ .. change::
+ :tags: bug
+ :tickets: 193
+
+ Fixed regression in 0.7.1 where AST
+ parsing for Py2.4 was broken.
+
+.. changelog::
+ :version: 0.7.1
+ :released: Sun Jul 8 2012
+
+ .. change::
+ :tags: feature
+ :tickets: 146
+
+ Control lines with no bodies will
+ now succeed, as "pass" is added for these
+ when no statements are otherwise present.
+ Courtesy Ben Trofatter
+
+ .. change::
+ :tags: bug
+ :tickets: 192
+
+ Fixed some long-broken scoping behavior
+ involving variables declared in defs and such,
+ which only became apparent when
+ the strict_undefined flag was turned on.
+
+ .. change::
+ :tags: bug
+ :tickets: 191
+
+ Can now use strict_undefined at the
+ same time args passed to def() are used
+ by other elements of the <%def> tag.
+
+.. changelog::
+ :version: 0.7.0
+ :released: Fri Mar 30 2012
+
+ .. change::
+ :tags: feature
+ :tickets: 125
+
+ Added new "loop" variable to templates,
+ is provided within a % for block to provide
+ info about the loop such as index, first/last,
+ odd/even, etc. A migration path is also provided
+ for legacy templates via the "enable_loop" argument
+ available on Template, TemplateLookup, and <%page>.
+ Thanks to Ben Trofatter for all
+ the work on this
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ Added a real check for "reserved"
+ names, that is names which are never pulled
+ from the context and cannot be passed to
+ the template.render() method. Current names
+ are "context", "loop", "UNDEFINED".
+
+ .. change::
+ :tags: feature
+ :tickets: 95
+
+ The html_error_template() will now
+ apply Pygments highlighting to the source
+ code displayed in the traceback, if Pygments
+ if available. Courtesy Ben Trofatter
+
+ .. change::
+ :tags: feature
+ :tickets: 147
+
+ Added support for context managers,
+ i.e. "% with x as e:/ % endwith" support.
+ Courtesy Ben Trofatter
+
+ .. change::
+ :tags: feature
+ :tickets: 185
+
+ Added class-level flag to CacheImpl
+ "pass_context"; when True, the keyword argument
+ 'context' will be passed to get_or_create()
+ containing the Mako Context object.
+
+ .. change::
+ :tags: bug
+ :tickets: 182
+
+ Fixed some Py3K resource warnings due
+ to filehandles being implicitly closed.
+
+ .. change::
+ :tags: bug
+ :tickets: 186
+
+ Fixed endless recursion bug when
+ nesting multiple def-calls with content.
+ Thanks to Jeff Dairiki.
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ Added Jinja2 to the example
+ benchmark suite, courtesy Vincent FĂ©rotin
+
+Older Versions
+==============
+
+.. changelog::
+ :version: 0.6.2
+ :released: Thu Feb 2 2012
+
+ .. change::
+ :tags: bug
+ :tickets: 86, 20
+
+ The ${{"foo":"bar"}} parsing issue is fixed!!
+ The legendary Eevee has slain the dragon!. Also fixes quoting issue
+ at.
+
+.. changelog::
+ :version: 0.6.1
+ :released: Sat Jan 28 2012
+
+ .. change::
+ :tags: bug
+ :tickets:
+
+ Added special compatibility for the 0.5.0
+ Cache() constructor, which was preventing file
+ version checks and not allowing Mako 0.6 to
+ recompile the module files.
+
+.. changelog::
+ :version: 0.6.0
+ :released: Sat Jan 21 2012
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ Template caching has been converted into a plugin
+ system, whereby the usage of Beaker is just the
+ default plugin. Template and TemplateLookup
+ now accept a string "cache_impl" parameter which
+ refers to the name of a cache plugin, defaulting
+ to the name 'beaker'. New plugins can be
+ registered as pkg_resources entrypoints under
+ the group "mako.cache", or registered directly
+ using mako.cache.register_plugin(). The
+ core plugin is the mako.cache.CacheImpl
+ class.
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ Added support for Beaker cache regions
+ in templates. Usage of regions should be considered
+ as superseding the very obsolete idea of passing in
+ backend options, timeouts, etc. within templates.
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ The 'put' method on Cache is now
+ 'set'. 'put' is there for backwards compatibility.
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ The <%def>, <%block> and <%page> tags now accept
+ any argument named "cache_*", and the key
+ minus the "cache_" prefix will be passed as keyword
+ arguments to the CacheImpl methods.
+
+ .. change::
+ :tags: feature
+ :tickets:
+
+ Template and TemplateLookup now accept an argument
+ cache_args, which refers to a dictionary containing
+ cache parameters. The cache_dir, cache_url, cache_type,
+ cache_timeout arguments are deprecated (will probably
+ never be removed, however) and can be passed
+ now as cache_args={'url':<some url>, 'type':'memcached',
+ 'timeout':50, 'dir':'/path/to/some/directory'}
+
+ .. change::
+ :tags: feature/bug
+ :tickets: 180
+
+ Can now refer to context variables
+ within extra arguments to <%block>, <%def>, i.e.
+ <%block name="foo" cache_key="${somekey}">.
+ Filters can also be used in this way, i.e.
+ <%def name="foo()" filter="myfilter">
+ then template.render(myfilter=some_callable)
+
+ .. change::
+ :tags: feature
+ :tickets: 178
+
+ Added "--var name=value" option to the mako-render
+ script, allows passing of kw to the template from
+ the command line.
+
+ .. change::
+ :tags: feature
+ :tickets: 181
+
+ Added module_writer argument to Template,
+ TemplateLookup, allows a callable to be passed which
+ takes over the writing of the template's module source
+ file, so that special environment-specific steps
+ can be taken.
+
+ .. change::
+ :tags: bug
+ :tickets: 142
+
+ The exception message in the html_error_template
+ is now escaped with the HTML filter.
+
+ .. change::
+ :tags: bug
+ :tickets: 173
+
+ Added "white-space:pre" style to html_error_template()
+ for code blocks so that indentation is preserved
+
+ .. change::
+ :tags: bug
+ :tickets: 175
+
+ The "benchmark" example is now Python 3 compatible
+ (even though several of those old template libs aren't
+ available on Py3K, so YMMV)
+
+
+.. changelog::
+ :version: 0.5.0
+ :released: Wed Sep 28 2011
+
+ .. change::
+ :tags:
+ :tickets: 174
+
+ A Template is explicitly disallowed
+ from having a url that normalizes to relative outside
+ of the root. That is, if the Lookup is based
+ at /home/mytemplates, an include that would place
+ the ultimate template at
+ /home/mytemplates/../some_other_directory,
+ i.e. outside of /home/mytemplates,
+ is disallowed. This usage was never intended
+ despite the lack of an explicit check.
+ The main issue this causes
+ is that module files can be written outside
+ of the module root (or raise an error, if file perms aren't
+ set up), and can also lead to the same template being
+ cached in the lookup under multiple, relative roots.
+ TemplateLookup instead has always supported multiple
+ file roots for this purpose.
+
+
+.. changelog::
+ :version: 0.4.2
+ :released: Fri Aug 5 2011
+
+ .. change::
+ :tags:
+ :tickets: 170
+
+ Fixed bug regarding <%call>/def calls w/ content
+ whereby the identity of the "caller" callable
+ inside the <%def> would be corrupted by the
+ presence of another <%call> in the same block.
+
+ .. change::
+ :tags:
+ :tickets: 169
+
+ Fixed the babel plugin to accommodate <%block>
+
+.. changelog::
+ :version: 0.4.1
+ :released: Wed Apr 6 2011
+
+ .. change::
+ :tags:
+ :tickets: 164
+
+ New tag: <%block>. A variant on <%def> that
+ evaluates its contents in-place.
+ Can be named or anonymous,
+ the named version is intended for inheritance
+ layouts where any given section can be
+ surrounded by the <%block> tag in order for
+ it to become overrideable by inheriting
+ templates, without the need to specify a
+ top-level <%def> plus explicit call.
+ Modified scoping and argument rules as well as a
+ more strictly enforced usage scheme make it ideal
+ for this purpose without at all replacing most
+ other things that defs are still good for.
+ Lots of new docs.
+
+ .. change::
+ :tags:
+ :tickets: 165
+
+ a slight adjustment to the "highlight" logic
+ for generating template bound stacktraces.
+ Will stick to known template source lines
+ without any extra guessing.
+
+.. changelog::
+ :version: 0.4.0
+ :released: Sun Mar 6 2011
+
+ .. change::
+ :tags:
+ :tickets:
+
+ 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.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ 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.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ disable_unicode mode requires that
+ output_encoding be set to None - it also
+ forces the bytestring_passthrough flag
+ to True.
+
+ .. change::
+ :tags:
+ :tickets: 156
+
+ the <%namespace> tag raises an error
+ if the 'template' and 'module' attributes
+ 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.
+
+ .. change::
+ :tags:
+ :tickets: 159
+
+ the keys() in the Context, as well as
+ it's internal _data dictionary, now
+ include just what was specified to
+ render() as well as Mako builtins
+ 'caller', 'capture'. The contents
+ of __builtin__ are no longer copied.
+ Thanks to Daniel Lopez for pointing
+ this out.
+
+
+.. changelog::
+ :version: 0.3.6
+ :released: Sat Nov 13 2010
+
+ .. change::
+ :tags:
+ :tickets: 126
+
+ Documentation is on Sphinx.
+
+ .. change::
+ :tags:
+ :tickets: 154
+
+ Beaker is now part of "extras" in
+ setup.py instead of "install_requires".
+ This to produce a lighter weight install
+ for those who don't use the caching
+ as well as to conform to Pyramid
+ deployment practices.
+
+ .. change::
+ :tags:
+ :tickets: 153
+
+ The Beaker import (or attempt thereof)
+ is delayed until actually needed;
+ this to remove the performance penalty
+ from startup, particularly for
+ "single execution" environments
+ such as shell scripts.
+
+ .. change::
+ :tags:
+ :tickets: 155
+
+ Patch to lexer to not generate an empty
+ '' write in the case of backslash-ended
+ lines.
+
+ .. change::
+ :tags:
+ :tickets: 148
+
+ Fixed missing **extra collection in
+ setup.py which prevented setup.py
+ from running 2to3 on install.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ New flag on Template, TemplateLookup -
+ strict_undefined=True, will cause
+ variables not found in the context to
+ raise a NameError immediately, instead of
+ defaulting to the UNDEFINED value.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ The range of Python identifiers that
+ are considered "undefined", meaning they
+ are pulled from the context, has been
+ trimmed back to not include variables
+ declared inside of expressions (i.e. from
+ list comprehensions), as well as
+ in the argument list of lambdas. This
+ to better support the strict_undefined
+ feature. The change should be
+ fully backwards-compatible but involved
+ a little bit of tinkering in the AST code,
+ which hadn't really been touched for
+ a couple of years, just FYI.
+
+.. changelog::
+ :version: 0.3.5
+ :released: Sun Oct 24 2010
+
+ .. change::
+ :tags:
+ :tickets: 141
+
+ The <%namespace> tag allows expressions
+ for the `file` argument, i.e. with ${}.
+ The `context` variable, if needed,
+ must be referenced explicitly.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ ${} expressions embedded in tags,
+ such as <%foo:bar x="${...}">, now
+ allow multiline Python expressions.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ Fixed previously non-covered regular
+ expression, such that using a ${} expression
+ inside of a tag element that doesn't allow
+ them raises a CompileException instead of
+ silently failing.
+
+ .. change::
+ :tags:
+ :tickets: 151
+
+ Added a try/except around "import markupsafe".
+ This to support GAE which can't run markupsafe. No idea whatsoever if the
+ install_requires in setup.py also breaks GAE,
+ couldn't get an answer on this.
+
+.. changelog::
+ :version: 0.3.4
+ :released: Tue Jun 22 2010
+
+ .. change::
+ :tags:
+ :tickets:
+
+ Now using MarkupSafe for HTML escaping,
+ i.e. in place of cgi.escape(). Faster
+ C-based implementation and also escapes
+ single quotes for additional security.
+ Supports the __html__ attribute for
+ the given expression as well.
+
+ When using "disable_unicode" mode,
+ a pure Python HTML escaper function
+ is used which also quotes single quotes.
+
+ Note that Pylons by default doesn't
+ use Mako's filter - check your
+ environment.py file.
+
+ .. change::
+ :tags:
+ :tickets: 137
+
+ Fixed call to "unicode.strip" in
+ exceptions.text_error_template which
+ is not Py3k compatible.
+
+.. changelog::
+ :version: 0.3.3
+ :released: Mon May 31 2010
+
+ .. change::
+ :tags:
+ :tickets: 135
+
+ Added conditional to RichTraceback
+ such that if no traceback is passed
+ and sys.exc_info() has been reset,
+ the formatter just returns blank
+ for the "traceback" portion.
+
+ .. change::
+ :tags:
+ :tickets: 131
+
+ Fixed sometimes incorrect usage of
+ exc.__class__.__name__
+ in html/text error templates when using
+ Python 2.4
+
+ .. change::
+ :tags:
+ :tickets:
+
+ Fixed broken @property decorator on
+ template.last_modified
+
+ .. change::
+ :tags:
+ :tickets: 132
+
+ Fixed error formatting when a stacktrace
+ line contains no line number, as in when
+ inside an eval/exec-generated function.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ When a .py is being created, the tempfile
+ where the source is stored temporarily is
+ now made in the same directory as that of
+ the .py file. This ensures that the two
+ files share the same filesystem, thus
+ avoiding cross-filesystem synchronization
+ issues. Thanks to Charles Cazabon.
+
+.. changelog::
+ :version: 0.3.2
+ :released: Thu Mar 11 2010
+
+ .. change::
+ :tags:
+ :tickets: 116
+
+ Calling a def from the top, via
+ template.get_def(...).render() now checks the
+ argument signature the same way as it did in
+ 0.2.5, so that TypeError is not raised.
+ reopen of
+
+.. changelog::
+ :version: 0.3.1
+ :released: Sun Mar 7 2010
+
+ .. change::
+ :tags:
+ :tickets: 129
+
+ Fixed incorrect dir name in setup.py
+
+.. changelog::
+ :version: 0.3.0
+ :released: Fri Mar 5 2010
+
+ .. change::
+ :tags:
+ :tickets: 123
+
+ Python 2.3 support is dropped.
+
+ .. change::
+ :tags:
+ :tickets: 119
+
+ Python 3 support is added ! See README.py3k
+ for installation and testing notes.
+
+ .. change::
+ :tags:
+ :tickets: 127
+
+ Unit tests now run with nose.
+
+ .. change::
+ :tags:
+ :tickets: 99
+
+ Source code escaping has been simplified.
+ In particular, module source files are now
+ generated with the Python "magic encoding
+ comment", and source code is passed through
+ mostly unescaped, except for that code which
+ is regenerated from parsed Python source.
+ This fixes usage of unicode in
+ <%namespace:defname> tags.
+
+ .. change::
+ :tags:
+ :tickets: 122
+
+ RichTraceback(), html_error_template().render(),
+ text_error_template().render() now accept "error"
+ and "traceback" as optional arguments, and
+ these are now actually used.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ The exception output generated when
+ format_exceptions=True will now be as a Python
+ unicode if it occurred during render_unicode(),
+ or an encoded string if during render().
+
+ .. change::
+ :tags:
+ :tickets: 112
+
+ A percent sign can be emitted as the first
+ non-whitespace character on a line by escaping
+ it as in "%%".
+
+ .. change::
+ :tags:
+ :tickets: 94
+
+ Template accepts empty control structure, i.e.
+ % if: %endif, etc.
+
+ .. change::
+ :tags:
+ :tickets: 116
+
+ The <%page args> tag can now be used in a base
+ inheriting template - the full set of render()
+ arguments are passed down through the inherits
+ chain. Undeclared arguments go into **pageargs
+ as usual.
+
+ .. change::
+ :tags:
+ :tickets: 109
+
+ defs declared within a <%namespace> section, an
+ uncommon feature, have been improved. The defs
+ no longer get doubly-rendered in the body() scope,
+ and now allow local variable assignment without
+ breakage.
+
+ .. change::
+ :tags:
+ :tickets: 128
+
+ Windows paths are handled correctly if a Template
+ is passed only an absolute filename (i.e. with c:
+ drive etc.) and no URI - the URI is converted
+ to a forward-slash path and module_directory
+ is treated as a windows path.
+
+ .. change::
+ :tags:
+ :tickets: 73
+
+ TemplateLookup raises TopLevelLookupException for
+ a given path that is a directory, not a filename,
+ instead of passing through to the template to
+ generate IOError.
+
+
+.. changelog::
+ :version: 0.2.6
+ :released:
+
+ .. change::
+ :tags:
+ :tickets:
+
+ Fix mako function decorators to preserve the
+ original function's name in all cases. Patch
+ from Scott Torborg.
+
+ .. change::
+ :tags:
+ :tickets: 118
+
+ Support the <%namespacename:defname> syntax in
+ the babel extractor.
+
+ .. change::
+ :tags:
+ :tickets: 88
+
+ Further fixes to unicode handling of .py files with the
+ html_error_template.
+
+.. changelog::
+ :version: 0.2.5
+ :released: Mon Sep 7 2009
+
+ .. change::
+ :tags:
+ :tickets:
+
+ Added a "decorator" kw argument to <%def>,
+ allows custom decoration functions to wrap
+ rendering callables. Mainly intended for
+ custom caching algorithms, not sure what
+ other uses there may be (but there may be).
+ Examples are in the "filtering" docs.
+
+ .. change::
+ :tags:
+ :tickets: 101
+
+ When Mako creates subdirectories in which
+ to store templates, it uses the more
+ permissive mode of 0775 instead of 0750,
+ helping out with certain multi-process
+ scenarios. Note that the mode is always
+ subject to the restrictions of the existing
+ umask.
+
+ .. change::
+ :tags:
+ :tickets: 104
+
+ Fixed namespace.__getattr__() to raise
+ AttributeError on attribute not found
+ instead of RuntimeError.
+
+ .. change::
+ :tags:
+ :tickets: 97
+
+ Added last_modified accessor to Template,
+ returns the time.time() when the module
+ was created.
+
+ .. change::
+ :tags:
+ :tickets: 102
+
+ Fixed lexing support for whitespace
+ around '=' sign in defs.
+
+ .. change::
+ :tags:
+ :tickets: 108
+
+ Removed errant "lower()" in the lexer which
+ was causing tags to compile with
+ case-insensitive names, thus messing up
+ custom <%call> names.
+
+ .. change::
+ :tags:
+ :tickets: 110
+
+ added "mako.__version__" attribute to
+ the base module.
+
+.. changelog::
+ :version: 0.2.4
+ :released: Tue Dec 23 2008
+
+ .. change::
+ :tags:
+ :tickets:
+
+ Fixed compatibility with Jython 2.5b1.
+
+.. changelog::
+ :version: 0.2.3
+ :released: Sun Nov 23 2008
+
+ .. change::
+ :tags:
+ :tickets:
+
+ the <%namespacename:defname> syntax described at
+ http://techspot.zzzeek.org/?p=28 has now
+ been added as a built in syntax, and is recommended
+ as a more modern syntax versus <%call expr="expression">.
+ The %call tag itself will always remain,
+ with <%namespacename:defname> presenting a more HTML-like
+ alternative to calling defs, both plain and
+ nested. Many examples of the new syntax are in the
+ "Calling a def with embedded content" section
+ of the docs.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added support for Jython 2.5.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ cache module now uses Beaker's CacheManager
+ object directly, so that all cache types are included.
+ memcached is available as both "ext:memcached" and
+ "memcached", the latter for backwards compatibility.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added "cache" accessor to Template, Namespace.
+ e.g. ${local.cache.get('somekey')} or
+ template.cache.invalidate_body()
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added "cache_enabled=True" flag to Template,
+ TemplateLookup. Setting this to False causes cache
+ operations to "pass through" and execute every time;
+ this flag should be integrated in Pylons with its own
+ cache_enabled configuration setting.
+
+ .. change::
+ :tags:
+ :tickets: 92
+
+ the Cache object now supports invalidate_def(name),
+ invalidate_body(), invalidate_closure(name),
+ invalidate(key), which will remove the given key
+ from the cache, if it exists. The cache arguments
+ (i.e. storage type) are derived from whatever has
+ been already persisted for that template.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ For cache changes to work fully, Beaker 1.1 is required.
+ 1.0.1 and up will work as well with the exception of
+ cache expiry. Note that Beaker 1.1 is **required**
+ for applications which use dynamically generated keys,
+ since previous versions will permanently store state in memory
+ for each individual key, thus consuming all available
+ memory for an arbitrarily large number of distinct
+ keys.
+
+ .. change::
+ :tags:
+ :tickets: 93
+
+ fixed bug whereby an <%included> template with
+ <%page> args named the same as a __builtin__ would not
+ honor the default value specified in <%page>
+
+ .. change::
+ :tags:
+ :tickets: 88
+
+ fixed the html_error_template not handling tracebacks from
+ normal .py files with a magic encoding comment
+
+ .. change::
+ :tags:
+ :tickets:
+
+ RichTraceback() now accepts an optional traceback object
+ to be used in place of sys.exc_info()[2]. html_error_template()
+ and text_error_template() accept an optional
+ render()-time argument "traceback" which is passed to the
+ RichTraceback object.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added ModuleTemplate class, which allows the construction
+ of a Template given a Python module generated by a previous
+ Template. This allows Python modules alone to be used
+ as templates with no compilation step. Source code
+ and template source are optional but allow error reporting
+ to work correctly.
+
+ .. change::
+ :tags:
+ :tickets: 90
+
+ fixed Python 2.3 compat. in mako.pyparser
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fix Babel 0.9.3 compatibility; stripping comment tags is now
+ optional (and enabled by default).
+
+.. changelog::
+ :version: 0.2.2
+ :released: Mon Jun 23 2008
+
+ .. change::
+ :tags:
+ :tickets: 87
+
+ cached blocks now use the current context when rendering
+ an expired section, instead of the original context
+ passed in
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fixed a critical issue regarding caching, whereby
+ a cached block would raise an error when called within a
+ cache-refresh operation that was initiated after the
+ initiating template had completed rendering.
+
+.. changelog::
+ :version: 0.2.1
+ :released: Mon Jun 16 2008
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fixed bug where 'output_encoding' parameter would prevent
+ render_unicode() from returning a unicode object.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ bumped magic number, which forces template recompile for
+ this version (fixes incompatible compile symbols from 0.1
+ series).
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added a few docs for cache options, specifically those that
+ help with memcached.
+
+.. changelog::
+ :version: 0.2.0
+ :released: Tue Jun 3 2008
+
+ .. change::
+ :tags:
+ :tickets:
+
+ Speed improvements (as though we needed them, but people
+ contributed and there you go):
+
+ .. change::
+ :tags:
+ :tickets: 77
+
+ added "bytestring passthru" mode, via
+ `disable_unicode=True` argument passed to Template or
+ TemplateLookup. All unicode-awareness and filtering is
+ turned off, and template modules are generated with
+ the appropriate magic encoding comment. In this mode,
+ template expressions can only receive raw bytestrings
+ or Unicode objects which represent straight ASCII, and
+ render_unicode() may not be used if multibyte
+ characters are present. When enabled, speed
+ improvement around 10-20%. (courtesy
+ anonymous guest)
+
+ .. change::
+ :tags:
+ :tickets: 76
+
+ inlined the "write" function of Context into a local
+ template variable. This affords a 12-30% speedup in
+ template render time. (idea courtesy same anonymous
+ guest)
+
+ .. change::
+ :tags:
+ :tickets:
+
+ New Features, API changes:
+
+ .. change::
+ :tags:
+ :tickets: 62
+
+ added "attr" accessor to namespaces. Returns
+ attributes configured as module level attributes, i.e.
+ within <%! %> sections. i.e.:
+
+ # somefile.html
+ <%!
+ foo = 27
+ %>
+
+ # some other template
+ <%namespace name="myns" file="somefile.html"/>
+ ${myns.attr.foo}
+
+ The slight backwards incompatibility here is, you
+ can't have namespace defs named "attr" since the
+ "attr" descriptor will occlude it.
+
+ .. change::
+ :tags:
+ :tickets: 78
+
+ cache_key argument can now render arguments passed
+ directly to the %page or %def, i.e. <%def
+ name="foo(x)" cached="True" cache_key="${x}"/>
+
+ .. change::
+ :tags:
+ :tickets:
+
+ some functions on Context are now private:
+ _push_buffer(), _pop_buffer(),
+ caller_stack._push_frame(), caller_stack._pop_frame().
+
+ .. change::
+ :tags:
+ :tickets: 56, 81
+
+ added a runner script "mako-render" which renders
+ standard input as a template to stdout
+
+ .. change::
+ :tags: bugfixes
+ :tickets: 83, 84
+
+ can now use most names from __builtins__ as variable
+ names without explicit declaration (i.e. 'id',
+ 'exception', 'range', etc.)
+
+ .. change::
+ :tags: bugfixes
+ :tickets: 84
+
+ can also use builtin names as local variable names
+ (i.e. dict, locals) (came from fix for)
+
+ .. change::
+ :tags: bugfixes
+ :tickets: 68
+
+ fixed bug in python generation when variable names are
+ used with identifiers like "else", "finally", etc.
+ inside them
+
+ .. change::
+ :tags: bugfixes
+ :tickets: 69
+
+ fixed codegen bug which occured when using <%page>
+ level caching, combined with an expression-based
+ cache_key, combined with the usage of <%namespace
+ import="*"/> - fixed lexer exceptions not cleaning up
+ temporary files, which could lead to a maximum number
+ of file descriptors used in the process
+
+ .. change::
+ :tags: bugfixes
+ :tickets: 71
+
+ fixed issue with inline format_exceptions that was
+ producing blank exception pages when an inheriting
+ template is present
+
+ .. change::
+ :tags: bugfixes
+ :tickets:
+
+ format_exceptions will apply the encoding options of
+ html_error_template() to the buffered output
+
+ .. change::
+ :tags: bugfixes
+ :tickets: 75
+
+ rewrote the "whitespace adjuster" function to work
+ with more elaborate combinations of quotes and
+ comments
+
+
+.. changelog::
+ :version: 0.1.10
+ :released:
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fixed propagation of 'caller' such that nested %def calls
+ within a <%call> tag's argument list propigates 'caller'
+ to the %call function itself (propigates to the inner
+ calls too, this is a slight side effect which previously
+ existed anyway)
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fixed bug where local.get_namespace() could put an
+ incorrect "self" in the current context
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fixed another namespace bug where the namespace functions
+ did not have access to the correct context containing
+ their 'self' and 'parent'
+
+.. changelog::
+ :version: 0.1.9
+ :released:
+
+ .. change::
+ :tags:
+ :tickets: 47
+
+ filters.Decode filter can also accept a non-basestring
+ object and will call str() + unicode() on it
+
+ .. change::
+ :tags:
+ :tickets: 53
+
+ comments can be placed at the end of control lines,
+ i.e. if foo: # a comment,, thanks to
+ Paul Colomiets
+
+ .. change::
+ :tags:
+ :tickets: 16
+
+ fixed expressions and page tag arguments and with embedded
+ newlines in CRLF templates, follow up to, thanks
+ Eric Woroshow
+
+ .. change::
+ :tags:
+ :tickets: 51
+
+ added an IOError catch for source file not found in RichTraceback
+ exception reporter
+
+.. changelog::
+ :version: 0.1.8
+ :released: Tue Jun 26 2007
+
+ .. change::
+ :tags:
+ :tickets:
+
+ variable names declared in render methods by internal
+ codegen prefixed by "__M_" to prevent name collisions
+ with user code
+
+ .. change::
+ :tags:
+ :tickets: 45
+
+ added a Babel (http://babel.edgewall.org/) extractor entry
+ point, allowing extraction of gettext messages directly from
+ mako templates via Babel
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fix to turbogears plugin to work with dot-separated names
+ (i.e. load_template('foo.bar')). also takes file extension
+ as a keyword argument (default is 'mak').
+
+ .. change::
+ :tags:
+ :tickets: 35
+
+ more tg fix: fixed, allowing string-based
+ templates with tgplugin even if non-compatible args were sent
+
+.. changelog::
+ :version: 0.1.7
+ :released: Wed Jun 13 2007
+
+ .. change::
+ :tags:
+ :tickets:
+
+ one small fix to the unit tests to support python 2.3
+
+ .. change::
+ :tags:
+ :tickets:
+
+ a slight hack to how cache.py detects Beaker's memcached,
+ works around unexplained import behavior observed on some
+ python 2.3 installations
+
+.. changelog::
+ :version: 0.1.6
+ :released: Fri May 18 2007
+
+ .. change::
+ :tags:
+ :tickets:
+
+ caching is now supplied directly by Beaker, which has
+ all of MyghtyUtils merged into it now. The latest Beaker
+ (0.7.1) also fixes a bug related to how Mako was using the
+ cache API.
+
+ .. change::
+ :tags:
+ :tickets: 34
+
+ fix to module_directory path generation when the path is "./"
+
+ .. change::
+ :tags:
+ :tickets: 35
+
+ TGPlugin passes options to string-based templates
+
+ .. change::
+ :tags:
+ :tickets: 28
+
+ added an explicit stack frame step to template runtime, which
+ allows much simpler and hopefully bug-free tracking of 'caller',
+ fixes
+
+ .. change::
+ :tags:
+ :tickets:
+
+ if plain Python defs are used with <%call>, a decorator
+ @runtime.supports_callable exists to ensure that the "caller"
+ stack is properly handled for the def.
+
+ .. change::
+ :tags:
+ :tickets: 37
+
+ fix to RichTraceback and exception reporting to get template
+ source code as a unicode object
+
+ .. change::
+ :tags:
+ :tickets: 39
+
+ html_error_template includes options "full=True", "css=True"
+ which control generation of HTML tags, CSS
+
+ .. change::
+ :tags:
+ :tickets: 40
+
+ added the 'encoding_errors' parameter to Template/TemplateLookup
+ for specifying the error handler associated with encoding to
+ 'output_encoding'
+
+ .. change::
+ :tags:
+ :tickets: 37
+
+ the Template returned by html_error_template now defaults to
+ output_encoding=sys.getdefaultencoding(),
+ encoding_errors='htmlentityreplace'
+
+ .. change::
+ :tags:
+ :tickets:
+
+ control lines, i.e. % lines, support backslashes to continue long
+ lines (#32)
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fixed codegen bug when defining <%def> within <%call> within <%call>
+
+ .. change::
+ :tags:
+ :tickets:
+
+ leading utf-8 BOM in template files is honored according to pep-0263
+
+.. changelog::
+ :version: 0.1.5
+ :released: Sat Mar 31 2007
+
+ .. change::
+ :tags:
+ :tickets: 26
+
+ AST expression generation - added in just about everything
+ expression-wise from the AST module
+
+ .. change::
+ :tags:
+ :tickets: 27
+
+ AST parsing, properly detects imports of the form "import foo.bar"
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fix to lexing of <%docs> tag nested in other tags
+
+ .. change::
+ :tags:
+ :tickets: 29
+
+ fix to context-arguments inside of <%include> tag which broke
+ during 0.1.4
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added "n" filter, disables *all* filters normally applied to an expression
+ via <%page> or default_filters (but not those within the filter)
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added buffer_filters argument, defines filters applied to the return value
+ of buffered/cached/filtered %defs, after all filters defined with the %def
+ itself have been applied. allows the creation of default expression filters
+ that let the output of return-valued %defs "opt out" of that filtering
+ via passing special attributes or objects.
+
+.. changelog::
+ :version: 0.1.4
+ :released: Sat Mar 10 2007
+
+ .. change::
+ :tags:
+ :tickets:
+
+ got defs-within-defs to be cacheable
+
+ .. change::
+ :tags:
+ :tickets: 23
+
+ fixes to code parsing/whitespace adjusting where plain python comments
+ may contain quote characters
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fix to variable scoping for identifiers only referenced within
+ functions
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added a path normalization step to lookup so URIs like
+ "/foo/bar/../etc/../foo" pre-process the ".." tokens before checking
+ the filesystem
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fixed/improved "caller" semantics so that undefined caller is
+ "UNDEFINED", propigates __nonzero__ method so it evaulates to False if
+ not present, True otherwise. this way you can say % if caller:\n
+ ${caller.body()}\n% endif
+
+ .. change::
+ :tags:
+ :tickets:
+
+ <%include> has an "args" attribute that can pass arguments to the
+ called template (keyword arguments only, must be declared in that
+ page's <%page> tag.)
+
+ .. change::
+ :tags:
+ :tickets:
+
+ <%include> plus arguments is also programmatically available via
+ self.include_file(<filename>, **kwargs)
+
+ .. change::
+ :tags:
+ :tickets: 24
+
+ further escaping added for multibyte expressions in %def, %call
+ attributes
+
+.. changelog::
+ :version: 0.1.3
+ :released: Wed Feb 21 2007
+
+ .. change::
+ :tags:
+ :tickets:
+
+ ***Small Syntax Change*** - the single line comment character is now
+ *two* hash signs, i.e. "## this is a comment". This avoids a common
+ collection with CSS selectors.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ the magic "coding" comment (i.e. # coding:utf-8) will still work with
+ either one "#" sign or two for now; two is preferred going forward, i.e.
+ ## coding:<someencoding>.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ new multiline comment form: "<%doc> a comment </%doc>"
+
+ .. change::
+ :tags:
+ :tickets:
+
+ UNDEFINED evaluates to False
+
+ .. change::
+ :tags:
+ :tickets:
+
+ improvement to scoping of "caller" variable when using <%call> tag
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added lexer error for unclosed control-line (%) line
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added "preprocessor" argument to Template, TemplateLookup - is a single
+ callable or list of callables which will be applied to the template text
+ before lexing. given the text as an argument, returns the new text.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added mako.ext.preprocessors package, contains one preprocessor so far:
+ 'convert_comments', which will convert single # comments to the new ##
+ format
+
+.. changelog::
+ :version: 0.1.2
+ :released: Thu Feb 1 2007
+
+ .. change::
+ :tags:
+ :tickets: 11
+
+ fix to parsing of code/expression blocks to insure that non-ascii
+ characters, combined with a template that indicates a non-standard
+ encoding, are expanded into backslash-escaped glyphs before being AST
+ parsed
+
+ .. change::
+ :tags:
+ :tickets:
+
+ all template lexing converts the template to unicode first, to
+ immediately catch any encoding issues and ensure internal unicode
+ representation.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added module_filename argument to Template to allow specification of a
+ specific module file
+
+ .. change::
+ :tags:
+ :tickets: 14
+
+ added modulename_callable to TemplateLookup to allow a function to
+ determine module filenames (takes filename, uri arguments). used for
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added optional input_encoding flag to Template, to allow sending a
+ unicode() object with no magic encoding comment
+
+ .. change::
+ :tags:
+ :tickets:
+
+ "expression_filter" argument in <%page> applies only to expressions
+
+ .. change::
+ :tags: "unicode"
+ :tickets:
+
+ added "default_filters" argument to Template, TemplateLookup. applies only
+ to expressions, gets prepended to "expression_filter" arg from <%page>.
+ defaults to, so that all expressions get stringified into u''
+ by default (this is what Mako already does). By setting to [], expressions
+ are passed through raw.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ added "imports" argument to Template, TemplateLookup. so you can predefine
+ a list of import statements at the top of the template. can be used in
+ conjunction with default_filters.
+
+ .. change::
+ :tags:
+ :tickets: 16
+
+ support for CRLF templates...whoops ! welcome to all the windows users.
+
+ .. change::
+ :tags:
+ :tickets:
+
+ small fix to local variable propigation for locals that are conditionally
+ declared
+
+ .. change::
+ :tags:
+ :tickets:
+
+ got "top level" def calls to work, i.e. template.get_def("somedef").render()
+
+.. changelog::
+ :version: 0.1.1
+ :released: Sun Jan 14 2007
+
+ .. change::
+ :tags:
+ :tickets: 8
+
+ buffet plugin supports string-based templates, allows ToscaWidgets to work
+
+ .. change::
+ :tags:
+ :tickets:
+
+ AST parsing fixes: fixed TryExcept identifier parsing
+
+ .. change::
+ :tags:
+ :tickets:
+
+ removed textmate tmbundle from contrib and into separate SVN location;
+ windows users cant handle those files, setuptools not very good at
+ "pruning" certain directories
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fix so that "cache_timeout" parameter is propigated
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fix to expression filters so that string conversion (actually unicode)
+ properly occurs before filtering
+
+ .. change::
+ :tags:
+ :tickets:
+
+ better error message when a lookup is attempted with a template that has no
+ lookup
+
+ .. change::
+ :tags:
+ :tickets:
+
+ implemented "module" attribute for namespace
+
+ .. change::
+ :tags:
+ :tickets:
+
+ fix to code generation to correctly track multiple defs with the same name
+
+ .. change::
+ :tags:
+ :tickets: 9
+
+ "directories" can be passed to TemplateLookup as a scalar in which case it
+ gets converted to a list
diff --git a/doc/build/conf.py b/doc/build/conf.py
index 5bfd996..807782b 100644
--- a/doc/build/conf.py
+++ b/doc/build/conf.py
@@ -31,7 +31,16 @@ import mako
# 'sphinx.ext.doctest', 'builder.builders']
extensions = ['sphinx.ext.autodoc','sphinx.ext.intersphinx',
- 'sphinx.ext.doctest', 'builder.builders']
+ 'changelog', 'sphinx_paramlinks',
+ 'builder.builders']
+
+changelog_render_ticket = "https://bitbucket.org/zzzeek/mako/issue/%s/"
+
+changelog_render_pullreq = {
+ "bitbucket": "https://bitbucket.org/zzzeek/mako/pull-request/%s",
+ "default": "https://bitbucket.org/zzzeek/mako/pull-request/%s",
+ "github": "https://github.com/zzzeek/mako/pull/%s",
+}
# Add any paths that contain templates here, relative to this directory.
templates_path = ['templates']
diff --git a/doc/build/index.rst b/doc/build/index.rst
index a81d5ba..3104ca9 100644
--- a/doc/build/index.rst
+++ b/doc/build/index.rst
@@ -13,6 +13,7 @@ Table of Contents
filtering
unicode
caching
+ changelog
Indices and Tables
------------------
diff --git a/doc/build/requirements.txt b/doc/build/requirements.txt
new file mode 100644
index 0000000..cc5dfbd
--- /dev/null
+++ b/doc/build/requirements.txt
@@ -0,0 +1,2 @@
+changelog>=0.3.4
+sphinx-paramlinks>=0.2.0
diff --git a/doc/build/templates/base.mako b/doc/build/templates/base.mako
index b075023..32c49d8 100644
--- a/doc/build/templates/base.mako
+++ b/doc/build/templates/base.mako
@@ -35,8 +35,6 @@
<div class="toolbar">
<a href="${site_base}/">Home</a>
&nbsp; | &nbsp;
- <a href="${site_base}/trac">Trac</a>
- &nbsp; | &nbsp;
<a href="${site_base}/community.html">Community</a>
&nbsp; | &nbsp;
<a href="${pathto('index')}">Documentation</a>
diff --git a/mako/__init__.py b/mako/__init__.py
index cb59f3a..aa99505 100644
--- a/mako/__init__.py
+++ b/mako/__init__.py
@@ -1,9 +1,9 @@
# mako/__init__.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
-__version__ = '0.9.1'
+__version__ = '0.9.2'
diff --git a/mako/_ast_util.py b/mako/_ast_util.py
index 3b0bd21..788b86a 100644
--- a/mako/_ast_util.py
+++ b/mako/_ast_util.py
@@ -1,5 +1,5 @@
# mako/_ast_util.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ast.py b/mako/ast.py
index f9ae3e1..8f711b4 100644
--- a/mako/ast.py
+++ b/mako/ast.py
@@ -1,5 +1,5 @@
# mako/ast.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
@@ -112,38 +112,65 @@ class FunctionDecl(object):
if not allow_kwargs and self.kwargs:
raise exceptions.CompileException(
"'**%s' keyword argument not allowed here" %
- self.argnames[-1], **exception_kwargs)
+ self.kwargnames[-1], **exception_kwargs)
- def get_argument_expressions(self, include_defaults=True):
- """return the argument declarations of this FunctionDecl as a printable
- list."""
+ def get_argument_expressions(self, as_call=False):
+ """Return the argument declarations of this FunctionDecl as a printable
+ list.
+
+ By default the return value is appropriate for writing in a ``def``;
+ set `as_call` to true to build arguments to be passed to the function
+ instead (assuming locals with the same names as the arguments exist).
+ """
namedecls = []
- defaults = [d for d in self.defaults]
- kwargs = self.kwargs
- varargs = self.varargs
- argnames = [f for f in self.argnames]
- argnames.reverse()
- for arg in argnames:
- default = None
- if kwargs:
- arg = "**" + arg_stringname(arg)
- kwargs = False
- elif varargs:
- arg = "*" + arg_stringname(arg)
- varargs = False
+
+ # Build in reverse order, since defaults and slurpy args come last
+ argnames = self.argnames[::-1]
+ kwargnames = self.kwargnames[::-1]
+ defaults = self.defaults[::-1]
+ kwdefaults = self.kwdefaults[::-1]
+
+ # Named arguments
+ if self.kwargs:
+ namedecls.append("**" + kwargnames.pop(0))
+
+ for name in kwargnames:
+ # Keyword-only arguments must always be used by name, so even if
+ # this is a call, print out `foo=foo`
+ if as_call:
+ namedecls.append("%s=%s" % (name, name))
+ elif kwdefaults:
+ default = kwdefaults.pop(0)
+ if default is None:
+ # The AST always gives kwargs a default, since you can do
+ # `def foo(*, a=1, b, c=3)`
+ namedecls.append(name)
+ else:
+ namedecls.append("%s=%s" % (
+ name, pyparser.ExpressionGenerator(default).value()))
else:
- default = len(defaults) and defaults.pop() or None
- if include_defaults and default:
- namedecls.insert(0, "%s=%s" %
- (arg,
- pyparser.ExpressionGenerator(default).value()
- )
- )
+ namedecls.append(name)
+
+ # Positional arguments
+ if self.varargs:
+ namedecls.append("*" + argnames.pop(0))
+
+ for name in argnames:
+ if as_call or not defaults:
+ namedecls.append(name)
else:
- namedecls.insert(0, arg)
+ default = defaults.pop(0)
+ namedecls.append("%s=%s" % (
+ name, pyparser.ExpressionGenerator(default).value()))
+
+ namedecls.reverse()
return namedecls
+ @property
+ def allargnames(self):
+ return tuple(self.argnames) + tuple(self.kwargnames)
+
class FunctionArgs(FunctionDecl):
"""the argument portion of a function declaration"""
diff --git a/mako/cache.py b/mako/cache.py
index 4433040..b7de6b5 100644
--- a/mako/cache.py
+++ b/mako/cache.py
@@ -1,5 +1,5 @@
# mako/cache.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/codegen.py b/mako/codegen.py
index 2779a6d..045d03c 100644
--- a/mako/codegen.py
+++ b/mako/codegen.py
@@ -1,5 +1,5 @@
# mako/codegen.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
@@ -543,7 +543,7 @@ class _GenerateRenderMethod(object):
"""write a locally-available callable referencing a top-level def"""
funcname = node.funcname
namedecls = node.get_argument_expressions()
- nameargs = node.get_argument_expressions(include_defaults=False)
+ nameargs = node.get_argument_expressions(as_call=True)
if not self.in_def and (
len(self.identifiers.locally_assigned) > 0 or
@@ -864,7 +864,7 @@ class _GenerateRenderMethod(object):
if node.is_anonymous:
self.printer.writeline("%s()" % node.funcname)
else:
- nameargs = node.get_argument_expressions(include_defaults=False)
+ nameargs = node.get_argument_expressions(as_call=True)
nameargs += ['**pageargs']
self.printer.writeline("if 'parent' not in context._data or "
"not hasattr(context._data['parent'], '%s'):"
diff --git a/mako/compat.py b/mako/compat.py
index 31da8bd..c5ef84b 100644
--- a/mako/compat.py
+++ b/mako/compat.py
@@ -3,6 +3,7 @@ import time
py3k = sys.version_info >= (3, 0)
py33 = sys.version_info >= (3, 3)
+py2k = sys.version_info < (3,)
py26 = sys.version_info >= (2, 6)
py25 = sys.version_info >= (2, 5)
jython = sys.platform.startswith('java')
diff --git a/mako/exceptions.py b/mako/exceptions.py
index dcf81a6..b8f97ee 100644
--- a/mako/exceptions.py
+++ b/mako/exceptions.py
@@ -1,5 +1,5 @@
# mako/exceptions.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ext/autohandler.py b/mako/ext/autohandler.py
index d56cbc1..99f651a 100644
--- a/mako/ext/autohandler.py
+++ b/mako/ext/autohandler.py
@@ -1,5 +1,5 @@
# ext/autohandler.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ext/babelplugin.py b/mako/ext/babelplugin.py
index ba244bd..2ff0781 100644
--- a/mako/ext/babelplugin.py
+++ b/mako/ext/babelplugin.py
@@ -1,5 +1,5 @@
# ext/babelplugin.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
@@ -80,41 +80,37 @@ def extract_nodes(nodes, keywords, comment_tags, options):
child_nodes = node.nodes
elif isinstance(node, parsetree.ControlLine):
if node.isend:
- translator_comments = []
in_translator_comments = False
continue
code = node.text
elif isinstance(node, parsetree.Code):
- # <% and <%! blocks would provide their own translator comments
- translator_comments = []
in_translator_comments = False
-
code = node.code.code
elif isinstance(node, parsetree.Expression):
code = node.code.code
else:
- translator_comments = []
- in_translator_comments = False
continue
# Comments don't apply unless they immediately preceed the message
if translator_comments and \
translator_comments[-1][0] < node.lineno - 1:
translator_comments = []
- else:
- translator_comments = \
- [comment[1] for comment in translator_comments]
+
+ translator_strings = [comment[1] for comment in translator_comments]
if isinstance(code, compat.text_type):
code = code.encode('ascii', 'backslashreplace')
+ used_translator_comments = False
code = compat.byte_buffer(code)
for lineno, funcname, messages, python_translator_comments \
in extract_python(code, keywords, comment_tags, options):
yield (node.lineno + (lineno - 1), funcname, messages,
- translator_comments + python_translator_comments)
+ translator_strings + python_translator_comments)
+ used_translator_comments = True
- translator_comments = []
+ if used_translator_comments:
+ translator_comments = []
in_translator_comments = False
if child_nodes:
diff --git a/mako/ext/preprocessors.py b/mako/ext/preprocessors.py
index 5a15ff3..94569c5 100644
--- a/mako/ext/preprocessors.py
+++ b/mako/ext/preprocessors.py
@@ -1,5 +1,5 @@
# ext/preprocessors.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ext/pygmentplugin.py b/mako/ext/pygmentplugin.py
index 040a25c..7e3cb42 100644
--- a/mako/ext/pygmentplugin.py
+++ b/mako/ext/pygmentplugin.py
@@ -1,5 +1,5 @@
# ext/pygmentplugin.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ext/turbogears.py b/mako/ext/turbogears.py
index a4179d0..ebbee50 100644
--- a/mako/ext/turbogears.py
+++ b/mako/ext/turbogears.py
@@ -1,5 +1,5 @@
# ext/turbogears.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/filters.py b/mako/filters.py
index 77aaf75..369cbc3 100644
--- a/mako/filters.py
+++ b/mako/filters.py
@@ -1,5 +1,5 @@
# mako/filters.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/lexer.py b/mako/lexer.py
index 42b9ecd..dca88e1 100644
--- a/mako/lexer.py
+++ b/mako/lexer.py
@@ -1,5 +1,5 @@
# mako/lexer.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/lookup.py b/mako/lookup.py
index 3edd101..3ac21f4 100644
--- a/mako/lookup.py
+++ b/mako/lookup.py
@@ -1,5 +1,5 @@
# mako/lookup.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/parsetree.py b/mako/parsetree.py
index 1c04c26..0612070 100644
--- a/mako/parsetree.py
+++ b/mako/parsetree.py
@@ -1,5 +1,5 @@
# mako/parsetree.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
@@ -437,7 +437,7 @@ class DefTag(Tag):
return self.function_decl.get_argument_expressions(**kw)
def declared_identifiers(self):
- return self.function_decl.argnames
+ return self.function_decl.allargnames
def undeclared_identifiers(self):
res = []
@@ -451,7 +451,7 @@ class DefTag(Tag):
).union(
self.expression_undeclared_identifiers
).difference(
- self.function_decl.argnames
+ self.function_decl.allargnames
)
class BlockTag(Tag):
@@ -502,7 +502,7 @@ class BlockTag(Tag):
return self.body_decl.get_argument_expressions(**kw)
def declared_identifiers(self):
- return self.body_decl.argnames
+ return self.body_decl.allargnames
def undeclared_identifiers(self):
return (self.filter_args.\
@@ -524,7 +524,7 @@ class CallTag(Tag):
**self.exception_kwargs)
def declared_identifiers(self):
- return self.code.declared_identifiers.union(self.body_decl.argnames)
+ return self.code.declared_identifiers.union(self.body_decl.allargnames)
def undeclared_identifiers(self):
return self.code.undeclared_identifiers.\
@@ -554,7 +554,7 @@ class CallNamespaceTag(Tag):
**self.exception_kwargs)
def declared_identifiers(self):
- return self.code.declared_identifiers.union(self.body_decl.argnames)
+ return self.code.declared_identifiers.union(self.body_decl.allargnames)
def undeclared_identifiers(self):
return self.code.undeclared_identifiers.\
@@ -589,6 +589,6 @@ class PageTag(Tag):
**self.exception_kwargs)
def declared_identifiers(self):
- return self.body_decl.argnames
+ return self.body_decl.allargnames
diff --git a/mako/pygen.py b/mako/pygen.py
index ed7ccc7..cba9464 100644
--- a/mako/pygen.py
+++ b/mako/pygen.py
@@ -1,5 +1,5 @@
# mako/pygen.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/pyparser.py b/mako/pyparser.py
index 75301cc..aa2d882 100644
--- a/mako/pyparser.py
+++ b/mako/pyparser.py
@@ -1,5 +1,5 @@
# mako/pyparser.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
@@ -214,13 +214,25 @@ if _ast:
def visit_FunctionDef(self, node):
self.listener.funcname = node.name
+
argnames = [arg_id(arg) for arg in node.args.args]
if node.args.vararg:
argnames.append(arg_stringname(node.args.vararg))
+
+ if compat.py2k:
+ # kw-only args don't exist in Python 2
+ kwargnames = []
+ else:
+ kwargnames = [arg_id(arg) for arg in node.args.kwonlyargs]
if node.args.kwarg:
- argnames.append(arg_stringname(node.args.kwarg))
+ kwargnames.append(arg_stringname(node.args.kwarg))
self.listener.argnames = argnames
self.listener.defaults = node.args.defaults # ast
+ self.listener.kwargnames = kwargnames
+ if compat.py2k:
+ self.listener.kwdefaults = []
+ else:
+ self.listener.kwdefaults = node.args.kw_defaults
self.listener.varargs = node.args.vararg
self.listener.kwargs = node.args.kwarg
@@ -367,8 +379,13 @@ else:
def visitFunction(self, node, *args):
self.listener.funcname = node.name
- self.listener.argnames = node.argnames
+ self.listener.argnames = list(node.argnames)
+ if node.kwargs:
+ self.listener.kwargnames = [self.listener.argnames.pop()]
+ else:
+ self.listener.kwargnames = []
self.listener.defaults = node.defaults
+ self.listener.kwdefaults = []
self.listener.varargs = node.varargs
self.listener.kwargs = node.kwargs
diff --git a/mako/runtime.py b/mako/runtime.py
index f94c109..5a3489b 100644
--- a/mako/runtime.py
+++ b/mako/runtime.py
@@ -1,5 +1,5 @@
# mako/runtime.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/template.py b/mako/template.py
index 3a7b7f0..00783b7 100644
--- a/mako/template.py
+++ b/mako/template.py
@@ -1,5 +1,5 @@
# mako/template.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/util.py b/mako/util.py
index 0a9e14e..0108109 100644
--- a/mako/util.py
+++ b/mako/util.py
@@ -1,5 +1,5 @@
# mako/util.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
#
# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/scripts/mako-render b/scripts/mako-render
index a28f3aa..122589f 100644..100755
--- a/scripts/mako-render
+++ b/scripts/mako-render
@@ -1,11 +1,11 @@
#!/usr/bin/env python
-def render(data, filename, kw):
+def render(data, kw, lookup_dirs):
from mako.template import Template
from mako.lookup import TemplateLookup
- lookup = TemplateLookup(["."])
- return Template(data, filename, lookup=lookup).render(**kw)
+ lookup = TemplateLookup(lookup_dirs)
+ return Template(data, lookup=lookup).render(**kw)
def varsplit(var):
if "=" not in var:
@@ -13,7 +13,7 @@ def varsplit(var):
return var.split("=", 1)
def main(argv=None):
- from os.path import isfile
+ from os.path import isfile, dirname
from sys import stdin
if argv is None:
@@ -25,6 +25,12 @@ def main(argv=None):
parser = OptionParser("usage: %prog [FILENAME]")
parser.add_option("--var", default=[], action="append",
help="variable (can be used multiple times, use name=value)")
+ parser.add_option("--template-dir", default=[], action="append",
+ help="Directory to use for template lookup (multiple "
+ "directories may be provided). If not given then if the "
+ "template is read from stdin, the value defaults to be "
+ "the current directory, otherwise it defaults to be the "
+ "parent directory of the file provided.")
opts, args = parser.parse_args(argv[1:])
if len(args) not in (0, 1):
@@ -32,15 +38,17 @@ def main(argv=None):
if (len(args) == 0) or (args[0] == "-"):
fo = stdin
+ lookup_dirs = opts.template_dir or ["."]
else:
filename = args[0]
if not isfile(filename):
raise SystemExit("error: can't find %s" % filename)
fo = open(filename)
+ lookup_dirs = opts.template_dir or [dirname(filename)]
kw = dict([varsplit(var) for var in opts.var])
data = fo.read()
- print(render(data, filename, kw))
+ print(render(data, kw, lookup_dirs=lookup_dirs))
if __name__ == "__main__":
main()
diff --git a/setup.cfg b/setup.cfg
index 3343ba9..c933a4d 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -2,6 +2,9 @@
tag_build = dev
+[wheel]
+universal = 1
+
[upload]
sign = 1
-identity = C4DAFEE1 \ No newline at end of file
+identity = C4DAFEE1
diff --git a/test/__init__.py b/test/__init__.py
index 623edcf..f114f64 100644
--- a/test/__init__.py
+++ b/test/__init__.py
@@ -96,6 +96,9 @@ def skip_if(predicate, reason=None):
return function_named(maybe, fn_name)
return decorate
+def requires_python_3(fn):
+ return skip_if(lambda: not py3k, "Requires Python 3.xx")(fn)
+
def requires_python_2(fn):
return skip_if(lambda: py3k, "Requires Python 2.xx")(fn)
diff --git a/test/templates/gettext.mako b/test/templates/gettext.mako
index 367af55..ad07c5d 100644
--- a/test/templates/gettext.mako
+++ b/test/templates/gettext.mako
@@ -88,3 +88,12 @@ ${_(u'bar')}
</%def>
+## TRANSLATOR: <p> tag is ok?
+<p>${_("Inside a p tag")}</p>
+
+## TRANSLATOR: also this
+<p>${even_with_other_code_first()} - ${_("Later in a p tag")}</p>
+
+## TRANSLATOR: we still ignore comments too far from the string
+
+<p>${_("No action at a distance.")}</p>
diff --git a/test/test_ast.py b/test/test_ast.py
index be93751..9f9ec10 100644
--- a/test/test_ast.py
+++ b/test/test_ast.py
@@ -1,7 +1,7 @@
import unittest
from mako import ast, exceptions, pyparser, util, compat
-from test import eq_, requires_python_2
+from test import eq_, requires_python_2, requires_python_3
exception_kwargs = {
'source': '',
@@ -263,6 +263,8 @@ import x as bar
eq_(parsed.funcname, 'foo')
eq_(parsed.argnames,
['a', 'b', 'c', 'd', 'e', 'f'])
+ eq_(parsed.kwargnames,
+ [])
def test_function_decl_2(self):
"""test getting the arguments from a function"""
@@ -270,7 +272,20 @@ import x as bar
parsed = ast.FunctionDecl(code, **exception_kwargs)
eq_(parsed.funcname, 'foo')
eq_(parsed.argnames,
- ['a', 'b', 'c', 'args', 'kwargs'])
+ ['a', 'b', 'c', 'args'])
+ eq_(parsed.kwargnames,
+ ['kwargs'])
+
+ @requires_python_3
+ def test_function_decl_3(self):
+ """test getting the arguments from a fancy py3k function"""
+ code = "def foo(a, b, *c, d, e, **f):pass"
+ parsed = ast.FunctionDecl(code, **exception_kwargs)
+ eq_(parsed.funcname, 'foo')
+ eq_(parsed.argnames,
+ ['a', 'b', 'c'])
+ eq_(parsed.kwargnames,
+ ['d', 'e', 'f'])
def test_expr_generate(self):
"""test the round trip of expressions to AST back to python source"""
diff --git a/test/test_babelplugin.py b/test/test_babelplugin.py
index 4118f4a..023433d 100644
--- a/test/test_babelplugin.py
+++ b/test/test_babelplugin.py
@@ -13,8 +13,8 @@ import os
class ExtractMakoTestCase(TemplateTest):
- @skip_if(lambda: not babel, 'babel not installed: skipping babelplugin test')
+ @skip_if(lambda: not babel, 'babel not installed: skipping babelplugin test')
def test_extract(self):
mako_tmpl = open(os.path.join(template_base, 'gettext.mako'))
messages = list(extract(mako_tmpl, {'_': None, 'gettext': None,
@@ -40,7 +40,10 @@ class ExtractMakoTestCase(TemplateTest):
(77, '_', 'Top', []),
(83, '_', 'foo', []),
(83, '_', 'hoho', []),
- (85, '_', 'bar', [])
+ (85, '_', 'bar', []),
+ (92, '_', 'Inside a p tag', ['TRANSLATOR: <p> tag is ok?']),
+ (95, '_', 'Later in a p tag', ['TRANSLATOR: also this']),
+ (99, '_', 'No action at a distance.', []),
]
self.assertEqual(expected, messages)
diff --git a/test/test_def.py b/test/test_def.py
index 16de067..8b32561 100644
--- a/test/test_def.py
+++ b/test/test_def.py
@@ -2,7 +2,7 @@ from mako.template import Template
from mako import lookup
from test import TemplateTest
from test.util import flatten_result, result_lines
-from test import eq_, assert_raises
+from test import eq_, assert_raises, requires_python_3
from mako import compat
class DefTest(TemplateTest):
@@ -45,6 +45,19 @@ class DefTest(TemplateTest):
"""hello mycomp hi, 5, 6"""
)
+ @requires_python_3
+ def test_def_py3k_args(self):
+ template = Template("""
+ <%def name="kwonly(one, two, *three, four, five=5, **six)">
+ look at all these args: ${one} ${two} ${three[0]} ${four} ${five} ${six['seven']}
+ </%def>
+
+ ${kwonly('one', 'two', 'three', four='four', seven='seven')}""")
+ eq_(
+ template.render(one=1, two=2, three=(3,), six=6).strip(),
+ """look at all these args: one two three four 5 seven"""
+ )
+
def test_inter_def(self):
"""test defs calling each other"""
template = Template("""
diff --git a/test/test_template.py b/test/test_template.py
index 28db06d..6c30c8a 100644
--- a/test/test_template.py
+++ b/test/test_template.py
@@ -13,6 +13,16 @@ from test import TemplateTest, eq_, template_base, module_base, \
requires_python_26_or_greater, assert_raises, assert_raises_message, \
requires_python_2
+class ctx(object):
+ def __init__(self, a, b):
+ pass
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *arg):
+ pass
+
class EncodingTest(TemplateTest):
def test_escapes_html_tags(self):
from mako.exceptions import html_error_template
@@ -875,11 +885,12 @@ class ControlTest(TemplateTest):
def test_blank_control_8(self):
self._do_memory_test(
"""
- % with open('x', 'w') as fp:
+ % with ctx('x', 'w') as fp:
% endwith
""",
"",
- filters=lambda s:s.strip()
+ filters=lambda s: s.strip(),
+ template_args={"ctx": ctx}
)
def test_commented_blank_control_1(self):
@@ -973,12 +984,13 @@ class ControlTest(TemplateTest):
def test_commented_blank_control_8(self):
self._do_memory_test(
"""
- % with open('x', 'w') as fp:
+ % with ctx('x', 'w') as fp:
## comment
% endwith
""",
"",
- filters=lambda s:s.strip()
+ filters=lambda s: s.strip(),
+ template_args={"ctx": ctx}
)
def test_multiline_control(self):