Skip to content

Commit 3dcffd6

Browse files
committed
fix: Use the standard logger and remove the print based logger
1 parent c97c407 commit 3dcffd6

14 files changed

Lines changed: 65 additions & 287 deletions

File tree

src/configdirector/__init__.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
ConfigDirectorTypeError,
2626
ConfigDirectorValidationError,
2727
)
28-
from .logger import ConsoleLogger, create_console_logger, get_default_logger
2928
from .types import (
3029
ClientEvent,
3130
ClientHooks,
@@ -41,7 +40,6 @@
4140
ConnectionOptions,
4241
Context,
4342
EvaluationReason,
44-
LoggingLevel,
4543
Metadata,
4644
Subscription,
4745
TelemetryOptions,
@@ -67,16 +65,12 @@
6765
"ConfigsUpdatedEvent",
6866
"ConnectionMode",
6967
"ConnectionOptions",
70-
"ConsoleLogger",
7168
"Context",
7269
"EvaluationReason",
73-
"LoggingLevel",
7470
"Metadata",
7571
"Subscription",
7672
"TelemetryOptions",
7773
"WatchHandler",
7874
"__version__",
7975
"create_client",
80-
"create_console_logger",
81-
"get_default_logger",
8276
]

src/configdirector/_evaluation/config_evaluator.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,6 @@ class _RuleResult:
3535

3636
class ConfigEvaluator:
3737
def __init__(self, logger: ConfigDirectorLogger) -> None:
38-
for method in ("debug", "info", "warning", "error"):
39-
if not callable(getattr(logger, method, None)):
40-
raise TypeError(
41-
f"The provided logger is not a valid ConfigDirectorLogger: it has no "
42-
f"callable '{method}' method."
43-
)
4438
self._logger = logger
4539
self._condition_evaluator = ConditionEvaluator()
4640

src/configdirector/_eventsource/client.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from typing import Any, TypeVar
1010

1111
from ..errors import ConfigDirectorTypeError
12-
from ..logger import get_default_logger
1312
from ..types import ConfigDirectorLogger
1413
from .errors import StreamClosedError, ValueOutOfRangeError
1514
from .parser import DEFAULT_MAX_EVENT_CHARS, DEFAULT_MAX_LINE_CHARS, EventSourceParser
@@ -52,7 +51,7 @@ def __init__(
5251
read_timeout: float | None = None,
5352
follow_redirects: bool = True,
5453
transport: Callable[[StreamRequest], ResponseStream] = open_stream,
55-
logger: ConfigDirectorLogger | None = None,
54+
logger: ConfigDirectorLogger,
5655
on_connect: Callable[[], None] | None = None,
5756
on_disconnect: Callable[[], None] | None = None,
5857
on_message: Callable[[EventSourceMessage], None] | None = None,
@@ -73,7 +72,7 @@ def __init__(
7372
self._read_timeout = read_timeout
7473
self._follow_redirects = follow_redirects
7574
self._transport = transport
76-
self._logger = logger if logger is not None else get_default_logger()
75+
self._logger = logger
7776
self._max_line_chars = max_line_chars
7877
self._max_event_chars = max_event_chars
7978

src/configdirector/_logger.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import logging
2+
3+
4+
def get_default_logger(log_level: int | str | None = None) -> logging.Logger:
5+
"""Return the standard library logger the SDK uses when none is supplied.
6+
7+
Configure it like any other logger::
8+
9+
logging.getLogger("configdirector").setLevel(logging.DEBUG)
10+
"""
11+
logger = logging.getLogger(__name__)
12+
logger.setLevel(logging.WARNING if log_level is None else log_level)
13+
return logger

src/configdirector/client.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
from ._bundle import ConfigBundle
1414
from ._evaluation import Config, ConfigEvaluator, EvaluationContext
15+
from ._logger import get_default_logger
1516
from ._telemetry import (
1617
MAX_EVENT_QUEUE_LIMIT,
1718
MIN_EVENT_QUEUE_LIMIT,
@@ -22,7 +23,6 @@
2223
from ._value_parser import parse_config_value
2324
from ._version import SDK_NAME, __version__
2425
from .errors import ConfigDirectorTypeError, ConfigDirectorValidationError
25-
from .logger import get_default_logger
2626
from .types import (
2727
ClientEvent,
2828
ClientHooks,
@@ -95,10 +95,11 @@ def __init__(
9595
metadata: Metadata | None = None,
9696
connection: ConnectionOptions | None = None,
9797
logger: ConfigDirectorLogger | None = None,
98+
log_level: int | str | None = None,
9899
telemetry: TelemetryOptions | None = None,
99100
hooks: ClientHooks | None = None,
100101
) -> None:
101-
self._logger = logger if logger is not None else get_default_logger()
102+
self._logger = logger if logger is not None else get_default_logger(log_level)
102103
if _is_blank(server_sdk_key):
103104
raise ConfigDirectorValidationError(
104105
"No server SDK key was provided, the client cannot be instantiated without a "

src/configdirector/logger.py

Lines changed: 0 additions & 103 deletions
This file was deleted.

src/configdirector/types.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
"ConnectionOptions",
2424
"Context",
2525
"EvaluationReason",
26-
"LoggingLevel",
2726
"Metadata",
2827
"Subscription",
2928
"TelemetryOptions",
@@ -51,9 +50,6 @@
5150
ConnectionMode = Literal["streaming", "polling", "one-time"]
5251
"""How the SDK retrieves config state from ConfigDirector."""
5352

54-
LoggingLevel = Literal["debug", "info", "warning", "error", "off"]
55-
"""Verbosity of the SDK's console logger."""
56-
5753
EvaluationReason = Literal[
5854
"found-match",
5955
"config-state-missing",

tests/evaluation/helpers.py

Lines changed: 0 additions & 19 deletions
This file was deleted.

tests/evaluation/test_config_evaluator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
TargetingRules,
1717
)
1818

19-
from .helpers import create_stubbed_logger
19+
from helpers import create_stubbed_logger
2020

2121
CONFIG_ID = "11111111-1111-4111-8111-111111111111"
2222

tests/eventsource/test_client.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@
1717
)
1818

1919
from .helpers import FailingTransport, FakeResponse, FakeTransport, sse, wait_for
20+
from helpers import create_stubbed_logger
2021

2122
URL = "http://localhost/sse"
2223
_R = TypeVar("_R")
2324

25+
logger = create_stubbed_logger()
26+
2427

2528
def record(sink: list[Any], attribute: str | None, *, returning: _R) -> Callable[[ReconnectionState], _R]:
2629
def handler(state: ReconnectionState) -> _R:
@@ -49,6 +52,7 @@ def clients() -> Iterator[list[EventSourceClient]]:
4952

5053

5154
def build(clients: list[EventSourceClient], **kwargs: object) -> EventSourceClient:
55+
kwargs.setdefault("logger", logger)
5256
client = EventSourceClient(URL, **kwargs) # type: ignore[arg-type]
5357
clients.append(client)
5458
return client
@@ -606,7 +610,7 @@ class TestInvalidOptions:
606610
)
607611
def test_a_non_callable_handler_is_rejected(self, option: str) -> None:
608612
with pytest.raises(ConfigDirectorTypeError, match=option):
609-
EventSourceClient(URL, **{option: "not callable"}) # type: ignore[arg-type]
613+
EventSourceClient(URL, logger=logger, **{option: "not callable"}) # type: ignore[arg-type]
610614

611615

612616
class TestConcurrentLifecycle:

0 commit comments

Comments
 (0)