diff --git a/debian/changelog b/debian/changelog index 1b71b71..6adab35 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,3 @@ -jinjax (0.54+dfsg-1) sid; urgency=medium - - * Merging upstream version 0.54+dfsg. - - -- Daniel Baumann Thu, 10 Apr 2025 13:41:06 +0200 - jinjax (0.53+dfsg-1) sid; urgency=medium * Merging upstream version 0.53+dfsg. diff --git a/pyproject.toml b/pyproject.toml index f865827..6fe7e7c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ requires = ["setuptools"] [project] name = "jinjax" -version = "0.54" +version = "0.53" description = "Replace your HTML templates with Python server-Side components" authors = [ {name = "Juan Pablo Scaletti", email = "juanpablo@jpscaletti.com"}, @@ -15,6 +15,7 @@ classifiers = [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", diff --git a/src/jinjax/catalog.py b/src/jinjax/catalog.py index 949fa43..367ef11 100644 --- a/src/jinjax/catalog.py +++ b/src/jinjax/catalog.py @@ -430,10 +430,41 @@ class Catalog: """ content = (kw.pop("_content", kw.pop("__content", "")) or "").strip() 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 - # Get current assets lists css_list = self.collected_css js_list = self.collected_js @@ -602,39 +633,6 @@ class Catalog: 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( self, *, @@ -708,7 +706,9 @@ class Catalog: root_paths = self.prefixes[prefix].searchpath name = name.replace(DELIMITER, SLASH) - kebab_name = kebab_case(name) + name_path = Path(name) + kebab_stem = kebab_case(name_path.stem) + kebab_name = str(name_path.with_name(kebab_stem)) dot_names = (f"{name}.", f"{kebab_name}.") for root_path in root_paths: @@ -716,10 +716,7 @@ class Catalog: root_path, topdown=False, followlinks=True ): relfolder = os.path.relpath(curr_folder, root_path).strip(".") - if relfolder and not ( - name.startswith(relfolder) - or kebab_name.startswith(relfolder) - ): + if relfolder and not name.startswith(relfolder): continue for filename in files: @@ -727,7 +724,6 @@ class Catalog: filepath = f"{relfolder}/{filename}" else: filepath = filename - if filepath.startswith(dot_names) and filepath.endswith(file_ext): return Path(curr_folder) / filename, Path(filepath) diff --git a/src/jinjax/utils.py b/src/jinjax/utils.py index 1748844..26270eb 100644 --- a/src/jinjax/utils.py +++ b/src/jinjax/utils.py @@ -32,10 +32,6 @@ def kebab_case(word: str) -> str: 'html' >>> kebab_case("ui.AwesomeDialog") '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) diff --git a/tests/test_render.py b/tests/test_render.py index a9ec75c..b8b92d9 100644 --- a/tests/test_render.py +++ b/tests/test_render.py @@ -805,15 +805,12 @@ def test_slots(catalog, folder, autoescape): @pytest.mark.parametrize("autoescape", [True, False]) -def test_kebab_cased_component_names(catalog, folder, autoescape): - catalog.jinja_env.autoescape = autoescape +def test_alt_cased_component_names(catalog, folder, autoescape): (folder / "a_tricky-FOLDER").mkdir() - (folder / "kebab-folder").mkdir() + catalog.jinja_env.autoescape = autoescape (folder / "kebab-cased.jinja").write_text("kebab") (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("a_tricky-FOLDER.Greeting") == Markup("pascal") - assert catalog.render("KebabFolder.KebabCased") == Markup("superkebab") diff --git a/uv.lock b/uv.lock index 64a29ce..1aa19f4 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,4 @@ version = 1 -revision = 1 requires-python = ">=3.11, <4" [[package]] @@ -215,7 +214,7 @@ wheels = [ [[package]] name = "jinjax" -version = "0.54" +version = "0.53" source = { editable = "." } dependencies = [ { name = "jinja2" }, @@ -248,7 +247,6 @@ requires-dist = [ { name = "markupsafe", specifier = ">=2.0" }, { name = "whitenoise", marker = "extra == 'whitenoise'" }, ] -provides-extras = ["whitenoise"] [package.metadata.requires-dev] dev = [