Skip to content

Commit 6b26885

Browse files
committed
add reset for EventDict
1 parent f80a47e commit 6b26885

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

src/fundus/scraping/crawler.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ def callback() -> None:
404404
break
405405
finally:
406406
session_handler.close_current_session()
407+
__EVENTS__.reset()
407408
if save_to_file is not None:
408409
if isinstance(save_to_file, str):
409410
save_to_file = Path(save_to_file)

src/fundus/utils/events.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import json
12
import threading
23
from collections import defaultdict
34
from typing import Dict, List, Optional, Union
45

5-
from bidict import ON_DUP_DROP_OLD, bidict
6+
from bidict import bidict
67

78
from fundus.logging import create_logger
89

@@ -84,7 +85,8 @@ def __init__(self, default_events: Optional[List[str]] = None):
8485
default_events: A list of event names that are automatically available
8586
for all threads (e.g., ["stop"]).
8687
"""
87-
self._events: Dict[int, ThreadEventDict] = defaultdict(lambda: ThreadEventDict(default_events))
88+
self.default_events = default_events
89+
self._events: Dict[int, ThreadEventDict] = defaultdict(lambda: ThreadEventDict(self.default_events))
8890
self._aliases: bidict[str, int] = bidict()
8991
self._lock = threading.RLock()
9092

@@ -142,7 +144,7 @@ def _alias(self, alias: str, key: Optional[int] = None):
142144
key: The thread identifier to associate with this alias.
143145
If None, the current thread's identifier is used.
144146
"""
145-
self._aliases.put(alias, key if key else self._get_identifier(), ON_DUP_DROP_OLD)
147+
self._aliases[alias] = key if key else self._get_identifier()
146148
if (ident := self._resolve(alias)) not in self._events:
147149
# noinspection PyStatementEffect
148150
# Since defaultdict doesn't provide a direct way to create defaults,
@@ -287,5 +289,19 @@ def get(self, event: str, key: Optional[Union[int, str, None]] = None) -> thread
287289
with self._lock:
288290
return self._events[self._resolve(key)][event]
289291

292+
def reset(self):
293+
with self._lock:
294+
self._events = defaultdict(lambda: ThreadEventDict(self.default_events))
295+
self._aliases = bidict()
296+
297+
def __str__(self):
298+
def _entry(thread: int) -> str:
299+
alias = self._aliases.inv.get(thread, None)
300+
serialized = json.dumps(self._events[thread], indent=2, ensure_ascii=False, default=lambda o: o.set())
301+
return f"{alias if alias else 'None'} --> {thread}: \n" + serialized
302+
303+
events = [_entry(ident) for ident in self._events]
304+
return "\n".join(events) if events else "Empty Event Dictionary"
305+
290306

291307
__EVENTS__: EventDict = EventDict(default_events=__DEFAULT_EVENTS__)

tests/resources/test_events.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import bidict
12
import pytest
23

34
from fundus.utils.events import EventDict
@@ -77,4 +78,9 @@ def test_duplicate(self):
7778

7879
events.alias("main-thread", 1)
7980

80-
events.alias("main-thread", 1)
81+
with pytest.raises(bidict.ValueDuplicationError):
82+
events.alias("new-thread", 1)
83+
84+
events.alias("main-thread", 2)
85+
86+
events.alias("new-thread", 1)

0 commit comments

Comments
 (0)