diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f665a20c..0e22335a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,6 +7,12 @@ Change log Added ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +#. `#90 `_: Dynamically import + modules of extensions in order to support third-party extensions + +Added +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + #. `#165 `_: Copy as plugins Added diff --git a/moban/jinja2/engine.py b/moban/jinja2/engine.py index 1244a816..7f4fb376 100644 --- a/moban/jinja2/engine.py +++ b/moban/jinja2/engine.py @@ -1,3 +1,5 @@ +from importlib import import_module + from jinja2 import Template, Environment, FileSystemLoader from lml.loader import scan_plugins_regex from lml.plugin import PluginInfo, PluginManager @@ -74,6 +76,7 @@ def __init__(self, template_dirs, extensions=None): if is_extension_list_valid(extensions): # because it is modified here env_params["extensions"] += extensions + import_module_of_extension(extensions) self.jj2_environment = Environment(**env_params) for filter_name, filter_function in FILTERS.get_all(): self.jj2_environment.filters[filter_name] = filter_function @@ -136,3 +139,12 @@ def is_extension_list_valid(extensions): and isinstance(extensions, list) and len(extensions) > 0 ) + + +def import_module_of_extension(extensions): + modules = set() + if extensions: + for extension in extensions: + modules.add(extension.split('.')[0]) + for module in modules: + import_module(module) diff --git a/tests/requirements.txt b/tests/requirements.txt index 6384b83a..c50f48dc 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -8,4 +8,4 @@ black;python_version>="3.6" isort;python_version>="3.6" moban-handlebars pypi-mobans-pkg - +jinja2_time diff --git a/tests/test_engine.py b/tests/test_engine.py index 679732f2..11d75586 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -1,3 +1,4 @@ +import sys import os from mock import patch @@ -6,7 +7,11 @@ import moban.exceptions as exceptions from moban.plugins import ENGINES -from moban.jinja2.engine import Engine, is_extension_list_valid +from moban.jinja2.engine import ( + Engine, + is_extension_list_valid, + import_module_of_extension, +) from moban.plugins.context import Context from moban.plugins.template import TemplateEngine, expand_template_directories @@ -137,3 +142,15 @@ def test_extensions_validator(): actual.append(is_extension_list_valid(fixture)) eq_(expected, actual) + + +def test_import(): + extensions = [ + "jinja2.ext.do", + "jinja2_time.TimeExtension", + "jinja2.ext.loopcontrols", + ] + import_module_of_extension(extensions) + modules = ["jinja2", "jinja2_time"] + for module in modules: + assert module in sys.modules