diff env/lib/python3.7/site-packages/galaxy/util/template.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.7/site-packages/galaxy/util/template.py	Sat May 02 07:14:21 2020 -0400
@@ -0,0 +1,120 @@
+"""Entry point for the usage of Cheetah templating within Galaxy."""
+from __future__ import absolute_import
+
+import sys
+import traceback
+from lib2to3.refactor import RefactoringTool
+
+import packaging.version
+from Cheetah.Compiler import Compiler
+from Cheetah.NameMapper import NotFound
+from Cheetah.Template import Template
+from past.translation import myfixes
+
+from . import unicodify
+
+# Skip libpasteurize fixers, which make sure code is py2 and py3 compatible.
+# This is not needed, we only translate code on py3.
+if sys.version_info.major > 2:
+    myfixes = [f for f in myfixes if not f.startswith('libpasteurize')]
+    refactoring_tool = RefactoringTool(myfixes, {'print_function': True})
+else:
+    myfixes = refactoring_tool = None
+
+
+class FixedModuleCodeCompiler(Compiler):
+
+    module_code = None
+
+    def getModuleCode(self):
+        self._moduleDef = self.module_code
+        return self._moduleDef
+
+
+def create_compiler_class(module_code):
+
+    class CustomCompilerClass(FixedModuleCodeCompiler):
+        pass
+
+    setattr(CustomCompilerClass, 'module_code', module_code)
+
+    return CustomCompilerClass
+
+
+def fill_template(template_text,
+                  context=None,
+                  retry=10,
+                  compiler_class=Compiler,
+                  first_exception=None,
+                  futurized=False,
+                  python_template_version='3',
+                  **kwargs):
+    """Fill a cheetah template out for specified context.
+
+    If template_text is None, an exception will be thrown, if context
+    is None (the default) - keyword arguments to this function will be used
+    as the context.
+    """
+    if template_text is None:
+        raise TypeError("Template text specified as None to fill_template.")
+    if not context:
+        context = kwargs
+    if isinstance(python_template_version, str):
+        python_template_version = packaging.version.parse(python_template_version)
+    klass = Template.compile(source=template_text, compilerClass=compiler_class)
+    t = klass(searchList=[context])
+    try:
+        return unicodify(t)
+    except NotFound as e:
+        if first_exception is None:
+            first_exception = e
+        if refactoring_tool and python_template_version.release[0] < 3 and retry > 0:
+            tb = e.__traceback__
+            last_stack = traceback.extract_tb(tb)[-1]
+            if last_stack.name == '<listcomp>':
+                # On python 3 list, dict and set comprehensions as well as generator expressions
+                # have their own local scope, which prevents accessing frame variables in cheetah.
+                # We can work around this by replacing `$var` with `var`, but we only do this for
+                # list comprehensions, as this has never worked for dict or set comprehensions or
+                # generator expressions in Cheetah.
+                var_not_found = e.args[0].split("'")[1]
+                replace_str = 'VFFSL(SL,"%s",True)' % var_not_found
+                lineno = last_stack.lineno - 1
+                module_code = t._CHEETAH_generatedModuleCode.splitlines()
+                module_code[lineno] = module_code[lineno].replace(replace_str, var_not_found)
+                module_code = "\n".join(module_code)
+                compiler_class = create_compiler_class(module_code)
+                return fill_template(template_text=template_text,
+                                     context=context,
+                                     retry=retry - 1,
+                                     compiler_class=compiler_class,
+                                     first_exception=first_exception,
+                                     python_template_version=python_template_version,
+                                     )
+        raise first_exception or e
+    except Exception as e:
+        if first_exception is None:
+            first_exception = e
+        if sys.version_info.major > 2 and python_template_version.release[0] < 3 and not futurized:
+            # Possibly an error caused by attempting to run python 2
+            # template code on python 3. Run the generated module code
+            # through futurize and hope for the best.
+            module_code = t._CHEETAH_generatedModuleCode
+            module_code = futurize_preprocessor(module_code)
+            compiler_class = create_compiler_class(module_code)
+            return fill_template(template_text=template_text,
+                                 context=context,
+                                 retry=retry,
+                                 compiler_class=compiler_class,
+                                 first_exception=first_exception,
+                                 futurized=True,
+                                 python_template_version=python_template_version,
+                                 )
+        raise first_exception or e
+
+
+def futurize_preprocessor(source):
+    source = str(refactoring_tool.refactor_string(source, name='auto_translate_cheetah'))
+    # libfuturize.fixes.fix_unicode_keep_u' breaks from Cheetah.compat import unicode
+    source = source.replace('from Cheetah.compat import str', 'from Cheetah.compat import unicode')
+    return source