Merging upstream version 0.54+dfsg.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
0fcef2118b
commit
9ca7384828
5 changed files with 54 additions and 42 deletions
|
@ -4,7 +4,7 @@ requires = ["setuptools"]
|
||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "jinjax"
|
name = "jinjax"
|
||||||
version = "0.53"
|
version = "0.54"
|
||||||
description = "Replace your HTML templates with Python server-Side components"
|
description = "Replace your HTML templates with Python server-Side components"
|
||||||
authors = [
|
authors = [
|
||||||
{name = "Juan Pablo Scaletti", email = "juanpablo@jpscaletti.com"},
|
{name = "Juan Pablo Scaletti", email = "juanpablo@jpscaletti.com"},
|
||||||
|
@ -15,7 +15,6 @@ classifiers = [
|
||||||
"Development Status :: 4 - Beta",
|
"Development Status :: 4 - Beta",
|
||||||
"Environment :: Web Environment",
|
"Environment :: Web Environment",
|
||||||
"Intended Audience :: Developers",
|
"Intended Audience :: Developers",
|
||||||
"License :: OSI Approved :: MIT License",
|
|
||||||
"Programming Language :: Python :: 3 :: Only",
|
"Programming Language :: Python :: 3 :: Only",
|
||||||
"Programming Language :: Python :: 3.10",
|
"Programming Language :: Python :: 3.10",
|
||||||
"Programming Language :: Python :: 3.11",
|
"Programming Language :: Python :: 3.11",
|
||||||
|
|
|
@ -430,41 +430,10 @@ class Catalog:
|
||||||
"""
|
"""
|
||||||
content = (kw.pop("_content", kw.pop("__content", "")) or "").strip()
|
content = (kw.pop("_content", kw.pop("__content", "")) or "").strip()
|
||||||
attrs = kw.pop("_attrs", kw.pop("__attrs", None)) or {}
|
attrs = kw.pop("_attrs", kw.pop("__attrs", None)) or {}
|
||||||
source = kw.pop("_source", kw.pop("__source", ""))
|
|
||||||
file_ext = kw.pop("_file_ext", kw.pop("__file_ext", "")) or self.file_ext
|
|
||||||
caller_prefix = kw.pop("__prefix", "")
|
|
||||||
|
|
||||||
cname = __name
|
|
||||||
prefix, name = self._split_name(cname)
|
|
||||||
component = None
|
|
||||||
|
|
||||||
if source:
|
|
||||||
logger.debug("Rendering from source %s", cname)
|
|
||||||
self.jinja_env.loader = self.prefixes[prefix]
|
|
||||||
component = self._get_from_source(prefix=prefix, name=name, source=source)
|
|
||||||
else:
|
|
||||||
logger.debug("Rendering from cache or file %s", cname)
|
|
||||||
get_from = self._get_from_cache if self.use_cache else self._get_from_file
|
|
||||||
|
|
||||||
if caller_prefix:
|
|
||||||
self.jinja_env.loader = self.prefixes[caller_prefix]
|
|
||||||
component = get_from(
|
|
||||||
prefix=caller_prefix,
|
|
||||||
name=cname,
|
|
||||||
file_ext=file_ext
|
|
||||||
)
|
|
||||||
if not component:
|
|
||||||
self.jinja_env.loader = self.prefixes[prefix]
|
|
||||||
component = get_from(
|
|
||||||
prefix=prefix,
|
|
||||||
name=name,
|
|
||||||
file_ext=file_ext
|
|
||||||
)
|
|
||||||
|
|
||||||
if not component:
|
|
||||||
raise ComponentNotFound(cname, file_ext)
|
|
||||||
|
|
||||||
|
component = self._get_component(__name, **kw)
|
||||||
root_path = component.path.parent if component.path else None
|
root_path = component.path.parent if component.path else None
|
||||||
|
|
||||||
# Get current assets lists
|
# Get current assets lists
|
||||||
css_list = self.collected_css
|
css_list = self.collected_css
|
||||||
js_list = self.collected_js
|
js_list = self.collected_js
|
||||||
|
@ -633,6 +602,39 @@ class Catalog:
|
||||||
|
|
||||||
return f"{parent}{stem}-{fingerprint}{ext}"
|
return f"{parent}{stem}-{fingerprint}{ext}"
|
||||||
|
|
||||||
|
def _get_component(self, cname: str, **kw) -> Component:
|
||||||
|
source = kw.pop("_source", kw.pop("__source", ""))
|
||||||
|
file_ext = kw.pop("_file_ext", kw.pop("__file_ext", "")) or self.file_ext
|
||||||
|
caller_prefix = kw.pop("__prefix", "")
|
||||||
|
|
||||||
|
prefix, name = self._split_name(cname)
|
||||||
|
component = None
|
||||||
|
|
||||||
|
if source:
|
||||||
|
logger.debug("Rendering from source %s", cname)
|
||||||
|
self.jinja_env.loader = self.prefixes[prefix]
|
||||||
|
return self._get_from_source(prefix=prefix, name=name, source=source)
|
||||||
|
|
||||||
|
logger.debug("Rendering from cache or file %s", cname)
|
||||||
|
get_from = self._get_from_cache if self.use_cache else self._get_from_file
|
||||||
|
if caller_prefix:
|
||||||
|
self.jinja_env.loader = self.prefixes[caller_prefix]
|
||||||
|
component = get_from(
|
||||||
|
prefix=caller_prefix,
|
||||||
|
name=cname,
|
||||||
|
file_ext=file_ext
|
||||||
|
)
|
||||||
|
if not component:
|
||||||
|
self.jinja_env.loader = self.prefixes[prefix]
|
||||||
|
component = get_from(
|
||||||
|
prefix=prefix,
|
||||||
|
name=name,
|
||||||
|
file_ext=file_ext
|
||||||
|
)
|
||||||
|
if component:
|
||||||
|
return component
|
||||||
|
raise ComponentNotFound(cname, file_ext)
|
||||||
|
|
||||||
def _get_from_source(
|
def _get_from_source(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
|
@ -706,9 +708,7 @@ class Catalog:
|
||||||
root_paths = self.prefixes[prefix].searchpath
|
root_paths = self.prefixes[prefix].searchpath
|
||||||
|
|
||||||
name = name.replace(DELIMITER, SLASH)
|
name = name.replace(DELIMITER, SLASH)
|
||||||
name_path = Path(name)
|
kebab_name = kebab_case(name)
|
||||||
kebab_stem = kebab_case(name_path.stem)
|
|
||||||
kebab_name = str(name_path.with_name(kebab_stem))
|
|
||||||
dot_names = (f"{name}.", f"{kebab_name}.")
|
dot_names = (f"{name}.", f"{kebab_name}.")
|
||||||
|
|
||||||
for root_path in root_paths:
|
for root_path in root_paths:
|
||||||
|
@ -716,7 +716,10 @@ class Catalog:
|
||||||
root_path, topdown=False, followlinks=True
|
root_path, topdown=False, followlinks=True
|
||||||
):
|
):
|
||||||
relfolder = os.path.relpath(curr_folder, root_path).strip(".")
|
relfolder = os.path.relpath(curr_folder, root_path).strip(".")
|
||||||
if relfolder and not name.startswith(relfolder):
|
if relfolder and not (
|
||||||
|
name.startswith(relfolder)
|
||||||
|
or kebab_name.startswith(relfolder)
|
||||||
|
):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for filename in files:
|
for filename in files:
|
||||||
|
@ -724,6 +727,7 @@ class Catalog:
|
||||||
filepath = f"{relfolder}/{filename}"
|
filepath = f"{relfolder}/{filename}"
|
||||||
else:
|
else:
|
||||||
filepath = filename
|
filepath = filename
|
||||||
|
|
||||||
if filepath.startswith(dot_names) and filepath.endswith(file_ext):
|
if filepath.startswith(dot_names) and filepath.endswith(file_ext):
|
||||||
return Path(curr_folder) / filename, Path(filepath)
|
return Path(curr_folder) / filename, Path(filepath)
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,10 @@ def kebab_case(word: str) -> str:
|
||||||
'html'
|
'html'
|
||||||
>>> kebab_case("ui.AwesomeDialog")
|
>>> kebab_case("ui.AwesomeDialog")
|
||||||
'ui.awesome-dialog'
|
'ui.awesome-dialog'
|
||||||
|
>>> kebab_case("MyFolder/DeviceType")
|
||||||
|
'my-folder/device-type'
|
||||||
|
>>> kebab_case("MyFolder.DeviceType")
|
||||||
|
'my-folder.device-type'
|
||||||
|
|
||||||
"""
|
"""
|
||||||
word = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1-\2", word)
|
word = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1-\2", word)
|
||||||
|
|
|
@ -805,12 +805,15 @@ def test_slots(catalog, folder, autoescape):
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("autoescape", [True, False])
|
@pytest.mark.parametrize("autoescape", [True, False])
|
||||||
def test_alt_cased_component_names(catalog, folder, autoescape):
|
def test_kebab_cased_component_names(catalog, folder, autoescape):
|
||||||
(folder / "a_tricky-FOLDER").mkdir()
|
|
||||||
catalog.jinja_env.autoescape = autoescape
|
catalog.jinja_env.autoescape = autoescape
|
||||||
|
(folder / "a_tricky-FOLDER").mkdir()
|
||||||
|
(folder / "kebab-folder").mkdir()
|
||||||
|
|
||||||
(folder / "kebab-cased.jinja").write_text("kebab")
|
(folder / "kebab-cased.jinja").write_text("kebab")
|
||||||
(folder / "a_tricky-FOLDER" / "Greeting.jinja").write_text("pascal")
|
(folder / "a_tricky-FOLDER" / "Greeting.jinja").write_text("pascal")
|
||||||
|
(folder / "kebab-folder" / "kebab-cased.jinja").write_text("superkebab")
|
||||||
|
|
||||||
assert catalog.render("KebabCased") == Markup("kebab")
|
assert catalog.render("KebabCased") == Markup("kebab")
|
||||||
assert catalog.render("a_tricky-FOLDER.Greeting") == Markup("pascal")
|
assert catalog.render("a_tricky-FOLDER.Greeting") == Markup("pascal")
|
||||||
|
assert catalog.render("KebabFolder.KebabCased") == Markup("superkebab")
|
||||||
|
|
4
uv.lock
generated
4
uv.lock
generated
|
@ -1,4 +1,5 @@
|
||||||
version = 1
|
version = 1
|
||||||
|
revision = 1
|
||||||
requires-python = ">=3.11, <4"
|
requires-python = ">=3.11, <4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -214,7 +215,7 @@ wheels = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jinjax"
|
name = "jinjax"
|
||||||
version = "0.53"
|
version = "0.54"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "jinja2" },
|
{ name = "jinja2" },
|
||||||
|
@ -247,6 +248,7 @@ requires-dist = [
|
||||||
{ name = "markupsafe", specifier = ">=2.0" },
|
{ name = "markupsafe", specifier = ">=2.0" },
|
||||||
{ name = "whitenoise", marker = "extra == 'whitenoise'" },
|
{ name = "whitenoise", marker = "extra == 'whitenoise'" },
|
||||||
]
|
]
|
||||||
|
provides-extras = ["whitenoise"]
|
||||||
|
|
||||||
[package.metadata.requires-dev]
|
[package.metadata.requires-dev]
|
||||||
dev = [
|
dev = [
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue