summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2021-10-04 17:39:39 -0700
committerDavid Lord <davidism@gmail.com>2021-10-04 17:39:39 -0700
commit89310770585ed0fb8d10c46cf8d6f447bb807467 (patch)
tree3db9fce9d93c2020419bf923cd1fc5aecf9258d5
parent355ef534517c08d16cefae49bb779ebefd0ce7f7 (diff)
downloadjinja2-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.rst3
-rw-r--r--src/jinja2/loaders.py4
-rw-r--r--tests/test_loader.py11
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):