From 42c86f8af46b9ad1d360920ef57450ba085fb020 Mon Sep 17 00:00:00 2001 From: Cailean Parker Date: Mon, 7 Aug 2023 17:08:46 -0400 Subject: [PATCH] Add population of `__dict__` variable with `__events__`, if present. --- events/events.py | 8 +++++++- events/tests/tests.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/events/events.py b/events/events.py index 082c0ec..edf128f 100644 --- a/events/events.py +++ b/events/events.py @@ -69,11 +69,11 @@ class Events: xxx.OnChange = event('OnChange') """ + def __init__(self, events=None, event_slot_cls=_EventSlot): self.__event_slot_cls__ = event_slot_cls if events is not None: - try: for _ in events: break @@ -83,6 +83,12 @@ def __init__(self, events=None, event_slot_cls=_EventSlot): else: self.__events__ = events + if hasattr(self, '__events__'): + self.__dict__ = dict( + {name: self.__event_slot_cls__(name) for name in self.__events__}, + **self.__dict__ + ) + def __getattr__(self, name): if name.startswith('__'): raise AttributeError("type object '%s' has no attribute '%s'" % diff --git a/events/tests/tests.py b/events/tests/tests.py index da7f94c..68e0176 100644 --- a/events/tests/tests.py +++ b/events/tests/tests.py @@ -118,6 +118,13 @@ def test_getitem(self): pass else: self.fail("IndexError expected.") + + def test_getitem_bystring(self): + + class MyEvents(Events): + __events__ = ('on_event_one', 'on_event_two') + + ev = self.events.on_edit self.assertIs(ev, self.events["on_edit"]) self.assertIsNot(ev, self.events["on_change"]) try: @@ -126,6 +133,32 @@ def test_getitem(self): pass else: self.fail("KeyError expected.") + my_events = MyEvents() + self.assertIs(my_events.on_event_one, my_events["on_event_one"]) + self.assertIs(my_events.on_event_two, my_events["on_event_two"]) + try: + my_events["on_nonexistent_event"] + except KeyError: + pass + else: + self.fail("KeyError expected.") + events = Events() + try: + events["on_event_one"] + except KeyError: + pass + else: + self.fail("KeyError expected.") + events = Events(("on_event_three", "on_event_four")) + self.assertIs(events.on_event_three, events["on_event_three"]) + self.assertIs(events.on_event_four, events["on_event_four"]) + try: + events["on_event_one"] + except KeyError: + pass + else: + self.fail("KeyError expected.") + def test_isub(self): self.events.on_change -= self.callback1