[BUGFIX] Do not perform nested scripting on file path outputs (#1123)
Fixes a bug where curly braces in file-names causes scripting to think its a variable that does not exist
This commit is contained in:
parent
0f542ac4e5
commit
d3295cef86
4 changed files with 17 additions and 28 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
import posixpath
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
|
|
@ -59,3 +60,8 @@ class FilePathTruncater:
|
||||||
return str(Path(file_directory) / cls._truncate_file_name(file_name))
|
return str(Path(file_directory) / cls._truncate_file_name(file_name))
|
||||||
|
|
||||||
return str(file_path)
|
return str(file_path)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def to_native_filepath(cls, file_path: str) -> str:
|
||||||
|
"""Ensures file paths use the correct separator"""
|
||||||
|
return os.path.expanduser(file_path.replace(posixpath.sep, os.sep))
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from ytdl_sub.script.script import Script
|
from ytdl_sub.utils.file_path import FilePathTruncater
|
||||||
from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator
|
from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator
|
||||||
from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator
|
from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator
|
||||||
from ytdl_sub.validators.validators import StringValidator
|
from ytdl_sub.validators.validators import StringValidator
|
||||||
|
|
@ -45,15 +45,8 @@ class StringFormatterFileNameValidator(StringFormatterValidator):
|
||||||
_expected_value_type_name = "filepath"
|
_expected_value_type_name = "filepath"
|
||||||
|
|
||||||
def post_process(self, resolved: str) -> str:
|
def post_process(self, resolved: str) -> str:
|
||||||
return (
|
return FilePathTruncater.to_native_filepath(
|
||||||
Script(
|
FilePathTruncater.maybe_truncate_file_path(resolved)
|
||||||
{
|
|
||||||
"tmp_var_1": resolved,
|
|
||||||
"tmp_var_2": "{%to_native_filepath(%truncate_filepath_if_too_long(tmp_var_1))}",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
.resolve()
|
|
||||||
.get_str("tmp_var_2")
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -61,13 +54,6 @@ class OverridesStringFormatterFilePathValidator(OverridesStringFormatterValidato
|
||||||
_expected_value_type_name = "static filepath"
|
_expected_value_type_name = "static filepath"
|
||||||
|
|
||||||
def post_process(self, resolved: str) -> str:
|
def post_process(self, resolved: str) -> str:
|
||||||
return (
|
return FilePathTruncater.to_native_filepath(
|
||||||
Script(
|
FilePathTruncater.maybe_truncate_file_path(resolved)
|
||||||
{
|
|
||||||
"tmp_var_1": resolved,
|
|
||||||
"tmp_var_2": "{%to_native_filepath(%truncate_filepath_if_too_long(tmp_var_1))}",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
.resolve()
|
|
||||||
.get_str("tmp_var_2")
|
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import json
|
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
@ -44,13 +43,13 @@ class TestReproduce:
|
||||||
def test_debug_log_repro(
|
def test_debug_log_repro(
|
||||||
self,
|
self,
|
||||||
default_config,
|
default_config,
|
||||||
repro_preset_dict,
|
debug_log_rerpo,
|
||||||
output_directory,
|
output_directory,
|
||||||
):
|
):
|
||||||
sub = Subscription.from_dict(
|
sub = Subscription.from_dict(
|
||||||
config=default_config,
|
config=default_config,
|
||||||
preset_name="repro",
|
preset_name="repro",
|
||||||
preset_dict=repro_preset_dict,
|
preset_dict=debug_log_rerpo,
|
||||||
)
|
)
|
||||||
|
|
||||||
transaction_log = sub.download(dry_run=False)
|
transaction_log = sub.download(dry_run=False)
|
||||||
|
|
|
||||||
|
|
@ -54,19 +54,17 @@ class TestStringFormatterFilePathValidator:
|
||||||
if "thumb" not in ext: # do not put . in front of -thumb
|
if "thumb" not in ext: # do not put . in front of -thumb
|
||||||
ext = f".{ext}" # pytest args with . in the beginning act weird
|
ext = f".{ext}" # pytest args with . in the beginning act weird
|
||||||
|
|
||||||
base_file_name = "s2023.e031701 - 𝗪𝗔𝗥𝗡𝗜𝗡𝗚: LG Secretly Overhaul This OLED Feature on C3 & G3… Should You Buy C2 Instead?"
|
base_file_name = "s2023.e031701 - 𝗪𝗔𝗥𝗡𝗜𝗡𝗚: {LG} Secretly Overhaul This OLED Feature on C3 & G3… Should You Buy C2 Instead?"
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
file_path = str(Path(temp_dir) / f"{base_file_name}{ext}")
|
file_path = str(Path(temp_dir) / f"{base_file_name}{ext}")
|
||||||
|
|
||||||
formatter = StringFormatterFileNameValidator(name="test", value=str(file_path))
|
formatter = StringFormatterFileNameValidator(name="test", value="")
|
||||||
truncated_file_path = formatter.post_process(
|
truncated_file_path = formatter.post_process(file_path)
|
||||||
Script({"file_name": formatter.format_string}).resolve().get_str("file_name")
|
|
||||||
)
|
|
||||||
|
|
||||||
assert truncated_file_path == str(
|
assert truncated_file_path == str(
|
||||||
Path(temp_dir)
|
Path(temp_dir)
|
||||||
/ f"s2023.e031701 - 𝗪𝗔𝗥𝗡𝗜𝗡𝗚: LG Secretly Overhaul This OLED Feature on C3 & G3… Should You Buy C2 Instead?{ext}"
|
/ f"s2023.e031701 - 𝗪𝗔𝗥𝗡𝗜𝗡𝗚: {{LG}} Secretly Overhaul This OLED Feature on C3 & G3… Should You Buy C2 Instead?{ext}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Ensure it can actually open the file
|
# Ensure it can actually open the file
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue