[DEV] Bump black from 22.3.0 to 24.4.2 (#973)

* Bump black from 22.3.0 to 24.4.2

Bumps [black](https://github.com/psf/black) from 22.3.0 to 24.4.2.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/22.3.0...24.4.2)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* run linter

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jesse Bannon <jbann1994@gmail.com>
This commit is contained in:
dependabot[bot] 2024-04-27 15:46:47 -07:00 committed by GitHub
parent caad4598fc
commit ec58a80660
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 280 additions and 204 deletions

View file

@ -47,7 +47,7 @@ test = [
"pytest-rerunfailures~=14.0", "pytest-rerunfailures~=14.0",
] ]
lint = [ lint = [
"black==22.3.0", "black==24.4.2",
"isort==5.13.2", "isort==5.13.2",
"pylint==2.13.5", "pylint==2.13.5",
] ]

View file

@ -150,6 +150,8 @@ 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:

View file

@ -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

View file

@ -248,9 +248,11 @@ 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 (
if url_idx is not None self.plugin_options.urls.list[url_idx].ytdl_options.dict
else None, if url_idx is not None
else None
),
before=True, before=True,
) )
.to_dict() .to_dict()
@ -352,9 +354,11 @@ 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=None is_thumbnail_downloaded_fn=(
if (self.is_dry_run or not self.is_entry_thumbnails_enabled) None
else entry.is_thumbnail_downloaded_via_ytdlp, if (self.is_dry_run or not self.is_entry_thumbnails_enabled)
else entry.is_thumbnail_downloaded_via_ytdlp
),
url=entry.webpage_url, url=entry.webpage_url,
) )
return Entry( return Entry(

View file

@ -263,13 +263,13 @@ class ChaptersPlugin(Plugin[ChaptersOptions]):
"force_keyframes": self.plugin_options.force_key_frames, "force_keyframes": self.plugin_options.force_key_frames,
} }
if self.plugin_options.remove_sponsorblock_categories is not None: if self.plugin_options.remove_sponsorblock_categories is not None:
remove_chapters_post_processor[ remove_chapters_post_processor["remove_sponsor_segments"] = (
"remove_sponsor_segments" self.plugin_options.remove_sponsorblock_categories
] = self.plugin_options.remove_sponsorblock_categories )
if self.plugin_options.remove_chapters_regex is not None: if self.plugin_options.remove_chapters_regex is not None:
remove_chapters_post_processor[ remove_chapters_post_processor["remove_chapters_patterns"] = (
"remove_chapters_patterns" self.plugin_options.remove_chapters_regex
] = self.plugin_options.remove_chapters_regex )
if self.plugin_options.embed_chapters: if self.plugin_options.embed_chapters:
builder.add( builder.add(

View file

@ -159,9 +159,9 @@ class SplitByChaptersPlugin(SplitPlugin[SplitByChaptersOptions]):
metadata_value_dict = {} metadata_value_dict = {}
if self.is_dry_run: if self.is_dry_run:
metadata_value_dict[ metadata_value_dict["Warning"] = (
"Warning" "Dry-run assumes embedded chapters with no modifications"
] = "Dry-run assumes embedded chapters with no modifications" )
metadata_value_dict["Source Title"] = new_entry.title metadata_value_dict["Source Title"] = new_entry.title
metadata_value_dict["Segment"] = f"{timestamp_begin} - {timestamp_end}" metadata_value_dict["Segment"] = f"{timestamp_begin} - {timestamp_end}"

View file

@ -74,13 +74,13 @@ class BaseSubscription(ABC):
} }
) )
self._enhanced_download_archive: Optional[ self._enhanced_download_archive: Optional[EnhancedDownloadArchive] = (
EnhancedDownloadArchive _initialize_download_archive(
] = _initialize_download_archive( output_options=self.output_options,
output_options=self.output_options, overrides=self.overrides,
overrides=self.overrides, working_directory=self.working_directory,
working_directory=self.working_directory, output_directory=self.output_directory,
output_directory=self.output_directory, )
) )
# Add post-archive variables # Add post-archive variables

View file

@ -143,9 +143,9 @@ class SubscriptionValueValidator(SubscriptionLeafValidator, StringValidator):
presets=presets, presets=presets,
indent_overrides=indent_overrides, indent_overrides=indent_overrides,
) )
self._overrides_to_add[ self._overrides_to_add[SubscriptionVariables.subscription_value().variable_name] = (
SubscriptionVariables.subscription_value().variable_name self.value
] = self.value )
class SubscriptionListValuesValidator(SubscriptionLeafValidator, StringListValidator): class SubscriptionListValuesValidator(SubscriptionLeafValidator, StringListValidator):
@ -170,9 +170,9 @@ class SubscriptionListValuesValidator(SubscriptionLeafValidator, StringListValid
for idx, list_value in enumerate(self.list): for idx, list_value in enumerate(self.list):
# Write the first list value into subscription_value as well # Write the first list value into subscription_value as well
if idx == 0: if idx == 0:
self._overrides_to_add[ self._overrides_to_add[SubscriptionVariables.subscription_value().variable_name] = (
SubscriptionVariables.subscription_value().variable_name list_value.value
] = list_value.value )
self._overrides_to_add[ self._overrides_to_add[
SubscriptionVariables.subscription_value_i(index=idx).variable_name SubscriptionVariables.subscription_value_i(index=idx).variable_name
@ -219,9 +219,9 @@ class SubscriptionMapValidator(SubscriptionLeafValidator, LiteralDictValidator):
presets=presets, presets=presets,
indent_overrides=indent_overrides, indent_overrides=indent_overrides,
) )
self._overrides_to_add[ self._overrides_to_add[SubscriptionVariables.subscription_map().variable_name] = (
SubscriptionVariables.subscription_map().variable_name ScriptUtils.to_script(self.dict)
] = ScriptUtils.to_script(self.dict) )
class SubscriptionValidator(SubscriptionOutput): class SubscriptionValidator(SubscriptionOutput):

View file

@ -213,9 +213,10 @@ 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 open(cls.debug_log_filename(), mode="r", encoding="utf-8") as debug_logs, open( with (
cls.error_log_filename(), mode="a", encoding="utf-8" open(cls.debug_log_filename(), mode="r", encoding="utf-8") as debug_logs,
) as error_logs: open(cls.error_log_filename(), mode="a", encoding="utf-8") as error_logs,
):
error_logs.writelines(debug_logs.readlines()) error_logs.writelines(debug_logs.readlines())
@classmethod @classmethod

View file

@ -120,11 +120,13 @@ 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 patch.object(YTDLP, "_EXTRACT_ENTRY_NUM_RETRIES", 1), patch.object( with (
Entry, "try_get_ytdlp_download_thumbnail_path" patch.object(YTDLP, "_EXTRACT_ENTRY_NUM_RETRIES", 1),
) as mock_ytdlp_path, patch( patch.object(Entry, "try_get_ytdlp_download_thumbnail_path") as mock_ytdlp_path,
"ytdl_sub.downloaders.url.downloader.try_convert_download_thumbnail", patch(
side_effect=delete_entry_thumb, "ytdl_sub.downloaders.url.downloader.try_convert_download_thumbnail",
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)

View file

@ -42,12 +42,15 @@ 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 patch.object( with (
Subscription, patch.object(
"download", Subscription,
new=mock_subscription_download_factory(mock_success_output=mock_success_output), "download",
# mock datetime to be an index to be able to run instantly new=mock_subscription_download_factory(mock_success_output=mock_success_output),
), patch("ytdl_sub.cli.entrypoint._log_time", side_effect=[str(idx) for idx in range(10)]): # 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)]),
):
try: try:
_download_subscriptions_from_yaml_files( _download_subscriptions_from_yaml_files(
config=config, config=config,
@ -101,16 +104,19 @@ 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 patch.object( with (
sys, patch.object(
"argv", sys,
[ "argv",
"ytdl-sub", [
"--config", "ytdl-sub",
str(default_config_path), "--config",
"sub", str(default_config_path),
str(music_video_subscription_path), "sub",
"--update-with-info-json", str(music_video_subscription_path),
], "--update-with-info-json",
), pytest.raises(ExperimentalFeatureNotEnabled): ],
),
pytest.raises(ExperimentalFeatureNotEnabled),
):
_ = main() _ = main()

View file

@ -32,19 +32,22 @@ 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 patch.object( with (
sys, patch.object(
"argv", sys,
[ "argv",
"ytdl-sub", [
"--config", "ytdl-sub",
str(default_config_path), "--config",
"sub", str(default_config_path),
str(music_video_subscription_path), "sub",
"--suppress-transaction-log", str(music_video_subscription_path),
] "--suppress-transaction-log",
+ (["--transaction-log", file_transaction_log] if file_transaction_log else []), ]
), patch("ytdl_sub.cli.output_transaction_log.output_transaction_log") as mock_transaction_log: + (["--transaction-log", file_transaction_log] if file_transaction_log else []),
),
patch("ytdl_sub.cli.output_transaction_log.output_transaction_log") as mock_transaction_log,
):
subscriptions = main() subscriptions = main()
assert subscriptions assert subscriptions
@ -82,20 +85,23 @@ 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 patch.object( with (
sys, patch.object(
"argv", sys,
[ "argv",
"ytdl-sub", [
"--config", "ytdl-sub",
str(default_config_path), "--config",
"sub", str(default_config_path),
str(music_video_subscription_path), "sub",
], str(music_video_subscription_path),
), assert_logs( ],
logger=transaction_logger, ),
expected_message="Transaction log for Rick Astley:\n", assert_logs(
log_level="info", logger=transaction_logger,
expected_message="Transaction log for Rick Astley:\n",
log_level="info",
),
): ):
subscriptions = main() subscriptions = main()
assert subscriptions assert subscriptions

View file

@ -375,38 +375,47 @@ 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 mock_load_yaml( with (
preset_dict=preset_with_subscription_value_nested_presets_and_indent_variables_same_line_old_format_errors mock_load_yaml(
), pytest.raises( preset_dict=preset_with_subscription_value_nested_presets_and_indent_variables_same_line_old_format_errors
ValidationException, ),
match=re.escape( pytest.raises(
"Validation error in parent_preset_2.=INDENT_1: 'INDENT_3' in '= INDENT_2 | INDENT_3' is not a preset name. " ValidationException,
"To use as a subscription indent value, define it as '= INDENT_3'" match=re.escape(
"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 mock_load_yaml( with (
preset_dict={ mock_load_yaml(
"= INDENTS_IN_ERR_MSG ": {"=ANOTHER": {"jellyfin_tv_show_by_date": "single value"}} preset_dict={
} "= INDENTS_IN_ERR_MSG ": {"=ANOTHER": {"jellyfin_tv_show_by_date": "single value"}}
), pytest.raises( }
ValidationException, ),
match=re.escape( pytest.raises(
"Validation error in = INDENTS_IN_ERR_MSG .=ANOTHER.jellyfin_tv_show_by_date: " ValidationException,
"jellyfin_tv_show_by_date conflicts with an existing preset name and cannot be used " match=re.escape(
"as a subscription name" "Validation error in = INDENTS_IN_ERR_MSG .=ANOTHER.jellyfin_tv_show_by_date: "
"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 mock_load_yaml(preset_dict={"sub_name": 4332}), pytest.raises( with (
ValidationException, mock_load_yaml(preset_dict={"sub_name": 4332}),
match=re.escape(f"Subscription value should either be a string, list, or object"), pytest.raises(
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")

View file

@ -228,10 +228,11 @@ def mock_download_collection_entries(
), ),
] ]
with patch.object( with (
YTDLP, "extract_info_via_info_json", new=_write_entries_to_working_dir patch.object(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

View file

@ -40,9 +40,11 @@ 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 mock_sys_exit(expected_exit_code=return_code), patch( with (
"src.ytdl_sub.main._main" mock_sys_exit(expected_exit_code=return_code),
) as mock_inner_main, patch.object(Logger, "cleanup") as mock_logger_cleanup: patch("src.ytdl_sub.main._main") as mock_inner_main,
patch.object(Logger, "cleanup") as mock_logger_cleanup,
):
mock_inner_main.return_value = return_code mock_inner_main.return_value = return_code
main() main()
@ -54,9 +56,11 @@ 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 mock_sys_exit(expected_exit_code=1), patch( with (
"src.ytdl_sub.main._main", side_effect=validation_exception mock_sys_exit(expected_exit_code=1),
), patch.object(logging.Logger, "error") as mock_logger: patch("src.ytdl_sub.main._main", side_effect=validation_exception),
patch.object(logging.Logger, "error") as mock_logger,
):
main() main()
assert mock_logger.call_count == 1 assert mock_logger.call_count == 1
@ -65,11 +69,12 @@ 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 mock_sys_exit(expected_exit_code=1), patch( with (
"src.ytdl_sub.main._main", side_effect=uncaught_error mock_sys_exit(expected_exit_code=1),
), patch.object(logging.Logger, "exception") as mock_exception, patch.object( patch("src.ytdl_sub.main._main", side_effect=uncaught_error),
logging.Logger, "error" patch.object(logging.Logger, "exception") as mock_exception,
) as mock_error: patch.object(logging.Logger, "error") as mock_error,
):
main() main()
assert mock_exception.call_count == 1 assert mock_exception.call_count == 1
@ -83,9 +88,11 @@ 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 mock_sys_exit(expected_exit_code=1), patch( with (
"src.ytdl_sub.main._main", side_effect=permission_error mock_sys_exit(expected_exit_code=1),
), patch.object(logging.Logger, "error") as mock_error: patch("src.ytdl_sub.main._main", side_effect=permission_error),
patch.object(logging.Logger, "error") as mock_error,
):
main() main()
assert mock_error.call_count == 1 assert mock_error.call_count == 1
@ -97,11 +104,15 @@ 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 mock_sys_exit(expected_exit_code=0), patch.object( with (
sys, mock_sys_exit(expected_exit_code=0),
"argv", patch.object(
["ytdl-sub", "-c", tv_show_config_path, "sub", "--log-level", "verbose"], sys,
), patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub: "argv",
["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
@ -112,21 +123,25 @@ 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 mock_sys_exit(expected_exit_code=0), patch.object( with (
sys, mock_sys_exit(expected_exit_code=0),
"argv", patch.object(
[ sys,
"ytdl-sub", "argv",
"--match", [
"testA", "ytdl-sub",
"testB", "--match",
"-c", "testA",
tv_show_config_path, "testB",
"sub", "-c",
"--log-level", tv_show_config_path,
"verbose", "sub",
], "--log-level",
), patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub: "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
@ -137,22 +152,26 @@ 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 mock_sys_exit(expected_exit_code=0), patch.object( with (
sys, mock_sys_exit(expected_exit_code=0),
"argv", patch.object(
[ sys,
"ytdl-sub", "argv",
"-c", [
tv_show_config_path, "ytdl-sub",
"sub", "-c",
"--log-level", tv_show_config_path,
"verbose", "sub",
"--match", "--log-level",
"testA", "verbose",
"--match", "--match",
"testB", "testA",
], "--match",
), patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub: "testB",
],
),
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
@ -163,11 +182,15 @@ 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 mock_sys_exit(expected_exit_code=0), patch.object( with (
sys, mock_sys_exit(expected_exit_code=0),
"argv", patch.object(
["ytdl-sub", "sub", "--log-level", "verbose"], sys,
), patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub: "argv",
["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
@ -183,14 +206,19 @@ 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 mock_sys_exit(expected_exit_code=0), patch.object( with (
sys, mock_sys_exit(expected_exit_code=0),
"argv", patch.object(
["ytdl-sub", "sub", "--log-level", "verbose"], sys,
), patch( "argv",
"ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files" ["ytdl-sub", "sub", "--log-level", "verbose"],
) as mock_sub, patch.object( ),
ConfigFile, "from_file_path", new=lambda _: ConfigFile(name="test default", value={}) patch("ytdl_sub.cli.entrypoint._download_subscriptions_from_yaml_files") as mock_sub,
patch.object(
ConfigFile,
"from_file_path",
new=lambda _: ConfigFile(name="test default", value={}),
),
): ):
main() main()
@ -204,11 +232,15 @@ 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 mock_sys_exit(expected_exit_code=1), patch.object( with (
sys, mock_sys_exit(expected_exit_code=1),
"argv", patch.object(
["ytdl-sub", "-c", tv_show_config_path, "--log-level", "verbose"], sys,
), patch.object(logging.Logger, "error") as mock_error: "argv",
["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
@ -216,11 +248,15 @@ 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 mock_sys_exit(expected_exit_code=1), patch.object( with (
sys, mock_sys_exit(expected_exit_code=1),
"argv", patch.object(
["ytdl-sub", "-c", "does_not_exist.yaml", "sub", "--log-level", "verbose"], sys,
), patch.object(logging.Logger, "error") as mock_error: "argv",
["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

View file

@ -39,23 +39,29 @@ class TestThrottleProtectionPlugin:
preset_dict=preset_dict, preset_dict=preset_dict,
) )
with mock_download_collection_entries( with (
is_youtube_channel=False, num_urls=1, is_extracted_audio=False mock_download_collection_entries(
), assert_logs( is_youtube_channel=False, num_urls=1, is_extracted_audio=False
logger=throttle_protection_logger, ),
expected_message="Sleeping between downloads for %0.2f seconds", assert_logs(
log_level="debug", logger=throttle_protection_logger,
expected_occurrences=4, expected_message="Sleeping between downloads for %0.2f seconds",
log_level="debug",
expected_occurrences=4,
),
): ):
_ = subscription.download(dry_run=False) _ = subscription.download(dry_run=False)
with mock_download_collection_entries( with (
is_youtube_channel=False, num_urls=1, is_extracted_audio=False mock_download_collection_entries(
), assert_logs( is_youtube_channel=False, num_urls=1, is_extracted_audio=False
logger=throttle_protection_logger, ),
expected_message="Sleeping between subscriptions for %0.2f seconds", assert_logs(
log_level="debug", logger=throttle_protection_logger,
expected_occurrences=1, expected_message="Sleeping between subscriptions for %0.2f seconds",
log_level="debug",
expected_occurrences=1,
),
): ):
_ = subscription.download(dry_run=False) _ = subscription.download(dry_run=False)
@ -105,12 +111,15 @@ class TestThrottleProtectionPlugin:
preset_dict=preset_dict, preset_dict=preset_dict,
) )
with mock_download_collection_entries( with (
is_youtube_channel=False, num_urls=1, is_extracted_audio=False mock_download_collection_entries(
), assert_logs( is_youtube_channel=False, num_urls=1, is_extracted_audio=False
logger=throttle_protection_logger, ),
expected_message="Sleeping between downloads for %0.2f seconds", assert_logs(
log_level="debug", logger=throttle_protection_logger,
expected_occurrences=0, expected_message="Sleeping between downloads for %0.2f seconds",
log_level="debug",
expected_occurrences=0,
),
): ):
_ = subscription.download(dry_run=False) _ = subscription.download(dry_run=False)