===============
+Version 2.11
+------------
+
+unreleased
+
+- Async support is only loaded the first time an
+ :class:`~environment.Environment` enables it, in order to avoid a
+ slow initial import. (`#765`_)
+- Python 2.6 and 3.3 are not supported anymore.
+- The ``map`` filter in async mode now automatically awaits
+- Added a new ``ChainableUndefined`` class to support getitem
+ and getattr on an undefined object. (`#977`_)
+
+.. _#765: https://github.com/pallets/jinja/issues/765
+.. _#977: https://github.com/pallets/jinja/issues/977
+
+
+ Version 2.10.2
+ --------------
+
+ _Unreleased_
+
+ - Fix Python 3.7 deprecation warnings.
+
Version 2.10.1
--------------
The `else` part is optional. If not provided, the else block implicitly
evaluates into an undefined object:
-.. sourcecode:: jinja
+.. code-block:: text
- {{ '[%s]' % page.title if page.title }}
+ {{ ('[%s]' % page.title) if page.title }}
+ .. _python-methods:
+
+ Python Methods
+ ~~~~~~~~~~~~~~
+
+ You can also use any of the methods of defined on a variable's type.
+ The value returned from the method invocation is used as the value of the expression.
+ Here is an example that uses methods defined on strings (where ``page.title`` is a string):
+
+ .. code-block:: text
+
+ {{ page.title.capitalize() }}
+
+ This also works for methods on user-defined types.
+ For example, if variable ``f`` of type ``Foo`` has a method ``bar`` defined on it,
+ you can do the following:
+
+ .. code-block:: text
+
+ {{ f.bar() }}
+
+
.. _builtin-filters:
List of Builtin Filters