]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
separate messages, add test 1706/head
authorDavid Lord <davidism@gmail.com>
Fri, 20 Dec 2024 04:15:10 +0000 (20:15 -0800)
committerDavid Lord <davidism@gmail.com>
Fri, 20 Dec 2024 04:15:10 +0000 (20:15 -0800)
CHANGES.rst
src/jinja2/loaders.py
tests/test_loader.py

index cd2a4ef089f14fefee9c74d8c4ca69d231d8d26d..2e83ab3f6092583f8d23327401d0f496fdba2a44 100644 (file)
@@ -37,6 +37,8 @@ Unreleased
 -   ``Environment.overlay(enable_async)`` is applied correctly. :pr:`2061`
 -   The error message from ``FileSystemLoader`` includes the paths that were
     searched. :issue:`1661`
+-   ``PackageLoader`` shows a clearer error message when the package does not
+    contain the templates directory. :issue:`1705`
 
 
 Version 3.1.4
index 0cdeca14a4d9e81695c7ffdde7f167d256ea45c0..3913ee51e35d62211a9bca50d0f944ab4c4bc609 100644 (file)
@@ -327,7 +327,6 @@ class PackageLoader(BaseLoader):
         assert loader is not None, "A loader was not found for the package."
         self._loader = loader
         self._archive = None
-        template_root = None
 
         if isinstance(loader, zipimport.zipimporter):
             self._archive = loader.archive
@@ -344,18 +343,23 @@ class PackageLoader(BaseLoader):
             elif spec.origin is not None:
                 roots.append(os.path.dirname(spec.origin))
 
+            if not roots:
+                raise ValueError(
+                    f"The {package_name!r} package was not installed in a"
+                    " way that PackageLoader understands."
+                )
+
             for root in roots:
                 root = os.path.join(root, package_path)
 
                 if os.path.isdir(root):
                     template_root = root
                     break
-
-        if template_root is None:
-            raise ValueError(
-                f"PackageLoader could not find a '{package_path}' directory for the "
-                f"{package_name!r} package."
-            )
+            else:
+                raise ValueError(
+                    f"PackageLoader could not find a {package_path!r} directory"
+                    f" in the {package_name!r} package."
+                )
 
         self._template_root = template_root
 
index 5a4e1a9daf07e230b0f2c75741e35c55220cb128..377290b7156461f078807a654ff536f0afdc622d 100644 (file)
@@ -429,3 +429,8 @@ def test_pep_451_import_hook():
         assert "test.html" in package_loader.list_templates()
     finally:
         sys.meta_path[:] = before
+
+
+def test_package_loader_no_dir() -> None:
+    with pytest.raises(ValueError, match="could not find a 'templates' directory"):
+        PackageLoader("jinja2")