From 3827704592acf6a06f73f6da70e80f4b0a4d88f0 Mon Sep 17 00:00:00 2001 From: Will Abbott Date: Wed, 18 Sep 2024 09:42:00 +0100 Subject: [PATCH] adjusted cvars dynamic defaults --- django_cotton/templatetags/_vars.py | 7 +- django_cotton/tests/test_cvars.py | 102 ++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 4 deletions(-) diff --git a/django_cotton/templatetags/_vars.py b/django_cotton/templatetags/_vars.py index fdc8267..2dacc18 100644 --- a/django_cotton/templatetags/_vars.py +++ b/django_cotton/templatetags/_vars.py @@ -23,12 +23,13 @@ def render(self, context): if cotton_data["stack"]: current_component = cotton_data["stack"][-1] attrs = current_component["attrs"] + vars = {} for key, value in self.var_dict.items(): if key not in attrs.exclude_unprocessable(): if key.startswith(":"): try: - attrs[key[1:]] = DynamicAttr(value, is_cvar=True).resolve(context) + vars[key[1:]] = DynamicAttr(value, is_cvar=True).resolve(context) except UnprocessableDynamicAttr: pass else: @@ -41,11 +42,9 @@ def render(self, context): # Process cvars without values for empty_var in self.empty_vars: - # if empty_var in attrs.exclude_unprocessable(): - attrs.exclude_from_string_output(empty_var) - with context.push({**attrs.make_attrs_accessible(), "attrs": attrs}): + with context.push({**attrs.make_attrs_accessible(), "attrs": attrs, **vars}): output = self.nodelist.render(context) return output diff --git a/django_cotton/tests/test_cvars.py b/django_cotton/tests/test_cvars.py index a80eff9..edad973 100644 --- a/django_cotton/tests/test_cvars.py +++ b/django_cotton/tests/test_cvars.py @@ -240,3 +240,105 @@ def test_class_attrs_dont_come_through_as_lists(self): with self.settings(ROOT_URLCONF=self.url_conf()): response = self.client.get("/view/") self.assertContains(response, "got it") + + def test_cvars_with_hyphens_and_underscores(self): + self.create_template( + "cvars_hyphens_underscores_view.html", + """""", + "view/", + ) + + self.create_template( + "cotton/cvars_hyphens_underscores.html", + """ + + + default-hyphenated: {{ default_hyphenated }} + default_underscored: {{ default_underscored }} + overwrite-hyphenated: {{ overwrite_hyphenated }} + overwrite_underscored: {{ overwrite_underscored }} + """, + ) + + with self.settings(ROOT_URLCONF=self.url_conf()): + response = self.client.get("/view/") + self.assertContains(response, "default-hyphenated: default-hyphenated") + self.assertContains(response, "default_underscored: default_underscored") + self.assertContains(response, "overwrite-hyphenated: overwrite-hyphenated") + self.assertContains(response, "overwrite_underscored: overwrite_underscored") + + def test_cvars_basics(self): + self.create_template( + "dynamic_cvars_basics_view.html", + """""", + "view/", + ) + + self.create_template( + "cotton/cvars_basics.html", + """ + + + attrs: {{ attrs }} + overwrite: {{ overwrite }} + real: {{ real_attribute }} + """, + ) + + with self.settings(ROOT_URLCONF=self.url_conf()): + response = self.client.get("/view/") + self.assertContains(response, 'attrs: real-attribute="real"') + self.assertContains(response, "overwrite: overwrite") + self.assertContains(response, "real: real") + + def test_cvars_dynamic_defaults(self): + self.create_template( + "dynamic_cvars_dynamic_defaults_view.html", + """""", + "view/", + ) + + self.create_template( + "cotton/dynamic_default_cvars.html", + """ + + + {% if dynamic_default is True %}not{% endif %} + {% if dynamic_default is False %}expected{% endif %} + """, + ) + + with self.settings(ROOT_URLCONF=self.url_conf()): + response = self.client.get("/view/") + self.assertNotContains(response, "not") + self.assertContains(response, "expected") + + def test_overwriting_cvars_dynamic_defaults(self): + self.create_template( + "overwriting_cvars_dynamic_defaults_view.html", + """""", + "view/", + ) + + self.create_template( + "cotton/dynamic_default_overwrite_cvars.html", + """ + + + {% if dynamic_default is True %}expected{% endif %} + {% if dynamic_default is False %}not{% endif %} + """, + ) + + with self.settings(ROOT_URLCONF=self.url_conf()): + response = self.client.get("/view/") + self.assertContains(response, "expected") + self.assertNotContains(response, "not")