Skip to content

Commit 273194e

Browse files
authored
Clean up neo4j.debug public exports (#1194)
Make undocumented internal constants, helper functions, and other items in `neo4j.debug` private: * `ColourFormatter` * `TaskIdFilter` * all other indirectly exposed items from imports (e.g. `asyncio` as `neo4j.debug.asyncio`)
1 parent 26cb4ea commit 273194e

File tree

3 files changed

+49
-37
lines changed

3 files changed

+49
-37
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,16 @@ See also https://github.com/neo4j/neo4j-python-driver/wiki for a full changelog.
128128
- `.default_host`
129129
- `.default_port`
130130
- `.default_target`
131+
- `BoltDriver` and `Neo4jDriver`
132+
- `.open`
133+
- `.parse_target`
134+
- `.default_host`
135+
- `.default_port`
136+
- `.default_target`
137+
- `neo4j.debug`
138+
- `ColourFormatter`
139+
- `TaskIdFilter`
140+
- all other indirectly exposed items from imports (e.g. `asyncio` as `neo4j.debug.asyncio`)
131141
- Deprecate ClockTime and its accessors
132142
- For each `neo4j.time.Date`, `neo4j.time.DateTime`, `neo4j.time.Time`
133143
- `from_clock_time` and `to_clock_time` methods

src/neo4j/debug.py

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,22 @@
1414
# limitations under the License.
1515

1616

17-
from __future__ import annotations
17+
from __future__ import annotations as _
1818

19-
import asyncio
19+
import asyncio as _asyncio
2020
from contextlib import suppress as _suppress
2121
from logging import (
22-
CRITICAL,
23-
DEBUG,
24-
ERROR,
25-
Filter,
26-
Formatter,
27-
getLogger,
28-
INFO,
29-
StreamHandler,
30-
WARNING,
22+
CRITICAL as _CRITICAL,
23+
DEBUG as _DEBUG,
24+
ERROR as _ERROR,
25+
Filter as _Filter,
26+
Formatter as _Formatter,
27+
getLogger as _getLogger,
28+
INFO as _INFO,
29+
StreamHandler as _StreamHandler,
30+
WARNING as _WARNING,
3131
)
32-
from sys import stderr
32+
from sys import stderr as _stderr
3333

3434
# ignore TCH001 to make sphinx not completely drop the ball
3535
from . import _typing as _t # noqa: TCH001
@@ -41,31 +41,31 @@
4141
]
4242

4343

44-
class ColourFormatter(Formatter):
44+
class _ColourFormatter(_Formatter):
4545
"""Colour formatter for pretty log output."""
4646

4747
def format(self, record):
4848
s = super().format(record)
49-
if record.levelno == CRITICAL:
49+
if record.levelno == _CRITICAL:
5050
return f"\x1b[31;1m{s}\x1b[0m" # bright red
51-
elif record.levelno == ERROR:
51+
elif record.levelno == _ERROR:
5252
return f"\x1b[33;1m{s}\x1b[0m" # bright yellow
53-
elif record.levelno == WARNING:
53+
elif record.levelno == _WARNING:
5454
return f"\x1b[33m{s}\x1b[0m" # yellow
55-
elif record.levelno == INFO:
55+
elif record.levelno == _INFO:
5656
return f"\x1b[37m{s}\x1b[0m" # white
57-
elif record.levelno == DEBUG:
57+
elif record.levelno == _DEBUG:
5858
return f"\x1b[36m{s}\x1b[0m" # cyan
5959
else:
6060
return s
6161

6262

63-
class TaskIdFilter(Filter):
63+
class _TaskIdFilter(_Filter):
6464
"""Injecting async task id into log records."""
6565

6666
def filter(self, record):
6767
try:
68-
record.task = id(asyncio.current_task())
68+
record.task = id(_asyncio.current_task())
6969
except RuntimeError:
7070
record.task = None
7171
return True
@@ -116,18 +116,18 @@ class Watcher:
116116
def __init__(
117117
self,
118118
*logger_names: str | None,
119-
default_level: int = DEBUG,
120-
default_out: _t.TextIO = stderr,
119+
default_level: int = _DEBUG,
120+
default_out: _t.TextIO = _stderr,
121121
colour: bool = False,
122122
thread_info: bool = True,
123123
task_info: bool = True,
124124
) -> None:
125125
super().__init__()
126-
self.logger_names = logger_names
127-
self._loggers = [getLogger(name) for name in self.logger_names]
128-
self.default_level = default_level
129-
self.default_out = default_out
130-
self._handlers: dict[str, StreamHandler] = {}
126+
self._logger_names = logger_names
127+
self._loggers = [_getLogger(name) for name in self._logger_names]
128+
self._default_level = default_level
129+
self._default_out = default_out
130+
self._handlers: dict[str, _StreamHandler] = {}
131131
self._task_info = task_info
132132

133133
format_ = "%(asctime)s %(message)s"
@@ -137,7 +137,7 @@ def __init__(
137137
format_ = "[Thread %(thread)d] " + format_
138138
if not colour:
139139
format_ = "[%(levelname)-8s] " + format_
140-
formatter_cls = ColourFormatter if colour else Formatter
140+
formatter_cls = _ColourFormatter if colour else _Formatter
141141
self.formatter = formatter_cls(format_)
142142

143143
def __enter__(self) -> Watcher:
@@ -162,15 +162,15 @@ def watch(
162162
:type out: stream or file-like object
163163
"""
164164
if level is None:
165-
level = self.default_level
165+
level = self._default_level
166166
if out is None:
167-
out = self.default_out
167+
out = self._default_out
168168
self.stop()
169-
handler = StreamHandler(out)
169+
handler = _StreamHandler(out)
170170
handler.setFormatter(self.formatter)
171171
handler.setLevel(level)
172172
if self._task_info:
173-
handler.addFilter(TaskIdFilter())
173+
handler.addFilter(_TaskIdFilter())
174174
for logger in self._loggers:
175175
self._handlers[logger.name] = handler
176176
logger.addHandler(handler)
@@ -186,8 +186,8 @@ def stop(self) -> None:
186186

187187
def watch(
188188
*logger_names: str | None,
189-
level: int = DEBUG,
190-
out: _t.TextIO = stderr,
189+
level: int = _DEBUG,
190+
out: _t.TextIO = _stderr,
191191
colour: bool = False,
192192
thread_info: bool = True,
193193
task_info: bool = True,

tests/unit/common/test_debug.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,9 @@ def test_watcher_colour(logger_mocker, colour, thread, task) -> None:
270270
assert isinstance(handler, logging.Handler)
271271
assert isinstance(handler.formatter, logging.Formatter)
272272
if colour:
273-
assert isinstance(handler.formatter, neo4j_debug.ColourFormatter)
273+
assert isinstance(handler.formatter, neo4j_debug._ColourFormatter)
274274
else:
275-
assert not isinstance(handler.formatter, neo4j_debug.ColourFormatter)
275+
assert not isinstance(handler.formatter, neo4j_debug._ColourFormatter)
276276

277277

278278
@pytest.mark.parametrize("colour", (True, False))
@@ -305,7 +305,9 @@ def test_watcher_format(logger_mocker, colour, thread, task) -> None:
305305
def _assert_task_injection(
306306
async_: bool, mocker, logger_mocker, colour: bool, thread: bool, task: bool
307307
) -> None:
308-
handler_cls_mock = mocker.patch("neo4j.debug.StreamHandler", autospec=True)
308+
handler_cls_mock = mocker.patch(
309+
"neo4j.debug._StreamHandler", autospec=True
310+
)
309311
handler_mock = handler_cls_mock.return_value
310312
logger_name = "neo4j"
311313
logger_mocker(logger_name)[0]

0 commit comments

Comments
 (0)