diff --git a/src/ytdl_sub/config/validators/variable_validation.py b/src/ytdl_sub/config/validators/variable_validation.py index 1f53c1f6..64f5f0f5 100644 --- a/src/ytdl_sub/config/validators/variable_validation.py +++ b/src/ytdl_sub/config/validators/variable_validation.py @@ -7,7 +7,7 @@ from ytdl_sub.config.plugin.preset_plugins import PresetPlugins from ytdl_sub.config.preset_options import OutputOptions from ytdl_sub.config.validators.options import OptionsValidator from ytdl_sub.downloaders.url.validators import MultiUrlValidator -from ytdl_sub.validators.string_formatter_validators import validate_formatters +from ytdl_sub.validators.string_formatter_validators import validate_formatters, _validate_formatter class VariableValidation: diff --git a/src/ytdl_sub/utils/script.py b/src/ytdl_sub/utils/script.py index 027a0bd8..753916f4 100644 --- a/src/ytdl_sub/utils/script.py +++ b/src/ytdl_sub/utils/script.py @@ -113,7 +113,20 @@ class ScriptUtils: if isinstance(arg, String): if arg.native == "": return "" if top_level else "''" - return arg.native if top_level else f"'''{arg.native}'''" + + contains_single_quote = "'" in arg.native + contains_double_quote = '"' in arg.native + + if not contains_single_quote and not contains_double_quote: + quote = '"' + elif not contains_single_quote and contains_double_quote: + quote = "'" + elif contains_single_quote and not contains_double_quote: + quote = '"' + else: + quote = "'''" + + return arg.native if top_level else f"{quote}{arg.native}{quote}" if isinstance(arg, Integer): out = f"%int({arg.native})" diff --git a/tests/integration/cli/test_inspect.py b/tests/integration/cli/test_inspect.py index ce50eab5..b11920db 100644 --- a/tests/integration/cli/test_inspect.py +++ b/tests/integration/cli/test_inspect.py @@ -68,7 +68,7 @@ class TestInspect: "info_json_name": "{episode_file_path}.{info_json_ext}", "keep_files_date_eval": "{episode_date_standardized}", "maintain_download_archive": True, - "output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp9ly59oqn/Jake Trains", + "output_directory": f"{output_directory}/Jake Trains", "preserve_mtime": False, "thumbnail_name": "{thumbnail_file_name}", }, @@ -124,7 +124,7 @@ class TestInspect: "tv_show_content_rating": "{ subscription_indent_2 }", "tv_show_content_rating_default": "TV-14", "tv_show_date_range_type": '{ %if( %contains( tv_show_by_date_season_ordering, "release" ), "release_date", "upload_date" ) }', - "tv_show_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp9ly59oqn", + "tv_show_directory": output_directory, "tv_show_fanart_file_name": "fanart.jpg", "tv_show_genre": "{ subscription_indent_1 }", "tv_show_genre_default": "ytdl-sub", diff --git a/tests/unit/utils/test_script_utils.py b/tests/unit/utils/test_script_utils.py index f9d9b395..608066b5 100644 --- a/tests/unit/utils/test_script_utils.py +++ b/tests/unit/utils/test_script_utils.py @@ -18,6 +18,9 @@ class TestScriptUtils: "string": "value", "quotes": "has '' and \"\"", "triple-single-quote": "right here! '''''''''''''''''''''''''''''' ack '''''''", + "has-double-quotes": 'i got "some double quotes" in here', + "has-single-quotes": "i got 'some single quotes' in here", + "has-both-quotes": "i got 'both quotes\" in here", "int": 1, "bool": True, "list": [1, 2, 3], @@ -60,7 +63,15 @@ class TestScriptUtils: def test_to_syntax_tree(self): out = ScriptUtils.to_native_script( - {"{var_a}": "{var_b}", "static_a": "string with {var_c} in it"} + { + "{var_a}": "{var_b}", + "static_a": "string with {var_c} in it", + "quotes": "has '' and \"\"", + "triple-single-quote": "right here! '''''''''''''''''''''''''''''' ack '''''''", + "has-double-quotes": 'i got "some double quotes" in here', + "has-single-quotes": "i got 'some single quotes' in here", + "has-both-quotes": "i got 'both quotes\" in here", + } ) assert parse(out) == SyntaxTree( ast=[ @@ -75,6 +86,19 @@ class TestScriptUtils: BuiltInFunction(name="string", args=[String(value=" in it")]), ], ), + String(value="quotes"): String(value="has '' and \"\""), + String(value="triple-single-quote"): String( + value="right here! '''''''''''''''''''''''''''''' ack '''''''" + ), + String(value="has-double-quotes"): String( + value='i got "some double quotes" in here' + ), + String(value="has-single-quotes"): String( + value="i got 'some single quotes' in here" + ), + String(value="has-both-quotes"): String( + value="i got 'both quotes\" in here" + ), } ) ]