Skip to content

Commit 2d699e4

Browse files
authored
reverse: Bidirectional links between modules create inconsistent behavior
1 parent ccf7e85 commit 2d699e4

4 files changed

Lines changed: 5 additions & 59 deletions

File tree

injection/_core/module.py

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,6 @@ class ModuleEventProxy(ModuleEvent):
118118
def __str__(self) -> str:
119119
return f"`{self.module}` has propagated an event: {self.origin}"
120120

121-
@property
122-
def is_duplicate(self) -> bool:
123-
module, origin = self.module, self.origin
124-
return any(
125-
module is event.module and origin is event.origin
126-
for event in self.proxy_history
127-
)
128-
129121
@property
130122
def origin(self) -> Event:
131123
reversed_proxy_history = reversed(tuple(self.proxy_history))
@@ -170,9 +162,7 @@ def __str__(self) -> str:
170162

171163

172164
@dataclass(frozen=True, slots=True)
173-
class UnlockCalled(Event):
174-
module: Module
175-
165+
class UnlockCalled(ModuleEvent):
176166
def __str__(self) -> str:
177167
return f"`{self.module}.unlock` has been called."
178168

@@ -875,12 +865,8 @@ def remove_listener(self, listener: EventListener) -> Self:
875865
self.__channel.remove_listener(listener)
876866
return self
877867

878-
def on_event(self, event: Event, /) -> ContextManager[None] | None:
868+
def on_event(self, event: Event, /) -> ContextManager[None]:
879869
self_event = ModuleEventProxy(self, event)
880-
881-
if self_event.is_duplicate:
882-
return None
883-
884870
return self.dispatch(self_event)
885871

886872
@contextmanager
@@ -894,17 +880,9 @@ def dispatch(self, event: Event, *, lock_bypass: bool = False) -> Iterator[None]
894880
finally:
895881
self.__debug(event)
896882

897-
def _iter_brokers(self, visited: set[Module] | None = None, /) -> Iterator[Broker]:
898-
if visited is None:
899-
visited = set()
900-
901-
if self in visited:
902-
return
903-
904-
visited.add(self)
905-
883+
def _iter_brokers(self) -> Iterator[Broker]:
906884
for module in self.__modules:
907-
yield from module._iter_brokers(visited)
885+
yield from module._iter_brokers()
908886

909887
yield self.__locator
910888

injection/loaders.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,12 @@ def _unload(self, name: str, /) -> None:
176176

177177
def __init_subsets_for(self, module: Module) -> Module:
178178
if not self.__is_empty and not self.__is_initialized(module):
179-
self.__mark_initialized(module)
180179
target_modules = tuple(
181180
self.__init_subsets_for(mod(name))
182181
for name in self.module_subsets.get(module.name, ())
183182
)
184183
module.init_modules(*target_modules)
184+
self.__mark_initialized(module)
185185

186186
return module
187187

tests/core/test_module.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -292,16 +292,6 @@ def test_use_with_module_already_in_use_raise_module_error(
292292

293293
event_history.assert_length(1)
294294

295-
def test_use_with_bidirectional_use(self, module, event_history):
296-
second_module = Module()
297-
third_module = Module()
298-
299-
module.use(second_module)
300-
second_module.use(module)
301-
module.use(third_module)
302-
303-
event_history.assert_length(4)
304-
305295
"""
306296
stop_using
307297
"""

tests/loaders/test_profile_loader.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -108,28 +108,6 @@ class B(A): ...
108108

109109
assert type(find_instance(A)) is A
110110

111-
def test_load_with_bidirectional_link(self):
112-
profile_name_1 = uuid4().hex
113-
profile_name_2 = uuid4().hex
114-
115-
@mod(profile_name_1).injectable
116-
class BaseConfig: ...
117-
118-
@mod(profile_name_2).injectable
119-
@dataclass
120-
class Dependency:
121-
config: BaseConfig
122-
123-
loader = ProfileLoader(
124-
{
125-
profile_name_1: [profile_name_2],
126-
profile_name_2: [profile_name_1],
127-
}
128-
)
129-
130-
with loader.load(profile_name_1):
131-
assert find_instance(Dependency)
132-
133111
def test_load_with_default_profile_do_nothing(self):
134112
default_profile_name = mod().name
135113
global_profile_name = uuid4().hex

0 commit comments

Comments
 (0)