diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 00000000..045cfad6 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,3 @@ +Release type: major + +Change default of `--fatal` command line switch to terminate on error. diff --git a/pelican/__init__.py b/pelican/__init__.py index 89a63e84..d21c0c56 100644 --- a/pelican/__init__.py +++ b/pelican/__init__.py @@ -442,12 +442,12 @@ def parse_arguments(argv=None): parser.add_argument( "--fatal", - metavar="errors|warnings", - choices=("errors", "warnings"), - default="", + metavar="errors|warnings|ignore", + choices=("errors", "warnings", "ignore"), + default="errors", help=( "Exit the program with non-zero status if any " - "errors/warnings encountered." + "errors/warnings encountered, or ignore any errors." ), ) diff --git a/pelican/log.py b/pelican/log.py index edf2f182..cf9f5db9 100644 --- a/pelican/log.py +++ b/pelican/log.py @@ -131,13 +131,23 @@ DEFAULT_LOG_HANDLER = RichHandler(console=console) def init( level=None, - fatal="", + fatal="errors", handler=DEFAULT_LOG_HANDLER, name=None, logs_dedup_min_level=None, ): + """Initialize the logger. + + :param level: the log level + :param fatal: how to set up the FatalLogger. If "warning", then warnings are fatal. + If fatal is set to anything other than "" or "ignore", + then errors are fatal. + :param handler: the logging handler + :param name: the name of the logger to use + :param logs_dedup_min_level: the LimitFilter.LOGS_DEDUP_MIN_LEVEL to use + """ FatalLogger.warnings_fatal = fatal.startswith("warning") - FatalLogger.errors_fatal = bool(fatal) + FatalLogger.errors_fatal = bool(fatal) and fatal != "ignore" LOG_FORMAT = "%(message)s" logging.basicConfig( @@ -155,12 +165,13 @@ def init( LimitFilter.LOGS_DEDUP_MIN_LEVEL = logs_dedup_min_level -def log_warnings(): +def log_warnings(fatal: str) -> None: + """Redirect warnings module to use logging instead.""" import warnings logging.captureWarnings(True) warnings.simplefilter("default", DeprecationWarning) - init(logging.DEBUG, name="py.warnings") + init(logging.DEBUG, name="py.warnings", fatal=fatal) if __name__ == "__main__": diff --git a/pelican/tests/__init__.py b/pelican/tests/__init__.py index 564e417c..2d5ecb1c 100644 --- a/pelican/tests/__init__.py +++ b/pelican/tests/__init__.py @@ -4,7 +4,8 @@ import warnings from pelican.log import log_warnings # redirect warnings module to use logging instead -log_warnings() +# "ignore" means "don't raise on logging an error" +log_warnings("ignore") # setup warnings to log DeprecationWarning's and error on # warnings in pelican's codebase diff --git a/pelican/tests/test_init.py b/pelican/tests/test_init.py new file mode 100644 index 00000000..1f8e156b --- /dev/null +++ b/pelican/tests/test_init.py @@ -0,0 +1,20 @@ +import unittest +from unittest.mock import MagicMock, patch + +from pelican import DEFAULT_LOG_HANDLER, main + + +class TestLog(unittest.TestCase): + @patch("pelican.get_instance") + @patch("pelican.init_logging") + def test_main_fatal_default(self, init_logging_mock, get_instance): + get_instance.side_effect = lambda *args, **kwargs: (MagicMock(), MagicMock()) + main() + init_logging_mock.assert_called_once_with( + level=None, + # default is "errors" + fatal="errors", + name="pelican", + handler=DEFAULT_LOG_HANDLER, + logs_dedup_min_level=30, + )