]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
omit curdir from PackageLoader root path 1505/head
authorDavid Lord <davidism@gmail.com>
Tue, 5 Oct 2021 00:39:39 +0000 (17:39 -0700)
committerDavid Lord <davidism@gmail.com>
Tue, 5 Oct 2021 00:39:39 +0000 (17:39 -0700)
fixes compatibility with zip imports

Co-authored-by: kuepe-sl <peter_kueffner@web.de>
CHANGES.rst
src/jinja2/loaders.py
tests/test_loader.py

index eb51581d5816f391d6992ba598746ac84d064e09..90c5bdf3a97e291c1f9302e0c6a27317eb577261 100644 (file)
@@ -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
index db04f0f68320312ab465d59b3df4c19e6b3d9d3d..513c858a80c183d70ac805d471b3b8cca276553f 100644 (file)
@@ -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
index 63fc39bae1d10a3b65eea1c1d1a8355bc19feff6..1533d0234ca7d747506b5e2796ecc0219cd3870f 100644 (file)
@@ -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):