From 6e937c0aafef0336c09eac1462e76294d8c0564f Mon Sep 17 00:00:00 2001 From: Ben Nguyen Tran Date: Sun, 28 Apr 2024 13:32:33 -0400 Subject: [PATCH] Added functionality to log_file_verbose. However, the default value does not work. --- doc/en/how-to/logging.rst | 1 + doc/en/reference/reference.rst | 4 +++- src/_pytest/config/__init__.py | 3 +++ src/_pytest/config/argparsing.py | 10 ++++++---- src/_pytest/logging.py | 13 +++++++++++-- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/doc/en/how-to/logging.rst b/doc/en/how-to/logging.rst index 300e9f6e6..2f75e57c1 100644 --- a/doc/en/how-to/logging.rst +++ b/doc/en/how-to/logging.rst @@ -208,6 +208,7 @@ option names are: If you need to record the whole test suite logging calls to a file, you can pass ``--log-file=/path/to/log/file``. This log file is opened in write mode by default which means that it will be overwritten at each run tests session. +You can specify the level of verbosity of the log file by passing ```--log-file-verbose=1`` If you'd like the file opened in append mode instead, then you can pass ``--log-file-mode=a``. Note that relative paths for the log-file location, whether passed on the CLI or declared in a config file, are always resolved relative to the current working directory. diff --git a/doc/en/reference/reference.rst b/doc/en/reference/reference.rst index f3eedd23a..1dd20f7f1 100644 --- a/doc/en/reference/reference.rst +++ b/doc/en/reference/reference.rst @@ -2107,7 +2107,7 @@ All the command-line flags can be obtained by running ``pytest --help``:: --log-cli-date-format=LOG_CLI_DATE_FORMAT Log date format used by the logging module --log-file=LOG_FILE Path to a file when logging will be written to - --log-file-verbose Log file verbosity + --log-file-verbose={0,1} Log file verbose --log-file-mode={w,a} Log file open mode --log-file-level=LOG_FILE_LEVEL @@ -2208,6 +2208,8 @@ All the command-line flags can be obtained by running ``pytest --help``:: log_cli_date_format (string): Default value for --log-cli-date-format log_file (string): Default value for --log-file + log_file_verbose (int): + Default value for --log-file-verbose log_file_mode (string): Default value for --log-file-mode log_file_level (string): diff --git a/src/_pytest/config/__init__.py b/src/_pytest/config/__init__.py index 306b14cce..16f803a24 100644 --- a/src/_pytest/config/__init__.py +++ b/src/_pytest/config/__init__.py @@ -1576,6 +1576,7 @@ class Config: ``paths``, ``pathlist``, ``args`` and ``linelist`` : empty list ``[]`` ``bool`` : ``False`` ``string`` : empty string ``""`` + ``int`` : ``0`` If neither the ``default`` nor the ``type`` parameter is passed while registering the configuration through @@ -1643,6 +1644,8 @@ class Config: return value elif type == "bool": return _strtobool(str(value).strip()) + elif type is "int": + return int(value) elif type == "string": return value elif type is None: diff --git a/src/_pytest/config/argparsing.py b/src/_pytest/config/argparsing.py index 95dc28d4a..a79cf9f63 100644 --- a/src/_pytest/config/argparsing.py +++ b/src/_pytest/config/argparsing.py @@ -180,7 +180,7 @@ class Parser: name: str, help: str, type: Optional[ - Literal["string", "paths", "pathlist", "args", "linelist", "bool"] + Literal["string", "paths", "pathlist", "args", "linelist", "bool", "int"] ] = None, default: Any = NOT_SET, ) -> None: @@ -190,7 +190,7 @@ class Parser: Name of the ini-variable. :param type: Type of the variable. Can be: - + * ``int``: an integer * ``string``: a string * ``bool``: a boolean * ``args``: a list of strings, separated as in a shell @@ -215,7 +215,7 @@ class Parser: The value of ini-variables can be retrieved via a call to :py:func:`config.getini(name) `. """ - assert type in (None, "string", "paths", "pathlist", "args", "linelist", "bool") + assert type in (None, "string", "paths", "pathlist", "args", "linelist", "bool", "int") if default is NOT_SET: default = get_ini_default_for_type(type) @@ -224,7 +224,7 @@ class Parser: def get_ini_default_for_type( - type: Optional[Literal["string", "paths", "pathlist", "args", "linelist", "bool"]], + type: Optional[Literal["string", "paths", "pathlist", "args", "linelist", "bool", "int"]], ) -> Any: """ Used by addini to get the default value for a given ini-option type, when @@ -236,6 +236,8 @@ def get_ini_default_for_type( return [] elif type == "bool": return False + elif type is "int": + return 0 else: return "" diff --git a/src/_pytest/logging.py b/src/_pytest/logging.py index 0adecc7c1..e9901b09c 100644 --- a/src/_pytest/logging.py +++ b/src/_pytest/logging.py @@ -301,8 +301,9 @@ def pytest_addoption(parser: Parser) -> None: ) add_option_ini( "--log-file-verbose", - dest="log_file_verbosity", - default=None, + dest="log_file_verbose", + default=0, + type="int", help="Log file verbose", ) add_option_ini( @@ -845,6 +846,14 @@ class LoggingPlugin: @hookimpl(wrapper=True) def pytest_runtest_setup(self, item: nodes.Item) -> Generator[None, None, None]: + + if self.log_file_verbose: + old_log_file_formatter = self.log_file_handler.formatter + self.log_file_handler.setFormatter(logging.Formatter()) + + self.log_file_handler.emit(logging.LogRecord('N/A', logging.WARNING, 'N/A', 0, f"Running at {item.nodeid}", None, None)) + self.log_file_handler.setFormatter(old_log_file_formatter) + self.log_cli_handler.set_when("setup") empty: Dict[str, List[logging.LogRecord]] = {}