]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Added untested support for imports and includes in async mode
authorArmin Ronacher <armin.ronacher@active-4.com>
Wed, 28 Dec 2016 14:33:14 +0000 (15:33 +0100)
committerArmin Ronacher <armin.ronacher@active-4.com>
Wed, 28 Dec 2016 14:33:14 +0000 (15:33 +0100)
jinja2/asyncsupport.py
jinja2/compiler.py
jinja2/environment.py

index e42a7131085b5ab91583327f98138c7ed9c9bfd5..765c3137acad5ccd682803547b6d3358c92886ca 100644 (file)
@@ -64,6 +64,13 @@ async def get_default_module_async(self):
     return rv
 
 
+@internalcode
+def get_default_module_impl(self):
+    if self.environment._async:
+        return self._get_default_module_async()
+    return self._get_default_module()
+
+
 def wrap_default_module(original_default_module):
     @internalcode
     def _get_default_module(self):
@@ -89,6 +96,7 @@ def patch_template():
     Template._get_default_module = wrap_default_module(
         Template._get_default_module)
     Template._get_default_module_async = get_default_module_async
+    Template._get_default_module_impl = get_default_module_impl
     Template.make_module_async = make_module_async
 
 
index 1d9d5059abd0f2a8ae53dc68ed45f2a7e263dbad..cd5c1cec7df93e479155f207c5d7923acc55e92b 100644 (file)
@@ -977,8 +977,8 @@ class CodeGenerator(NodeVisitor):
                            'template.new_context(context.parent, True, '
                            'locals())):' % loop)
         else:
-            self.writeline('for event in template._get_default_module()'
-                           '._body_stream:')
+            self.writeline('%s event in template._get_default_module_impl()'
+                           '._body_stream:' % loop)
 
         self.indent()
         self.simple_write('event', frame)
@@ -994,13 +994,16 @@ class CodeGenerator(NodeVisitor):
         self.writeline('l_%s = ' % node.target, node)
         if frame.toplevel:
             self.write('context.vars[%r] = ' % node.target)
+        if self.environment._async:
+            self.write('await ')
         self.write('environment.get_template(')
         self.visit(node.template, frame)
         self.write(', %r).' % self.name)
         if node.with_context:
-            self.write('make_module(context.parent, True, locals())')
+            self.write('make_module%s(context.parent, True, locals())'
+                       % (self.environment._async and '_async' or ''))
         else:
-            self.write('_get_default_module()')
+            self.write('_get_default_module_impl()')
         if frame.toplevel and not node.target.startswith('_'):
             self.writeline('context.exported_vars.discard(%r)' % node.target)
         frame.assigned_names.add(node.target)
@@ -1008,13 +1011,15 @@ class CodeGenerator(NodeVisitor):
     def visit_FromImport(self, node, frame):
         """Visit named imports."""
         self.newline(node)
-        self.write('included_template = environment.get_template(')
+        self.write('included_template = %senvironment.get_template('
+                   % (self.environment._async and 'await ' or ''))
         self.visit(node.template, frame)
         self.write(', %r).' % self.name)
         if node.with_context:
-            self.write('make_module(context.parent, True)')
+            self.write('make_module%s(context.parent, True)'
+                       % (self.environment._async and '_async' or ''))
         else:
-            self.write('_get_default_module()')
+            self.write('_get_default_module_impl()')
 
         var_names = []
         discarded_names = []
index f91b01dcc83415ca1e6dc42383e3e59d57a8c6b5..1ebb4da2f14cd92601ca66365f498372a149ecd0 100644 (file)
@@ -1042,6 +1042,10 @@ class Template(object):
         self._module = rv = self.make_module()
         return rv
 
+    # This is what the compiler dispatches to from generated code.  It
+    # might get swapped out by the async support
+    _get_default_module_impl = _get_default_module
+
     @property
     def module(self):
         """The template as module.  This is used for imports in the