diff options
author | David Lord <davidism@gmail.com> | 2021-11-09 12:21:05 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-09 12:21:05 -0800 |
commit | 199b6d5ceb6f8369c21d04ce52c995bdb0005c2a (patch) | |
tree | 2e561e32b5a0e391adb141c56e676ca1223c7ee5 | |
parent | 46f3a68183c2eca8865195f3988f9baf4ec551eb (diff) | |
parent | eec0db8642b25691867890f14fc6c9ca04c8a8c9 (diff) | |
download | jinja2-199b6d5ceb6f8369c21d04ce52c995bdb0005c2a.tar.gz |
Merge pull request #1542 from pallets/package-loader-file
PackageLoader works with single module file
-rw-r--r-- | CHANGES.rst | 2 | ||||
-rw-r--r-- | src/jinja2/loaders.py | 16 | ||||
-rw-r--r-- | tests/test_loader.py | 22 |
3 files changed, 36 insertions, 4 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index a000888..d93d3fe 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -13,6 +13,8 @@ Unreleased :issue:`1514` - Revert change to ``hash(Node)`` behavior. Nodes are hashed by id again :issue:`1521` +- ``PackageLoader`` works when the package is a single module file. + :issue:`1512` Version 3.0.2 diff --git a/src/jinja2/loaders.py b/src/jinja2/loaders.py index 513c858..4fac3a0 100644 --- a/src/jinja2/loaders.py +++ b/src/jinja2/loaders.py @@ -297,10 +297,18 @@ class PackageLoader(BaseLoader): self._archive = loader.archive pkgdir = next(iter(spec.submodule_search_locations)) # type: ignore template_root = os.path.join(pkgdir, package_path) - elif spec.submodule_search_locations: - # This will be one element for regular packages and multiple - # for namespace packages. - for root in spec.submodule_search_locations: + else: + roots: t.List[str] = [] + + # One element for regular packages, multiple for namespace + # packages, or None for single module file. + if spec.submodule_search_locations: + roots.extend(spec.submodule_search_locations) + # A single module file, use the parent directory instead. + elif spec.origin is not None: + roots.append(os.path.dirname(spec.origin)) + + for root in roots: root = os.path.join(root, package_path) if os.path.isdir(root): diff --git a/tests/test_loader.py b/tests/test_loader.py index 1533d02..b300c8f 100644 --- a/tests/test_loader.py +++ b/tests/test_loader.py @@ -314,6 +314,28 @@ def test_package_dir_list(package_dir_loader): @pytest.fixture() +def package_file_loader(monkeypatch): + monkeypatch.syspath_prepend(Path(__file__).parent / "res") + return PackageLoader("__init__") + + +@pytest.mark.parametrize( + ("template", "expect"), [("foo/test.html", "FOO"), ("test.html", "BAR")] +) +def test_package_file_source(package_file_loader, template, expect): + source, name, up_to_date = package_file_loader.get_source(None, template) + assert source.rstrip() == expect + assert name.endswith(os.path.join(*split_template_path(template))) + assert up_to_date() + + +def test_package_file_list(package_file_loader): + templates = package_file_loader.list_templates() + assert "foo/test.html" in templates + assert "test.html" in templates + + +@pytest.fixture() def package_zip_loader(monkeypatch): package_zip = (Path(__file__) / ".." / "res" / "package.zip").resolve() monkeypatch.syspath_prepend(package_zip) |