Skip to content

Commit 612c693

Browse files
committed
Refactor ValueProvider.require()
1 parent cc67016 commit 612c693

2 files changed

Lines changed: 12 additions & 10 deletions

File tree

ascetic_ddd/faker/domain/aop/providers/structure_provider.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,7 @@ def reset(self, visited: set[int] | None = None) -> None:
7979
self._criteria = None
8080

8181
def is_complete(self) -> bool:
82-
return (
83-
self._output.is_some() or
84-
all(provider.is_complete() for provider in self._providers.values())
85-
)
82+
return self._output.is_some()
8683

8784
def is_transient(self) -> bool:
8885
return any(provider.is_transient() for provider in self._providers.values())

ascetic_ddd/faker/domain/providers/_mixins.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
IQueryOperator, CompositeQuery, MergeConflict
1616
)
1717
from ascetic_ddd.faker.domain.query.parser import parse_query
18+
from ascetic_ddd.faker.domain.query.evaluate_visitor import EvaluateWalker
1819
from ascetic_ddd.faker.domain.query.visitors import query_to_dict
1920
from ascetic_ddd.faker.domain.providers.exceptions import DiamondUpdateConflict
2021
from ascetic_ddd.faker.domain.specification.empty_specification import EmptySpecification
@@ -168,8 +169,15 @@ def require(self, criteria: dict[str, typing.Any]) -> None:
168169
self._criteria = new_criteria
169170
# Only reset output if input actually changed
170171
if self._criteria != old_criteria:
171-
self._input = Nothing()
172-
self._output = Nothing()
172+
if self._output.is_some():
173+
if not self.is_transient():
174+
state = self.state()
175+
walker = EvaluateWalker()
176+
if not walker.evaluate_sync(new_criteria, state):
177+
raise DiamondUpdateConflict(state, query_to_dict(new_criteria), self.provider_name)
178+
else:
179+
self._input = Nothing()
180+
self._output = Nothing()
173181
self._on_required.notify(CriteriaRequiredEvent(new_criteria))
174182

175183
def output(self) -> OutputT:
@@ -373,10 +381,7 @@ async def _set_output(self, session: ISession, output: CompositeOutputT | None,
373381
await self._on_populated.notify(OutputPopulatedEvent(session, output, self.is_transient(), is_distributed))
374382

375383
def is_complete(self) -> bool:
376-
return (
377-
self._output.is_some() or
378-
all(provider.is_complete() for provider in self.providers.values())
379-
)
384+
return self._output.is_some()
380385

381386
def is_transient(self) -> bool:
382387
return any(provider.is_transient() for provider in self.providers.values())

0 commit comments

Comments
 (0)