From 5f246b419c9865a328f33178478aa2b03898d842 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Fri, 23 Jan 2026 19:41:37 -0800 Subject: [PATCH] updated fixtures --- .../validators/string_formatter_validators.py | 38 ++++++------------- .../tv_show/inspect_sub_internal.json | 30 ++++++++------- .../tv_show/inspect_sub_original.json | 2 +- .../tv_show/inspect_sub_resolve.json | 30 ++++++++------- .../config/test_subscription_resolution.py | 2 +- 5 files changed, 46 insertions(+), 56 deletions(-) diff --git a/src/ytdl_sub/validators/string_formatter_validators.py b/src/ytdl_sub/validators/string_formatter_validators.py index aab2d8fe..37cfe802 100644 --- a/src/ytdl_sub/validators/string_formatter_validators.py +++ b/src/ytdl_sub/validators/string_formatter_validators.py @@ -11,7 +11,6 @@ from ytdl_sub.script.types.syntax_tree import SyntaxTree from ytdl_sub.script.utils.exceptions import RuntimeException from ytdl_sub.script.utils.exceptions import ScriptVariableNotResolved from ytdl_sub.script.utils.exceptions import UserException -from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError from ytdl_sub.utils.exceptions import StringFormattingVariableNotFoundException from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.validators.validators import DictValidator @@ -225,28 +224,16 @@ class UnstructuredOverridesDictFormatterValidator(UnstructuredDictFormatterValid _key_validator = OverridesStringFormatterValidator -def to_variable_dependency_format_string(script: Script, parsed_format_string: SyntaxTree) -> str: - """ - Create a dummy format string that contains all variable deps as a string. - """ - dummy_format_string = "" - for var in parsed_format_string.variables: - dummy_format_string += f"{{ {var.name} }}" - for variable_dependency in script._variables[var.name].variables: - dummy_format_string += f"{{ {variable_dependency.name} }}" - return dummy_format_string - - def _validate_formatter( mock_script: Script, unresolved_variables: Set[str], unresolved_runtime_variables: Set[str], formatter_validator: Union[StringFormatterValidator, OverridesStringFormatterValidator], partial_resolve_entry_formatters: bool, -) -> str: +) -> Any: parsed = formatter_validator.parsed if resolved := parsed.maybe_resolvable: - return resolved.native + return formatter_validator.post_process(resolved.native) is_static_formatter = isinstance(formatter_validator, OverridesStringFormatterValidator) @@ -282,11 +269,16 @@ def _validate_formatter( try: if is_static_formatter: - return mock_script.resolve_once_parsed( - {"tmp_var": formatter_validator.parsed}, - unresolvable=unresolved_variables, - update=True, - )["tmp_var"].native + return formatter_validator.post_process( + mock_script.resolve_once_parsed( + {"tmp_var": formatter_validator.parsed}, + unresolvable=unresolved_variables, + update=True, + )["tmp_var"].native + ) + + if maybe_resolved := parsed.maybe_resolvable: + return formatter_validator.post_process(maybe_resolved) return ScriptUtils.to_native_script(parsed) except RuntimeException as exc: @@ -296,12 +288,6 @@ def _validate_formatter( "entry variables" ) from exc raise StringFormattingVariableNotFoundException(exc) from exc - except UserThrownRuntimeError as exc: - # Errors are expected for non-static formatters due to missing entry - # data. Raise otherwise. - if not is_static_formatter: - return formatter_validator.format_string - raise exc def validate_formatters( diff --git a/tests/resources/expected_json/tv_show/inspect_sub_internal.json b/tests/resources/expected_json/tv_show/inspect_sub_internal.json index e718d2e9..ebe2ceaf 100644 --- a/tests/resources/expected_json/tv_show/inspect_sub_internal.json +++ b/tests/resources/expected_json/tv_show/inspect_sub_internal.json @@ -2,17 +2,17 @@ "chapters": { "allow_chapters_from_comments": false, "embed_chapters": true, - "enable": "True", + "enable": true, "force_key_frames": false }, "date_range": { - "breaks": "True", - "enable": "True", + "breaks": true, + "enable": true, "type": "upload_date" }, "download": [ { - "download_reverse": "True", + "download_reverse": true, "include_sibling_metadata": false, "playlist_thumbnails": [ { @@ -34,7 +34,9 @@ "uid": "banner_uncropped" } ], - "url": "https://www.youtube.com/@novapbs", + "url": [ + "https://www.youtube.com/@novapbs" + ], "variables": {}, "webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", "ytdl_options": {} @@ -43,7 +45,7 @@ "file_convert": { "convert_to": "mp4", "convert_with": "yt-dlp", - "enable": "True" + "enable": true }, "format": "(bv*[ext=mp4][vcodec~='^((he|a)vc|h26[45])']+ba[ext=m4a]) / (bv[ext=mp4]*+ba[ext=m4a]/b)", "output_options": { @@ -52,7 +54,7 @@ "info_json_name": "{ %concat( %string( %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".e\", %string( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), %pad_zero( upload_date_index, 2 ) ) ), 6 ) ), \" - \", %string( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) ) ) }.info.json", "keep_files_date_eval": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", "maintain_download_archive": true, - "output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp_iqgtgmn/NOVA PBS", + "output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp8vzxo6z8/NOVA PBS", "preserve_mtime": false, "thumbnail_name": "{ %concat( %string( %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".e\", %string( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), %pad_zero( upload_date_index, 2 ) ) ), 6 ) ), \" - \", %string( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) ) ) }-thumb.jpg" }, @@ -110,7 +112,7 @@ "tv_show_content_rating": "TV-14", "tv_show_content_rating_default": "TV-14", "tv_show_date_range_type": "upload_date", - "tv_show_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp_iqgtgmn", + "tv_show_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp8vzxo6z8", "tv_show_fanart_file_name": "fanart.jpg", "tv_show_genre": "Documentaries", "tv_show_genre_default": "ytdl-sub", @@ -223,16 +225,16 @@ "throttle_protection": { "enable": true, "sleep_per_download_s": { - "max": "28.4", - "min": "13.8" + "max": 28.4, + "min": 13.8 }, "sleep_per_request_s": { - "max": "0.75", - "min": "0.0" + "max": 0.75, + "min": 0.0 }, "sleep_per_subscription_s": { - "max": "26.1", - "min": "16.3" + "max": 26.1, + "min": 16.3 } }, "video_tags": { diff --git a/tests/resources/expected_json/tv_show/inspect_sub_original.json b/tests/resources/expected_json/tv_show/inspect_sub_original.json index 854c4b6c..b8940f35 100644 --- a/tests/resources/expected_json/tv_show/inspect_sub_original.json +++ b/tests/resources/expected_json/tv_show/inspect_sub_original.json @@ -109,7 +109,7 @@ "tv_show_content_rating": "{subscription_indent_2}", "tv_show_content_rating_default": "TV-14", "tv_show_date_range_type": "{\n %if(\n %contains(tv_show_by_date_season_ordering, \"release\"),\n \"release_date\",\n \"upload_date\"\n )\n}", - "tv_show_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpjjbduqm_", + "tv_show_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpg7qxc12z", "tv_show_fanart_file_name": "fanart.jpg", "tv_show_genre": "{subscription_indent_1}", "tv_show_genre_default": "ytdl-sub", diff --git a/tests/resources/expected_json/tv_show/inspect_sub_resolve.json b/tests/resources/expected_json/tv_show/inspect_sub_resolve.json index 2310f9fd..5aabacb5 100644 --- a/tests/resources/expected_json/tv_show/inspect_sub_resolve.json +++ b/tests/resources/expected_json/tv_show/inspect_sub_resolve.json @@ -2,17 +2,17 @@ "chapters": { "allow_chapters_from_comments": false, "embed_chapters": true, - "enable": "True", + "enable": true, "force_key_frames": false }, "date_range": { - "breaks": "True", - "enable": "True", + "breaks": true, + "enable": true, "type": "upload_date" }, "download": [ { - "download_reverse": "True", + "download_reverse": true, "include_sibling_metadata": false, "playlist_thumbnails": [ { @@ -34,7 +34,9 @@ "uid": "banner_uncropped" } ], - "url": "https://www.youtube.com/@novapbs", + "url": [ + "https://www.youtube.com/@novapbs" + ], "variables": {}, "webpage_url": "{ webpage_url }", "ytdl_options": {} @@ -43,7 +45,7 @@ "file_convert": { "convert_to": "mp4", "convert_with": "yt-dlp", - "enable": "True" + "enable": true }, "format": "(bv*[ext=mp4][vcodec~='^((he|a)vc|h26[45])']+ba[ext=m4a]) / (bv[ext=mp4]*+ba[ext=m4a]/b)", "output_options": { @@ -52,7 +54,7 @@ "info_json_name": "{ %concat( %string( %sanitize( %concat( \"Season \", %string( upload_year ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( upload_year ), \".e\", %string( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ), \" - \", %string( title_sanitized_plex ) ) ) ) ) }.{ info_json_ext }", "keep_files_date_eval": "{ upload_date_standardized }", "maintain_download_archive": true, - "output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmptcec16mv/NOVA PBS", + "output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpk9271nih/NOVA PBS", "preserve_mtime": false, "thumbnail_name": "{ %concat( %string( %sanitize( %concat( \"Season \", %string( upload_year ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( upload_year ), \".e\", %string( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ), \" - \", %string( title_sanitized_plex ) ) ) ) ) }-thumb.jpg" }, @@ -110,7 +112,7 @@ "tv_show_content_rating": "TV-14", "tv_show_content_rating_default": "TV-14", "tv_show_date_range_type": "upload_date", - "tv_show_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmptcec16mv", + "tv_show_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpk9271nih", "tv_show_fanart_file_name": "fanart.jpg", "tv_show_genre": "Documentaries", "tv_show_genre_default": "ytdl-sub", @@ -223,16 +225,16 @@ "throttle_protection": { "enable": true, "sleep_per_download_s": { - "max": "28.4", - "min": "13.8" + "max": 28.4, + "min": 13.8 }, "sleep_per_request_s": { - "max": "0.75", - "min": "0.0" + "max": 0.75, + "min": 0.0 }, "sleep_per_subscription_s": { - "max": "26.1", - "min": "16.3" + "max": 26.1, + "min": 16.3 } }, "video_tags": { diff --git a/tests/unit/config/test_subscription_resolution.py b/tests/unit/config/test_subscription_resolution.py index 04388ff7..2bd0a171 100644 --- a/tests/unit/config/test_subscription_resolution.py +++ b/tests/unit/config/test_subscription_resolution.py @@ -23,7 +23,7 @@ def _ensure_resolved_yaml( if resolution_level > ResolutionLevel.ORIGINAL: expected_out["output_options"]["output_directory"] = FilePathTruncater.to_native_filepath( - str(Path(output_directory) / "ass") + str(Path(output_directory) / sub.name) ) if "tv_show_directory" in expected_out["overrides"]: