class TestModuleLoader(object): archive = None def compile_down(self, prefix_loader, zip="deflated", py_compile=False): log = [] self.reg_env = Environment(loader=prefix_loader) if zip is not None: fd, self.archive = tempfile.mkstemp(suffix=".zip") os.close(fd) else: self.archive = tempfile.mkdtemp() self.reg_env.compile_templates( self.archive, zip=zip, log_function=log.append, py_compile=py_compile ) self.mod_env = Environment(loader=loaders.ModuleLoader(self.archive)) return "".join(log) def teardown(self): if hasattr(self, "mod_env"): if os.path.isfile(self.archive): os.remove(self.archive) else: shutil.rmtree(self.archive) self.archive = None def test_log(self, prefix_loader): log = self.compile_down(prefix_loader) assert ( 'Compiled "a/foo/test.html" as ' "tmpl_a790caf9d669e39ea4d280d597ec891c4ef0404a" in log ) assert "Finished compiling templates" in log assert ( 'Could not compile "a/syntaxerror.html": ' "Encountered unknown tag 'endif'" in log ) def _test_common(self): tmpl1 = self.reg_env.get_template("a/test.html") tmpl2 = self.mod_env.get_template("a/test.html") assert tmpl1.render() == tmpl2.render() tmpl1 = self.reg_env.get_template("b/justdict.html") tmpl2 = self.mod_env.get_template("b/justdict.html") assert tmpl1.render() == tmpl2.render() def test_deflated_zip_compile(self, prefix_loader): self.compile_down(prefix_loader, zip="deflated") self._test_common() def test_stored_zip_compile(self, prefix_loader): self.compile_down(prefix_loader, zip="stored") self._test_common() def test_filesystem_compile(self, prefix_loader): self.compile_down(prefix_loader, zip=None) self._test_common() def test_weak_references(self, prefix_loader): self.compile_down(prefix_loader) self.mod_env.get_template("a/test.html") key = loaders.ModuleLoader.get_template_key("a/test.html") name = self.mod_env.loader.module.__name__ assert hasattr(self.mod_env.loader.module, key) assert name in sys.modules # unset all, ensure the module is gone from sys.modules self.mod_env = None try: import gc gc.collect() except BaseException: pass assert name not in sys.modules # This test only makes sense on non-pypy python 2 @pytest.mark.skipif( not (PY2 and not PYPY), reason="This test only makes sense on non-pypy python 2" ) def test_byte_compilation(self, prefix_loader): log = self.compile_down(prefix_loader, py_compile=True) assert 'Byte-compiled "a/test.html"' in log self.mod_env.get_template("a/test.html") mod = self.mod_env.loader.module.tmpl_3c4ddf650c1a73df961a6d3d2ce2752f1b8fd490 assert mod.__file__.endswith(".pyc") def test_choice_loader(self, prefix_loader): self.compile_down(prefix_loader) self.mod_env.loader = loaders.ChoiceLoader( [self.mod_env.loader, loaders.DictLoader({"DICT_SOURCE": "DICT_TEMPLATE"})] ) tmpl1 = self.mod_env.get_template("a/test.html") assert tmpl1.render() == "BAR" tmpl2 = self.mod_env.get_template("DICT_SOURCE") assert tmpl2.render() == "DICT_TEMPLATE" def test_prefix_loader(self, prefix_loader): self.compile_down(prefix_loader) self.mod_env.loader = loaders.PrefixLoader( { "MOD": self.mod_env.loader, "DICT": loaders.DictLoader({"test.html": "DICT_TEMPLATE"}), } ) tmpl1 = self.mod_env.get_template("MOD/a/test.html") assert tmpl1.render() == "BAR" tmpl2 = self.mod_env.get_template("DICT/test.html") assert tmpl2.render() == "DICT_TEMPLATE" @pytest.mark.skipif(PY2, reason="pathlib is not available in Python 2") def test_path_as_pathlib(self, prefix_loader): self.compile_down(prefix_loader) mod_path = self.mod_env.loader.module.__path__[0] import pathlib mod_loader = loaders.ModuleLoader(pathlib.Path(mod_path)) self.mod_env = Environment(loader=mod_loader) self._test_common() @pytest.mark.skipif(PY2, reason="pathlib is not available in Python 2") def test_supports_pathlib_in_list_of_paths(self, prefix_loader): self.compile_down(prefix_loader) mod_path = self.mod_env.loader.module.__path__[0] import pathlib mod_loader = loaders.ModuleLoader([pathlib.Path(mod_path), "/tmp/templates"]) self.mod_env = Environment(loader=mod_loader) self._test_common()