Skip to content

Commit dd05212

Browse files
author
Sergio García Prado
authored
Merge pull request #463 from minos-framework/0.8.0
0.8.0.dev2
2 parents a98f917 + 2843039 commit dd05212

File tree

108 files changed

+3273
-1368
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+3273
-1368
lines changed

.github/workflows/minos-database-aiopg-tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ on:
1111
- 'packages/core/minos-microservice-aggregate/**'
1212
- 'packages/core/minos-microservice-networks/**'
1313
- 'packages/core/minos-microservice-transactions/**'
14+
- 'packages/core/minos-microservice-saga/**'
1415
- 'packages/core/minos-microservice-common/**'
1516

1617
jobs:

.github/workflows/minos-microservice-aggregate-tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ on:
1010
- 'packages/core/minos-microservice-aggregate/**'
1111
- 'packages/core/minos-microservice-networks/**'
1212
- 'packages/core/minos-microservice-transactions/**'
13+
- 'packages/core/minos-microservice-saga/**'
1314
- 'packages/core/minos-microservice-common/**'
1415

1516
jobs:

docs/index.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@ Minos is a framework which helps you create [reactive](https://www.reactivemanif
2929
minos.cqrs
3030
minos.networks
3131
minos.saga
32+
minos.transactions
3233
minos.plugins.kafka
3334
minos.plugins.rabbitmq
3435
minos.plugins.minos_discovery
36+
minos.plugins.aiopg
37+
minos.plugins.lmdb
3538
minos.plugins.kong
3639
minos.plugins.aiohttp
3740
minos.plugins.graphql

packages/core/minos-microservice-aggregate/minos/aggregate/deltas/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ def simplified_name(self) -> str:
6363
return self.name.rsplit(".", 1)[-1]
6464

6565
def __lt__(self, other: Any) -> bool:
66-
return isinstance(other, type(self)) and self.version < other.version
66+
return isinstance(other, type(self)) and (
67+
(self.uuid == other.uuid and self.version < other.version) or (self.created_at < other.created_at)
68+
)
6769

6870
def __getitem__(self, item: str) -> Any:
6971
try:

packages/core/minos-microservice-aggregate/minos/aggregate/impl.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
BrokerMessageV1Payload,
2525
BrokerPublisher,
2626
)
27+
from minos.saga import (
28+
SagaManager,
29+
)
2730
from minos.transactions import (
2831
TransactionRepository,
2932
)
@@ -56,6 +59,7 @@ class Aggregate(Generic[RT], SetupMixin):
5659
snapshot_repository: SnapshotRepository
5760
repository: EntityRepository
5861
broker_publisher: BrokerPublisher
62+
saga_manager: SagaManager
5963

6064
@Inject()
6165
def __init__(
@@ -64,6 +68,7 @@ def __init__(
6468
delta_repository: DeltaRepository,
6569
snapshot_repository: SnapshotRepository,
6670
broker_publisher: BrokerPublisher,
71+
saga_manager: SagaManager,
6772
*args,
6873
**kwargs,
6974
):
@@ -75,6 +80,8 @@ def __init__(
7580
raise NotProvidedException(f"A {SnapshotRepository!r} object must be provided.")
7681
if broker_publisher is None:
7782
raise NotProvidedException(f"A {BrokerPublisher!r} object must be provided.")
83+
if saga_manager is None:
84+
raise NotProvidedException(f"A {SagaManager!r} object must be provided.")
7885

7986
super().__init__(*args, **kwargs)
8087

@@ -86,6 +93,7 @@ def __init__(
8693
self.delta_repository = delta_repository
8794
self.snapshot_repository = snapshot_repository
8895
self.broker_publisher = broker_publisher
96+
self.saga_manager = saga_manager
8997

9098
@classmethod
9199
def _from_config(cls, config: Config, **kwargs) -> Aggregate:

packages/core/minos-microservice-aggregate/minos/aggregate/queries.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ def _evaluate(self, value: Model) -> bool:
146146
return self._get_field(value) in self.parameter
147147

148148

149+
class _ContainsCondition(_SimpleCondition):
150+
def _evaluate(self, value: Model) -> bool:
151+
return self.parameter in self._get_field(value)
152+
153+
149154
class _LikeCondition(_SimpleCondition):
150155
def _evaluate(self, value: Model) -> bool:
151156
return bool(self._pattern.fullmatch(self._get_field(value)))
@@ -205,6 +210,7 @@ class Condition:
205210
EQUAL = _EqualCondition
206211
NOT_EQUAL = _NotEqualCondition
207212
IN = _InCondition
213+
CONTAINS = _ContainsCondition
208214
LIKE = _LikeCondition
209215

210216

packages/core/minos-microservice-aggregate/minos/aggregate/testing/snapshots/repositories/testcases.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ class SnapshotRepositoryTestCase(MinosTestCase, ABC):
5252

5353
snapshot_repository: SnapshotRepository
5454

55+
class NumbersList(Entity):
56+
"""For testing purposes"""
57+
58+
numbers: list[int]
59+
60+
class Number(Entity):
61+
"""For testing purposes"""
62+
63+
value: int
64+
5565
class Owner(Entity):
5666
"""For testing purposes"""
5767

@@ -380,6 +390,52 @@ async def test_find_by_uuid(self):
380390
]
381391
self.assertEqual(expected, observed)
382392

393+
async def test_find_contains(self):
394+
a = FieldDiffContainer([FieldDiff("numbers", list[int], [1, 2, 3])])
395+
b = FieldDiffContainer([FieldDiff("numbers", list[int], [4, 5, 6])])
396+
c = FieldDiffContainer([FieldDiff("numbers", list[int], [3, 8, 9])])
397+
await self.delta_repository.create(
398+
DeltaEntry(name=self.NumbersList.classname, data=a.avro_bytes, uuid=self.uuid_1)
399+
)
400+
await self.delta_repository.create(
401+
DeltaEntry(name=self.NumbersList.classname, data=b.avro_bytes, uuid=self.uuid_2)
402+
)
403+
await self.delta_repository.create(
404+
DeltaEntry(name=self.NumbersList.classname, data=c.avro_bytes, uuid=self.uuid_3)
405+
)
406+
await self.synchronize()
407+
408+
condition = Condition.CONTAINS("numbers", 3)
409+
410+
iterable = self.snapshot_repository.find(self.NumbersList, condition, ordering=Ordering.ASC("updated_at"))
411+
observed = [v async for v in iterable]
412+
413+
expected = [
414+
await self.snapshot_repository.get(self.NumbersList, self.uuid_1),
415+
await self.snapshot_repository.get(self.NumbersList, self.uuid_3),
416+
]
417+
self.assertEqual(expected, observed)
418+
419+
async def test_find_equal(self):
420+
a = FieldDiffContainer([FieldDiff("value", int, 1)])
421+
b = FieldDiffContainer([FieldDiff("value", int, 2)])
422+
c = FieldDiffContainer([FieldDiff("value", int, 1)])
423+
await self.delta_repository.create(DeltaEntry(name=self.Number.classname, data=a.avro_bytes, uuid=self.uuid_1))
424+
await self.delta_repository.create(DeltaEntry(name=self.Number.classname, data=b.avro_bytes, uuid=self.uuid_2))
425+
await self.delta_repository.create(DeltaEntry(name=self.Number.classname, data=c.avro_bytes, uuid=self.uuid_3))
426+
await self.synchronize()
427+
428+
condition = Condition.EQUAL("value", 1)
429+
430+
iterable = self.snapshot_repository.find(self.Number, condition, ordering=Ordering.ASC("updated_at"))
431+
observed = [v async for v in iterable]
432+
433+
expected = [
434+
await self.snapshot_repository.get(self.Number, self.uuid_1),
435+
await self.snapshot_repository.get(self.Number, self.uuid_3),
436+
]
437+
self.assertEqual(expected, observed)
438+
383439
async def test_find_with_transaction(self):
384440
await self.populate_and_synchronize()
385441
condition = Condition.IN("uuid", [self.uuid_2, self.uuid_3])

0 commit comments

Comments
 (0)