From fa6578205904260cd86798c58c8bc318da23fdee Mon Sep 17 00:00:00 2001 From: Paul de Raaij Date: Wed, 29 Jul 2026 10:44:12 -0400 Subject: [PATCH] refactor: rename apply_event to apply --- .vscode/settings.json | 7 +++++++ domain/framework/entity.py | 6 ++++-- domain/marketplace/classified_ad.py | 8 ++++---- tests/test_classified_ad.py | 4 ++-- tests/test_entity.py | 18 +++++++++--------- 5 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3791782 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python", + "python.testing.pytestEnabled": true, + "python.testing.pytestPath": "${workspaceFolder}/.venv/bin/pytest", + "python.testing.pytestArgs": ["tests"], + "python.testing.unittestEnabled": false +} \ No newline at end of file diff --git a/domain/framework/entity.py b/domain/framework/entity.py index 9dc8850..18977c7 100644 --- a/domain/framework/entity.py +++ b/domain/framework/entity.py @@ -8,8 +8,10 @@ from domain.marketplace.domain_event import DomainEvent class Entity(ABC): _changes: tuple[DomainEvent, ...] = () - def apply_event(self, event: DomainEvent) -> Self: - return replace(self, _changes=(*self._changes, event)) + def apply(self, event: DomainEvent) -> Self: + result = self.when(event) + result._ensure_valid_state() + return replace(result, _changes=(*result._changes, event)) def get_changes(self) -> tuple[DomainEvent, ...]: return self._changes diff --git a/domain/marketplace/classified_ad.py b/domain/marketplace/classified_ad.py index cfe77e8..1e817d5 100644 --- a/domain/marketplace/classified_ad.py +++ b/domain/marketplace/classified_ad.py @@ -57,27 +57,27 @@ class ClassifiedAd(Entity): self._ensure_valid_state() updated = replace(self, state=ClassifiedAdState.PendingReview) - return updated.apply_event( + return updated.apply( ClassifiedAdSentForReview(id=self.id.value) ) def set_title(self, title: ClassifiedAdTitle) -> ClassifiedAd: updated = replace(self, title=title) updated._ensure_valid_state() - return updated.apply_event( + return updated.apply( ClassifiedAdTitleChanged(id=self.id.value, title=title.title) ) def update_text(self, text: ClassifiedAdText) -> ClassifiedAd: updated = replace(self, text=text) updated._ensure_valid_state() - return updated.apply_event( + return updated.apply( ClassifiedAdTextUpdated(id=self.id.value, ad_text=text.text) ) def update_price(self, price: Price) -> ClassifiedAd: updated = replace(self, price=price) updated._ensure_valid_state() - return updated.apply_event( + return updated.apply( ClassifiedAdPriceUpdated(id=self.id.value, price=price.amount) ) diff --git a/tests/test_classified_ad.py b/tests/test_classified_ad.py index f64bff6..0fdd2d9 100644 --- a/tests/test_classified_ad.py +++ b/tests/test_classified_ad.py @@ -248,7 +248,7 @@ def test_classified_ad_is_instance_of_entity(): assert isinstance(ad, Entity) -def test_classified_ad_can_use_entity_apply_event(): +def test_classified_ad_can_use_entity_apply(): ad = ClassifiedAd( id=ClassifiedAdId(value=uuid4()), _ownerId=UserId(value=uuid4()), @@ -258,7 +258,7 @@ def test_classified_ad_can_use_entity_apply_event(): ) event = ClassifiedAdSentForReview(id=ad.id.value) - updated_ad = ad.apply_event(event) + updated_ad = ad.apply(event) assert updated_ad.get_changes() == (ad.get_changes()[0], event) assert len(ad.get_changes()) == 1 diff --git a/tests/test_entity.py b/tests/test_entity.py index 8506b8c..54572f1 100644 --- a/tests/test_entity.py +++ b/tests/test_entity.py @@ -20,20 +20,20 @@ def test_entity_creation(): assert entity.get_changes() == () -def test_apply_event_returns_new_instance_with_event(): +def test_apply_returns_new_instance_with_event(): entity = TestEntity() event = ClassifiedAdCreated(id=uuid4(), owner_id=uuid4()) - new_entity = entity.apply_event(event) + new_entity = entity.apply(event) assert new_entity.get_changes() == (event,) -def test_apply_event_does_not_mutate_original(): +def test_apply_does_not_mutate_original(): entity = TestEntity() event = ClassifiedAdCreated(id=uuid4(), owner_id=uuid4()) - entity.apply_event(event) + entity.apply(event) assert entity.get_changes() == () @@ -43,8 +43,8 @@ def test_multiple_events_accumulate(): event1 = ClassifiedAdCreated(id=uuid4(), owner_id=uuid4()) event2 = ClassifiedAdSentForReview(id=uuid4()) - entity = entity.apply_event(event1) - entity = entity.apply_event(event2) + entity = entity.apply(event1) + entity = entity.apply(event2) assert entity.get_changes() == (event1, event2) @@ -52,7 +52,7 @@ def test_multiple_events_accumulate(): def test_clear_changes_returns_instance_with_empty_events(): entity = TestEntity() event = ClassifiedAdCreated(id=uuid4(), owner_id=uuid4()) - entity = entity.apply_event(event) + entity = entity.apply(event) cleared = entity.clear_changes() @@ -62,7 +62,7 @@ def test_clear_changes_returns_instance_with_empty_events(): def test_clear_changes_does_not_mutate_original(): entity = TestEntity() event = ClassifiedAdCreated(id=uuid4(), owner_id=uuid4()) - entity = entity.apply_event(event) + entity = entity.apply(event) entity.clear_changes() @@ -72,7 +72,7 @@ def test_clear_changes_does_not_mutate_original(): def test_get_changes_returns_tuple(): entity = TestEntity() event = ClassifiedAdCreated(id=uuid4(), owner_id=uuid4()) - entity = entity.apply_event(event) + entity = entity.apply(event) changes = entity.get_changes()