Skip to content

Commit 6c34157

Browse files
committed
Remove abstraction level MergeByIdentity and make it root instead
Signed-off-by: Mathias L. Baumann <[email protected]>
1 parent 7d43537 commit 6c34157

File tree

6 files changed

+15
-27
lines changed

6 files changed

+15
-27
lines changed

src/frequenz/dispatch/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ._dispatch import Dispatch
2121
from ._dispatcher import Dispatcher
2222
from ._event import Created, Deleted, DispatchEvent, Updated
23-
from ._merge_strategies import MergeByIdentity, MergeByType, MergeByTypeTarget
23+
from ._merge_strategies import MergeByType, MergeByTypeTarget
2424

2525
__all__ = [
2626
"Created",
@@ -32,7 +32,6 @@
3232
"ActorDispatcher",
3333
"DispatchInfo",
3434
"MergeStrategy",
35-
"MergeByIdentity",
3635
"MergeByType",
3736
"MergeByTypeTarget",
3837
]

src/frequenz/dispatch/_bg_service.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
class MergeStrategy(ABC):
3232
"""Base class for strategies to merge running intervals."""
3333

34+
@abstractmethod
35+
def identity(self, dispatch: Dispatch) -> int:
36+
"""Identity function for the merge criteria."""
37+
3438
@abstractmethod
3539
def filter(self, dispatches: Mapping[int, Dispatch], dispatch: Dispatch) -> bool:
3640
"""Filter dispatches based on the strategy.
@@ -154,12 +158,9 @@ async def new_running_state_event_receiver(
154158
dispatches of the same type and target
155159
* `None` — no merging, just send all events
156160
157-
You can make your own strategy by subclassing:
158-
159-
* [`MergeByIdentity`][frequenz.dispatch.MergeByIdentity] — Merges
160-
dispatches based on a user defined identity function
161-
* [`MergeStrategy`][frequenz.dispatch.MergeStrategy] — Merges based
162-
on a user defined filter function
161+
You can make your own identity-based strategy by subclassing `MergeByType` and overriding
162+
the `identity()` method. If you require a more complex strategy, you can subclass
163+
`MergeStrategy` directly and implement both the `identity()` and `filter()` methods.
163164
164165
Running intervals from multiple dispatches will be merged, according to
165166
the chosen strategy.

src/frequenz/dispatch/_dispatcher.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
from ._bg_service import DispatchScheduler, MergeStrategy
2020
from ._dispatch import Dispatch
2121
from ._event import DispatchEvent
22-
from ._merge_strategies import MergeByIdentity
2322

2423
_logger = logging.getLogger(__name__)
2524

@@ -227,7 +226,7 @@ async def start_dispatching(
227226
dispatch_type: str,
228227
*,
229228
actor_factory: Callable[[DispatchInfo, Receiver[DispatchInfo]], Actor],
230-
merge_strategy: MergeByIdentity | None = None,
229+
merge_strategy: MergeStrategy | None = None,
231230
) -> None:
232231
"""Manage actors for a given dispatch type.
233232

src/frequenz/dispatch/_merge_strategies.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
"""Different merge strategies for dispatch running state events."""
55

66
import logging
7-
from abc import abstractmethod
87
from collections.abc import Mapping
98

109
from typing_extensions import override
@@ -13,12 +12,13 @@
1312
from ._dispatch import Dispatch
1413

1514

16-
class MergeByIdentity(MergeStrategy):
17-
"""Merge running intervals based on a dispatch configuration."""
15+
class MergeByType(MergeStrategy):
16+
"""Merge running intervals based on the dispatch type."""
1817

19-
@abstractmethod
18+
@override
2019
def identity(self, dispatch: Dispatch) -> int:
2120
"""Identity function for the merge criteria."""
21+
return hash(dispatch.type)
2222

2323
@override
2424
def filter(self, dispatches: Mapping[int, Dispatch], dispatch: Dispatch) -> bool:
@@ -49,15 +49,6 @@ def filter(self, dispatches: Mapping[int, Dispatch], dispatch: Dispatch) -> bool
4949
return not other_dispatches_running
5050

5151

52-
class MergeByType(MergeByIdentity):
53-
"""Merge running intervals based on the dispatch type."""
54-
55-
@override
56-
def identity(self, dispatch: Dispatch) -> int:
57-
"""Identity function for the merge criteria."""
58-
return hash(dispatch.type)
59-
60-
6152
class MergeByTypeTarget(MergeByType):
6253
"""Merge running intervals based on the dispatch type and target."""
6354

tests/test_frequenz_dispatch.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
Deleted,
2525
Dispatch,
2626
DispatchEvent,
27-
MergeByIdentity,
2827
MergeByType,
2928
MergeByTypeTarget,
3029
MergeStrategy,
@@ -679,7 +678,7 @@ async def test_multiple_dispatches_sequential_intervals_merge(
679678
async def test_at_least_one_running_filter(
680679
fake_time: time_machine.Coordinates,
681680
generator: DispatchGenerator,
682-
merge_strategy: MergeByIdentity,
681+
merge_strategy: MergeStrategy,
683682
) -> None:
684683
"""Test scenarios directly tied to the _at_least_one_running logic."""
685684
microgrid_id = randint(1, 100)

tests/test_mananging_actor.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
Dispatch,
2828
Dispatcher,
2929
DispatchInfo,
30-
MergeByIdentity,
3130
MergeByType,
3231
MergeByTypeTarget,
3332
MergeStrategy,
@@ -257,7 +256,7 @@ async def test_dry_run(test_env: TestEnv, fake_time: time_machine.Coordinates) -
257256
async def test_manage_abstraction(
258257
fake_time: time_machine.Coordinates,
259258
generator: DispatchGenerator,
260-
strategy: MergeByIdentity | None,
259+
strategy: MergeStrategy | None,
261260
) -> None:
262261
"""Test Dispatcher.start_dispatching sets up correctly."""
263262
identity: Callable[[Dispatch], int] = (

0 commit comments

Comments
 (0)