[FEATURE] More verbose error logs when using ytdl-sub commands (#717)

Add a more informative error message when the config file is missing, and when no command is supplied (i.e. sub, dl, view)
This commit is contained in:
Jesse Bannon 2023-09-15 12:35:34 -07:00 committed by GitHub
parent 6c3e70a9fd
commit 0008bf3aca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 4 deletions

View file

@ -341,6 +341,8 @@ def main() -> List[Tuple[Subscription, FileHandlerTransactionLog]]:
transaction_logs.append(
_view_url_from_cli(config=config, url=args.url, split_chapters=args.split_chapters)
)
else:
raise ValidationException("Must provide one of the commands: sub, dl, view")
if not args.suppress_transaction_log:
_output_transaction_log(

View file

@ -4,6 +4,7 @@ from typing import Dict
from ytdl_sub.config.config_validator import ConfigValidator
from ytdl_sub.config.preset import Preset
from ytdl_sub.utils.exceptions import FileNotFoundException
from ytdl_sub.utils.ffmpeg import FFMPEG
from ytdl_sub.utils.yaml import load_yaml
from ytdl_sub.validators.file_path_validators import FilePathValidatorMixin
@ -68,8 +69,20 @@ class ConfigFile(ConfigValidator):
Returns
-------
Config file validator
Raises
------
FileNotFoundException
Not found
"""
config_dict = load_yaml(file_path=config_path)
try:
config_dict = load_yaml(file_path=config_path)
except FileNotFoundException as exc:
raise FileNotFoundException(
f"The config file '{config_path}' could not be found. "
f"Did you set --config correctly?"
) from exc
return ConfigFile.from_dict(config_dict)
def as_dict(self) -> Dict[str, Any]:

View file

@ -220,7 +220,7 @@ class Logger:
# Log validation exceptions as-is
if isinstance(exception, ValidationException):
logger.error(exception)
logger.error(str(exception))
# For other uncaught errors, log as bug:
else:
logger.exception("An uncaught error occurred:")

View file

@ -41,14 +41,14 @@ def test_main_success(mock_sys_exit):
def test_main_validation_error(capsys, mock_sys_exit):
validation_exception = ValidationException("test")
validation_exception = ValidationException("test exc")
with mock_sys_exit(expected_exit_code=1), patch(
"src.ytdl_sub.main._main", side_effect=validation_exception
), patch.object(logging.Logger, "error") as mock_logger:
main()
assert mock_logger.call_count == 1
assert mock_logger.call_args.args[0] == validation_exception
assert mock_logger.call_args.args[0] == "test exc"
def test_main_uncaught_error(capsys, mock_sys_exit, expected_uncaught_error_message):
@ -80,3 +80,30 @@ def test_args_after_sub_work(mock_sys_exit):
assert mock_sub.call_count == 1
assert mock_sub.call_args.kwargs["subscription_paths"] == ["subscriptions.yaml"]
assert Logger._LOGGER_LEVEL == LoggerLevels.VERBOSE
def test_no_positional_arg_command(mock_sys_exit):
with mock_sys_exit(expected_exit_code=1), patch.object(
sys,
"argv",
["ytdl-sub", "-c", "examples/tv_show_config.yaml", "--log-level", "verbose"],
), patch.object(logging.Logger, "error") as mock_error:
main()
assert mock_error.call_count == 1
assert mock_error.call_args.args[0] == "Must provide one of the commands: sub, dl, view"
def test_bad_config_path(mock_sys_exit):
with mock_sys_exit(expected_exit_code=1), patch.object(
sys,
"argv",
["ytdl-sub", "-c", "does_not_exist.yaml", "sub", "--log-level", "verbose"],
), patch.object(logging.Logger, "error") as mock_error:
main()
assert mock_error.call_count == 1
assert mock_error.call_args.args[0] == (
"The config file 'does_not_exist.yaml' could not be found. "
"Did you set --config correctly?"
)