From e6c218bce9ae80810a095032b2c11e64b0dc2620 Mon Sep 17 00:00:00 2001 From: Vicki McKay Date: Mon, 25 Nov 2024 17:29:29 +1100 Subject: [PATCH 1/3] Create GradleEscape extension for #1876 --- src/briefcase/integrations/cookiecutter.py | 22 ++++++++++++ .../cookiecutter/test_GradleEscape.py | 34 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 tests/integrations/cookiecutter/test_GradleEscape.py diff --git a/src/briefcase/integrations/cookiecutter.py b/src/briefcase/integrations/cookiecutter.py index 8367b94c7..2d53bee32 100644 --- a/src/briefcase/integrations/cookiecutter.py +++ b/src/briefcase/integrations/cookiecutter.py @@ -77,6 +77,28 @@ def escape_non_ascii(obj): environment.filters["escape_non_ascii"] = escape_non_ascii +class GradleEscape(Extension): + """Jinja2 extension to escape strings for Gradle as well.""" + + def __init__(self, environment): + """Initialize the extension with the given environment.""" + super().__init__(environment) + + def escape_gradle(obj): + """Escapes single quotes.""" + return obj.replace("'", "") + + def escape_non_ascii(obj): + """Quotes obj if non ascii characters are present.""" + if obj.isascii(): + return obj + else: + return '"' + obj + '"' + + environment.filters["escape_gradle"] = escape_gradle + environment.filters["escape_non_ascii"] = escape_non_ascii + + class PListExtension(Extension): """Jinja2 extension for generating plist values.""" diff --git a/tests/integrations/cookiecutter/test_GradleEscape.py b/tests/integrations/cookiecutter/test_GradleEscape.py new file mode 100644 index 000000000..374d563e9 --- /dev/null +++ b/tests/integrations/cookiecutter/test_GradleEscape.py @@ -0,0 +1,34 @@ +from unittest.mock import MagicMock + +import pytest + +from briefcase.integrations.cookiecutter import GradleEscape + + +@pytest.mark.parametrize( + "value, expected", + [ + ("Hello World", "Hello World"), + ("Hello ' World", "Hello \\' World"), + # ("Hello \\ World", "Hello \\\\ World"), + ], +) +def test_escape_gradle(value, expected): + env = MagicMock() + env.filters = {} + GradleEscape(env) + assert env.filters["escape_gradle"](value) == expected + + +@pytest.mark.parametrize( + "value, expected", + [ + ("helloworld", "helloworld"), + ("helloworldı", '"helloworldı"'), + ], +) +def test_escape_non_ascii(value, expected): + env = MagicMock() + env.filters = {} + GradleEscape(env) + assert env.filters["escape_non_ascii"](value) == expected From 65311be459af6caa99dc8c0620e3444510041267 Mon Sep 17 00:00:00 2001 From: Vicki McKay Date: Tue, 26 Nov 2024 11:29:36 +1100 Subject: [PATCH 2/3] Include backslash escape, fix number of backslashes in single quote escape --- src/briefcase/integrations/cookiecutter.py | 4 ++-- tests/integrations/cookiecutter/test_GradleEscape.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/briefcase/integrations/cookiecutter.py b/src/briefcase/integrations/cookiecutter.py index 2d53bee32..d691b2892 100644 --- a/src/briefcase/integrations/cookiecutter.py +++ b/src/briefcase/integrations/cookiecutter.py @@ -85,8 +85,8 @@ def __init__(self, environment): super().__init__(environment) def escape_gradle(obj): - """Escapes single quotes.""" - return obj.replace("'", "") + """Escapes single quotes and backslashes.""" + return obj.replace("\\", "\\\\").replace("'", "\\'") def escape_non_ascii(obj): """Quotes obj if non ascii characters are present.""" diff --git a/tests/integrations/cookiecutter/test_GradleEscape.py b/tests/integrations/cookiecutter/test_GradleEscape.py index 374d563e9..105ea28c5 100644 --- a/tests/integrations/cookiecutter/test_GradleEscape.py +++ b/tests/integrations/cookiecutter/test_GradleEscape.py @@ -10,7 +10,7 @@ [ ("Hello World", "Hello World"), ("Hello ' World", "Hello \\' World"), - # ("Hello \\ World", "Hello \\\\ World"), + ("Hello \\ World", "Hello \\\\ World"), ], ) def test_escape_gradle(value, expected): From e44e2b1fb983c16e409b0df5eb69ad81fca8d810 Mon Sep 17 00:00:00 2001 From: Vicki McKay Date: Tue, 26 Nov 2024 11:34:53 +1100 Subject: [PATCH 3/3] Add release note --- changes/1876.bugfix.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 changes/1876.bugfix.txt diff --git a/changes/1876.bugfix.txt b/changes/1876.bugfix.txt new file mode 100644 index 000000000..ab1386abd --- /dev/null +++ b/changes/1876.bugfix.txt @@ -0,0 +1 @@ +Added escape template for Gradle which handles single quotes.