revert formatting
This commit is contained in:
parent
acd30e421a
commit
39e7ad7e88
12 changed files with 180 additions and 256 deletions
|
|
@ -1,2 +1,2 @@
|
||||||
__pypi_version__ = "2024.04.25.post1"
|
__pypi_version__ = "2023.10.22.post3"
|
||||||
__local_version__ = "2024.04.25+aa1f6ea"
|
__local_version__ = "2023.10.22+bfba4f0"
|
||||||
|
|
|
||||||
|
|
@ -150,8 +150,6 @@ parser.add_argument("-v", "--version", action="version", version="%(prog)s " + _
|
||||||
_add_shared_arguments(parser, suppress_defaults=False)
|
_add_shared_arguments(parser, suppress_defaults=False)
|
||||||
|
|
||||||
subparsers = parser.add_subparsers(dest="subparser")
|
subparsers = parser.add_subparsers(dest="subparser")
|
||||||
|
|
||||||
|
|
||||||
###################################################################################################
|
###################################################################################################
|
||||||
# SUBSCRIPTION PARSER
|
# SUBSCRIPTION PARSER
|
||||||
class SubArguments:
|
class SubArguments:
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ _DUMMY_ENTRY_VARIABLES: Dict[str, str] = {
|
||||||
name: to_variable_dependency_format_string(
|
name: to_variable_dependency_format_string(
|
||||||
# pylint: disable=protected-access
|
# pylint: disable=protected-access
|
||||||
script=BASE_SCRIPT,
|
script=BASE_SCRIPT,
|
||||||
parsed_format_string=BASE_SCRIPT._variables[name],
|
parsed_format_string=BASE_SCRIPT._variables[name]
|
||||||
# pylint: enable=protected-access
|
# pylint: enable=protected-access
|
||||||
)
|
)
|
||||||
for name in BASE_SCRIPT.variable_names
|
for name in BASE_SCRIPT.variable_names
|
||||||
|
|
|
||||||
|
|
@ -248,11 +248,9 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
||||||
self._download_ytdl_options_builder.clone()
|
self._download_ytdl_options_builder.clone()
|
||||||
.add(self.ytdl_option_defaults(), before=True)
|
.add(self.ytdl_option_defaults(), before=True)
|
||||||
.add(
|
.add(
|
||||||
(
|
self.plugin_options.urls.list[url_idx].ytdl_options.dict
|
||||||
self.plugin_options.urls.list[url_idx].ytdl_options.dict
|
if url_idx is not None
|
||||||
if url_idx is not None
|
else None,
|
||||||
else None
|
|
||||||
),
|
|
||||||
before=True,
|
before=True,
|
||||||
)
|
)
|
||||||
.to_dict()
|
.to_dict()
|
||||||
|
|
@ -354,11 +352,9 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
||||||
url_idx=entry.get(v.ytdl_sub_input_url_index, int)
|
url_idx=entry.get(v.ytdl_sub_input_url_index, int)
|
||||||
),
|
),
|
||||||
is_downloaded_fn=None if self.is_dry_run else entry.is_downloaded,
|
is_downloaded_fn=None if self.is_dry_run else entry.is_downloaded,
|
||||||
is_thumbnail_downloaded_fn=(
|
is_thumbnail_downloaded_fn=None
|
||||||
None
|
if (self.is_dry_run or not self.is_entry_thumbnails_enabled)
|
||||||
if (self.is_dry_run or not self.is_entry_thumbnails_enabled)
|
else entry.is_thumbnail_downloaded_via_ytdlp,
|
||||||
else entry.is_thumbnail_downloaded_via_ytdlp
|
|
||||||
),
|
|
||||||
url=entry.webpage_url,
|
url=entry.webpage_url,
|
||||||
)
|
)
|
||||||
return Entry(
|
return Entry(
|
||||||
|
|
|
||||||
|
|
@ -213,10 +213,9 @@ class Logger:
|
||||||
@classmethod
|
@classmethod
|
||||||
def _append_to_error_log(cls):
|
def _append_to_error_log(cls):
|
||||||
# Any time an exception occurs, dump all debug logs into the error log
|
# Any time an exception occurs, dump all debug logs into the error log
|
||||||
with (
|
with open(cls.debug_log_filename(), mode="r", encoding="utf-8") as debug_logs, open(
|
||||||
open(cls.debug_log_filename(), mode="r", encoding="utf-8") as debug_logs,
|
cls.error_log_filename(), mode="a", encoding="utf-8"
|
||||||
open(cls.error_log_filename(), mode="a", encoding="utf-8") as error_logs,
|
) as error_logs:
|
||||||
):
|
|
||||||
error_logs.writelines(debug_logs.readlines())
|
error_logs.writelines(debug_logs.readlines())
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
||||||
|
|
@ -120,13 +120,11 @@ class TestYoutubeVideo:
|
||||||
try_convert_download_thumbnail(entry=entry)
|
try_convert_download_thumbnail(entry=entry)
|
||||||
|
|
||||||
# Pretend the thumbnail did not download via returning nothing for its downloaded path
|
# Pretend the thumbnail did not download via returning nothing for its downloaded path
|
||||||
with (
|
with patch.object(YTDLP, "_EXTRACT_ENTRY_NUM_RETRIES", 1), patch.object(
|
||||||
patch.object(YTDLP, "_EXTRACT_ENTRY_NUM_RETRIES", 1),
|
Entry, "try_get_ytdlp_download_thumbnail_path"
|
||||||
patch.object(Entry, "try_get_ytdlp_download_thumbnail_path") as mock_ytdlp_path,
|
) as mock_ytdlp_path, patch(
|
||||||
patch(
|
"ytdl_sub.downloaders.url.downloader.try_convert_download_thumbnail",
|
||||||
"ytdl_sub.downloaders.url.downloader.try_convert_download_thumbnail",
|
side_effect=delete_entry_thumb,
|
||||||
side_effect=delete_entry_thumb,
|
|
||||||
),
|
|
||||||
):
|
):
|
||||||
mock_ytdlp_path.return_value = None
|
mock_ytdlp_path.return_value = None
|
||||||
transaction_log = single_video_subscription.download(dry_run=False)
|
transaction_log = single_video_subscription.download(dry_run=False)
|
||||||
|
|
|
||||||
|
|
@ -42,15 +42,12 @@ def test_subscription_logs_write_to_file(
|
||||||
config = persist_logs_config_factory(keep_successful_logs=keep_successful_logs)
|
config = persist_logs_config_factory(keep_successful_logs=keep_successful_logs)
|
||||||
subscription_paths = [str(music_video_subscription_path)] * num_runs
|
subscription_paths = [str(music_video_subscription_path)] * num_runs
|
||||||
|
|
||||||
with (
|
with patch.object(
|
||||||
patch.object(
|
Subscription,
|
||||||
Subscription,
|
"download",
|
||||||
"download",
|
new=mock_subscription_download_factory(mock_success_output=mock_success_output),
|
||||||
new=mock_subscription_download_factory(mock_success_output=mock_success_output),
|
# mock datetime to be an index to be able to run instantly
|
||||||
# mock datetime to be an index to be able to run instantly
|
), patch("ytdl_sub.cli.entrypoint._log_time", side_effect=[str(idx) for idx in range(10)]):
|
||||||
),
|
|
||||||
patch("ytdl_sub.cli.entrypoint._log_time", side_effect=[str(idx) for idx in range(10)]),
|
|
||||||
):
|
|
||||||
try:
|
try:
|
||||||
_download_subscriptions_from_yaml_files(
|
_download_subscriptions_from_yaml_files(
|
||||||
config=config,
|
config=config,
|
||||||
|
|
@ -104,19 +101,16 @@ def test_update_with_info_json_requires_experimental_flag(
|
||||||
default_config_path: Path,
|
default_config_path: Path,
|
||||||
music_video_subscription_path: Path,
|
music_video_subscription_path: Path,
|
||||||
) -> None:
|
) -> None:
|
||||||
with (
|
with patch.object(
|
||||||
patch.object(
|
sys,
|
||||||
sys,
|
"argv",
|
||||||
"argv",
|
[
|
||||||
[
|
"ytdl-sub",
|
||||||
"ytdl-sub",
|
"--config",
|
||||||
"--config",
|
str(default_config_path),
|
||||||
str(default_config_path),
|
"sub",
|
||||||
"sub",
|
str(music_video_subscription_path),
|
||||||
str(music_video_subscription_path),
|
"--update-with-info-json",
|
||||||
"--update-with-info-json",
|
],
|
||||||
],
|
), pytest.raises(ExperimentalFeatureNotEnabled):
|
||||||
),
|
|
||||||
pytest.raises(ExperimentalFeatureNotEnabled),
|
|
||||||
):
|
|
||||||
_ = main()
|
_ = main()
|
||||||
|
|
|
||||||
|
|
@ -32,22 +32,19 @@ def test_suppress_transaction_log(
|
||||||
music_video_subscription_path: Path,
|
music_video_subscription_path: Path,
|
||||||
file_transaction_log: Optional[str],
|
file_transaction_log: Optional[str],
|
||||||
) -> None:
|
) -> None:
|
||||||
with (
|
with patch.object(
|
||||||
patch.object(
|
sys,
|
||||||
sys,
|
"argv",
|
||||||
"argv",
|
[
|
||||||
[
|
"ytdl-sub",
|
||||||
"ytdl-sub",
|
"--config",
|
||||||
"--config",
|
str(default_config_path),
|
||||||
str(default_config_path),
|
"sub",
|
||||||
"sub",
|
str(music_video_subscription_path),
|
||||||
str(music_video_subscription_path),
|
"--suppress-transaction-log",
|
||||||
"--suppress-transaction-log",
|
]
|
||||||
]
|
+ (["--transaction-log", file_transaction_log] if file_transaction_log else []),
|
||||||
+ (["--transaction-log", file_transaction_log] if file_transaction_log else []),
|
), patch("ytdl_sub.cli.output_transaction_log.output_transaction_log") as mock_transaction_log:
|
||||||
),
|
|
||||||
patch("ytdl_sub.cli.output_transaction_log.output_transaction_log") as mock_transaction_log,
|
|
||||||
):
|
|
||||||
subscriptions = main()
|
subscriptions = main()
|
||||||
|
|
||||||
assert subscriptions
|
assert subscriptions
|
||||||
|
|
@ -85,23 +82,20 @@ def test_transaction_log_to_logger(
|
||||||
default_config_path: Path,
|
default_config_path: Path,
|
||||||
music_video_subscription_path: Path,
|
music_video_subscription_path: Path,
|
||||||
) -> None:
|
) -> None:
|
||||||
with (
|
with patch.object(
|
||||||
patch.object(
|
sys,
|
||||||
sys,
|
"argv",
|
||||||
"argv",
|
[
|
||||||
[
|
"ytdl-sub",
|
||||||
"ytdl-sub",
|
"--config",
|
||||||
"--config",
|
str(default_config_path),
|
||||||
str(default_config_path),
|
"sub",
|
||||||
"sub",
|
str(music_video_subscription_path),
|
||||||
str(music_video_subscription_path),
|
],
|
||||||
],
|
), assert_logs(
|
||||||
),
|
logger=transaction_logger,
|
||||||
assert_logs(
|
expected_message="Transaction log for Rick Astley:\n",
|
||||||
logger=transaction_logger,
|
log_level="info",
|
||||||
expected_message="Transaction log for Rick Astley:\n",
|
|
||||||
log_level="info",
|
|
||||||
),
|
|
||||||
):
|
):
|
||||||
subscriptions = main()
|
subscriptions = main()
|
||||||
assert subscriptions
|
assert subscriptions
|
||||||
|
|
|
||||||
|
|
@ -375,47 +375,38 @@ def test_subscription_file_value_applies_from_config_and_nested_and_indent_varia
|
||||||
config_file: ConfigFile,
|
config_file: ConfigFile,
|
||||||
preset_with_subscription_value_nested_presets_and_indent_variables_same_line_old_format_errors: Dict,
|
preset_with_subscription_value_nested_presets_and_indent_variables_same_line_old_format_errors: Dict,
|
||||||
):
|
):
|
||||||
with (
|
with mock_load_yaml(
|
||||||
mock_load_yaml(
|
preset_dict=preset_with_subscription_value_nested_presets_and_indent_variables_same_line_old_format_errors
|
||||||
preset_dict=preset_with_subscription_value_nested_presets_and_indent_variables_same_line_old_format_errors
|
), pytest.raises(
|
||||||
),
|
ValidationException,
|
||||||
pytest.raises(
|
match=re.escape(
|
||||||
ValidationException,
|
"Validation error in parent_preset_2.=INDENT_1: 'INDENT_3' in '= INDENT_2 | INDENT_3' is not a preset name. "
|
||||||
match=re.escape(
|
"To use as a subscription indent value, define it as '= INDENT_3'"
|
||||||
"Validation error in parent_preset_2.=INDENT_1: 'INDENT_3' in '= INDENT_2 | INDENT_3' is not a preset name. "
|
|
||||||
"To use as a subscription indent value, define it as '= INDENT_3'"
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
):
|
):
|
||||||
Subscription.from_file_path(config=config_file, subscription_path="mocked")
|
Subscription.from_file_path(config=config_file, subscription_path="mocked")
|
||||||
|
|
||||||
|
|
||||||
def test_subscription_file_using_conflicting_preset_name(config_file: ConfigFile):
|
def test_subscription_file_using_conflicting_preset_name(config_file: ConfigFile):
|
||||||
with (
|
with mock_load_yaml(
|
||||||
mock_load_yaml(
|
preset_dict={
|
||||||
preset_dict={
|
"= INDENTS_IN_ERR_MSG ": {"=ANOTHER": {"jellyfin_tv_show_by_date": "single value"}}
|
||||||
"= INDENTS_IN_ERR_MSG ": {"=ANOTHER": {"jellyfin_tv_show_by_date": "single value"}}
|
}
|
||||||
}
|
), pytest.raises(
|
||||||
),
|
ValidationException,
|
||||||
pytest.raises(
|
match=re.escape(
|
||||||
ValidationException,
|
"Validation error in = INDENTS_IN_ERR_MSG .=ANOTHER.jellyfin_tv_show_by_date: "
|
||||||
match=re.escape(
|
"jellyfin_tv_show_by_date conflicts with an existing preset name and cannot be used "
|
||||||
"Validation error in = INDENTS_IN_ERR_MSG .=ANOTHER.jellyfin_tv_show_by_date: "
|
"as a subscription name"
|
||||||
"jellyfin_tv_show_by_date conflicts with an existing preset name and cannot be used "
|
|
||||||
"as a subscription name"
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
):
|
):
|
||||||
_ = Subscription.from_file_path(config=config_file, subscription_path="mocked")
|
_ = Subscription.from_file_path(config=config_file, subscription_path="mocked")
|
||||||
|
|
||||||
|
|
||||||
def test_subscription_file_invalid_form(config_file: ConfigFile):
|
def test_subscription_file_invalid_form(config_file: ConfigFile):
|
||||||
with (
|
with mock_load_yaml(preset_dict={"sub_name": 4332}), pytest.raises(
|
||||||
mock_load_yaml(preset_dict={"sub_name": 4332}),
|
ValidationException,
|
||||||
pytest.raises(
|
match=re.escape(f"Subscription value should either be a string, list, or object"),
|
||||||
ValidationException,
|
|
||||||
match=re.escape(f"Subscription value should either be a string, list, or object"),
|
|
||||||
),
|
|
||||||
):
|
):
|
||||||
_ = Subscription.from_file_path(config=config_file, subscription_path="mocked")
|
_ = Subscription.from_file_path(config=config_file, subscription_path="mocked")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -228,11 +228,10 @@ def mock_download_collection_entries(
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
with (
|
with patch.object(
|
||||||
patch.object(YTDLP, "extract_info_via_info_json", new=_write_entries_to_working_dir),
|
YTDLP, "extract_info_via_info_json", new=_write_entries_to_working_dir
|
||||||
patch.object(
|
), patch.object(
|
||||||
MultiUrlDownloader, "_extract_entry_info_with_retry", new=lambda _, entry: entry
|
MultiUrlDownloader, "_extract_entry_info_with_retry", new=lambda _, entry: entry
|
||||||
),
|
|
||||||
):
|
):
|
||||||
# Stub out metadata. TODO: update this if we do metadata plugins
|
# Stub out metadata. TODO: update this if we do metadata plugins
|
||||||
yield
|
yield
|
||||||
|
|
|
||||||
|
|
@ -40,11 +40,9 @@ def mock_sys_exit():
|
||||||
|
|
||||||
@pytest.mark.parametrize("return_code", [0, 1])
|
@pytest.mark.parametrize("return_code", [0, 1])
|
||||||
def test_main_exit_code(mock_sys_exit, return_code: int):
|
def test_main_exit_code(mock_sys_exit, return_code: int):
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=return_code), patch(
|
||||||
mock_sys_exit(expected_exit_code=return_code),
|
"src.ytdl_sub.main._main"
|
||||||
patch("src.ytdl_sub.main._main") as mock_inner_main,
|
) as mock_inner_main, patch.object(Logger, "cleanup") as mock_logger_cleanup:
|
||||||
patch.object(Logger, "cleanup") as mock_logger_cleanup,
|
|
||||||
):
|
|
||||||
mock_inner_main.return_value = return_code
|
mock_inner_main.return_value = return_code
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|
@ -56,11 +54,9 @@ def test_main_exit_code(mock_sys_exit, return_code: int):
|
||||||
|
|
||||||
def test_main_validation_error(capsys, mock_sys_exit):
|
def test_main_validation_error(capsys, mock_sys_exit):
|
||||||
validation_exception = ValidationException("test exc")
|
validation_exception = ValidationException("test exc")
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=1), patch(
|
||||||
mock_sys_exit(expected_exit_code=1),
|
"src.ytdl_sub.main._main", side_effect=validation_exception
|
||||||
patch("src.ytdl_sub.main._main", side_effect=validation_exception),
|
), patch.object(logging.Logger, "error") as mock_logger:
|
||||||
patch.object(logging.Logger, "error") as mock_logger,
|
|
||||||
):
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
assert mock_logger.call_count == 1
|
assert mock_logger.call_count == 1
|
||||||
|
|
@ -69,12 +65,11 @@ def test_main_validation_error(capsys, mock_sys_exit):
|
||||||
|
|
||||||
def test_main_uncaught_error(capsys, mock_sys_exit, expected_uncaught_error_message):
|
def test_main_uncaught_error(capsys, mock_sys_exit, expected_uncaught_error_message):
|
||||||
uncaught_error = ValueError("test")
|
uncaught_error = ValueError("test")
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=1), patch(
|
||||||
mock_sys_exit(expected_exit_code=1),
|
"src.ytdl_sub.main._main", side_effect=uncaught_error
|
||||||
patch("src.ytdl_sub.main._main", side_effect=uncaught_error),
|
), patch.object(logging.Logger, "exception") as mock_exception, patch.object(
|
||||||
patch.object(logging.Logger, "exception") as mock_exception,
|
logging.Logger, "error"
|
||||||
patch.object(logging.Logger, "error") as mock_error,
|
) as mock_error:
|
||||||
):
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
assert mock_exception.call_count == 1
|
assert mock_exception.call_count == 1
|
||||||
|
|
@ -88,11 +83,9 @@ def test_main_uncaught_error(capsys, mock_sys_exit, expected_uncaught_error_mess
|
||||||
|
|
||||||
def test_main_permission_error(capsys, mock_sys_exit, expected_uncaught_error_message):
|
def test_main_permission_error(capsys, mock_sys_exit, expected_uncaught_error_message):
|
||||||
permission_error = PermissionError("test")
|
permission_error = PermissionError("test")
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=1), patch(
|
||||||
mock_sys_exit(expected_exit_code=1),
|
"src.ytdl_sub.main._main", side_effect=permission_error
|
||||||
patch("src.ytdl_sub.main._main", side_effect=permission_error),
|
), patch.object(logging.Logger, "error") as mock_error:
|
||||||
patch.object(logging.Logger, "error") as mock_error,
|
|
||||||
):
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
assert mock_error.call_count == 1
|
assert mock_error.call_count == 1
|
||||||
|
|
@ -104,15 +97,11 @@ def test_main_permission_error(capsys, mock_sys_exit, expected_uncaught_error_me
|
||||||
|
|
||||||
|
|
||||||
def test_args_after_sub_work(mock_sys_exit, tv_show_config_path):
|
def test_args_after_sub_work(mock_sys_exit, tv_show_config_path):
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=0), patch.object(
|
||||||
mock_sys_exit(expected_exit_code=0),
|
sys,
|
||||||
patch.object(
|
"argv",
|
||||||
sys,
|
["ytdl-sub", "-c", tv_show_config_path, "sub", "--log-level", "verbose"],
|
||||||
"argv",
|
), patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub:
|
||||||
["ytdl-sub", "-c", tv_show_config_path, "sub", "--log-level", "verbose"],
|
|
||||||
),
|
|
||||||
patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub,
|
|
||||||
):
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
assert mock_sub.call_count == 1
|
assert mock_sub.call_count == 1
|
||||||
|
|
@ -123,25 +112,21 @@ def test_args_after_sub_work(mock_sys_exit, tv_show_config_path):
|
||||||
|
|
||||||
|
|
||||||
def test_sub_match_arguments_before(mock_sys_exit, tv_show_config_path):
|
def test_sub_match_arguments_before(mock_sys_exit, tv_show_config_path):
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=0), patch.object(
|
||||||
mock_sys_exit(expected_exit_code=0),
|
sys,
|
||||||
patch.object(
|
"argv",
|
||||||
sys,
|
[
|
||||||
"argv",
|
"ytdl-sub",
|
||||||
[
|
"--match",
|
||||||
"ytdl-sub",
|
"testA",
|
||||||
"--match",
|
"testB",
|
||||||
"testA",
|
"-c",
|
||||||
"testB",
|
tv_show_config_path,
|
||||||
"-c",
|
"sub",
|
||||||
tv_show_config_path,
|
"--log-level",
|
||||||
"sub",
|
"verbose",
|
||||||
"--log-level",
|
],
|
||||||
"verbose",
|
), patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub:
|
||||||
],
|
|
||||||
),
|
|
||||||
patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub,
|
|
||||||
):
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
assert mock_sub.call_count == 1
|
assert mock_sub.call_count == 1
|
||||||
|
|
@ -152,26 +137,22 @@ def test_sub_match_arguments_before(mock_sys_exit, tv_show_config_path):
|
||||||
|
|
||||||
|
|
||||||
def test_sub_match_arguments_after_many(mock_sys_exit, tv_show_config_path):
|
def test_sub_match_arguments_after_many(mock_sys_exit, tv_show_config_path):
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=0), patch.object(
|
||||||
mock_sys_exit(expected_exit_code=0),
|
sys,
|
||||||
patch.object(
|
"argv",
|
||||||
sys,
|
[
|
||||||
"argv",
|
"ytdl-sub",
|
||||||
[
|
"-c",
|
||||||
"ytdl-sub",
|
tv_show_config_path,
|
||||||
"-c",
|
"sub",
|
||||||
tv_show_config_path,
|
"--log-level",
|
||||||
"sub",
|
"verbose",
|
||||||
"--log-level",
|
"--match",
|
||||||
"verbose",
|
"testA",
|
||||||
"--match",
|
"--match",
|
||||||
"testA",
|
"testB",
|
||||||
"--match",
|
],
|
||||||
"testB",
|
), patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub:
|
||||||
],
|
|
||||||
),
|
|
||||||
patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub,
|
|
||||||
):
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
assert mock_sub.call_count == 1
|
assert mock_sub.call_count == 1
|
||||||
|
|
@ -182,15 +163,11 @@ def test_sub_match_arguments_after_many(mock_sys_exit, tv_show_config_path):
|
||||||
|
|
||||||
|
|
||||||
def test_no_config_works(mock_sys_exit):
|
def test_no_config_works(mock_sys_exit):
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=0), patch.object(
|
||||||
mock_sys_exit(expected_exit_code=0),
|
sys,
|
||||||
patch.object(
|
"argv",
|
||||||
sys,
|
["ytdl-sub", "sub", "--log-level", "verbose"],
|
||||||
"argv",
|
), patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub:
|
||||||
["ytdl-sub", "sub", "--log-level", "verbose"],
|
|
||||||
),
|
|
||||||
patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub,
|
|
||||||
):
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
assert mock_sub.call_count == 1
|
assert mock_sub.call_count == 1
|
||||||
|
|
@ -206,19 +183,14 @@ def test_uses_default_config_if_present(mock_sys_exit):
|
||||||
open(DEFAULT_CONFIG_FILE_NAME, "a").close()
|
open(DEFAULT_CONFIG_FILE_NAME, "a").close()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=0), patch.object(
|
||||||
mock_sys_exit(expected_exit_code=0),
|
sys,
|
||||||
patch.object(
|
"argv",
|
||||||
sys,
|
["ytdl-sub", "sub", "--log-level", "verbose"],
|
||||||
"argv",
|
), patch(
|
||||||
["ytdl-sub", "sub", "--log-level", "verbose"],
|
"ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files"
|
||||||
),
|
) as mock_sub, patch.object(
|
||||||
patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub,
|
ConfigFile, "from_file_path", new=lambda _: ConfigFile(name="test default", value={})
|
||||||
patch.object(
|
|
||||||
ConfigFile,
|
|
||||||
"from_file_path",
|
|
||||||
new=lambda _: ConfigFile(name="test default", value={}),
|
|
||||||
),
|
|
||||||
):
|
):
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|
@ -232,15 +204,11 @@ def test_uses_default_config_if_present(mock_sys_exit):
|
||||||
|
|
||||||
|
|
||||||
def test_no_positional_arg_command(mock_sys_exit, tv_show_config_path):
|
def test_no_positional_arg_command(mock_sys_exit, tv_show_config_path):
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=1), patch.object(
|
||||||
mock_sys_exit(expected_exit_code=1),
|
sys,
|
||||||
patch.object(
|
"argv",
|
||||||
sys,
|
["ytdl-sub", "-c", tv_show_config_path, "--log-level", "verbose"],
|
||||||
"argv",
|
), patch.object(logging.Logger, "error") as mock_error:
|
||||||
["ytdl-sub", "-c", tv_show_config_path, "--log-level", "verbose"],
|
|
||||||
),
|
|
||||||
patch.object(logging.Logger, "error") as mock_error,
|
|
||||||
):
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
assert mock_error.call_count == 1
|
assert mock_error.call_count == 1
|
||||||
|
|
@ -248,15 +216,11 @@ def test_no_positional_arg_command(mock_sys_exit, tv_show_config_path):
|
||||||
|
|
||||||
|
|
||||||
def test_bad_config_path(mock_sys_exit):
|
def test_bad_config_path(mock_sys_exit):
|
||||||
with (
|
with mock_sys_exit(expected_exit_code=1), patch.object(
|
||||||
mock_sys_exit(expected_exit_code=1),
|
sys,
|
||||||
patch.object(
|
"argv",
|
||||||
sys,
|
["ytdl-sub", "-c", "does_not_exist.yaml", "sub", "--log-level", "verbose"],
|
||||||
"argv",
|
), patch.object(logging.Logger, "error") as mock_error:
|
||||||
["ytdl-sub", "-c", "does_not_exist.yaml", "sub", "--log-level", "verbose"],
|
|
||||||
),
|
|
||||||
patch.object(logging.Logger, "error") as mock_error,
|
|
||||||
):
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
assert mock_error.call_count == 1
|
assert mock_error.call_count == 1
|
||||||
|
|
|
||||||
|
|
@ -39,29 +39,23 @@ class TestThrottleProtectionPlugin:
|
||||||
preset_dict=preset_dict,
|
preset_dict=preset_dict,
|
||||||
)
|
)
|
||||||
|
|
||||||
with (
|
with mock_download_collection_entries(
|
||||||
mock_download_collection_entries(
|
is_youtube_channel=False, num_urls=1, is_extracted_audio=False
|
||||||
is_youtube_channel=False, num_urls=1, is_extracted_audio=False
|
), assert_logs(
|
||||||
),
|
logger=throttle_protection_logger,
|
||||||
assert_logs(
|
expected_message="Sleeping between downloads for %0.2f seconds",
|
||||||
logger=throttle_protection_logger,
|
log_level="debug",
|
||||||
expected_message="Sleeping between downloads for %0.2f seconds",
|
expected_occurrences=4,
|
||||||
log_level="debug",
|
|
||||||
expected_occurrences=4,
|
|
||||||
),
|
|
||||||
):
|
):
|
||||||
_ = subscription.download(dry_run=False)
|
_ = subscription.download(dry_run=False)
|
||||||
|
|
||||||
with (
|
with mock_download_collection_entries(
|
||||||
mock_download_collection_entries(
|
is_youtube_channel=False, num_urls=1, is_extracted_audio=False
|
||||||
is_youtube_channel=False, num_urls=1, is_extracted_audio=False
|
), assert_logs(
|
||||||
),
|
logger=throttle_protection_logger,
|
||||||
assert_logs(
|
expected_message="Sleeping between subscriptions for %0.2f seconds",
|
||||||
logger=throttle_protection_logger,
|
log_level="debug",
|
||||||
expected_message="Sleeping between subscriptions for %0.2f seconds",
|
expected_occurrences=1,
|
||||||
log_level="debug",
|
|
||||||
expected_occurrences=1,
|
|
||||||
),
|
|
||||||
):
|
):
|
||||||
_ = subscription.download(dry_run=False)
|
_ = subscription.download(dry_run=False)
|
||||||
|
|
||||||
|
|
@ -111,15 +105,12 @@ class TestThrottleProtectionPlugin:
|
||||||
preset_dict=preset_dict,
|
preset_dict=preset_dict,
|
||||||
)
|
)
|
||||||
|
|
||||||
with (
|
with mock_download_collection_entries(
|
||||||
mock_download_collection_entries(
|
is_youtube_channel=False, num_urls=1, is_extracted_audio=False
|
||||||
is_youtube_channel=False, num_urls=1, is_extracted_audio=False
|
), assert_logs(
|
||||||
),
|
logger=throttle_protection_logger,
|
||||||
assert_logs(
|
expected_message="Sleeping between downloads for %0.2f seconds",
|
||||||
logger=throttle_protection_logger,
|
log_level="debug",
|
||||||
expected_message="Sleeping between downloads for %0.2f seconds",
|
expected_occurrences=0,
|
||||||
log_level="debug",
|
|
||||||
expected_occurrences=0,
|
|
||||||
),
|
|
||||||
):
|
):
|
||||||
_ = subscription.download(dry_run=False)
|
_ = subscription.download(dry_run=False)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue