From d3b41a53eabaa0900640f6af80a0638966f81528 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 16 Sep 2022 15:37:57 -0700 Subject: [PATCH 1/9] Allow whitespace characters within component regex --- src/django_idom/utils.py | 4 +++- tests/test_app/tests/test_regex.py | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/django_idom/utils.py b/src/django_idom/utils.py index 9dd635f8..4566901c 100644 --- a/src/django_idom/utils.py +++ b/src/django_idom/utils.py @@ -13,7 +13,9 @@ from django_idom.config import IDOM_REGISTERED_COMPONENTS -COMPONENT_REGEX = re.compile(r"{% *component +((\"[^\"']*\")|('[^\"']*'))(.*?)%}") +COMPONENT_REGEX = re.compile( + r"{%\s*component\s*((\"[^\"']*\")|('[^\"']*'))\s*((.*?|\s*?)*)\s*%}" +) _logger = logging.getLogger(__name__) diff --git a/tests/test_app/tests/test_regex.py b/tests/test_app/tests/test_regex.py index c0942dba..8883d70f 100644 --- a/tests/test_app/tests/test_regex.py +++ b/tests/test_app/tests/test_regex.py @@ -13,6 +13,14 @@ def test_component_regex(self): r"{% component 'my.component' %}", r'{% component "my.component" class="my_thing" %}', r'{% component "my.component" class="my_thing" attr="attribute" %}', + r"""{% + + component + "my.component" + class="my_thing" + attr="attribute" + + %}""", # noqa: W291 }: self.assertRegex(component, COMPONENT_REGEX) From 5347c5b252d271e97304e30e23ff1d533fed1c88 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 16 Sep 2022 15:47:10 -0700 Subject: [PATCH 2/9] add changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a4ca3b8..c4bb835d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ Using the following categories, list your changes in this order: - `use_query` hook for fetching database values. - `use_mutation` hook for modifying database values. +### Fixed + +- IDOM template tag parser is no longer sensitive to whitespace. + ## [1.1.0] - 2022-07-01 ### Added From 4172dfc8d87fe8064f45435fec29613b302e1326 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 16 Sep 2022 16:32:52 -0700 Subject: [PATCH 3/9] break COMPONENT_REGEX into multiple parts --- src/django_idom/utils.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/django_idom/utils.py b/src/django_idom/utils.py index 4566901c..fba0c71f 100644 --- a/src/django_idom/utils.py +++ b/src/django_idom/utils.py @@ -13,8 +13,17 @@ from django_idom.config import IDOM_REGISTERED_COMPONENTS +_component_tag = r"component" +_component_path = r"((\"[^\"']*\")|('[^\"']*'))" +_component_kwargs = r"((.*?|\s*?)*)" COMPONENT_REGEX = re.compile( - r"{%\s*component\s*((\"[^\"']*\")|('[^\"']*'))\s*((.*?|\s*?)*)\s*%}" + r"{%\s*" + + _component_tag + + r"\s*" + + _component_path + + r"\s*" + + _component_kwargs + + r"\s*%}" ) _logger = logging.getLogger(__name__) From 21682da8d2b465f524c8810ac1d59d2bfbb42a87 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 16 Sep 2022 16:34:54 -0700 Subject: [PATCH 4/9] move logger up --- src/django_idom/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/django_idom/utils.py b/src/django_idom/utils.py index fba0c71f..ae654eea 100644 --- a/src/django_idom/utils.py +++ b/src/django_idom/utils.py @@ -13,6 +13,7 @@ from django_idom.config import IDOM_REGISTERED_COMPONENTS +_logger = logging.getLogger(__name__) _component_tag = r"component" _component_path = r"((\"[^\"']*\")|('[^\"']*'))" _component_kwargs = r"((.*?|\s*?)*)" @@ -25,7 +26,6 @@ + _component_kwargs + r"\s*%}" ) -_logger = logging.getLogger(__name__) def _register_component(full_component_name: str) -> None: From ad17c887f7e41d9561c8b5930f357846d0954d67 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 16 Sep 2022 16:37:00 -0700 Subject: [PATCH 5/9] use consistent verbiage on changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4bb835d..c8e1bb14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,7 +30,7 @@ Using the following categories, list your changes in this order: ### Fixed -- IDOM template tag parser is no longer sensitive to whitespace. +- IDOM preloader is no longer sensitive to whitespace within template tags. ## [1.1.0] - 2022-07-01 From 61e84e09571919eb57c3aea81cde51c8ffc0e395 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 17 Sep 2022 23:39:17 -0700 Subject: [PATCH 6/9] use regex named groups --- src/django_idom/utils.py | 13 ++++++++----- tests/test_app/tests/test_regex.py | 3 +++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/django_idom/utils.py b/src/django_idom/utils.py index ae654eea..bccc7efa 100644 --- a/src/django_idom/utils.py +++ b/src/django_idom/utils.py @@ -15,8 +15,8 @@ _logger = logging.getLogger(__name__) _component_tag = r"component" -_component_path = r"((\"[^\"']*\")|('[^\"']*'))" -_component_kwargs = r"((.*?|\s*?)*)" +_component_path = r"(?P(\"[^\"'\s]*\")|('[^\"'\s]*'))" +_component_kwargs = r"(?P(.*?|\s*?)*)" COMPONENT_REGEX = re.compile( r"{%\s*" + _component_tag @@ -113,11 +113,14 @@ def _get_components(self, templates: set[str]) -> set[str]: for template in templates: with contextlib.suppress(Exception): with open(template, "r", encoding="utf-8") as template_file: - match = COMPONENT_REGEX.findall(template_file.read()) - if not match: + regex_iterable = COMPONENT_REGEX.finditer(template_file.read()) + if not regex_iterable: continue components.update( - [group[0].replace('"', "").replace("'", "") for group in match] + [ + match.groupdict()["path"].replace('"', "").replace("'", "") + for match in regex_iterable + ] ) if not components: _logger.warning( diff --git a/tests/test_app/tests/test_regex.py b/tests/test_app/tests/test_regex.py index 8883d70f..1ff8e2a4 100644 --- a/tests/test_app/tests/test_regex.py +++ b/tests/test_app/tests/test_regex.py @@ -34,5 +34,8 @@ def test_component_regex(self): r"{%%}", r" ", r"", + r'{% component " my.component " %}', + r"""{% component "my.component + " %}""", }: self.assertNotRegex(fake_component, COMPONENT_REGEX) From 45b3e8ddf023e10d12976da4045d5c1094605cf8 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Sep 2022 03:28:55 -0700 Subject: [PATCH 7/9] add tag group name for consistency --- src/django_idom/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/django_idom/utils.py b/src/django_idom/utils.py index bccc7efa..3958dbcf 100644 --- a/src/django_idom/utils.py +++ b/src/django_idom/utils.py @@ -14,7 +14,7 @@ _logger = logging.getLogger(__name__) -_component_tag = r"component" +_component_tag = r"(?Pcomponent)" _component_path = r"(?P(\"[^\"'\s]*\")|('[^\"'\s]*'))" _component_kwargs = r"(?P(.*?|\s*?)*)" COMPONENT_REGEX = re.compile( From d13b9ecfe11b6a76a2da1cbc6b532721778de6fc Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Sep 2022 15:31:03 -0700 Subject: [PATCH 8/9] dont allow component name to be None --- src/django_idom/utils.py | 2 +- tests/test_app/tests/test_regex.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/django_idom/utils.py b/src/django_idom/utils.py index 3958dbcf..52fbf30e 100644 --- a/src/django_idom/utils.py +++ b/src/django_idom/utils.py @@ -15,7 +15,7 @@ _logger = logging.getLogger(__name__) _component_tag = r"(?Pcomponent)" -_component_path = r"(?P(\"[^\"'\s]*\")|('[^\"'\s]*'))" +_component_path = r"(?P(\"[^\"'\s]+\")|('[^\"'\s]+'))" _component_kwargs = r"(?P(.*?|\s*?)*)" COMPONENT_REGEX = re.compile( r"{%\s*" diff --git a/tests/test_app/tests/test_regex.py b/tests/test_app/tests/test_regex.py index 1ff8e2a4..4fff532d 100644 --- a/tests/test_app/tests/test_regex.py +++ b/tests/test_app/tests/test_regex.py @@ -37,5 +37,7 @@ def test_component_regex(self): r'{% component " my.component " %}', r"""{% component "my.component " %}""", + r'{{ component """ }}', + r'{{ component "" }}', }: self.assertNotRegex(fake_component, COMPONENT_REGEX) From 14d772f88d90e05bbfc0e140472789d82e08f7ec Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Sep 2022 21:51:01 -0700 Subject: [PATCH 9/9] use `group` api instead of `groupdict` --- src/django_idom/utils.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/django_idom/utils.py b/src/django_idom/utils.py index 52fbf30e..27d106a4 100644 --- a/src/django_idom/utils.py +++ b/src/django_idom/utils.py @@ -114,14 +114,11 @@ def _get_components(self, templates: set[str]) -> set[str]: with contextlib.suppress(Exception): with open(template, "r", encoding="utf-8") as template_file: regex_iterable = COMPONENT_REGEX.finditer(template_file.read()) - if not regex_iterable: - continue - components.update( - [ - match.groupdict()["path"].replace('"', "").replace("'", "") - for match in regex_iterable - ] - ) + component_paths = [ + match.group("path").replace('"', "").replace("'", "") + for match in regex_iterable + ] + components.update(component_paths) if not components: _logger.warning( "\033[93m"