From bbd3bfa501410801fdddf009a3e72f65cc88e73b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ale=C5=A1=20Mr=C3=A1zek?= Date: Fri, 23 Jun 2023 12:02:08 +0200 Subject: [PATCH] manager: datamodel: types: multiline method for EscapedStr It escapes double square brackets. --- .../templates/macros/local_data_macros.lua.j2 | 3 +- .../datamodel/types/types.py | 16 +++++++++++ .../datamodel/templates/test_types_render.py | 28 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2 b/manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2 index c3104b7de..98819a8f3 100644 --- a/manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2 +++ b/manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2 @@ -46,7 +46,8 @@ assert(hints.add_hosts('{{ file }}').result == true) {{ id }}.filename = '{{ input_str }}' {% else %} {{ id }}.input_str = [[ -{{ input_str }}]] +{{ input_str.multiline() }} +]] {% endif %} assert(C.kr_rule_zonefile({{ id }})==0) {%- endmacro %} diff --git a/manager/knot_resolver_manager/datamodel/types/types.py b/manager/knot_resolver_manager/datamodel/types/types.py index dfc2317cc..c8b533215 100644 --- a/manager/knot_resolver_manager/datamodel/types/types.py +++ b/manager/knot_resolver_manager/datamodel/types/types.py @@ -99,6 +99,22 @@ class EscapedStr(StrBase): s[i] = repr(c)[1:-1] self._value = "".join(s) + def multiline(self) -> str: + """ + Lua multiline string is enclosed in double square brackets '[[ ]]'. + This method makes sure that double square brackets are escaped. + """ + + replace = { + "[[": r"\[\[", + "]]": r"\]\]", + } + + ml = self._orig_value + for s, r in replace.items(): + ml = ml.replace(s, r) + return ml + class EscapedStr32B(EscapedStr, StringLengthBase): """ diff --git a/manager/tests/unit/datamodel/templates/test_types_render.py b/manager/tests/unit/datamodel/templates/test_types_render.py index 15a0611a4..f83b41e34 100644 --- a/manager/tests/unit/datamodel/templates/test_types_render.py +++ b/manager/tests/unit/datamodel/templates/test_types_render.py @@ -9,6 +9,34 @@ from knot_resolver_manager.utils.modeling import ConfigSchema str_template = Template("'{{ string }}'") +str_multiline_template = Template( + """[[ +{{ string.multiline() }} +]]""" +) + + +@pytest.mark.parametrize( + "val,exp", + [ + ("\a\b\f\n\r\t\v\\", "\a\b\f\n\r\t\v\\"), + ("[[ test ]]", r"\[\[ test \]\]"), + ("[ [ test ] ]", r"[ [ test ] ]"), + ], +) +def test_escaped_str_multiline(val: Any, exp: str): + class TestSchema(ConfigSchema): + pattern: EscapedStr + + d = TestSchema({"pattern": val}) + assert ( + str_multiline_template.render(string=d.pattern) + == f"""[[ +{exp} +]]""" + ) + + @pytest.mark.parametrize( "val,exp", [ -- 2.47.2