From b8dc68fb08b5140c0ddf84467f5244506b88f427 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 4 May 2025 18:01:51 -0700 Subject: [PATCH] [FEATURE] Add `join` and `strip` string functions to scripting --- .../script/functions/string_functions.py | 37 +++++++++++++++++++ .../script/functions/test_string_functions.py | 16 ++++++++ 2 files changed, 53 insertions(+) diff --git a/src/ytdl_sub/script/functions/string_functions.py b/src/ytdl_sub/script/functions/string_functions.py index e9af7a54..7e0e0eb5 100644 --- a/src/ytdl_sub/script/functions/string_functions.py +++ b/src/ytdl_sub/script/functions/string_functions.py @@ -176,3 +176,40 @@ class StringFunctions: # World """ return String(string.value.encode("utf-8").decode("unicode_escape")) + + @staticmethod + def join(separator: String, array: Array) -> String: + """ + :description: + Join all elements in the array together as a string, and insert the separator between them. + + :usage: + + .. code-block:: python + + { + %join( ", ", ["item1", "item2"] ) + } + + # "item1, item2" + """ + + return String(separator.value.join(str(val) for val in array.value)) + + @staticmethod + def strip(string: String) -> String: + """ + :description: + Strip a string of all its whitespace at the beginning and end. + + :usage: + + .. code-block:: python + + { + %trim(" delete the outer! ") + } + + # "delete the outer!" + """ + return String(string.value.strip()) \ No newline at end of file diff --git a/tests/unit/script/functions/test_string_functions.py b/tests/unit/script/functions/test_string_functions.py index f5c85741..de0fd116 100644 --- a/tests/unit/script/functions/test_string_functions.py +++ b/tests/unit/script/functions/test_string_functions.py @@ -152,3 +152,19 @@ class TestNumericFunctions: output = single_variable_output(f"{{%split('{input_string}', {split})}}") assert output == expected_output + + @pytest.mark.parametrize( + "value, expected_output", + [("['a', 'b', 'c']", 'a, b, c'), ("['nope', [], {}]", 'nope, [], {}'), ("['a', 1, 3.14, True]", 'a, 1, 3.14, true')], + ) + def test_join(self, value, expected_output): + output = single_variable_output(f"{{%join(', ', {value})}}") + assert output == expected_output + + @pytest.mark.parametrize( + "value, expected_output", + [(" delete outer ", 'delete outer'), (" delete me\n\n", 'delete me')], + ) + def test_strip(self, value, expected_output): + output = single_variable_output(f"{{%strip('{value}')}}") + assert output == expected_output \ No newline at end of file