Compare commits

..

2 Commits

Author SHA1 Message Date
John Lancaster
977e87d7f5 hook tracker 2026-02-22 18:32:37 -06:00
John Lancaster
406024d990 asserting type 2026-02-22 18:28:33 -06:00
2 changed files with 31 additions and 7 deletions

3
.gitignore vendored
View File

@@ -8,3 +8,6 @@ wheels/
# Virtual environments # Virtual environments
.venv .venv
*.ipynb

View File

@@ -1,6 +1,25 @@
from dataclasses import dataclass, field
from hooked_containers import events as e
from hooked_containers.mapping import HookedMapping from hooked_containers.mapping import HookedMapping
@dataclass
class HookTracker:
added: list[e.AddItemEvent] = field(default_factory=list)
set: list[e.SetItemEvent] = field(default_factory=list)
removed: list[e.RemoveItemEvent] = field(default_factory=list)
def hook(self, event: e.ChangeEvent):
match event:
case e.AddItemEvent():
self.added.append(event.item)
case e.SetItemEvent():
self.set.append(event.item)
case e.RemoveItemEvent():
self.removed.append(event.item)
class TestHookedMapping: class TestHookedMapping:
class TestConstruction: class TestConstruction:
def test_empty(self): def test_empty(self):
@@ -24,24 +43,26 @@ class TestHookedMapping:
class TestMappingOps: class TestMappingOps:
def test_setitem(self): def test_setitem(self):
added = [] tracker = HookTracker()
m = HookedMapping({}, lambda e: added.append(e.item)) m = HookedMapping({}, tracker.hook)
m["a"] = 1 m["a"] = 1
assert m._data == {"a": 1} assert m._data == {"a": 1}
assert added == [1] assert tracker.added == [1]
def test_nested_setitem(self): def test_nested_setitem(self):
added = [] tracker = HookTracker()
m = HookedMapping({"a": {}}, lambda e: added.append(e.item)) m = HookedMapping({"a": {}}, tracker.hook)
m["a"]["x"] = 1 m["a"]["x"] = 1
assert m._data == {"a": {"x": 1}} assert m._data == {"a": {"x": 1}}
assert added == [1] assert tracker.added == [1]
def test_getitem(self): def test_getitem(self):
m = HookedMapping({"a": 1}) m = HookedMapping({"a": 1})
assert m["a"] == 1 assert m["a"] == 1
def test_delitem(self): def test_delitem(self):
m = HookedMapping({"a": 1}) tracker = HookTracker()
m = HookedMapping({"a": 1}, tracker.hook)
del m["a"] del m["a"]
assert not m["a"] assert not m["a"]
assert tracker.removed == [1]