]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
reformat readme 1042/head
authorDavid Lord <davidism@gmail.com>
Fri, 26 Jul 2019 21:36:55 +0000 (14:36 -0700)
committerDavid Lord <davidism@gmail.com>
Fri, 26 Jul 2019 21:36:55 +0000 (14:36 -0700)
CHANGES.rst

index 4d5ba6deb9152dc0cf082ec576380af270e192bd..7be9103d9da6247b487a7ee54fa7eeaed5d362bc 100644 (file)
 Version 2.9.7
 -------------
 
-(bugfix release, in development)
+Unreleased
 
-- ``tojson`` filter marks output as safe to match documented behavior.
-  (`#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 ..:`  (#759)
+-   ``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`
 
-.. _#718: https://github.com/pallets/jinja/pull/718
 
 Version 2.9.6
 -------------
-(bugfix release, released on April 3rd 2017)
 
-- Fixed custom context behavior in fast resolve mode (#675)
+Released 2017-04-03
+
+-   Fixed custom context behavior in fast resolve mode :issue:`675`
+
 
 Version 2.9.5
 -------------
-(bugfix release, released on January 28th 2017)
-
-- Restored the original repr of the internal `_GroupTuple` because this
-  caused issues with ansible and it was an unintended change.  (#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 (#669)
-- Resolve an issue where the `{% extends %}` tag could not be used with
-  async environments. (#668)
-- Reduce memory footprint slightly by reducing our unicode database dump
-  we use for identifier matching on Python 3 (#666)
-- Fixed autoescaping not working for macros in async compilation mode. (#671)
+
+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
 -------------
-(bugfix release, released on January 10th 2017)
-
-- Solved some warnings for string literals.  (#646)
-- Increment the bytecode cache version which was not done due to an
-  oversight before.
-- Corrected bad code generation and scoping for filtered loops.  (#649)
-- Resolved an issue where top-level output silencing after known extend
-  blocks could generate invalid code when blocks where contained in if
-  statements.  (#651)
-- Made the `truncate.leeway` default configurable to improve compatibility
-  with older templates.
+
+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
 -------------
-(bugfix release, released on January 8th 2017)
-
-- 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. (#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 #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.
+
+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
 -------------
-(bugfix release, released on January 8th 2017)
-
-- Fixed a regression that caused for loops to not be able to use the same
-  variable for the target as well as source iterator.  (#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.
-  (#642)
+
+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
 -------------
-(bugfix release, released on January 7th 2017)
 
-- 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.
+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
 -----------
-(codename Derivation, released on January 7th 2017)
-
-- 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 Jinja2
-  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.
-
-Version 2.8.2
--------------
 
-(bugfix release, unreleased)
+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
+    Jinja2 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.
 
-- Fixed a runtime error in the sandbox when attributes of async generators
-  were accessed.
 
 Version 2.8.1
 -------------
 
-(bugfix release, released on December 29th 2016)
+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.
 
-- 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
 -----------
-(codename Replacement, released on July 26th 2015)
-
-- 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 Jinja2 enforces strings to be native strings in
-  Python 2 to work when people break their default encoding.
-- Added :func:`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) %}...{% endmacro %}`` 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`) (pull request ``#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.
+
+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 Jinja2 enforces strings to be native strings in Python 2
+    to work when people break their default encoding.
+-   Added :func:`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``) (pull request
+    ``:issue:`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
 -------------
-(bugfix release, released on June 6th 2014)
 
-- Security issue: Corrected the security fix for the cache folder.  This
-  fix was provided by RedHat.
+Released 2014-06-06
+
+-   Security issue: Corrected the security fix for the cache folder.
+    This fix was provided by RedHat.
+
 
 Version 2.7.2
 -------------
-(bugfix release, released on January 10th 2014)
 
-- 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.
+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
 -------------
-(bugfix release, released on August 7th 2013)
-
-- 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.
+
+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
 -----------
-(codename Translation, released on May 20th 2013)
-
-- 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.
+
+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
 -----------
-(codename Convolution, released on July 24th 2011)
-
-- 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 Jinja2 versions here was not a Jinja2 bug but a limitation in
-  the underlying Python interpreter.  If you notice Jinja2 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, Jinja2 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.
+
+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 Jinja2 versions here was not a
+    Jinja2 bug but a limitation in the underlying Python interpreter. If
+    you notice Jinja2 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,
+    Jinja2 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
 -------------
-(re-release of 2.5.4 with built documentation removed for filesize.
- Released on October 18th 2010)
 
-- built documentation is no longer part of release.
+Released 2010-10-18
+
+-   Built documentation is no longer part of release.
+
 
 Version 2.5.4
 -------------
-(bugfix release, released on October 17th 2010)
 
-- Fixed extensions not loading properly with overlays.
-- Work around a bug in cpython for the debugger that causes segfaults
-  on 64bit big-endian architectures.
+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
 -------------
-(bugfix release, released on October 17th 2010)
 
-- 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)".
+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
 -------------
-(bugfix release, released on August 18th 2010)
 
-- 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.
+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
 -------------
-(bugfix release, released on August 17th 2010)
-
-- 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 Jinja2 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.
+
+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 Jinja2 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
 -----------
-(codename Incoherence, released on May 29th 2010)
 
-- 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. (:ref:`newstyle-gettext`)
-- it's now possible to register extensions after an environment
-  was created.
+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.
+    (:ref:`newstyle-gettext`)
+-   It's now possible to register extensions after an environment was
+    created.
+
 
 Version 2.4.1
 -------------
-(bugfix release, released on April 20th 2010)
 
-- fixed an error reporting bug for undefineds.
+Released 2010-04-20
+
+-   Fixed an error reporting bug for undefined.
+
 
 Version 2.4
 -----------
-(codename Correlation, released on April 13th 2010)
-
-- 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 :class:`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 (:ref:`eval-context`).
-- extensions have a priority now.
 
-Version 2.3.1
--------------
-(bugfix release, released on February 19th 2010)
+Released 2010-04-13, codename Correlation
 
-- fixed an error reporting bug on all python versions
-- fixed an error reporting bug on Python 2.4
+-   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 :class:`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 (:ref:`eval-context`).
+-   Extensions have a priority now.
 
-Version 2.3
------------
-(3000 Pythons, released on February 10th 2010)
-
-- 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 (#360).
-- greatly improved error message reporting (#339)
-- implicit tuple expressions can no longer be totally empty.
-  This change makes ``{% if %}...{% endif %}`` a syntax error
-  now. (#364)
-- added support for translator comments if extracted via babel.
-- added with-statement extension.
-- experimental Python 3 support.
 
-Version 2.2.1
+Version 2.3.1
 -------------
-(bugfix release, released on September 14th 2009)
 
-- fixes some smaller problems for Jinja2 on Jython.
+Released 2010-02-19
 
-Version 2.2
------------
-(codename Kong, released on September 13th 2009)
-
-- 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 (#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.  (#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
--------------
-(Bugfix release)
+-   Fixed an error reporting bug on all python versions
+-   Fixed an error reporting bug on Python 2.4
 
-- Fixed a translation error caused by looping over empty recursive loops.
 
-Version 2.1
+Version 2.3
 -----------
-(codename Yasuzō, released on November 23rd 2008)
-
-- 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.
+Released 2010-02-10, codename 3000 Pythons
 
-- fixed a limitation in the lexer that made ``{{ foo.0.0 }}`` impossible.
+-   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.
 
-- 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.
+Version 2.2.1
+-------------
 
-- fixed a confusing behavior with conditional extending.  loops were partially
-  executed under some conditions even though they were not part of a visible
-  area.
+Released 2009-09-14
 
-- added `sort` filter that works like `dictsort` but for arbitrary sequences.
+-   Fixes some smaller problems for Jinja2 on Jython.
 
-- fixed a bug with empty statements in macros.
 
-- implemented a bytecode cache system.  (:ref:`bytecode-cache`)
+Version 2.2
+-----------
 
-- the template context is now weakref-able
+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.
 
-- inclusions and imports "with context" forward all variables now, not only
-  the initial context.
 
-- added a cycle helper called `cycler`.
+Version 2.1.1
+-------------
 
-- added a joining helper called `joiner`.
+Released 2008-12-25
 
-- added a `compile_expression` method to the environment that allows compiling
-  of Jinja expressions into callable Python objects.
+-   Fixed a translation error caused by looping over empty recursive
+    loops.
 
-- fixed an escaping bug in urlize
 
-Version 2.0
+Version 2.1
 -----------
-(codename jinjavitus, released on July 17th 2008)
-
-- 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
-  :class:`~jinja2.nodes.Getitem` and :class:`~jinja2.nodes.Getattr`.
-
-  For more information see :ref:`the implementation details <notes-on-subscriptions>`.
-
-- 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 :meth:`jinja2.environment.TemplateStream.dump`.
+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. (:ref:`bytecode-cache`)
+-   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
 
-- 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.
+Version 2.0
+-----------
 
-- `filesizeformat` filter uses decimal prefixes now per default and can be
-  set to binary mode with the second parameter.
+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 :class:`~jinja2.nodes.Getitem` and
+    :class:`~jinja2.nodes.Getattr`. For more information see :ref:`the
+    implementation details <notes-on-subscriptions>`.
+-   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 :meth:`jinja2.environment.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
 
-- fixed bug in finalizer
 
 Version 2.0rc1
 --------------
-(no codename, released on June 9th 2008)
 
-- first release of Jinja2
+Released 2008-06-09
+
+-   First release of Jinja2