From a4293398b7d633bb93e613ff819057e00f96cdb0 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 4 May 2025 18:19:32 -0700 Subject: [PATCH] [FEATURE] Add `join` and `strip` string functions to scripting (#1218) --- .../scripting/scripting_functions.rst | 35 +++++++++++++++++ .../script/functions/string_functions.py | 38 +++++++++++++++++++ .../script/functions/test_string_functions.py | 20 ++++++++++ 3 files changed, 93 insertions(+) diff --git a/docs/source/config_reference/scripting/scripting_functions.rst b/docs/source/config_reference/scripting/scripting_functions.rst index cc42c52c..61076fa7 100644 --- a/docs/source/config_reference/scripting/scripting_functions.rst +++ b/docs/source/config_reference/scripting/scripting_functions.rst @@ -660,6 +660,24 @@ contains_any :description: Returns true if any element in ``contains_array`` is in ``string``. False otherwise. +join +~~~~ +:spec: ``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" + lower ~~~~~ :spec: ``lower(string: String) -> String`` @@ -710,6 +728,23 @@ string :description: Cast to String. +strip +~~~~~ +:spec: ``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!" + titlecase ~~~~~~~~~ :spec: ``titlecase(string: String) -> String`` diff --git a/src/ytdl_sub/script/functions/string_functions.py b/src/ytdl_sub/script/functions/string_functions.py index e9af7a54..43ff87a5 100644 --- a/src/ytdl_sub/script/functions/string_functions.py +++ b/src/ytdl_sub/script/functions/string_functions.py @@ -176,3 +176,41 @@ 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()) diff --git a/tests/unit/script/functions/test_string_functions.py b/tests/unit/script/functions/test_string_functions.py index f5c85741..bc5bfc32 100644 --- a/tests/unit/script/functions/test_string_functions.py +++ b/tests/unit/script/functions/test_string_functions.py @@ -152,3 +152,23 @@ 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