Skip to content

Commit d022c86

Browse files
committed
Merge branch 'feature/on-changed-dict-fixes' into feature/2pv572-support
2 parents 523ac00 + 9544f10 commit d022c86

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

deebot_client/util/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,12 @@ def __init__(
8989
super().__init__(iterable)
9090
self._on_change = on_change
9191

92+
# This is needed as __getattribute__ won't be invoked for implicit special method lookup
9293
def __setitem__(self, key: _KT, value: _VT) -> None:
9394
self._on_change()
9495
super().__setitem__(key, value)
9596

97+
# This is needed as __getattribute__ won't be invoked for implicit special method lookup
9698
def __delitem__(self, key: _KT) -> None:
9799
self._on_change()
98100
return super().__delitem__(key)

tests/util/test_init.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import asyncio
44
from typing import Any
55

6-
from deebot_client.util import cancel, create_task
6+
from deebot_client.util import OnChangedDict, cancel, create_task
77

88

99
async def test_create_task_and_cancel() -> None:
@@ -35,3 +35,43 @@ async def sleep(delay: float) -> None:
3535
for task in _tasks:
3636
assert task.cancelled()
3737
assert task.done()
38+
39+
40+
def test_on_changed_dict() -> None:
41+
class OnChangedListener:
42+
def __init__(self) -> None:
43+
self.__counter = 0
44+
45+
def on_changed_dict(self) -> None:
46+
self.__counter += 1
47+
48+
def counter(self) -> int:
49+
return self.__counter
50+
51+
listener = OnChangedListener()
52+
53+
sut: OnChangedDict[str, int] = OnChangedDict(listener.on_changed_dict)
54+
55+
sut["test"] = 1001 # Should be triggered by __setitem__
56+
57+
assert sut["test"] == 1001
58+
59+
sut.update(
60+
{"test": 1002, "test2": 2001, "test3": 3001, "test4": 4001}
61+
) # Should trigger update()
62+
63+
assert sut["test"] == 1002
64+
65+
del sut["test"] # Should trigger __delitem__
66+
67+
assert "test" not in sut
68+
69+
assert sut.pop("test2") == 2001 # Should trigger pop()
70+
71+
(popped_key, popped_value) = sut.popitem() # Should trigger popitem()
72+
assert popped_key == "test4"
73+
assert popped_value == 4001
74+
75+
sut.clear() # Should trigger clear
76+
77+
assert listener.counter() == 6

0 commit comments

Comments
 (0)