Skip to content

Commit 1f66375

Browse files
timtreisclaude
andauthored
Include function name in log messages (#536)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent d7dc3f0 commit 1f66375

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

src/spatialdata_plot/_logging.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,27 @@
44
import re
55
from collections.abc import Iterator
66
from contextlib import contextmanager
7+
from contextvars import ContextVar
78
from typing import TYPE_CHECKING
89

910
if TYPE_CHECKING: # pragma: no cover
1011
from _pytest.logging import LogCaptureFixture
1112

13+
# Holds the public-facing function name (e.g. "render_shapes") for log messages.
14+
# Set at the top of each _render_* entry point so that all downstream helpers
15+
# report the user-visible origin rather than internal function names.
16+
_log_context: ContextVar[str] = ContextVar("_log_context", default="")
17+
18+
19+
class _ContextFilter(logging.Filter):
20+
"""Inject the public function name from ``_log_context`` into log records."""
21+
22+
def filter(self, record: logging.LogRecord) -> bool:
23+
ctx = _log_context.get()
24+
if ctx:
25+
record.funcName = ctx
26+
return True
27+
1228

1329
def _setup_logger() -> "logging.Logger":
1430
from rich.console import Console
@@ -20,6 +36,8 @@ def _setup_logger() -> "logging.Logger":
2036
if console.is_jupyter is True:
2137
console.is_jupyter = False
2238
ch = RichHandler(show_path=False, console=console, show_time=False)
39+
ch.setFormatter(logging.Formatter("%(funcName)s: %(message)s"))
40+
ch.addFilter(_ContextFilter())
2341
logger.addHandler(ch)
2442

2543
# this prevents double outputs

src/spatialdata_plot/pl/basic.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from xarray import DataArray, DataTree
2626

2727
from spatialdata_plot._accessor import register_spatial_data_accessor
28-
from spatialdata_plot._logging import logger
28+
from spatialdata_plot._logging import _log_context, logger
2929
from spatialdata_plot.pl.render import (
3030
_render_images,
3131
_render_labels,
@@ -826,6 +826,7 @@ def show(
826826
sd.SpatialData
827827
A SpatialData object.
828828
"""
829+
_log_context.set("show")
829830
# copy the SpatialData object so we don't modify the original
830831
try:
831832
plotting_tree = self._sdata.plotting_tree

src/spatialdata_plot/pl/render.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from spatialdata.transformations.transformations import Identity
2424
from xarray import DataTree
2525

26-
from spatialdata_plot._logging import logger
26+
from spatialdata_plot._logging import _log_context, logger
2727
from spatialdata_plot.pl.render_params import (
2828
Color,
2929
ColorbarSpec,
@@ -121,6 +121,7 @@ def _render_shapes(
121121
legend_params: LegendParams,
122122
colorbar_requests: list[ColorbarSpec] | None = None,
123123
) -> None:
124+
_log_context.set("render_shapes")
124125
element = render_params.element
125126
col_for_color = render_params.col_for_color
126127
groups = render_params.groups
@@ -608,6 +609,7 @@ def _render_points(
608609
legend_params: LegendParams,
609610
colorbar_requests: list[ColorbarSpec] | None = None,
610611
) -> None:
612+
_log_context.set("render_points")
611613
element = render_params.element
612614
col_for_color = render_params.col_for_color
613615
table_name = render_params.table_name
@@ -998,6 +1000,7 @@ def _render_images(
9981000
rasterize: bool,
9991001
colorbar_requests: list[ColorbarSpec] | None = None,
10001002
) -> None:
1003+
_log_context.set("render_images")
10011004
sdata_filt = sdata.filter_by_coordinate_system(
10021005
coordinate_system=coordinate_system,
10031006
filter_tables=False,
@@ -1254,6 +1257,7 @@ def _render_labels(
12541257
rasterize: bool,
12551258
colorbar_requests: list[ColorbarSpec] | None = None,
12561259
) -> None:
1260+
_log_context.set("render_labels")
12571261
element = render_params.element
12581262
table_name = render_params.table_name
12591263
table_layer = render_params.table_layer

0 commit comments

Comments
 (0)