From: Aleš Mrázek Date: Fri, 23 Jun 2023 10:02:08 +0000 (+0200) Subject: manager: datamodel: types: multiline method for EscapedStr X-Git-Tag: v6.0.2~31^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bbd3bfa501410801fdddf009a3e72f65cc88e73b;p=thirdparty%2Fknot-resolver.git manager: datamodel: types: multiline method for EscapedStr It escapes double square brackets. --- 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", [