From 754acf9f5671756eace8f8796ff3c03e276052de Mon Sep 17 00:00:00 2001 From: pubpub-zz <4083478+pubpub-zz@users.noreply.github.com> Date: Wed, 26 Jul 2023 18:15:44 +0200 Subject: [PATCH] ENH : add clear capability to overload logger_warning closes #2020 --- pypdf/__init__.py | 2 ++ pypdf/_utils.py | 19 ++++++++++++++++++- tests/test_utils.py | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/pypdf/__init__.py b/pypdf/__init__.py index 91f860cbb..5aad444c7 100644 --- a/pypdf/__init__.py +++ b/pypdf/__init__.py @@ -11,6 +11,7 @@ from ._merger import PdfFileMerger, PdfMerger from ._page import PageObject, Transformation from ._reader import DocumentInformation, PdfFileReader, PdfReader +from ._utils import overload_logger_warning from ._version import __version__ from ._writer import ObjectDeletionFlag, PdfFileWriter, PdfWriter from .pagerange import PageRange, parse_filename_page_ranges @@ -18,6 +19,7 @@ __all__ = [ "__version__", + "overload_logger_warning", "PageRange", "PaperSize", "DocumentInformation", diff --git a/pypdf/_utils.py b/pypdf/_utils.py index da121ac55..bff5bffa3 100644 --- a/pypdf/_utils.py +++ b/pypdf/_utils.py @@ -430,6 +430,20 @@ def deprecation_no_replacement(name: str, removed_in: str = "3.0.0") -> None: deprecation(DEPR_MSG_NO_REPLACEMENT_HAPPENED.format(name, removed_in)) +custom_logger_warning = None + + +def overload_logger_warning(fn: Optional[Callable[[str, str], None]] = None) -> None: + """ + overload the logger_warning with a customed function + Parameters: + fn : Customed function ; parameters : msg: str, src: str + None: reset to default + """ + global custom_logger_warning + custom_logger_warning = fn + + def logger_warning(msg: str, src: str) -> None: """ Use this instead of logger.warning directly. @@ -446,7 +460,10 @@ def logger_warning(msg: str, src: str) -> None: pypdf could apply a robustness fix to still read it. This applies mainly to strict=False mode. """ - logging.getLogger(src).warning(msg) + if custom_logger_warning is None: + logging.getLogger(src).warning(msg) + else: + custom_logger_warning(msg, src) def deprecation_bookmark(**aliases: str) -> Callable: diff --git a/tests/test_utils.py b/tests/test_utils.py index ca954a493..84bb2f3e4 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -15,6 +15,7 @@ deprecation_no_replacement, mark_location, matrix_multiply, + overload_logger_warning, parse_iso8824_date, read_block_backwards, read_previous_line, @@ -368,3 +369,16 @@ def test_parse_datetime_err(): parse_iso8824_date("D:20210408T054711Z") assert ex.value.args[0] == "Can not convert date: D:20210408T054711Z" assert parse_iso8824_date("D:20210408054711").tzinfo is None + + +def test_overload_logger_warning(capsys): + path = RESOURCE_ROOT / "issue-297.pdf" + + def my_logger(msg: str, src: str) -> None: + print("!!!!") # noqa + + overload_logger_warning(my_logger) + PdfReader(path, strict=False) + captured = capsys.readouterr() + assert captured.out == "!!!!\n" + overload_logger_warning()