From b6af2c8de7000d910ce43721c720f4e550e4f748 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Fri, 24 Feb 2023 17:16:22 -0800 Subject: [PATCH] unit tests almost passing --- src/ytdl_sub/config/preset_options.py | 14 ++++++++------ src/ytdl_sub/plugins/nfo_tags.py | 5 +++-- src/ytdl_sub/plugins/subtitles.py | 3 ++- src/ytdl_sub/utils/file_handler.py | 13 +++++++++++++ .../validators/file_path_validators.py | 18 ++++++++++++++++++ tests/expected_transaction_log.py | 2 +- 6 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 src/ytdl_sub/validators/file_path_validators.py diff --git a/src/ytdl_sub/config/preset_options.py b/src/ytdl_sub/config/preset_options.py index af67d5fb..7635b23d 100644 --- a/src/ytdl_sub/config/preset_options.py +++ b/src/ytdl_sub/config/preset_options.py @@ -7,6 +7,8 @@ from typing import Optional from yt_dlp.utils import sanitize_filename from ytdl_sub.entries.entry import Entry +from ytdl_sub.validators.file_path_validators import OverridesStringFormatterValidatorFilePathValidator, \ + StringFormatterFilePathValidator from ytdl_sub.validators.strict_dict_validator import StrictDictValidator from ytdl_sub.validators.string_datetime import StringDatetimeValidator from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator @@ -221,19 +223,19 @@ class OutputOptions(StrictDictValidator): # Output directory should resolve without any entry variables. # This is to check the directory for any download-archives before any downloads begin - self._output_directory: OverridesStringFormatterValidator = self._validate_key( - key="output_directory", validator=OverridesStringFormatterValidator + self._output_directory = self._validate_key( + key="output_directory", validator=OverridesStringFormatterValidatorFilePathValidator ) # file name and thumbnails however can use entry variables - self._file_name: StringFormatterValidator = self._validate_key( - key="file_name", validator=StringFormatterValidator + self._file_name = self._validate_key( + key="file_name", validator=StringFormatterFilePathValidator ) self._thumbnail_name = self._validate_key_if_present( - key="thumbnail_name", validator=StringFormatterValidator + key="thumbnail_name", validator=StringFormatterFilePathValidator ) self._info_json_name = self._validate_key_if_present( - key="info_json_name", validator=StringFormatterValidator + key="info_json_name", validator=StringFormatterFilePathValidator ) self._maintain_download_archive = self._validate_key_if_present( diff --git a/src/ytdl_sub/plugins/nfo_tags.py b/src/ytdl_sub/plugins/nfo_tags.py index 4bde7d4c..cb6df5a9 100644 --- a/src/ytdl_sub/plugins/nfo_tags.py +++ b/src/ytdl_sub/plugins/nfo_tags.py @@ -16,6 +16,7 @@ from ytdl_sub.utils.xml import XmlElement from ytdl_sub.utils.xml import to_max_3_byte_utf8_dict from ytdl_sub.utils.xml import to_max_3_byte_utf8_string from ytdl_sub.utils.xml import to_xml +from ytdl_sub.validators.file_path_validators import StringFormatterFilePathValidator from ytdl_sub.validators.nfo_validators import NfoTagsValidator from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator @@ -46,7 +47,7 @@ class SharedNfoTagsOptions(PluginOptions): super().__init__(name, value) self._nfo_name = self._validate_key_if_present( - key="nfo_name", validator=StringFormatterValidator + key="nfo_name", validator=StringFormatterFilePathValidator ) self._nfo_root = self._validate_key_if_present( key="nfo_root", validator=StringFormatterValidator @@ -57,7 +58,7 @@ class SharedNfoTagsOptions(PluginOptions): ).value @property - def nfo_name(self) -> StringFormatterValidator: + def nfo_name(self) -> StringFormatterFilePathValidator: """ The NFO file name. """ diff --git a/src/ytdl_sub/plugins/subtitles.py b/src/ytdl_sub/plugins/subtitles.py index 8fefa973..c63d87b0 100644 --- a/src/ytdl_sub/plugins/subtitles.py +++ b/src/ytdl_sub/plugins/subtitles.py @@ -11,6 +11,7 @@ from ytdl_sub.plugins.plugin import PluginOptions from ytdl_sub.utils.file_handler import FileHandler from ytdl_sub.utils.file_handler import FileMetadata from ytdl_sub.utils.logger import Logger +from ytdl_sub.validators.file_path_validators import StringFormatterFilePathValidator from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator from ytdl_sub.validators.string_select_validator import StringSelectValidator from ytdl_sub.validators.validators import BoolValidator @@ -58,7 +59,7 @@ class SubtitleOptions(PluginOptions): def __init__(self, name, value): super().__init__(name, value) self._subtitles_name = self._validate_key_if_present( - key="subtitles_name", validator=StringFormatterValidator + key="subtitles_name", validator=StringFormatterFilePathValidator ) self._subtitles_type = self._validate_key_if_present( key="subtitles_type", validator=SubtitlesTypeValidator, default="srt" diff --git a/src/ytdl_sub/utils/file_handler.py b/src/ytdl_sub/utils/file_handler.py index fdc8eabd..d7ec9388 100644 --- a/src/ytdl_sub/utils/file_handler.py +++ b/src/ytdl_sub/utils/file_handler.py @@ -155,6 +155,15 @@ class FileHandlerTransactionLog: Tracks file 'transactions' performed by a FileHandler """ + @classmethod + def format_path_str(cls, path_str: Path | str) -> str: + """ + Returns + ------- + str formatted to always look like a unix string + """ + return str(path_str).replace(os.sep, '/') + def __init__(self): self.files_created: Dict[str, FileMetadata] = {} self.files_modified: Dict[str, FileMetadata] = {} @@ -241,6 +250,10 @@ class FileHandlerTransactionLog: file_directory = os.path.dirname(Path(output_directory) / file_path) file_name = os.path.basename(Path(output_directory) / file_path) + # Format file directories/names to always look like unix + file_directory = cls.format_path_str(file_directory) + file_name = cls.format_path_str(file_name) + directory_set[file_directory][file_name] = file_metadata lines: List[str] = [file_set_title, "-" * 40] diff --git a/src/ytdl_sub/validators/file_path_validators.py b/src/ytdl_sub/validators/file_path_validators.py new file mode 100644 index 00000000..b860c9f2 --- /dev/null +++ b/src/ytdl_sub/validators/file_path_validators.py @@ -0,0 +1,18 @@ +import os +from typing import Dict + +from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator, OverridesStringFormatterValidator + + +class StringFormatterFilePathValidator(StringFormatterValidator): + _expected_value_type_name = "filepath" + + def apply_formatter(self, variable_dict: Dict[str, str]) -> str: + return os.path.relpath(super().apply_formatter(variable_dict)) + + +class OverridesStringFormatterValidatorFilePathValidator(OverridesStringFormatterValidator): + _expected_value_type_name = "static filepath" + + def apply_formatter(self, variable_dict: Dict[str, str]) -> str: + return os.path.relpath(super().apply_formatter(variable_dict)) diff --git a/tests/expected_transaction_log.py b/tests/expected_transaction_log.py index 55e081d3..4a68f90c 100644 --- a/tests/expected_transaction_log.py +++ b/tests/expected_transaction_log.py @@ -43,7 +43,7 @@ def assert_transaction_log_matches( # Read the expected summary file with open(transaction_log_path, "r", encoding="utf-8") as summary_file: - expected_summary = summary_file.read().format(output_directory=output_directory) + expected_summary = summary_file.read().format(output_directory=FileHandlerTransactionLog.format_path_str(output_directory)) # Split, ensure there are the same number of new lines summary_lines: List[str] = summary.split("\n")