From 5800db45dde0c2060ad0a9bed8ea931bd41da936 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Mon, 29 Jul 2019 14:22:23 +0200 Subject: [PATCH] =?UTF-8?q?Fixed=20logging.*(=E2=80=A6,=20deep=3D"?= =?UTF-8?q?=E2=80=A6")=20Fixes=20#746?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scanpy/_settings.py | 7 ++++++- scanpy/logging.py | 5 ++++- scanpy/tests/test_logging.py | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/scanpy/_settings.py b/scanpy/_settings.py index fec0cfa22f..63a170bb5b 100644 --- a/scanpy/_settings.py +++ b/scanpy/_settings.py @@ -3,6 +3,7 @@ from enum import IntEnum from pathlib import Path from time import time +from logging import getLevelName from typing import Tuple, Union, Any, List, Iterable, TextIO, Optional from . import logging @@ -15,7 +16,6 @@ 'hint': 'HINT', 'debug': 'DEBUG', } -verbosity_names = list(_VERBOSITY_TO_LOGLEVEL.keys()) # Python 3.7 ensures iteration order for v, level in enumerate(list(_VERBOSITY_TO_LOGLEVEL.values())): _VERBOSITY_TO_LOGLEVEL[v] = level @@ -28,6 +28,11 @@ class Verbosity(IntEnum): hint = 3 debug = 4 + @property + def level(self) -> int: + # getLevelName(str) returns the int level… + return getLevelName(_VERBOSITY_TO_LOGLEVEL[self]) + def _type_check(var: Any, varname: str, types: Union[type, Tuple[type, ...]]): if isinstance(var, types): diff --git a/scanpy/logging.py b/scanpy/logging.py index 891ad5624d..ca49287c37 100644 --- a/scanpy/logging.py +++ b/scanpy/logging.py @@ -28,11 +28,12 @@ def log( time: datetime = None, deep: Optional[str] = None, ) -> datetime: + from . import settings now = datetime.now(timezone.utc) time_passed: timedelta = None if time is None else now - time extra = { **(extra or {}), - 'deep': deep, + 'deep': deep if settings.verbosity.level < level else None, 'time_passed': time_passed } super().log(level, msg, extra=extra) @@ -98,6 +99,8 @@ def format(self, record: logging.LogRecord): record.msg = record.msg.replace('{time_passed}', str(record.time_passed)) else: self._style._fmt += ' ({time_passed})' + if record.deep: + record.msg = f'{record.msg}: {record.deep}' result = logging.Formatter.format(self, record) self._style._fmt = format_orig return result diff --git a/scanpy/tests/test_logging.py b/scanpy/tests/test_logging.py index e9b4e0bd01..abcc97d104 100644 --- a/scanpy/tests/test_logging.py +++ b/scanpy/tests/test_logging.py @@ -34,6 +34,20 @@ def test_formats(capsys, logging_state): assert capsys.readouterr().err == ' 4\n' +def test_deep(capsys, logging_state): + s.logfile = sys.stderr + s.verbosity = Verbosity.hint + l.hint('0') + assert capsys.readouterr().err == '--> 0\n' + l.hint('1', deep='1!') + assert capsys.readouterr().err == '--> 1\n' + s.verbosity = Verbosity.debug + l.hint('2') + assert capsys.readouterr().err == '--> 2\n' + l.hint('3', deep='3!') + assert capsys.readouterr().err == '--> 3: 3!\n' + + def test_logfile(tmp_path, logging_state): s.verbosity = Verbosity.hint