From 62e47b1d43c3e369ed29d4c633387874d19863d2 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Wed, 6 Dec 2023 17:21:20 -0800 Subject: [PATCH] testing almost ready --- .../entries/script/function_scripts.py | 7 ++++ .../entries/script/variable_scripts.py | 32 ++++++++++++------- .../script/functions/numeric_functions.py | 5 +-- tests/unit/entries/test_variable_scripts.py | 15 +++++++++ 4 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 tests/unit/entries/test_variable_scripts.py diff --git a/src/ytdl_sub/entries/script/function_scripts.py b/src/ytdl_sub/entries/script/function_scripts.py index da26fe5f..8fb5af72 100644 --- a/src/ytdl_sub/entries/script/function_scripts.py +++ b/src/ytdl_sub/entries/script/function_scripts.py @@ -1,5 +1,6 @@ from yt_dlp.utils import sanitize_filename +from ytdl_sub.script.functions import Functions from ytdl_sub.script.types.map import Map from ytdl_sub.script.types.resolvable import Integer from ytdl_sub.script.types.resolvable import String @@ -98,3 +99,9 @@ class CustomFunctions: String("day_of_year_reversed_padded"): String(_pad(day_of_year_reversed, width=3)), } ) + + @staticmethod + def register(): + Functions.register_function(CustomFunctions.sanitize) + Functions.register_function(CustomFunctions.sanitize_plex_episode) + Functions.register_function(CustomFunctions.to_date_metadata) diff --git a/src/ytdl_sub/entries/script/variable_scripts.py b/src/ytdl_sub/entries/script/variable_scripts.py index 16a2adea..c17c0959 100644 --- a/src/ytdl_sub/entries/script/variable_scripts.py +++ b/src/ytdl_sub/entries/script/variable_scripts.py @@ -3,6 +3,7 @@ from typing import Optional import mergedeep +from ytdl_sub.entries.script.function_scripts import CustomFunctions from ytdl_sub.entries.script.variable_definitions import VARIABLES as v from ytdl_sub.entries.script.variable_definitions import DerivedMetadata from ytdl_sub.entries.script.variable_definitions import Metadata @@ -33,7 +34,9 @@ def date_metadata(date_key: Variable, metadata_key: str) -> str: # Metadata Getters -def _get(metadata: Metadata, key: MetadataVariable, default: Optional[Variable | str | int]) -> str: +def _get_internal( + metadata: Metadata, key: MetadataVariable, default: Optional[Variable | str | int] +) -> str: if default is None: # TODO: assert with good error message if key DNE return f"%map_get({metadata.variable_name}, '{key.metadata_key}')" @@ -48,7 +51,11 @@ def _get(metadata: Metadata, key: MetadataVariable, default: Optional[Variable | def _get_int( metadata: Metadata, key: MetadataVariable, default: Optional[Variable | int] = None ) -> str: - return f"{{%int({_get(metadata=metadata, key=key, default=default)}}}" + return f"{{%int({_get_internal(metadata=metadata, key=key, default=default)})}}" + + +def _get(metadata: Metadata, key: MetadataVariable, default: Optional[Variable | str | int]) -> str: + return f"{{{_get_internal(metadata=metadata, key=key, default=default)}}}" ############################################################################################### @@ -56,11 +63,11 @@ def _get_int( def entry_get(key: MetadataVariable, default: Optional[Variable | str | int] = None) -> str: - return f"{{{_get(metadata=v.entry_metadata, key=key, default=default)}}}" + return _get(metadata=v.entry_metadata, key=key, default=default) def entry_get_int(key: MetadataVariable, default: Optional[Variable | int] = None) -> str: - return f"{{%int({_get_int(metadata=v.entry_metadata, key=key, default=default)}}}" + return _get_int(metadata=v.entry_metadata, key=key, default=default) ############################################################################################### @@ -68,11 +75,11 @@ def entry_get_int(key: MetadataVariable, default: Optional[Variable | int] = Non def playlist_get(key: MetadataVariable, default: Optional[Variable | str | int] = None) -> str: - return f"{{{_get(metadata=v.playlist_metadata, key=key, default=default)}}}" + return _get(metadata=v.playlist_metadata, key=key, default=default) def playlist_get_int(key: MetadataVariable, default: Optional[Variable | int] = None) -> str: - return f"{{%int({_get_int(metadata=v.playlist_metadata, key=key, default=default)}}}" + return _get_int(metadata=v.playlist_metadata, key=key, default=default) ############################################################################################### @@ -80,11 +87,11 @@ def playlist_get_int(key: MetadataVariable, default: Optional[Variable | int] = def source_get(key: MetadataVariable, default: Optional[Variable | str | int] = None) -> str: - return f"{{{_get(metadata=v.source_metadata, key=key, default=default)}}}" + return _get(metadata=v.source_metadata, key=key, default=default) def source_get_int(key: MetadataVariable, default: Optional[Variable | int] = None) -> str: - return f"{{%int({_get_int(metadata=v.source_metadata, key=key, default=default)}}}" + return _get_int(metadata=v.source_metadata, key=key, default=default) ############################################################################################### @@ -131,7 +138,7 @@ ENTRY_INJECTED_VARIABLES: Dict[MetadataVariable, str] = { ENTRY_DERIVED_VARIABLES: Dict[Variable, str] = { v.uid_sanitized: sanitized(v.uid), - v.uid_sanitized_plex: sanitized_plex(v.uid_sanitized_plex), + v.uid_sanitized_plex: sanitized_plex(v.uid), v.title_sanitized: sanitized(v.title), v.title_sanitized_plex: sanitized_plex(v.title), v.epoch_date: f"{{%datetime_strftime({v.epoch.variable_name}, '%Y%m%d')}}", @@ -140,7 +147,7 @@ ENTRY_DERIVED_VARIABLES: Dict[Variable, str] = { v.creator_sanitized: sanitized(v.creator), v.download_index_padded6: pad_int(v.download_index, 6), v.upload_date_index_padded: pad_int(v.upload_date_index, 2), - v.upload_date_index_reversed: f"{{%sub(100, {v.download_index})}}", + v.upload_date_index_reversed: f"{{%sub(100, {v.download_index.variable_name})}}", v.upload_date_index_reversed_padded: pad_int(v.upload_date_index_reversed, 2), } @@ -203,7 +210,7 @@ PLAYLIST_INJECTED_VARIABLES: Dict[MetadataVariable, str] = { PLAYLIST_DERIVED_VARIABLES: Dict[Variable, str] = { v.playlist_title_sanitized: sanitized(v.playlist_title), - v.playlist_index_reversed: f"{{%sub({v.playlist_count, v.playlist_index, 1})}}", + v.playlist_index_reversed: f"{{%sub({v.playlist_count.variable_name}, {v.playlist_index.variable_name}, 1)}}", v.playlist_index_padded: pad_int(v.playlist_index, 2), v.playlist_index_reversed_padded: pad_int(v.playlist_index_reversed, 2), v.playlist_index_padded6: pad_int(v.playlist_index, 6), @@ -233,6 +240,7 @@ SOURCE_DERIVED_VARIABLES: Dict[Variable, str] = { _VARIABLE_SCRIPTS: Dict[Variable, str] = {} mergedeep.merge( _VARIABLE_SCRIPTS, + ENTRY_METADATA, ENTRY_HARDCODED_VARIABLES, ENTRY_REQUIRED_VARIABLES, ENTRY_DEFAULT_VARIABLES, @@ -250,3 +258,5 @@ mergedeep.merge( VARIABLE_SCRIPTS: Dict[str, str] = { var.variable_name: script for var, script in _VARIABLE_SCRIPTS.items() } + +CustomFunctions.register() diff --git a/src/ytdl_sub/script/functions/numeric_functions.py b/src/ytdl_sub/script/functions/numeric_functions.py index 02d90c11..02f8f084 100644 --- a/src/ytdl_sub/script/functions/numeric_functions.py +++ b/src/ytdl_sub/script/functions/numeric_functions.py @@ -1,6 +1,7 @@ import math from typing import Union +from ytdl_sub.script.types.resolvable import AnyArgument from ytdl_sub.script.types.resolvable import Boolean from ytdl_sub.script.types.resolvable import Float from ytdl_sub.script.types.resolvable import Integer @@ -16,14 +17,14 @@ def _to_numeric(value: int | float) -> Numeric: class NumericFunctions: @staticmethod - def float(value: Union[Float, Integer, Boolean, String]) -> Float: + def float(value: AnyArgument) -> Float: """ Cast to Float. """ return Float(value=float(value.value)) @staticmethod - def int(value: Union[Float, Integer, Boolean, String]) -> Integer: + def int(value: AnyArgument) -> Integer: """ Cast to Integer. """ diff --git a/tests/unit/entries/test_variable_scripts.py b/tests/unit/entries/test_variable_scripts.py new file mode 100644 index 00000000..ca0a3733 --- /dev/null +++ b/tests/unit/entries/test_variable_scripts.py @@ -0,0 +1,15 @@ +import json +from typing import Dict + +from ytdl_sub.entries.script.variable_definitions import VARIABLES +from ytdl_sub.entries.script.variable_scripts import VARIABLE_SCRIPTS +from ytdl_sub.script.script import Script + + +class TestEntry(object): + def test_entry_to_dict(self, mock_entry, mock_entry_to_dict): + entry_metadata: Dict[str, str] = { + VARIABLES.entry_metadata.variable_name: f"{{{json.dumps(mock_entry._kwargs)}}}" + } + script = Script(dict(entry_metadata, **VARIABLE_SCRIPTS)).resolve() + assert script == mock_entry_to_dict