]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
fix test_package_zip_list on 3.13 1979/head
authorThomas Grainger <tagrain@gmail.com>
Mon, 13 May 2024 17:02:35 +0000 (18:02 +0100)
committerThomas Grainger <tagrain@gmail.com>
Mon, 13 May 2024 19:04:38 +0000 (20:04 +0100)
src/jinja2/loaders.py
tests/test_loader.py

index 9eaf647ba878a894bd8faa74a77f7b4beca50769..8c2c86cd0b9eb164e97003a126e8baac0241ad5e 100644 (file)
@@ -238,6 +238,30 @@ class FileSystemLoader(BaseLoader):
         return sorted(found)
 
 
+if sys.version_info >= (3, 13):
+
+    def _get_zipimporter_files(z: t.Any) -> t.Dict[str, object]:
+        try:
+            get_files = z._get_files
+        except AttributeError as e:
+            raise TypeError(
+                "This zip import does not have the required"
+                " metadata to list templates."
+            ) from e
+        return get_files()
+else:
+
+    def _get_zipimporter_files(z: t.Any) -> t.Dict[str, object]:
+        try:
+            files = z._files
+        except AttributeError as e:
+            raise TypeError(
+                "This zip import does not have the required"
+                " metadata to list templates."
+            ) from e
+        return files  # type: ignore[no-any-return]
+
+
 class PackageLoader(BaseLoader):
     """Load templates from a directory in a Python package.
 
@@ -382,11 +406,7 @@ class PackageLoader(BaseLoader):
                     for name in filenames
                 )
         else:
-            if not hasattr(self._loader, "_files"):
-                raise TypeError(
-                    "This zip import does not have the required"
-                    " metadata to list templates."
-                )
+            files = _get_zipimporter_files(self._loader)
 
             # Package is a zip file.
             prefix = (
@@ -395,7 +415,7 @@ class PackageLoader(BaseLoader):
             )
             offset = len(prefix)
 
-            for name in self._loader._files.keys():
+            for name in files:
                 # Find names under the templates directory that aren't directories.
                 if name.startswith(prefix) and name[-1] != os.path.sep:
                     results.append(name[offset:].replace(os.path.sep, "/"))
index 3e64f62372b541819d7617185c6c14575f8e2a28..e0cff6720fd27e8eb9906dccb36c80b74bd49f58 100644 (file)
@@ -363,7 +363,7 @@ def test_package_zip_source(package_zip_loader, template, expect):
 
 
 @pytest.mark.xfail(
-    sys.implementation.name == "pypy" or sys.version_info > (3, 13),
+    sys.implementation.name == "pypy",
     reason="zipimporter doesn't have a '_files' attribute",
     raises=TypeError,
 )