Skip to content

Commit

Permalink
PackageLoader works with single module file
Browse files Browse the repository at this point in the history
  • Loading branch information
davidism committed Nov 9, 2021
1 parent 46f3a68 commit 4198459
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 4 deletions.
2 changes: 2 additions & 0 deletions CHANGES.rst
Expand Up @@ -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
Expand Down
16 changes: 12 additions & 4 deletions src/jinja2/loaders.py
Expand Up @@ -297,10 +297,18 @@ def __init__(
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.has_location:
roots.append(os.path.dirname(spec.origin))

for root in roots:
root = os.path.join(root, package_path)

if os.path.isdir(root):
Expand Down
22 changes: 22 additions & 0 deletions tests/test_loader.py
Expand Up @@ -313,6 +313,28 @@ def test_package_dir_list(package_dir_loader):
assert "test.html" in templates


@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()
Expand Down

0 comments on commit 4198459

Please sign in to comment.