From d343b0aa366872a3ee160486aca44960af982574 Mon Sep 17 00:00:00 2001 From: chfw Date: Wed, 16 Jan 2019 07:46:22 +0000 Subject: [PATCH 01/12] :fire: remove base_engine.py from repo. fix #158. I did not realize that it is part of the repo. --- moban/base_engine.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 moban/base_engine.py diff --git a/moban/base_engine.py b/moban/base_engine.py deleted file mode 100644 index e69de29b..00000000 From d50e9455af4ff4c94d20bd3558ac93676d994bd2 Mon Sep 17 00:00:00 2001 From: chfw Date: Wed, 16 Jan 2019 07:56:07 +0000 Subject: [PATCH 02/12] :sparkles: initial prototype supporting extensions key word --- moban/constants.py | 11 +++++++---- moban/jinja2/engine.py | 16 +++++++++------- moban/mobanfile.py | 4 ++++ moban/plugins.py | 15 ++++++++++++--- rnd_requirements.txt | 1 + tests/test_engine.py | 2 +- tests/test_utils.py | 6 +++--- 7 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 rnd_requirements.txt diff --git a/moban/constants.py b/moban/constants.py index a667e874..b17eeaca 100644 --- a/moban/constants.py +++ b/moban/constants.py @@ -23,15 +23,13 @@ LABEL_TEMPLATE = "template" POSITIONAL_LABEL_TEMPLATE = "template_in_string" LABEL_TMPL_DIRS = "template_dir" +LABEL_EXIT_CODE = "exit-code" LABEL_OUTPUT = "output" LABEL_TEMPLATE_TYPE = "template_type" -LABEL_TARGETS = "targets" -LABEL_COPY = "copy" LABEL_OVERRIDES = "overrides" LABEL_MOBANFILE = "mobanfile" LABEL_FORCE = "force" -LABEL_REQUIRES = "requires" -LABEL_EXIT_CODE = "exit-code" + DEFAULT_CONFIGURATION_DIRNAME = ".moban.cd" DEFAULT_TEMPLATE_DIRNAME = ".moban.td" @@ -52,6 +50,11 @@ DEFAULT_MOBAN_VERSION = "1.0" MOBAN_DIR_NAME_UNDER_USER_HOME = ".moban" MOBAN_REPOS_DIR_NAME = "repos" +# moban file configuration +LABEL_REQUIRES = "requires" +LABEL_TARGETS = "targets" +LABEL_COPY = "copy" +LABEL_EXTENSIONS = "extensions" # error messages ERROR_DATA_FILE_NOT_FOUND = "Both %s and %s does not exist" diff --git a/moban/jinja2/engine.py b/moban/jinja2/engine.py index 3a3e7bca..70cec4c4 100644 --- a/moban/jinja2/engine.py +++ b/moban/jinja2/engine.py @@ -12,10 +12,6 @@ "moban.jinja2.filters.text", "moban.jinja2.tests.files", ] -JINJA2_THIRD_PARTY_EXTENSIONS = [ - 'jinja2.ext.do', - 'jinja2.ext.loopcontrols', -] class PluginMixin: @@ -54,7 +50,7 @@ def __init__(self): constants.TEMPLATE_ENGINE_EXTENSION, tags=["jinja2", "jinja", "jj2", "j2"] ) class Engine(object): - def __init__(self, template_dirs): + def __init__(self, template_dirs, extensions=None): """ Contruct a jinja2 template engine @@ -65,13 +61,15 @@ def __init__(self, template_dirs): load_jinja2_extensions() self.template_dirs = template_dirs template_loader = FileSystemLoader(template_dirs) - self.jj2_environment = Environment( + env_params = dict( loader=template_loader, keep_trailing_newline=True, trim_blocks=True, lstrip_blocks=True, - extensions=JINJA2_THIRD_PARTY_EXTENSIONS, ) + if is_extensions_valid(extensions): + env_params["extensions"] = extensions + self.jj2_environment = Environment(**env_params) for filter_name, filter_function in FILTERS.get_all(): self.jj2_environment.filters[filter_name] = filter_function @@ -125,3 +123,7 @@ def apply_template(self, template, data, output): def load_jinja2_extensions(): scan_plugins_regex(JINJA2_LIBRARIES, "moban", None, JINJA2_EXENSIONS) + + +def is_extensions_valid(extensions): + return extensions and isinstance(extensions, list) diff --git a/moban/mobanfile.py b/moban/mobanfile.py index 1223db29..cb43b03e 100644 --- a/moban/mobanfile.py +++ b/moban/mobanfile.py @@ -68,6 +68,10 @@ def handle_moban_file_v1(moban_file_configurations, command_line_options): if requires: handle_requires(requires) + extensions = moban_file_configurations.get(constants.LABEL_EXTENSIONS) + if extensions: + plugins.ENGINES.register_extensions(extensions) + if targets: # If template specified via CLI flag `-t: # 1. Only update the specified template diff --git a/moban/plugins.py b/moban/plugins.py index 5ba36cee..13488cc5 100644 --- a/moban/plugins.py +++ b/moban/plugins.py @@ -21,7 +21,9 @@ def resource_path_of(self, library_name): class BaseEngine(object): - def __init__(self, template_dirs, context_dirs, engine_cls): + def __init__( + self, template_dirs, context_dirs, engine_cls, engine_extensions=None + ): # pypi-moban-pkg cannot be found if removed make_sure_all_pkg_are_loaded() template_dirs = list(expand_template_directories(template_dirs)) @@ -29,7 +31,7 @@ def __init__(self, template_dirs, context_dirs, engine_cls): context_dirs = expand_template_directory(context_dirs) self.context = Context(context_dirs) self.template_dirs = template_dirs - self.engine = engine_cls(self.template_dirs) + self.engine = engine_cls(self.template_dirs, engine_extensions) self.engine_cls = engine_cls self.templated_count = 0 self.file_count = 0 @@ -143,10 +145,17 @@ def __init__(self): super(EngineFactory, self).__init__( constants.TEMPLATE_ENGINE_EXTENSION ) + self.extensions = {} + + def register_extensions(self, extensions): + self.extensions.update(extensions) def get_engine(self, template_type, template_dirs, context_dirs): engine_cls = self.load_me_now(template_type) - return BaseEngine(template_dirs, context_dirs, engine_cls) + engine_extensions = self.extensions.get(template_type) + return BaseEngine( + template_dirs, context_dirs, engine_cls, engine_extensions + ) def all_types(self): return list(self.registry.keys()) diff --git a/rnd_requirements.txt b/rnd_requirements.txt new file mode 100644 index 00000000..86b965ae --- /dev/null +++ b/rnd_requirements.txt @@ -0,0 +1 @@ +https://github.com/moremoban/moban-handlebars/archive/dev.zip diff --git a/tests/test_engine.py b/tests/test_engine.py index 9ce98862..36037914 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -44,7 +44,7 @@ def test_default_template_type(): class FakeEngine: - def __init__(self, template_dirs): + def __init__(self, template_dirs, extensions=None): pass diff --git a/tests/test_utils.py b/tests/test_utils.py index 56ed331d..609629df 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -45,9 +45,9 @@ def test_file_permission_copy(): def file_permissions_disabled_on_windows(): - if sys.platform == 'win32': - permissions = file_permissions('abc') - eq_('no-permission-support', permissions) + if sys.platform == "win32": + permissions = file_permissions("abc") + eq_("no-permission-support", permissions) else: raise SkipTest("No test required") From 96f22ea365e733e6624232750c6e73f2b5d106cc Mon Sep 17 00:00:00 2001 From: chfw Date: Wed, 16 Jan 2019 08:15:40 +0000 Subject: [PATCH 03/12] :books: initial docs --- .../README.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 docs/level-12-use-template-engine-extensions/README.rst diff --git a/docs/level-12-use-template-engine-extensions/README.rst b/docs/level-12-use-template-engine-extensions/README.rst new file mode 100644 index 00000000..8f5fd621 --- /dev/null +++ b/docs/level-12-use-template-engine-extensions/README.rst @@ -0,0 +1,18 @@ +Level 11: use template engine extensions +================================================================================ + +jinja2 comes with a lot of extensions. In order not to be the blocker in the +middle, **extensions** is allowed in moban file to initialize jinja2 engine +with desired extensions + +The extensions syntax is:: + + extensions: + jinja2: + - jinja2.ext.do + - jinja2.ext.loopcontrols + + +Evaluation +-------------------------------------------------------------------------------- + From f85a7f2e28bcad356026cd360b84862bfe8df348 Mon Sep 17 00:00:00 2001 From: chfw Date: Wed, 16 Jan 2019 18:12:32 +0000 Subject: [PATCH 04/12] :sparkles: put jinja2.ext.do, jinja2.ext.loopcontrols as default because they come as part of jinja package. #90 --- moban/jinja2/engine.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/moban/jinja2/engine.py b/moban/jinja2/engine.py index 70cec4c4..c05f2eb6 100644 --- a/moban/jinja2/engine.py +++ b/moban/jinja2/engine.py @@ -12,7 +12,10 @@ "moban.jinja2.filters.text", "moban.jinja2.tests.files", ] - +JINJA2_THIRD_PARTY_EXTENSIONS = [ + 'jinja2.ext.do', + 'jinja2.ext.loopcontrols', +] class PluginMixin: def get_all(self): @@ -68,7 +71,9 @@ def __init__(self, template_dirs, extensions=None): lstrip_blocks=True, ) if is_extensions_valid(extensions): - env_params["extensions"] = extensions + env_params["extensions"] = ( + extensions + JINJA2_THIRD_PARTY_EXTENSIONS + ) self.jj2_environment = Environment(**env_params) for filter_name, filter_function in FILTERS.get_all(): self.jj2_environment.filters[filter_name] = filter_function From ce1a96c55481888c6a31fb79b0db29677c6408ce Mon Sep 17 00:00:00 2001 From: chfw Date: Wed, 16 Jan 2019 18:19:58 +0000 Subject: [PATCH 05/12] :green_heart: enable the support of rnd_requiremnts on windows and mac-os build on azure --- .azure-pipelines-steps-macos.yml | 1 + .azure-pipelines-steps.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.azure-pipelines-steps-macos.yml b/.azure-pipelines-steps-macos.yml index 9611b057..81734822 100644 --- a/.azure-pipelines-steps-macos.yml +++ b/.azure-pipelines-steps-macos.yml @@ -3,6 +3,7 @@ steps: displayName: 'Use Python 3.x' - script: | python -m pip install --upgrade pip setuptools wheel + test ! -f rnd_requirements.txt || pip install -r rnd_requirements.txt pip install -r requirements.txt pip install -r tests/requirements.txt displayName: 'Setup dependencies' diff --git a/.azure-pipelines-steps.yml b/.azure-pipelines-steps.yml index f30f38df..4fc4925e 100644 --- a/.azure-pipelines-steps.yml +++ b/.azure-pipelines-steps.yml @@ -3,6 +3,7 @@ steps: displayName: 'Use Python 3.x' - script: | python -m pip install --upgrade pip setuptools wheel + if exist rnd_requirements.txt pip install -r rnd_requirements.txt pip install -r requirements.txt pip install -r tests\requirements.txt displayName: 'Setup dependencies' From 2f5d34fc8b82bdddaed457f36a278c6d53e4e0a4 Mon Sep 17 00:00:00 2001 From: chfw Date: Wed, 16 Jan 2019 18:26:02 +0000 Subject: [PATCH 06/12] :hammer: refactor test cases --- moban/jinja2/engine.py | 6 ++---- tests/test_engine.py | 10 +++++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/moban/jinja2/engine.py b/moban/jinja2/engine.py index c05f2eb6..1c7712c1 100644 --- a/moban/jinja2/engine.py +++ b/moban/jinja2/engine.py @@ -12,10 +12,8 @@ "moban.jinja2.filters.text", "moban.jinja2.tests.files", ] -JINJA2_THIRD_PARTY_EXTENSIONS = [ - 'jinja2.ext.do', - 'jinja2.ext.loopcontrols', -] +JINJA2_THIRD_PARTY_EXTENSIONS = ["jinja2.ext.do", "jinja2.ext.loopcontrols"] + class PluginMixin: def get_all(self): diff --git a/tests/test_engine.py b/tests/test_engine.py index 36037914..23bced73 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -77,7 +77,7 @@ def test_non_existent_ctx_directries(): def test_file_tests(): output = "test.txt" path = os.path.join("tests", "fixtures", "jinja_tests") - engine = BaseEngine([path], path, Engine) + engine = ENGINES.get_engine("jinja2", [path], path) engine.render_to_file("file_tests.template", "file_tests.yml", output) with open(output, "r") as output_file: content = output_file.read() @@ -88,7 +88,7 @@ def test_file_tests(): def test_global_template_variables(): output = "test.txt" path = os.path.join("tests", "fixtures", "globals") - engine = BaseEngine([path], path, Engine) + engine = ENGINES.get_engine("jinja2", [path], path) engine.render_to_file("variables.template", "variables.yml", output) with open(output, "r") as output_file: content = output_file.read() @@ -99,7 +99,7 @@ def test_global_template_variables(): def test_nested_global_template_variables(): output = "test.txt" path = os.path.join("tests", "fixtures", "globals") - engine = BaseEngine([path], path, Engine) + engine = ENGINES.get_engine("jinja2", [path], path) engine.render_to_file("nested.template", "variables.yml", output) with open(output, "r") as output_file: content = output_file.read() @@ -113,7 +113,7 @@ def test_environ_variables_as_data(): os.environ[test_var] = test_value output = "test.txt" path = os.path.join("tests", "fixtures", "environ_vars_as_data") - engine = BaseEngine([path], path, Engine) + engine = ENGINES.get_engine("jinja2", [path], path) engine.render_to_file("test.template", "this_does_not_exist.yml", output) with open(output, "r") as output_file: content = output_file.read() @@ -124,7 +124,7 @@ def test_environ_variables_as_data(): def test_string_template(): output = "test.txt" path = os.path.join("tests", "fixtures") - engine = BaseEngine([path], path, Engine) + engine = ENGINES.get_engine("jinja2", [path], path) engine.render_string_to_file("{{simple}}", "simple.yaml", output) with open(output, "r") as output_file: content = output_file.read() From 970f65122857549bb45930cf75bff3d8efe4d3fc Mon Sep 17 00:00:00 2001 From: chfw Date: Thu, 17 Jan 2019 07:16:06 +0000 Subject: [PATCH 07/12] :hammer: refactor test cases --- tests/test_template.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tests/test_template.py b/tests/test_template.py index d5d5ed45..e9803a7c 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -2,7 +2,7 @@ from mock import patch -from moban.plugins import BaseEngine +from moban.plugins import ENGINES from moban.jinja2.engine import Engine @@ -24,7 +24,7 @@ def test_do_templates_1(_do_templates_with_more_shared_data): ("5.template", "6.output"), ] } - engine = BaseEngine(".", ".", Engine) + engine = ENGINES.get_engine("jinja2", ".", ".") engine.render_to_files(jobs) _do_templates_with_more_shared_data.assert_called_with(expected) if os.path.exists(".moban.hashes"): @@ -49,7 +49,7 @@ def test_do_templates_2(_do_templates_with_more_shared_templates): ("data5.yml", "6.output"), ] } - engine = BaseEngine(".", ".", Engine) + engine = ENGINES.get_engine("jinja2", ".", ".") engine.render_to_files(jobs) _do_templates_with_more_shared_templates.assert_called_with(expected) if os.path.exists(".moban.hashes"): @@ -58,7 +58,9 @@ def test_do_templates_2(_do_templates_with_more_shared_templates): def test_do_templates_with_more_shared_templates(): base_dir = os.path.join("tests", "fixtures") - engine = BaseEngine(base_dir, os.path.join(base_dir, "config"), Engine) + engine = ENGINES.get_engine( + "jinja2", base_dir, os.path.join(base_dir, "config") + ) engine._render_with_finding_template_first( {"a.jj2": [(os.path.join(base_dir, "child.yaml"), "test")]} ) @@ -72,7 +74,9 @@ def test_do_templates_with_more_shared_templates(): def test_do_templates_with_more_shared_data(): base_dir = os.path.join("tests", "fixtures") - engine = BaseEngine(base_dir, os.path.join(base_dir, "config"), Engine) + engine = ENGINES.get_engine( + "jinja2", base_dir, os.path.join(base_dir, "config") + ) engine._render_with_finding_data_first( {os.path.join(base_dir, "child.yaml"): [("a.jj2", "test")]} ) From 96928de03324c242e50877c4c1aa1a1139de93f6 Mon Sep 17 00:00:00 2001 From: chfw Date: Thu, 17 Jan 2019 07:19:14 +0000 Subject: [PATCH 08/12] :bug: third party extensions as default even when no user extensions are nominated: #90 --- moban/jinja2/engine.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/moban/jinja2/engine.py b/moban/jinja2/engine.py index 1c7712c1..d1764a25 100644 --- a/moban/jinja2/engine.py +++ b/moban/jinja2/engine.py @@ -67,11 +67,13 @@ def __init__(self, template_dirs, extensions=None): keep_trailing_newline=True, trim_blocks=True, lstrip_blocks=True, + extensions=[ + extension for extension in JINJA2_THIRD_PARTY_EXTENSIONS + ], # get a copy of this global variable ) if is_extensions_valid(extensions): - env_params["extensions"] = ( - extensions + JINJA2_THIRD_PARTY_EXTENSIONS - ) + # because it is modified here + env_params["extensions"] += extensions self.jj2_environment = Environment(**env_params) for filter_name, filter_function in FILTERS.get_all(): self.jj2_environment.filters[filter_name] = filter_function From 2c3d19091c6ce05a724ca1b6ae1e71c2ccffd5eb Mon Sep 17 00:00:00 2001 From: Ayan Banerjee Date: Thu, 17 Jan 2019 17:46:09 +0530 Subject: [PATCH 09/12] :books: :umbrella: Add extension docs and tests Related to https://github.com/moremoban/moban/issues/90 --- .../.moban.yml | 6 ++++++ .../README.rst | 15 ++++++++++++--- .../a.template | 3 +++ .../b.template | 9 +++++++++ .../data.yml | 1 + tests/test_docs.py | 14 ++++++++++++++ 6 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 docs/level-12-use-template-engine-extensions/.moban.yml create mode 100644 docs/level-12-use-template-engine-extensions/a.template create mode 100644 docs/level-12-use-template-engine-extensions/b.template create mode 100644 docs/level-12-use-template-engine-extensions/data.yml diff --git a/docs/level-12-use-template-engine-extensions/.moban.yml b/docs/level-12-use-template-engine-extensions/.moban.yml new file mode 100644 index 00000000..63b4bc64 --- /dev/null +++ b/docs/level-12-use-template-engine-extensions/.moban.yml @@ -0,0 +1,6 @@ +targets: + - a.output: a.template + - b.output: b.template +extensions: + jinja2: + - jinja2.ext.with_ diff --git a/docs/level-12-use-template-engine-extensions/README.rst b/docs/level-12-use-template-engine-extensions/README.rst index 8f5fd621..07b06554 100644 --- a/docs/level-12-use-template-engine-extensions/README.rst +++ b/docs/level-12-use-template-engine-extensions/README.rst @@ -3,16 +3,25 @@ Level 11: use template engine extensions jinja2 comes with a lot of extensions. In order not to be the blocker in the middle, **extensions** is allowed in moban file to initialize jinja2 engine -with desired extensions +with desired extensions. Two extensions, expression-statement and loop-controls +are enabled by default. The extensions syntax is:: extensions: jinja2: - - jinja2.ext.do - - jinja2.ext.loopcontrols + - jinja2.ext.i18n Evaluation -------------------------------------------------------------------------------- +Please go to `docs/level-12-use-template-engine-extensions` directory. +If you notice the file `a.template`, we are using a for loop control. This is +because moban comes with two default extensions loop-controls and +expression-statement. + +Now, let us try to use the extension `with`. To do that, we have to enable the +extension in the `.moban.yml` file following the above syntax. Now, the +extension can be used in the jinja2 templates. One such example is shown in the +`b.template` file. diff --git a/docs/level-12-use-template-engine-extensions/a.template b/docs/level-12-use-template-engine-extensions/a.template new file mode 100644 index 00000000..da43df97 --- /dev/null +++ b/docs/level-12-use-template-engine-extensions/a.template @@ -0,0 +1,3 @@ +{% for _ in range(1,5) %} +{{ hello }} +{% endfor %} diff --git a/docs/level-12-use-template-engine-extensions/b.template b/docs/level-12-use-template-engine-extensions/b.template new file mode 100644 index 00000000..72937b14 --- /dev/null +++ b/docs/level-12-use-template-engine-extensions/b.template @@ -0,0 +1,9 @@ +{% with %} + {% set foo = 142 %} +{{ foo }} + {% with %} + {% set foo = 42 %} +{{ foo }} + {% endwith %} +{{ foo }} +{% endwith %} diff --git a/docs/level-12-use-template-engine-extensions/data.yml b/docs/level-12-use-template-engine-extensions/data.yml new file mode 100644 index 00000000..bb56b055 --- /dev/null +++ b/docs/level-12-use-template-engine-extensions/data.yml @@ -0,0 +1 @@ +hello: world diff --git a/tests/test_docs.py b/tests/test_docs.py index 1a4470b4..7b6e9f5e 100644 --- a/tests/test_docs.py +++ b/tests/test_docs.py @@ -107,6 +107,20 @@ def test_level_11(self): folder = "level-11-use-handlebars" self._raw_moban(["moban"], folder, expected, "a.output") + def test_level_12(self): + expected_a = """world +world +world +world +""" + expected_b = """142 +42 +142 +""" + folder = "level-12-use-template-engine-extensions" + self._raw_moban(["moban"], folder, expected_a, "a.output") + self._raw_moban(["moban"], folder, expected_b, "b.output") + def test_misc_1(self): expected = "test file\n" From 623735047be8b3947a13241c5f4e7a55b14238d1 Mon Sep 17 00:00:00 2001 From: chfw Date: Thu, 17 Jan 2019 17:59:00 +0000 Subject: [PATCH 10/12] :hammer: test extension validator --- moban/jinja2/engine.py | 10 +++++++--- tests/test_engine.py | 20 +++++++++++++++++++- tests/test_template.py | 1 - 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/moban/jinja2/engine.py b/moban/jinja2/engine.py index d1764a25..5ae6bfcd 100644 --- a/moban/jinja2/engine.py +++ b/moban/jinja2/engine.py @@ -71,7 +71,7 @@ def __init__(self, template_dirs, extensions=None): extension for extension in JINJA2_THIRD_PARTY_EXTENSIONS ], # get a copy of this global variable ) - if is_extensions_valid(extensions): + if is_extension_list_valid(extensions): # because it is modified here env_params["extensions"] += extensions self.jj2_environment = Environment(**env_params) @@ -130,5 +130,9 @@ def load_jinja2_extensions(): scan_plugins_regex(JINJA2_LIBRARIES, "moban", None, JINJA2_EXENSIONS) -def is_extensions_valid(extensions): - return extensions and isinstance(extensions, list) +def is_extension_list_valid(extensions): + return ( + extensions is not None and + isinstance(extensions, list) and + len(extensions) > 0 + ) diff --git a/tests/test_engine.py b/tests/test_engine.py index 23bced73..8ff8dfcb 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -11,7 +11,7 @@ BaseEngine, expand_template_directories, ) -from moban.jinja2.engine import Engine +from moban.jinja2.engine import Engine, is_extension_list_valid USER_HOME = os.path.join("user", "home", ".moban", "repos") @@ -130,3 +130,21 @@ def test_string_template(): content = output_file.read() eq_(content, "yaml") os.unlink(output) + + +def test_extensions_validator(): + test_fixtures = [ + None, + ['module1', 'module2'], + [], + ] + expected = [ + False, + True, + False + ] + actual = [] + for fixture in test_fixtures: + actual.append(is_extension_list_valid(fixture)) + + eq_(expected, actual) diff --git a/tests/test_template.py b/tests/test_template.py index e9803a7c..0829f330 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -3,7 +3,6 @@ from mock import patch from moban.plugins import ENGINES -from moban.jinja2.engine import Engine @patch("moban.plugins.BaseEngine._render_with_finding_data_first") From 0be534df03eaf5efed4efcee7618e0313487e164 Mon Sep 17 00:00:00 2001 From: chfw Date: Thu, 17 Jan 2019 18:07:14 +0000 Subject: [PATCH 11/12] :books: :green_heart: update unit test and level 12 docs --- docs/level-12-use-template-engine-extensions/README.rst | 8 +++++++- tests/test_docs.py | 7 +++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/level-12-use-template-engine-extensions/README.rst b/docs/level-12-use-template-engine-extensions/README.rst index 07b06554..ade99bfc 100644 --- a/docs/level-12-use-template-engine-extensions/README.rst +++ b/docs/level-12-use-template-engine-extensions/README.rst @@ -1,4 +1,4 @@ -Level 11: use template engine extensions +Level 12: use template engine extensions ================================================================================ jinja2 comes with a lot of extensions. In order not to be the blocker in the @@ -8,6 +8,12 @@ are enabled by default. The extensions syntax is:: + extensions: + template_type: + - template.engine.specific.extension + +For example:: + extensions: jinja2: - jinja2.ext.i18n diff --git a/tests/test_docs.py b/tests/test_docs.py index 7b6e9f5e..99c5bad1 100644 --- a/tests/test_docs.py +++ b/tests/test_docs.py @@ -107,18 +107,21 @@ def test_level_11(self): folder = "level-11-use-handlebars" self._raw_moban(["moban"], folder, expected, "a.output") - def test_level_12(self): + def test_level_12_a(self): expected_a = """world world world world """ + folder = "level-12-use-template-engine-extensions" + self._raw_moban(["moban"], folder, expected_a, "a.output") + + def test_level_12_b(self): expected_b = """142 42 142 """ folder = "level-12-use-template-engine-extensions" - self._raw_moban(["moban"], folder, expected_a, "a.output") self._raw_moban(["moban"], folder, expected_b, "b.output") def test_misc_1(self): From 46f1924fcb6dc0b3c4d63cd51854468298056047 Mon Sep 17 00:00:00 2001 From: chfw Date: Thu, 17 Jan 2019 18:13:47 +0000 Subject: [PATCH 12/12] :books: :lipstick: update documentation --- .moban.cd/changelog.yml | 7 +++++++ .moban.cd/moban.yml | 6 +++--- .travis.yml | 1 + CHANGELOG.rst | 13 +++++++++++++ docs/conf.py | 4 ++-- .../README.rst | 3 +++ moban/_version.py | 2 +- moban/jinja2/engine.py | 6 +++--- setup.py | 2 +- tests/test_engine.py | 12 ++---------- 10 files changed, 36 insertions(+), 20 deletions(-) diff --git a/.moban.cd/changelog.yml b/.moban.cd/changelog.yml index a8b54c02..a0db511e 100644 --- a/.moban.cd/changelog.yml +++ b/.moban.cd/changelog.yml @@ -1,6 +1,13 @@ name: moban organisation: moremoban releases: +- changes: + - action: Updated + details: + - "`#90`: allow adding extra jinja2 extensions. `jinja2.ext.do`, `jinja2.ext.loopcontrols` are included by default. what's more, any other template enigne are eligible for extension additions." + - "`#158`: Empty file base_engine.py is finally removed" + date: 12-1-2019 + version: 0.3.9 - changes: - action: Updated details: diff --git a/.moban.cd/moban.yml b/.moban.cd/moban.yml index e354076a..a2ba6eda 100644 --- a/.moban.cd/moban.yml +++ b/.moban.cd/moban.yml @@ -3,14 +3,14 @@ organisation: moremoban author: C. W. contact: wangc_2011@hotmail.com license: MIT -version: 0.3.8 -current_version: 0.3.8 +version: 0.3.9 +current_version: 0.3.9 release: 0.3.8 branch: master command_line_interface: "moban" entry_point: "moban.main:main" company: Onni Software Ltd. -copyright_year: 2017-2018 +copyright_year: 2017-2019 keywords: - jinja2 - moban diff --git a/.travis.yml b/.travis.yml index 16330f5a..8295c536 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ python: - 3.7-dev - 3.6 - 3.5 + - 3.4 - 2.7 before_install: - if [[ $TRAVIS_PYTHON_VERSION == "2.6" ]]; then pip install flake8==2.6.2; fi diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 0b9b467e..5fdb7ac8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,19 @@ Change log ================================================================================ +0.3.9 - 12-1-2019 +-------------------------------------------------------------------------------- + +Updated +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +#. `#90 `_: allow adding extra + jinja2 extensions. `jinja2.ext.do`, `jinja2.ext.loopcontrols` are included by + default. what's more, any other template enigne are eligible for extension + additions. +#. `#158 `_: Empty file + base_engine.py is finally removed + 0.3.8 - 12-1-2019 -------------------------------------------------------------------------------- diff --git a/docs/conf.py b/docs/conf.py index ce753fd0..dc86b4fd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -24,13 +24,13 @@ # -- Project information ----------------------------------------------------- project = u'moban' -copyright = u'2017-2018 Onni Software Ltd.' +copyright = u'2017-2019 Onni Software Ltd.' author = u'C. W.' # The short X.Y version version = u'0.3.8' # The full version, including alpha/beta/rc tags -release = u'0.3.8' +release = u'0.3.9' # -- General configuration --------------------------------------------------- diff --git a/docs/level-12-use-template-engine-extensions/README.rst b/docs/level-12-use-template-engine-extensions/README.rst index ade99bfc..911a7266 100644 --- a/docs/level-12-use-template-engine-extensions/README.rst +++ b/docs/level-12-use-template-engine-extensions/README.rst @@ -18,6 +18,9 @@ For example:: jinja2: - jinja2.ext.i18n +Please also note that the following extensions are included by default: +`jinja2.ext.do`, `jinja2.ext.loopcontrols` + Evaluation -------------------------------------------------------------------------------- diff --git a/moban/_version.py b/moban/_version.py index 846cb583..bef32dc0 100644 --- a/moban/_version.py +++ b/moban/_version.py @@ -1,2 +1,2 @@ -__version__ = "0.3.8" +__version__ = "0.3.9" __author__ = "C. W." diff --git a/moban/jinja2/engine.py b/moban/jinja2/engine.py index 5ae6bfcd..1244a816 100644 --- a/moban/jinja2/engine.py +++ b/moban/jinja2/engine.py @@ -132,7 +132,7 @@ def load_jinja2_extensions(): def is_extension_list_valid(extensions): return ( - extensions is not None and - isinstance(extensions, list) and - len(extensions) > 0 + extensions is not None + and isinstance(extensions, list) + and len(extensions) > 0 ) diff --git a/setup.py b/setup.py index decfd6ff..eba359f4 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ NAME = 'moban' AUTHOR = 'C. W.' -VERSION = '0.3.8' +VERSION = '0.3.9' EMAIL = 'wangc_2011@hotmail.com' LICENSE = 'MIT' ENTRY_POINTS = { diff --git a/tests/test_engine.py b/tests/test_engine.py index 8ff8dfcb..8674c950 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -133,16 +133,8 @@ def test_string_template(): def test_extensions_validator(): - test_fixtures = [ - None, - ['module1', 'module2'], - [], - ] - expected = [ - False, - True, - False - ] + test_fixtures = [None, ["module1", "module2"], []] + expected = [False, True, False] actual = [] for fixture in test_fixtures: actual.append(is_extension_list_valid(fixture))