From f304cf4ee9a1a6891e98ad6ad579e2afd9ab6c24 Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Tue, 27 Sep 2022 19:03:15 -0400 Subject: [PATCH 1/3] Simplify import of Protocol --- adafruit_logging.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/adafruit_logging.py b/adafruit_logging.py index cabcdff..aa40bfa 100644 --- a/adafruit_logging.py +++ b/adafruit_logging.py @@ -62,12 +62,8 @@ from collections import namedtuple try: - from typing import Optional - - try: - from typing import Protocol - except ImportError: - from typing_extensions import Protocol + from typing import Optional, Hashable + from typing_extensions import Protocol class WriteableStream(Protocol): """Any stream that can ``write`` strings""" From 5a7999c9737f86e342c48d752770b79a8377740d Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Tue, 27 Sep 2022 19:03:57 -0400 Subject: [PATCH 2/3] Allow usage with a root logger --- adafruit_logging.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/adafruit_logging.py b/adafruit_logging.py index aa40bfa..c9f8661 100644 --- a/adafruit_logging.py +++ b/adafruit_logging.py @@ -113,6 +113,8 @@ def write(self, buf: str) -> int: for __value, __name in LEVELS: globals()[__name] = __value +_ROOT_LOGGER_SENTINEL = object() + def _level_for(value: int) -> str: """Convert a numeric level to the most appropriate name. @@ -241,7 +243,7 @@ def emit(self, record: LogRecord) -> None: logger_cache = {} -def _addLogger(logger_name: str) -> None: +def _addLogger(logger_name: Hashable) -> None: """Adds the logger if it doesn't already exist""" if logger_name not in logger_cache: new_logger = Logger(logger_name) @@ -249,12 +251,14 @@ def _addLogger(logger_name: str) -> None: logger_cache[logger_name] = new_logger -def getLogger(logger_name: str) -> "Logger": +def getLogger(logger_name: Hashable = _ROOT_LOGGER_SENTINEL) -> "Logger": """Create or retrieve a logger by name; only retrieves loggers made using this function; if a Logger with this name does not exist it is created - :param str logger_name: The name of the `Logger` to create/retrieve. + :param Hashable logger_name: The name of the `Logger` to create/retrieve, this + is typically a ``str``. If none is provided, the single root logger will + be created/retrieved. """ _addLogger(logger_name) return logger_cache[logger_name] @@ -263,12 +267,12 @@ def getLogger(logger_name: str) -> "Logger": class Logger: """The actual logger that will provide the logging API. - :param str name: The name of the logger, typically assigned by the - value from `getLogger` + :param Hashable name: The name of the logger, typically assigned by the + value from `getLogger`; this is typically a ``str`` :param int level: (optional) The log level, default is ``NOTSET`` """ - def __init__(self, name: str, level: int = NOTSET) -> None: + def __init__(self, name: Hashable, level: int = NOTSET) -> None: """Create an instance.""" self._level = level self.name = name From 9cd43d14f2a7228208261e384b5d39ca5a23b8fe Mon Sep 17 00:00:00 2001 From: Alec Delaney <89490472+tekktrik@users.noreply.github.com> Date: Tue, 4 Oct 2022 19:59:51 -0400 Subject: [PATCH 3/3] Change sentinel object to string --- adafruit_logging.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/adafruit_logging.py b/adafruit_logging.py index c9f8661..db4b699 100644 --- a/adafruit_logging.py +++ b/adafruit_logging.py @@ -113,8 +113,6 @@ def write(self, buf: str) -> int: for __value, __name in LEVELS: globals()[__name] = __value -_ROOT_LOGGER_SENTINEL = object() - def _level_for(value: int) -> str: """Convert a numeric level to the most appropriate name. @@ -251,14 +249,15 @@ def _addLogger(logger_name: Hashable) -> None: logger_cache[logger_name] = new_logger -def getLogger(logger_name: Hashable = _ROOT_LOGGER_SENTINEL) -> "Logger": +def getLogger(logger_name: Hashable = "") -> "Logger": """Create or retrieve a logger by name; only retrieves loggers made using this function; if a Logger with this name does not exist it is created :param Hashable logger_name: The name of the `Logger` to create/retrieve, this is typically a ``str``. If none is provided, the single root logger will - be created/retrieved. + be created/retrieved. Note that unlike CPython, a blank string will also + access the root logger. """ _addLogger(logger_name) return logger_cache[logger_name]