From 6133d3e24307df5122e87ce072ae57d67719c7e3 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Fri, 10 Mar 2023 00:00:13 -0800 Subject: [PATCH] fix for windows --- .../validators/file_path_validators.py | 21 ++++++------------- .../validators/test_file_path_validators.py | 19 +++++++++++------ 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/ytdl_sub/validators/file_path_validators.py b/src/ytdl_sub/validators/file_path_validators.py index fb070d5e..592b52b0 100644 --- a/src/ytdl_sub/validators/file_path_validators.py +++ b/src/ytdl_sub/validators/file_path_validators.py @@ -10,12 +10,8 @@ from ytdl_sub.validators.string_formatter_validators import OverridesStringForma from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator from ytdl_sub.validators.validators import StringValidator -_MAX_FILE_NAME_LEN: int = 0 -_MAX_FILE_NAME_BYTES: int = 0 if IS_WINDOWS: - from ctypes.wintypes import MAX_PATH - - _MAX_FILE_NAME_LEN = MAX_PATH + _MAX_FILE_NAME_BYTES = 255 else: _MAX_FILE_NAME_BYTES = os.pathconf("/", "PC_NAME_MAX") @@ -48,9 +44,7 @@ class StringFormatterFilePathValidator(StringFormatterValidator): @classmethod def _is_file_name_too_long(cls, file_name: str) -> bool: - return (_MAX_FILE_NAME_LEN and len(file_name) > _MAX_FILE_NAME_LEN) or ( - _MAX_FILE_NAME_BYTES and len(file_name.encode("utf-8")) > _MAX_FILE_NAME_BYTES - ) + return len(file_name.encode("utf-8")) > _MAX_FILE_NAME_BYTES @classmethod def _get_extension_split(cls, file_name: str) -> Tuple[str, str]: @@ -71,13 +65,10 @@ class StringFormatterFilePathValidator(StringFormatterValidator): @classmethod def _truncate_file_name(cls, file_name: str) -> str: file_sub_name, file_ext = cls._get_extension_split(file_name) - if _MAX_FILE_NAME_LEN: - to_trim = len(file_name) - _MAX_FILE_NAME_LEN + 1 - file_sub_name = file_sub_name[:-to_trim] - elif _MAX_FILE_NAME_BYTES: - desired_size = _MAX_FILE_NAME_BYTES - len(file_ext.encode("utf-8")) - 1 - while len(file_sub_name.encode("utf-8")) > desired_size: - file_sub_name = file_sub_name[:-1] + + desired_size = _MAX_FILE_NAME_BYTES - len(file_ext.encode("utf-8")) - 1 + while len(file_sub_name.encode("utf-8")) > desired_size: + file_sub_name = file_sub_name[:-1] return f"{file_sub_name}.{file_ext}" diff --git a/tests/unit/validators/test_file_path_validators.py b/tests/unit/validators/test_file_path_validators.py index aa0ab181..1daebb76 100644 --- a/tests/unit/validators/test_file_path_validators.py +++ b/tests/unit/validators/test_file_path_validators.py @@ -11,14 +11,17 @@ class TestStringFormatterFilePathValidator: @pytest.mark.parametrize( "ext", [ - ".mp4", - ".info.json", + "mp4", + "info.json", ] - + [f".en.{ext}" for ext in SUBTITLE_EXTENSIONS], + + [f"en-US.{ext}" for ext in SUBTITLE_EXTENSIONS], ) - def test_truncates_file_name_successfully(self, ext: str): + @pytest.mark.parametrize('file_name_char', ['a', '𒃀']) + @pytest.mark.parametrize('file_name_len', [10, 10000]) + def test_truncates_file_name_successfully(self, ext: str, file_name_char: str, file_name_len: int): + ext = f".{ext}" # pytest args with . in the beginning act weird with tempfile.TemporaryDirectory() as temp_dir: - file_name = ("a" * 10000) + ext + file_name = (file_name_char * file_name_len) + ext file_path = str(Path(temp_dir) / file_name) formatter = StringFormatterFilePathValidator(name="test", value=str(file_path)) @@ -30,4 +33,8 @@ class TestStringFormatterFilePathValidator: # Ensure it can actually open the file with open(truncated_file_path, "w", encoding="utf-8"): - pass + # Make sure the file is actually in the directory + dir_paths = list(Path(temp_dir).rglob("*")) + + assert len(dir_paths) == 1 + assert Path(truncated_file_path) == dir_paths[0]