aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2020-03-30 12:55:40 -0700
committerDavid Lord <davidism@gmail.com>2020-03-30 12:55:40 -0700
commitc0675781a569b4d54f23ecbfcc6d4730d11ded01 (patch)
tree3faf870963786755075d2332b9193dc74225f399
parenta524e77eec22589e4e657550233a5c3bcf24d046 (diff)
downloadjinja-c0675781a569b4d54f23ecbfcc6d4730d11ded01.tar.gz
add changelog and cleanup for pep 451 support
-rw-r--r--CHANGES.rst2
-rw-r--r--src/jinja2/loaders.py12
-rw-r--r--tests/test_loader.py21
3 files changed, 15 insertions, 20 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index 580d411e..1911ab40 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -9,6 +9,8 @@ Unreleased
- Bump MarkupSafe dependency to >=1.1.
- Bump Babel optional dependency to >=2.1.
- Remove code that was marked deprecated.
+- Use :pep:`451` API to load templates with
+ :class:`~loaders.PackageLoader`. :issue:`1168`
2.11.2
diff --git a/src/jinja2/loaders.py b/src/jinja2/loaders.py
index ca42b7fa..6e546c00 100644
--- a/src/jinja2/loaders.py
+++ b/src/jinja2/loaders.py
@@ -255,17 +255,17 @@ class PackageLoader(BaseLoader):
# packages work, otherwise get_loader returns None.
import_module(package_name)
spec = importlib.util.find_spec(package_name)
- self._loader = spec.loader
-
+ self._loader = loader = spec.loader
self._archive = None
self._template_root = None
- if isinstance(spec.loader, zipimport.zipimporter):
- self._archive = spec.loader.archive
+
+ if isinstance(loader, zipimport.zipimporter):
+ self._archive = loader.archive
pkgdir = next(iter(spec.submodule_search_locations))
self._template_root = os.path.join(pkgdir, package_path)
elif spec.submodule_search_locations:
- # this will be one element for "packages" and multiple for
- # namespace packages
+ # This will be one element for regular packages and multiple
+ # for namespace packages.
for root in spec.submodule_search_locations:
root = os.path.join(root, package_path)
diff --git a/tests/test_loader.py b/tests/test_loader.py
index d3fe61eb..8ca1289a 100644
--- a/tests/test_loader.py
+++ b/tests/test_loader.py
@@ -352,21 +352,13 @@ def test_package_zip_list(package_zip_loader):
assert package_zip_loader.list_templates() == ["foo/test.html", "test.html"]
-def test_pep_451_import_hook(tmp_path):
- package_name = "_my_pep451_pkg"
- pkg = tmp_path.joinpath(package_name)
- pkg.mkdir()
- pkg.joinpath("__init__.py").touch()
- templates = pkg.joinpath("templates")
- templates.mkdir()
- templates.joinpath("foo.html").write_text("hello world")
-
+def test_pep_451_import_hook():
class ImportHook(importlib.abc.MetaPathFinder, importlib.abc.Loader):
def find_spec(self, name, path=None, target=None):
- if name != package_name:
+ if name != "res":
return None
- path = [str(tmp_path)]
- spec = importlib.machinery.PathFinder.find_spec(name, path=path)
+
+ spec = importlib.machinery.PathFinder.find_spec(name)
return importlib.util.spec_from_file_location(
name,
spec.origin,
@@ -382,9 +374,10 @@ def test_pep_451_import_hook(tmp_path):
# ensure we restore `sys.meta_path` after putting in our loader
before = sys.meta_path[:]
+
try:
sys.meta_path.insert(0, ImportHook())
- package_loader = PackageLoader(package_name)
- assert package_loader.list_templates() == ["foo.html"]
+ package_loader = PackageLoader("res")
+ assert "test.html" in package_loader.list_templates()
finally:
sys.meta_path[:] = before