the environment template loading functions now transparently
authorArmin Ronacher <armin.ronacher@active-4.com>
Tue, 16 Feb 2010 16:35:59 +0000 (17:35 +0100)
committerArmin Ronacher <armin.ronacher@active-4.com>
Tue, 16 Feb 2010 16:35:59 +0000 (17:35 +0100)
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.

--HG--
branch : trunk

CHANGES
docs/templates.rst
jinja2/environment.py
jinja2/testsuite/api.py

diff --git a/CHANGES b/CHANGES
index 8d1b8b65156ea7649bf05f4852815094ef4c0917..26b386e8b963a66bd47107947b5d2c65f740b8b0 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -5,6 +5,11 @@ Version 2.4
 -----------
 (codename to be selected, release date to be decided)
 
+- 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.
+
 Version 2.3
 -----------
 (3000 Pythons, released on February 10th 2010)
index 06a339be54c9493acb737f82fbf9abb90aa271fd..087fb59c5d11d86347dcec6b6f3616095f5ce967 100644 (file)
@@ -409,6 +409,22 @@ modifier to a block declaration::
 When overriding a block the `scoped` modifier does not have to be provided.
 
 
+Template Objects
+~~~~~~~~~~~~~~~~
+
+.. versionchanged:: 2.4
+
+If a template object was passed to the template context you can
+extend from that object as well.  Assuming the calling code passes
+a layout template as `layout_template` to the environment, this
+code works::
+
+    {% extends layout_template %}
+
+Previously the `layout_template` variable had to be a string with
+the layout template's filename for this to work.
+
+
 HTML Escaping
 -------------
 
@@ -776,6 +792,10 @@ Example::
     {% include ['page_detailed.html', 'page.html'] %}
     {% include ['special_sidebar.html', 'sidebar.html'] ignore missing %}
 
+.. versionchanged:: 2.4
+   If a template object was passed to the template context you can
+   include that object using `include`.
+
 .. _import:
 
 Import
@@ -830,6 +850,10 @@ namespace::
 Macros and variables starting with one ore more underscores are private and
 cannot be imported.
 
+.. versionchanged:: 2.4
+   If a template object was passed to the template context you can
+   import from that object.
+
 
 .. _import-visibility:
 
index e3c64e3222a38e05ef773ecd60ecab9ac452caec..4e9e4fd05c77724486b0e996f6da9926dfa9777e 100644 (file)
@@ -552,6 +552,8 @@ class Environment(object):
         If the template does not exist a :exc:`TemplateNotFound` exception is
         raised.
         """
+        if isinstance(name, Template):
+            return name
         if parent is not None:
             name = self.join_path(name, parent)
         return self._load_template(name, self.make_globals(globals))
@@ -569,6 +571,8 @@ class Environment(object):
                                             u'of templates.')
         globals = self.make_globals(globals)
         for name in names:
+            if isinstance(name, Template):
+                return name
             if parent is not None:
                 name = self.join_path(name, parent)
             try:
@@ -588,6 +592,8 @@ class Environment(object):
         """
         if isinstance(template_name_or_list, basestring):
             return self.get_template(template_name_or_list, parent, globals)
+        elif isinstance(template_name_or_list, Template):
+            return template_name_or_list
         return self.select_template(template_name_or_list, parent, globals)
 
     def from_string(self, source, globals=None, template_class=None):
index 2b16facedd6f04efeb0820e98437a2c7bce84f0c..194e9a13ea450ab0b9645e681283d0b21df9f61c 100644 (file)
@@ -17,7 +17,7 @@ from jinja2.testsuite import JinjaTestCase
 
 from jinja2 import Environment, Undefined, DebugUndefined, \
      StrictUndefined, UndefinedError, Template, meta, \
-     is_undefined
+     is_undefined, Template
 from jinja2.utils import Cycler
 
 env = Environment()
@@ -69,6 +69,13 @@ class ExtendedAPITestCase(JinjaTestCase):
         expr = env.compile_expression("42 + foo")
         assert expr(foo=42) == 84
 
+    def test_template_passthrough(self):
+        t = Template('Content')
+        assert env.get_template(t) is t
+        assert env.select_template([t]) is t
+        assert env.get_or_select_template([t]) is t
+        assert env.get_or_select_template(t) is t
+
 
 class MetaTestCase(JinjaTestCase):