.. currentmodule:: jinja2

Version 3.0.0
-------------

Unreleased

-   Drop support for Python 2.7 and 3.5.
-   Bump MarkupSafe dependency to >=1.1.
-   Bump Babel optional dependency to >=2.1.
-   Remove code that was marked deprecated.
-   Use :pep:`451` API to load templates with
    :class:`~loaders.PackageLoader`. :issue:`1168`
-   Fix a bug that caused imported macros to not have access to the
    current template's globals. :issue:`688`
-   Add ability to ignore ``trim_blocks`` using ``+%}``. :issue:`1036`

Version 2.11.2
--------------

Released 2020-04-13

-   Fix a bug that caused callable objects with ``__getattr__``, like
    :class:`~unittest.mock.Mock` to be treated as a
    :func:`contextfunction`. :issue:`1145`
-   Update ``wordcount`` filter to trigger :class:`Undefined` methods
    by wrapping the input in :func:`soft_str`. :pr:`1160`
-   Fix a hang when displaying tracebacks on Python 32-bit.
    :issue:`1162`
-   Showing an undefined error for an object that raises
    ``AttributeError`` on access doesn't cause a recursion error.
    :issue:`1177`
-   Revert changes to :class:`~loaders.PackageLoader` from 2.10 which
    removed the dependency on setuptools and pkg_resources, and added
    limited support for namespace packages. The changes caused issues
    when using Pytest. Due to the difficulty in supporting Python 2 and
    :pep:`451` simultaneously, the changes are reverted until 3.0.
    :pr:`1182`
-   Fix line numbers in error messages when newlines are stripped.
    :pr:`1178`
-   The special ``namespace()`` assignment object in templates works in
    async environments. :issue:`1180`
-   Fix whitespace being removed before tags in the middle of lines when
    ``lstrip_blocks`` is enabled. :issue:`1138`
-   :class:`~nativetypes.NativeEnvironment` doesn't evaluate
    intermediate strings during rendering. This prevents early
    evaluation which could change the value of an expression.
    :issue:`1186`


Version 2.11.1
--------------

Released 2020-01-30

-   Fix a bug that prevented looking up a key after an attribute
    (``{{ data.items[1:] }}``) in an async template. :issue:`1141`


Version 2.11.0
--------------

Released 2020-01-27

-   Drop support for Python 2.6, 3.3, and 3.4. This will be the last
    version to support Python 2.7 and 3.5.
-   Added a new ``ChainableUndefined`` class to support getitem and
    getattr on an undefined object. :issue:`977`
-   Allow ``{%+`` syntax (with NOP behavior) when ``lstrip_blocks`` is
    disabled. :issue:`748`
-   Added a ``default`` parameter for the ``map`` filter. :issue:`557`
-   Exclude environment globals from
    :func:`meta.find_undeclared_variables`. :issue:`931`
-   Float literals can be written with scientific notation, like
    2.56e-3. :issue:`912`, :pr:`922`
-   Int and float literals can be written with the '_' separator for
    legibility, like 12_345. :pr:`923`
-   Fix a bug causing deadlocks in ``LRUCache.setdefault``. :pr:`1000`
-   The ``trim`` filter takes an optional string of characters to trim.
    :pr:`828`
-   A new ``jinja2.ext.debug`` extension adds a ``{% debug %}`` tag to
    quickly dump the current context and available filters and tests.
    :issue:`174`, :pr:`798, 983`
-   Lexing templates with large amounts of whitespace is much faster.
    :issue:`857`, :pr:`858`
-   Parentheses around comparisons are preserved, so
    ``{{ 2 * (3 < 5) }}`` outputs "2" instead of "False".
    :issue:`755`, :pr:`938`
-   Add new ``boolean``, ``false``, ``true``, ``integer`` and ``float``
    tests. :pr:`824`
-   The environment's ``finalize`` function is only applied to the
    output of expressions (constant or not), not static template data.
    :issue:`63`
-   When providing multiple paths to ``FileSystemLoader``, a template
    can have the same name as a directory. :issue:`821`
-   Always return :class:`Undefined` when omitting the ``else`` clause
    in a ``{{ 'foo' if bar }}`` expression, regardless of the
    environment's ``undefined`` class. Omitting the ``else`` clause is a
    valid shortcut and should not raise an error when using
    :class:`StrictUndefined`. :issue:`710`, :pr:`1079`
-   Fix behavior of ``loop`` control variables such as ``length`` and
    ``revindex0`` when looping over a generator. :issue:`459, 751, 794`,
    :pr:`993`
-   Async support is only loaded the first time an environment enables
    it, in order to avoid a slow initial import. :issue:`765`
-   In async environments, the ``|map`` filter will await the filter
    call if needed. :pr:`913`
-   In for loops that access ``loop`` attributes, the iterator is not
    advanced ahead of the current iteration unless ``length``,
    ``revindex``, ``nextitem``, or ``last`` are accessed. This makes it
    less likely to break ``groupby`` results. :issue:`555`, :pr:`1101`
-   In async environments, the ``loop`` attributes ``length`` and
    ``revindex`` work for async iterators. :pr:`1101`
-   In async environments, values from attribute/property access will
    be awaited if needed. :pr:`1101`
-   :class:`~loader.PackageLoader` doesn't depend on setuptools or
    pkg_resources. :issue:`970`
-   ``PackageLoader`` has limited support for :pep:`420` namespace
    packages. :issue:`1097`
-   Support :class:`os.PathLike` objects in
    :class:`~loader.FileSystemLoader` and :class:`~loader.ModuleLoader`.
    :issue:`870`
-   :class:`~nativetypes.NativeTemplate` correctly handles quotes
    between expressions. ``"'{{ a }}', '{{ b }}'"`` renders as the tuple
    ``('1', '2')`` rather than the string ``'1, 2'``. :issue:`1020`
-   Creating a :class:`~nativetypes.NativeTemplate` directly creates a
    :class:`~nativetypes.NativeEnvironment` instead of a default
    :class:`Environment`. :issue:`1091`
-   After calling ``LRUCache.copy()``, the copy's queue methods point to
    the correct queue. :issue:`843`
-   Compiling templates always writes UTF-8 instead of defaulting to the
    system encoding. :issue:`889`
-   ``|wordwrap`` filter treats existing newlines as separate paragraphs
    to be wrapped individually, rather than creating short intermediate
    lines. :issue:`175`
-   Add ``break_on_hyphens`` parameter to ``|wordwrap`` filter.
    :issue:`550`
-   Cython compiled functions decorated as context functions will be
    passed the context. :pr:`1108`
-   When chained comparisons of constants are evaluated at compile time,
    the result follows Python's behavior of returning ``False`` if any
    comparison returns ``False``, rather than only the last one.
    :issue:`1102`
-   Tracebacks for exceptions in templates show the correct line numbers
    and source for Python >= 3.7. :issue:`1104`
-   Tracebacks for template syntax errors in Python 3 no longer show
    internal compiler frames. :issue:`763`
-   Add a ``DerivedContextReference`` node that can be used by
    extensions to get the current context and local variables such as
    ``loop``. :issue:`860`
-   Constant folding during compilation is applied to some node types
    that were previously overlooked. :issue:`733`
-   ``TemplateSyntaxError.source`` is not empty when raised from an
    included template. :issue:`457`
-   Passing an ``Undefined`` value to ``get_template`` (such as through
    ``extends``, ``import``, or ``include``), raises an
    ``UndefinedError`` consistently. ``select_template`` will show the
    undefined message in the list of attempts rather than the empty
    string. :issue:`1037`
-   ``TemplateSyntaxError`` can be pickled. :pr:`1117`


Version 2.10.3
--------------

Released 2019-10-04

-   Fix a typo in Babel entry point in ``setup.py`` that was preventing
    installation.


Version 2.10.2
--------------

Released 2019-10-04

-   Fix Python 3.7 deprecation warnings.
-   Using ``range`` in the sandboxed environment uses ``xrange`` on
    Python 2 to avoid memory use. :issue:`933`
-   Use Python 3.7's better traceback support to avoid a core dump when
    using debug builds of Python 3.7. :issue:`1050`


Version 2.10.1
--------------

Released 2019-04-06

-   ``SandboxedEnvironment`` securely handles ``str.format_map`` in
    order to prevent code execution through untrusted format strings.
    The sandbox already handled ``str.format``.


Version 2.10
------------

Released 2017-11-08

-   Added a new extension node called ``OverlayScope`` which can be used
    to create an unoptimized scope that will look up all variables from
    a derived context.
-   Added an ``in`` test that works like the in operator. This can be
    used in combination with ``reject`` and ``select``.
-   Added ``previtem`` and ``nextitem`` to loop contexts, providing
    access to the previous/next item in the loop. If such an item does
    not exist, the value is undefined.
-   Added ``changed(*values)`` to loop contexts, providing an easy way
    of checking whether a value has changed since the last iteration (or
    rather since the last call of the method)
-   Added a ``namespace`` function that creates a special object which
    allows attribute assignment using the ``set`` tag. This can be used
    to carry data across scopes, e.g. from a loop body to code that
    comes after the loop.
-   Added a ``trimmed`` modifier to ``{% trans %}`` to strip linebreaks
    and surrounding whitespace. Also added a new policy to enable this
    for all ``trans`` blocks.
-   The ``random`` filter is no longer incorrectly constant folded and
    will produce a new random choice each time the template is rendered.
    :pr:`478`
-   Added a ``unique`` filter. :pr:`469`
-   Added ``min`` and ``max`` filters. :pr:`475`
-   Added tests for all comparison operators: ``eq``, ``ne``, ``lt``,
    ``le``, ``gt``, ``ge``. :pr:`665`
-   ``import`` statement cannot end with a trailing comma. :pr:`617`,
    :pr:`618`
-   ``indent`` filter will not indent blank lines by default. :pr:`685`
-   Add ``reverse`` argument for ``dictsort`` filter. :pr:`692`
-   Add a ``NativeEnvironment`` that renders templates to native Python
    types instead of strings. :pr:`708`
-   Added filter support to the block ``set`` tag. :pr:`489`
-   ``tojson`` filter marks output as safe to match documented behavior.
    :pr:`718`
-   Resolved a bug where getting debug locals for tracebacks could
    modify template context.
-   Fixed a bug where having many ``{% elif ... %}`` blocks resulted in
    a "too many levels of indentation" error. These blocks now compile
    to native ``elif ..:`` instead of ``else: if ..:`` :issue:`759`


Version 2.9.6
-------------

Released 2017-04-03

-   Fixed custom context behavior in fast resolve mode :issue:`675`


Version 2.9.5
-------------

Released 2017-01-28

-   Restored the original repr of the internal ``_GroupTuple`` because
    this caused issues with ansible and it was an unintended change.
    :issue:`654`
-   Added back support for custom contexts that override the old
    ``resolve`` method since it was hard for people to spot that this
    could cause a regression.
-   Correctly use the buffer for the else block of for loops. This
    caused invalid syntax errors to be caused on 2.x and completely
    wrong behavior on Python 3 :issue:`669`
-   Resolve an issue where the ``{% extends %}`` tag could not be used
    with async environments. :issue:`668`
-   Reduce memory footprint slightly by reducing our unicode database
    dump we use for identifier matching on Python 3 :issue:`666`
-   Fixed autoescaping not working for macros in async compilation mode.
    :issue:`671`


Version 2.9.4
-------------

Released 2017-01-10

-   Solved some warnings for string literals. :issue:`646`
-   Increment the bytecode cache version which was not done due to an
    oversight before.
-   Corrected bad code generation and scoping for filtered loops.
    :issue:`649`
-   Resolved an issue where top-level output silencing after known
    extend blocks could generate invalid code when blocks where
    contained in if statements. :issue:`651`
-   Made the ``truncate.leeway`` default configurable to improve
    compatibility with older templates.


Version 2.9.3
-------------

Released 2017-01-08

-   Restored the use of blocks in macros to the extend that was possible
    before. On Python 3 it would render a generator repr instead of the
    block contents. :issue:`645`
-   Set a consistent behavior for assigning of variables in inner scopes
    when the variable is also read from an outer scope. This now sets
    the intended behavior in all situations however it does not restore
    the old behavior where limited assignments to outer scopes was
    possible. For more information and a discussion see :issue:`641`
-   Resolved an issue where ``block scoped`` would not take advantage of
    the new scoping rules. In some more exotic cases a variable
    overriden in a local scope would not make it into a block.
-   Change the code generation of the ``with`` statement to be in line
    with the new scoping rules. This resolves some unlikely bugs in edge
    cases. This also introduces a new internal ``With`` node that can be
    used by extensions.


Version 2.9.2
-------------

Released 2017-01-08

-   Fixed a regression that caused for loops to not be able to use the
    same variable for the target as well as source iterator.
    :issue:`640`
-   Add support for a previously unknown behavior of macros. It used to
    be possible in some circumstances to explicitly provide a caller
    argument to macros. While badly buggy and unintended it turns out
    that this is a common case that gets copy pasted around. To not
    completely break backwards compatibility with the most common cases
    it's now possible to provide an explicit keyword argument for caller
    if it's given an explicit default. :issue:`642`


Version 2.9.1
-------------

Released 2017-01-07

-   Resolved a regression with call block scoping for macros. Nested
    caller blocks that used the same identifiers as outer macros could
    refer to the wrong variable incorrectly.


Version 2.9
-----------

Released 2017-01-07, codename Derivation

-   Change cache key definition in environment. This fixes a performance
    regression introduced in 2.8.
-   Added support for ``generator_stop`` on supported Python versions
    (Python 3.5 and later)
-   Corrected a long standing issue with operator precedence of math
    operations not being what was expected.
-   Added support for Python 3.6 async iterators through a new async
    mode.
-   Added policies for filter defaults and similar things.
-   Urlize now sets "rel noopener" by default.
-   Support attribute fallback for old-style classes in 2.x.
-   Support toplevel set statements in extend situations.
-   Restored behavior of Cycler for Python 3 users.
-   Subtraction now follows the same behavior as other operators on
    undefined values.
-   ``map`` and friends will now give better error messages if you
    forgot to quote the parameter.
-   Depend on MarkupSafe 0.23 or higher.
-   Improved the ``truncate`` filter to support better truncation in
    case the string is barely truncated at all.
-   Change the logic for macro autoescaping to be based on the runtime
    autoescaping information at call time instead of macro define time.
-   Ported a modified version of the ``tojson`` filter from Flask to
    Jinja and hooked it up with the new policy framework.
-   Block sets are now marked ``safe`` by default.
-   On Python 2 the asciification of ASCII strings can now be disabled
    with the ``compiler.ascii_str`` policy.
-   Tests now no longer accept an arbitrary expression as first argument
    but a restricted one. This means that you can now properly use
    multiple tests in one expression without extra parentheses. In
    particular you can now write ``foo is divisibleby 2 or foo is
    divisibleby 3`` as you would expect.
-   Greatly changed the scoping system to be more consistent with what
    template designers and developers expect. There is now no more magic
    difference between the different include and import constructs.
    Context is now always propagated the same way. The only remaining
    differences is the defaults for ``with context`` and ``without
    context``.
-   The ``with`` and ``autoescape`` tags are now built-in.
-   Added the new ``select_autoescape`` function which helps configuring
    better autoescaping easier.
-   Fixed a runtime error in the sandbox when attributes of async
    generators were accessed.


Version 2.8.1
-------------

Released 2016-12-29

-   Fixed the ``for_qs`` flag for ``urlencode``.
-   Fixed regression when applying ``int`` to non-string values.
-   SECURITY: if the sandbox mode is used format expressions are now
    sandboxed with the same rules as in Jinja. This solves various
    information leakage problems that can occur with format strings.


Version 2.8
-----------

Released 2015-07-26, codename Replacement

-   Added ``target`` parameter to urlize function.
-   Added support for ``followsymlinks`` to the file system loader.
-   The truncate filter now counts the length.
-   Added equalto filter that helps with select filters.
-   Changed cache keys to use absolute file names if available instead
    of load names.
-   Fixed loop length calculation for some iterators.
-   Changed how Jinja enforces strings to be native strings in Python 2
    to work when people break their default encoding.
-   Added ``make_logging_undefined`` which returns an undefined
    object that logs failures into a logger.
-   If unmarshalling of cached data fails the template will be reloaded
    now.
-   Implemented a block ``set`` tag.
-   Default cache size was increased to 400 from a low 50.
-   Fixed ``is number`` test to accept long integers in all Python
    versions.
-   Changed ``is number`` to accept Decimal as a number.
-   Added a check for default arguments followed by non-default
    arguments. This change makes ``{% macro m(x, y=1, z) %}`` a syntax
    error. The previous behavior for this code was broken anyway
    (resulting in the default value being applied to ``y``).
-   Add ability to use custom subclasses of
    ``jinja2.compiler.CodeGenerator`` and ``jinja2.runtime.Context`` by
    adding two new attributes to the environment
    (``code_generator_class`` and ``context_class``). :pr:`404`
-   Added support for context/environment/evalctx decorator functions on
    the finalize callback of the environment.
-   Escape query strings for urlencode properly. Previously slashes were
    not escaped in that place.
-   Add 'base' parameter to 'int' filter.


Version 2.7.3
-------------

Released 2014-06-06

-   Security issue: Corrected the security fix for the cache folder.
    This fix was provided by RedHat.


Version 2.7.2
-------------

Released 2014-01-10

-   Prefix loader was not forwarding the locals properly to inner
    loaders. This is now fixed.
-   Security issue: Changed the default folder for the filesystem cache
    to be user specific and read and write protected on UNIX systems.
    See `Debian bug 734747`_ for more information.

.. _Debian bug 734747: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=734747


Version 2.7.1
-------------

Released 2013-08-07

-   Fixed a bug with ``call_filter`` not working properly on environment
    and context filters.
-   Fixed lack of Python 3 support for bytecode caches.
-   Reverted support for defining blocks in included templates as this
    broke existing templates for users.
-   Fixed some warnings with hashing of undefineds and nodes if Python
    is run with warnings for Python 3.
-   Added support for properly hashing undefined objects.
-   Fixed a bug with the title filter not working on already uppercase
    strings.


Version 2.7
-----------

Released 2013-05-20, codename Translation

-   Choice and prefix loaders now dispatch source and template lookup
    separately in order to work in combination with module loaders as
    advertised.
-   Fixed filesizeformat.
-   Added a non-silent option for babel extraction.
-   Added ``urlencode`` filter that automatically quotes values for URL
    safe usage with utf-8 as only supported encoding. If applications
    want to change this encoding they can override the filter.
-   Added ``keep-trailing-newline`` configuration to environments and
    templates to optionally preserve the final trailing newline.
-   Accessing ``last`` on the loop context no longer causes the iterator
    to be consumed into a list.
-   Python requirement changed: 2.6, 2.7 or >= 3.3 are required now,
    supported by same source code, using the "six" compatibility
    library.
-   Allow ``contextfunction`` and other decorators to be applied to
    ``__call__``.
-   Added support for changing from newline to different signs in the
    ``wordwrap`` filter.
-   Added support for ignoring memcache errors silently.
-   Added support for keeping the trailing newline in templates.
-   Added finer grained support for stripping whitespace on the left
    side of blocks.
-   Added ``map``, ``select``, ``reject``, ``selectattr`` and
    ``rejectattr`` filters.
-   Added support for ``loop.depth`` to figure out how deep inside a
    recursive loop the code is.
-   Disabled py_compile for pypy and python 3.


Version 2.6
-----------

Released 2011-07-24, codename Convolution

-   Internal attributes now raise an internal attribute error now
    instead of returning an undefined. This fixes problems when passing
    undefined objects to Python semantics expecting APIs.
-   Traceback support now works properly for PyPy. (Tested with 1.4)
-   Implemented operator intercepting for sandboxed environments. This
    allows application developers to disable builtin operators for
    better security. (For instance limit the mathematical operators to
    actual integers instead of longs)
-   Groupby filter now supports dotted notation for grouping by
    attributes of attributes.
-   Scoped blocks now properly treat toplevel assignments and imports.
    Previously an import suddenly "disappeared" in a scoped block.
-   Automatically detect newer Python interpreter versions before
    loading code from bytecode caches to prevent segfaults on invalid
    opcodes. The segfault in earlier Jinja versions here was not a
    Jinja bug but a limitation in the underlying Python interpreter. If
    you notice Jinja segfaulting in earlier versions after an upgrade
    of the Python interpreter you don't have to upgrade, it's enough to
    flush the bytecode cache. This just no longer makes this necessary,
    Jinja will automatically detect these cases now.
-   The sum filter can now sum up values by attribute. This is a
    backwards incompatible change. The argument to the filter previously
    was the optional starting index which defaults to zero. This now
    became the second argument to the function because it's rarely used.
-   Like sum, sort now also makes it possible to order items by
    attribute.
-   Like sum and sort, join now also is able to join attributes of
    objects as string.
-   The internal eval context now has a reference to the environment.
-   Added a mapping test to see if an object is a dict or an object with
    a similar interface.


Version 2.5.5
-------------

Released 2010-10-18

-   Built documentation is no longer part of release.


Version 2.5.4
-------------

Released 2010-10-17

-   Fixed extensions not loading properly with overlays.
-   Work around a bug in cpython for the debugger that causes segfaults
    on 64bit big-endian architectures.


Version 2.5.3
-------------

Released 2010-10-17

-   Fixed an operator precedence error introduced in 2.5.2. Statements
    like "-foo.bar" had their implicit parentheses applied around the
    first part of the expression ("(-foo).bar") instead of the more
    correct "-(foo.bar)".


Version 2.5.2
-------------

Released 2010-08-18

-   Improved setup.py script to better work with assumptions people
    might still have from it (``--with-speedups``).
-   Fixed a packaging error that excluded the new debug support.


Version 2.5.1
-------------

Released 2010-08-17

-   StopIteration exceptions raised by functions called from templates
    are now intercepted and converted to undefineds. This solves a lot
    of debugging grief. (StopIteration is used internally to abort
    template execution)
-   Improved performance of macro calls slightly.
-   Babel extraction can now properly extract newstyle gettext calls.
-   Using the variable ``num`` in newstyle gettext for something else
    than the pluralize count will no longer raise a :exc:`KeyError`.
-   Removed builtin markup class and switched to markupsafe. For
    backwards compatibility the pure Python implementation still exists
    but is pulled from markupsafe by the Jinja developers. The debug
    support went into a separate feature called "debugsupport" and is
    disabled by default because it is only relevant for Python 2.4
-   Fixed an issue with unary operators having the wrong precedence.


Version 2.5
-----------

Released 2010-05-29, codename Incoherence

-   Improved the sort filter (should have worked like this for a long
    time) by adding support for case insensitive searches.
-   Fixed a bug for getattribute constant folding.
-   Support for newstyle gettext translations which result in a nicer
    in-template user interface and more consistent catalogs.
-   It's now possible to register extensions after an environment was
    created.


Version 2.4.1
-------------

Released 2010-04-20

-   Fixed an error reporting bug for undefined.


Version 2.4
-----------

Released 2010-04-13, codename Correlation

-   The environment template loading functions now transparently pass
    through a template object if it was passed to it. This makes it
    possible to import or extend from a template object that was passed
    to the template.
-   Added a ``ModuleLoader`` that can load templates from
    precompiled sources. The environment now features a method to
    compile the templates from a configured loader into a zip file or
    folder.
-   The _speedups C extension now supports Python 3.
-   Added support for autoescaping toggling sections and support for
    evaluation contexts.
-   Extensions have a priority now.


Version 2.3.1
-------------

Released 2010-02-19

-   Fixed an error reporting bug on all python versions
-   Fixed an error reporting bug on Python 2.4


Version 2.3
-----------

Released 2010-02-10, codename 3000 Pythons

-   Fixes issue with code generator that causes unbound variables to be
    generated if set was used in if-blocks and other small identifier
    problems.
-   Include tags are now able to select between multiple templates and
    take the first that exists, if a list of templates is given.
-   Fixed a problem with having call blocks in outer scopes that have an
    argument that is also used as local variable in an inner frame
    :issue:`360`.
-   Greatly improved error message reporting :pr:`339`
-   Implicit tuple expressions can no longer be totally empty. This
    change makes ``{% if %}`` a syntax error now. :issue:`364`
-   Added support for translator comments if extracted via babel.
-   Added with-statement extension.
-   Experimental Python 3 support.


Version 2.2.1
-------------

Released 2009-09-14

-   Fixes some smaller problems for Jinja on Jython.


Version 2.2
-----------

Released 2009-09-13, codename Kong

-   Include statements can now be marked with ``ignore missing`` to skip
    non existing templates.
-   Priority of ``not`` raised. It's now possible to write ``not foo in
    bar`` as an alias to ``foo not in bar`` like in python. Previously
    the grammar required parentheses (``not (foo in bar)``) which was
    odd.
-   Fixed a bug that caused syntax errors when defining macros or using
    the ``{% call %}`` tag inside loops.
-   Fixed a bug in the parser that made ``{{ foo[1, 2] }}`` impossible.
-   Made it possible to refer to names from outer scopes in included
    templates that were unused in the callers frame :issue:`327`
-   Fixed a bug that caused internal errors if names where used as
    iteration variable and regular variable *after* the loop if that
    variable was unused *before* the loop. :pr:`331`
-   Added support for optional ``scoped`` modifier to blocks.
-   Added support for line-comments.
-   Added the ``meta`` module.
-   Renamed (undocumented) attribute "overlay" to "overlayed" on the
    environment because it was clashing with a method of the same name.
-   Speedup extension is now disabled by default.


Version 2.1.1
-------------

Released 2008-12-25

-   Fixed a translation error caused by looping over empty recursive
    loops.


Version 2.1
-----------

Released 2008-11-23, codename Yasuzō

-   Fixed a bug with nested loops and the special loop variable. Before
    the change an inner loop overwrote the loop variable from the outer
    one after iteration.
-   Fixed a bug with the i18n extension that caused the explicit
    pluralization block to look up the wrong variable.
-   Fixed a limitation in the lexer that made ``{{ foo.0.0 }}``
    impossible.
-   Index based subscribing of variables with a constant value returns
    an undefined object now instead of raising an index error. This was
    a bug caused by eager optimizing.
-   The i18n extension looks up ``foo.ugettext`` now followed by
    ``foo.gettext`` if an translations object is installed. This makes
    dealing with custom translations classes easier.
-   Fixed a confusing behavior with conditional extending. loops were
    partially executed under some conditions even though they were not
    part of a visible area.
-   Added ``sort`` filter that works like ``dictsort`` but for arbitrary
    sequences.
-   Fixed a bug with empty statements in macros.
-   Implemented a bytecode cache system.
-   The template context is now weakref-able
-   Inclusions and imports "with context" forward all variables now, not
    only the initial context.
-   Added a cycle helper called ``cycler``.
-   Added a joining helper called ``joiner``.
-   Added a ``compile_expression`` method to the environment that allows
    compiling of Jinja expressions into callable Python objects.
-   Fixed an escaping bug in urlize


Version 2.0
-----------

Released 2008-07-17, codename Jinjavitus

-   The subscribing of objects (looking up attributes and items) changed
    from slightly. It's now possible to give attributes or items a
    higher priority by either using dot-notation lookup or the bracket
    syntax. This also changed the AST slightly. ``Subscript`` is gone
    and was replaced with ``Getitem`` and ``Getattr``.
-   Added support for preprocessing and token stream filtering for
    extensions. This would allow extensions to allow simplified gettext
    calls in template data and something similar.
-   Added ``TemplateStream.dump``.
-   Added missing support for implicit string literal concatenation.
    ``{{ "foo" "bar" }}`` is equivalent to ``{{ "foobar" }}``
-   ``else`` is optional for conditional expressions. If not given it
    evaluates to ``false``.
-   Improved error reporting for undefined values by providing a
    position.
-   ``filesizeformat`` filter uses decimal prefixes now per default and
    can be set to binary mode with the second parameter.
-   Fixed bug in finalizer


Version 2.0rc1
--------------

Released 2008-06-09

-   First release of Jinja 2.
