- 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
# 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)
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,
# 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