diff options
author | David Lord <davidism@gmail.com> | 2021-10-04 17:39:39 -0700 |
---|---|---|
committer | David Lord <davidism@gmail.com> | 2021-10-04 17:39:39 -0700 |
commit | 89310770585ed0fb8d10c46cf8d6f447bb807467 (patch) | |
tree | 3db9fce9d93c2020419bf923cd1fc5aecf9258d5 | |
parent | 355ef534517c08d16cefae49bb779ebefd0ce7f7 (diff) | |
download | jinja2-89310770585ed0fb8d10c46cf8d6f447bb807467.tar.gz |
omit curdir from PackageLoader root path
fixes compatibility with zip imports
Co-authored-by: kuepe-sl <peter_kueffner@web.de>
-rw-r--r-- | CHANGES.rst | 3 | ||||
-rw-r--r-- | src/jinja2/loaders.py | 4 | ||||
-rw-r--r-- | tests/test_loader.py | 11 |
3 files changed, 17 insertions, 1 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index eb51581..90c5bdf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -11,6 +11,9 @@ Version 3.0.2 ``StrictUndefined`` for the ``in`` operator. :issue:`1448` - Imported macros have access to the current template globals in async environments. :issue:`1494` +- ``PackageLoader`` will not include a current directory (.) path + segment. This allows loading templates from the root of a zip + import. :issue:`1467` Version 3.0.1 diff --git a/src/jinja2/loaders.py b/src/jinja2/loaders.py index db04f0f..513c858 100644 --- a/src/jinja2/loaders.py +++ b/src/jinja2/loaders.py @@ -270,12 +270,14 @@ class PackageLoader(BaseLoader): package_path: "str" = "templates", encoding: str = "utf-8", ) -> None: + package_path = os.path.normpath(package_path).rstrip(os.path.sep) + + # normpath preserves ".", which isn't valid in zip paths. if package_path == os.path.curdir: package_path = "" elif package_path[:2] == os.path.curdir + os.path.sep: package_path = package_path[2:] - package_path = os.path.normpath(package_path).rstrip(os.path.sep) self.package_path = package_path self.package_name = package_name self.encoding = encoding diff --git a/tests/test_loader.py b/tests/test_loader.py index 63fc39b..1533d02 100644 --- a/tests/test_loader.py +++ b/tests/test_loader.py @@ -339,6 +339,17 @@ def test_package_zip_list(package_zip_loader): assert package_zip_loader.list_templates() == ["foo/test.html", "test.html"] +@pytest.mark.parametrize("package_path", ["", ".", "./"]) +def test_package_zip_omit_curdir(package_zip_loader, package_path): + """PackageLoader should not add or include "." or "./" in the root + path, it is invalid in zip paths. + """ + loader = PackageLoader("t_pack", package_path) + assert loader.package_path == "" + source, _, _ = loader.get_source(None, "templates/foo/test.html") + assert source.rstrip() == "FOO" + + def test_pep_451_import_hook(): class ImportHook(importlib.abc.MetaPathFinder, importlib.abc.Loader): def find_spec(self, name, path=None, target=None): |