- ``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
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
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
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")