Skip to content

Commit 4524fb7

Browse files
committed
1.6.2 HOTFIX for improper logs
1 parent 6f0539b commit 4524fb7

17 files changed

Lines changed: 534 additions & 106 deletions

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## [1.6.2] - 2026-08-18 HOTFIX
4+
5+
### Fixed
6+
7+
* logs not displaying calls properly
8+
* =filter matched the wrong argument after 1.6.1
9+
* _recently_emitted emitted twice
10+
311
## [1.6.1] - 2026-08-18
412

513
### Fixed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
![PyPI](https://img.shields.io/pypi/v/logeye?cachebust=1787031765)
1+
![PyPI](https://img.shields.io/pypi/v/logeye?cachebust=1787034819)
22
![Python](https://img.shields.io/pypi/pyversions/logeye)
33
![License](https://img.shields.io/github/license/MattFor/LogEye)
44

@@ -952,5 +952,5 @@ MIT License © 2026
952952

953953
See [LICENSE](LICENSE) for details.
954954

955-
Version 1.6.1
955+
Version 1.6.2
956956

demos/demo_txt/func.log

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
[0.014s] demo_file_and_filter.py:35 (call) add args=(2, 3)
2-
[0.014s] demo_file_and_filter.py:29 (set) add.a = 2
3-
[0.014s] demo_file_and_filter.py:29 (set) add.b = 3
4-
[0.014s] demo_file_and_filter.py:31 (set) add.total = 5
5-
[0.014s] demo_file_and_filter.py:32 (return) add args=(2, 3) -> 5
1+
[0.011s] demo_file_and_filter.py:35 (call) add args=(2, 3)
2+
[0.011s] demo_file_and_filter.py:29 (set) add.a = 2
3+
[0.011s] demo_file_and_filter.py:29 (set) add.b = 3
4+
[0.011s] demo_file_and_filter.py:31 (set) add.total = 5
5+
[0.011s] demo_file_and_filter.py:32 (return) add args=(2, 3) -> 5

demos/demo_txt/global.log

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,31 @@
1-
[0.004s] demo_file_and_filter.py:17 (set) x = 10
2-
[0.005s] demo_file_and_filter.py:18 (set) y = 20
3-
[0.010s] demo_file_and_filter.py:19 sum is 30
4-
[0.016s] demo_file_and_filter.py:50 (set) y = 50
5-
[0.017s] demo_file_and_filter.py:62 (set) foo.x = 10
6-
[0.017s] demo_file_and_filter.py:75 (set) dijkstra.distances = {'A': inf, 'B': inf, 'C': inf, 'D': inf}
7-
[0.017s] demo_file_and_filter.py:76 (change) dijkstra.distances.A = 0
8-
[0.017s] demo_file_and_filter.py:78 (set) dijkstra.queue = [(0, 'A')]
9-
[0.017s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (0, 'A') | []
10-
[0.017s] demo_file_and_filter.py:87 (change) dijkstra.distances.B = 1
11-
[0.017s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((1, 'B')) -> [(1, 'B')]
12-
[0.017s] demo_file_and_filter.py:87 (change) dijkstra.distances.C = 4
13-
[0.018s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((4, 'C')) -> [(1, 'B'), (4, 'C')]
14-
[0.018s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(1, 'B'), (4, 'C')]
15-
[0.018s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (1, 'B') | [(4, 'C')]
16-
[0.018s] demo_file_and_filter.py:87 (change) dijkstra.distances.C = 3
17-
[0.018s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((3, 'C')) -> [(4, 'C'), (3, 'C')]
18-
[0.018s] demo_file_and_filter.py:87 (change) dijkstra.distances.D = 6
19-
[0.018s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((6, 'D')) -> [(4, 'C'), (3, 'C'), (6, 'D')]
20-
[0.018s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(3, 'C'), (4, 'C'), (6, 'D')]
21-
[0.018s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (3, 'C') | [(4, 'C'), (6, 'D')]
22-
[0.018s] demo_file_and_filter.py:87 (change) dijkstra.distances.D = 4
23-
[0.018s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((4, 'D')) -> [(4, 'C'), (6, 'D'), (4, 'D')]
24-
[0.018s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(4, 'C'), (4, 'D'), (6, 'D')]
25-
[0.018s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (4, 'C') | [(4, 'D'), (6, 'D')]
26-
[0.019s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(4, 'D'), (6, 'D')]
27-
[0.019s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (4, 'D') | [(6, 'D')]
28-
[0.019s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(6, 'D')]
29-
[0.019s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (6, 'D') | []
30-
[0.019s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> []
31-
[0.019s] demo_file_and_filter.py:105 (change) process.queue.append(1) -> [1]
32-
[0.019s] demo_file_and_filter.py:106 (change) process.queue.append(2) -> [1, 2]
33-
[0.019s] demo_file_and_filter.py:107 (change) process.queue.pop(0) -> 1 | [2]
34-
[0.019s] demo_file_and_filter.py:117 (set) compute.x = 5
1+
[0.003s] demo_file_and_filter.py:17 (set) x = 10
2+
[0.003s] demo_file_and_filter.py:18 (set) y = 20
3+
[0.008s] demo_file_and_filter.py:19 sum is 30
4+
[0.013s] demo_file_and_filter.py:50 (set) y = 50
5+
[0.013s] demo_file_and_filter.py:62 (set) foo.x = 10
6+
[0.014s] demo_file_and_filter.py:75 (set) dijkstra.distances = {'A': inf, 'B': inf, 'C': inf, 'D': inf}
7+
[0.014s] demo_file_and_filter.py:76 (change) dijkstra.distances.A = 0
8+
[0.014s] demo_file_and_filter.py:78 (set) dijkstra.queue = [(0, 'A')]
9+
[0.014s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (0, 'A') | []
10+
[0.014s] demo_file_and_filter.py:87 (change) dijkstra.distances.B = 1
11+
[0.014s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((1, 'B')) -> [(1, 'B')]
12+
[0.014s] demo_file_and_filter.py:87 (change) dijkstra.distances.C = 4
13+
[0.014s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((4, 'C')) -> [(1, 'B'), (4, 'C')]
14+
[0.014s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(1, 'B'), (4, 'C')]
15+
[0.015s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (1, 'B') | [(4, 'C')]
16+
[0.015s] demo_file_and_filter.py:87 (change) dijkstra.distances.C = 3
17+
[0.015s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((3, 'C')) -> [(4, 'C'), (3, 'C')]
18+
[0.015s] demo_file_and_filter.py:87 (change) dijkstra.distances.D = 6
19+
[0.015s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((6, 'D')) -> [(4, 'C'), (3, 'C'), (6, 'D')]
20+
[0.015s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(3, 'C'), (4, 'C'), (6, 'D')]
21+
[0.015s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (3, 'C') | [(4, 'C'), (6, 'D')]
22+
[0.015s] demo_file_and_filter.py:87 (change) dijkstra.distances.D = 4
23+
[0.015s] demo_file_and_filter.py:88 (change) dijkstra.queue.append((4, 'D')) -> [(4, 'C'), (6, 'D'), (4, 'D')]
24+
[0.015s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(4, 'C'), (4, 'D'), (6, 'D')]
25+
[0.015s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (4, 'C') | [(4, 'D'), (6, 'D')]
26+
[0.016s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(4, 'D'), (6, 'D')]
27+
[0.016s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (4, 'D') | [(6, 'D')]
28+
[0.016s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> [(6, 'D')]
29+
[0.016s] demo_file_and_filter.py:81 (change) dijkstra.queue.pop(0) -> (6, 'D') | []
30+
[0.016s] demo_file_and_filter.py:90 (change) dijkstra.queue.sort() -> []
31+
[0.017s] demo_file_and_filter.py:117 (set) compute.x = 5

demos/demo_txt/queue.log

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
[0.019s] demo_file_and_filter.py:104 (set) process.queue = []
1+
[0.016s] demo_file_and_filter.py:104 (set) process.queue = []
2+
[0.016s] demo_file_and_filter.py:105 (change) process.queue.append(1) -> [1]
3+
[0.016s] demo_file_and_filter.py:106 (change) process.queue.append(2) -> [1, 2]
4+
[0.016s] demo_file_and_filter.py:107 (change) process.queue.pop(0) -> 1 | [2]

demos/demo_txt/special.log

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
[0.016s] demo_file_and_filter.py:54 (call) special
2-
[0.016s] demo_file_and_filter.py:45 (set) special.x = 100
3-
[0.016s] demo_file_and_filter.py:46 (return) special -> 100
1+
[0.013s] demo_file_and_filter.py:54 (call) special
2+
[0.013s] demo_file_and_filter.py:45 (set) special.x = 100
3+
[0.013s] demo_file_and_filter.py:46 (return) special -> 100

logeye/config.py

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import time
33
import threading
44

5-
from typing import Literal, TypeAlias
5+
from typing import Callable, Literal, TypeAlias
66

77
PathMode: TypeAlias = Literal["absolute", "project", "file"]
88

@@ -47,11 +47,24 @@ class _ThreadState(threading.local):
4747
show_file: bool | None = None
4848
show_lineno: bool | None = None
4949

50+
# Destination for everything logged while this call is on the stack
51+
filepath: str | None = None
52+
53+
# level= / filter= of the enclosing @log, asked before change tracking emits
54+
emit_gate: "Callable[[str, str], bool] | None" = None
55+
5056

5157
_tls: _ThreadState = _ThreadState()
5258

5359
# What _push_display saves and _pop_display restores
54-
DisplayState: TypeAlias = tuple[Mode | None, bool | None, bool | None, bool | None]
60+
DisplayState: TypeAlias = tuple[
61+
Mode | None,
62+
bool | None,
63+
bool | None,
64+
bool | None,
65+
str | None,
66+
"Callable[[str, str], bool] | None",
67+
]
5568

5669

5770
def _mode() -> Mode:
@@ -74,31 +87,85 @@ def _show_lineno() -> bool:
7487
return _g_show_lineno if override is None else override
7588

7689

90+
EmitContext: TypeAlias = tuple[
91+
bool, bool, bool, str | None, "Callable[[str, str], bool] | None"
92+
]
93+
94+
95+
def _emit_context(
96+
show_time: bool | None,
97+
show_file: bool | None,
98+
show_lineno: bool | None,
99+
filepath: str | None,
100+
) -> EmitContext:
101+
"""Fill in whatever the caller left open from the call on the stack"""
102+
103+
state = _tls
104+
105+
if show_time is None:
106+
show_time = _g_show_time if state.show_time is None else state.show_time
107+
108+
if show_file is None:
109+
show_file = _g_show_file if state.show_file is None else state.show_file
110+
111+
if show_lineno is None:
112+
show_lineno = _g_show_lineno if state.show_lineno is None else state.show_lineno
113+
114+
if filepath is None:
115+
filepath = state.filepath
116+
117+
return show_time, show_file, show_lineno, filepath, state.emit_gate
118+
119+
77120
def _push_display(
78121
mode: Mode | None = None,
79122
show_time: bool | None = None,
80123
show_file: bool | None = None,
81124
show_lineno: bool | None = None,
125+
filepath: str | None = None,
126+
emit_gate: "Callable[[str, str], bool] | None" = None,
82127
) -> DisplayState:
83-
"""Install per-call display overrides; pair with _pop_display in a finally"""
128+
"""Install per-call overrides; pair with _pop_display in a finally"""
84129

85130
previous: DisplayState = (
86131
_tls.mode,
87132
_tls.show_time,
88133
_tls.show_file,
89134
_tls.show_lineno,
135+
_tls.filepath,
136+
_tls.emit_gate,
90137
)
91138

92139
_tls.mode = mode
93140
_tls.show_time = show_time
94141
_tls.show_file = show_file
95142
_tls.show_lineno = show_lineno
143+
_tls.filepath = filepath
144+
_tls.emit_gate = emit_gate
96145

97146
return previous
98147

99148

149+
def _reset_display() -> None:
150+
"""Forget every per-call override, whatever the state is made of"""
151+
152+
_tls.mode = None
153+
_tls.show_time = None
154+
_tls.show_file = None
155+
_tls.show_lineno = None
156+
_tls.filepath = None
157+
_tls.emit_gate = None
158+
159+
100160
def _pop_display(previous: DisplayState) -> None:
101-
_tls.mode, _tls.show_time, _tls.show_file, _tls.show_lineno = previous
161+
(
162+
_tls.mode,
163+
_tls.show_time,
164+
_tls.show_file,
165+
_tls.show_lineno,
166+
_tls.filepath,
167+
_tls.emit_gate,
168+
) = previous
102169

103170

104171
# =========
@@ -189,7 +256,9 @@ def _normalize_mode(mode: Mode) -> Mode:
189256
"_show_time",
190257
"_show_file",
191258
"_show_lineno",
259+
"_emit_context",
192260
"_push_display",
193261
"_pop_display",
262+
"_reset_display",
194263
"_normalize_mode",
195264
]

0 commit comments

Comments
 (0)