Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@

* Fixed documentation cross-references to dependencies by updating the mkdocstrings inventories to match the minimum dependency versions and adding the missing `frequenz-client-base` inventory.
* Declared the missing direct dependencies `frequenz-client-common`, `frequenz-core` and `grpcio`, which were previously only pulled in indirectly through `frequenz-client-dispatch`.
* Docstrings now use absolute cross-references to public paths instead of relative ones. Relative cross-references are expanded from the module where an object is defined since mkdocstrings-python 2.0.9, which broke some links, and projects rendering docstrings inherited from this library needed `relative_crossrefs: true` for them to work at all. See [frequenz-repo-config-python#655](https://github.com/frequenz-floss/frequenz-repo-config-python/issues/655) for details.
1 change: 0 additions & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ plugins:
show_source: true
show_symbol_type_toc: true
signature_crossrefs: true
relative_crossrefs: true
inventories:
# See https://mkdocstrings.github.io/python/usage/#import for details
- https://docs.python.org/3/objects.inv
Expand Down
15 changes: 8 additions & 7 deletions src/frequenz/dispatch/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@

A small overview of the most important classes in this module:

* [`Dispatcher`][.Dispatcher]: The entry point for the API.
* [`Dispatch`][.Dispatch]: A dispatch type with lots of useful extra functionality.
* [`ActorDispatcher`][.ActorDispatcher]: A service to manage other actors based on
incoming dispatches.
* [`Created`][.Created],
[`Updated`][.Updated],
[`Deleted`][.Deleted]: Dispatch event types.
* [`Dispatcher`][frequenz.dispatch.Dispatcher]: The entry point for the API.
* [`Dispatch`][frequenz.dispatch.Dispatch]: A dispatch type with lots of useful extra
functionality.
* [`ActorDispatcher`][frequenz.dispatch.ActorDispatcher]: A service to manage other
actors based on incoming dispatches.
* [`Created`][frequenz.dispatch.Created],
[`Updated`][frequenz.dispatch.Updated],
[`Deleted`][frequenz.dispatch.Deleted]: Dispatch event types.

"""

Expand Down
2 changes: 1 addition & 1 deletion src/frequenz/dispatch/_actor_dispatcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def components(self) -> TargetComponents:
"""The target components.

Warning: Deprecated in v0.10.3
Use [`target`][..target] instead.
Use [`target`][frequenz.dispatch.DispatchInfo.target] instead.
"""
return self.target

Expand Down
16 changes: 8 additions & 8 deletions src/frequenz/dispatch/_bg_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,22 +180,22 @@ async def new_running_state_event_receiver(
"""Create a new receiver for running state events of the specified type.

`merge_strategy` is an instance of a class derived from
[`MergeStrategy`][....MergeStrategy]. Available strategies
[`MergeStrategy`][frequenz.dispatch.MergeStrategy]. Available strategies
are:

* [`MergeByType`][....MergeByType] — merges all dispatches
* [`MergeByType`][frequenz.dispatch.MergeByType] — merges all dispatches
of the same type.
* [`MergeByTypeTarget`][....MergeByTypeTarget] — merges all
* [`MergeByTypeTarget`][frequenz.dispatch.MergeByTypeTarget] — merges all
dispatches of the same type and target.
* `None` — no merging, just send all events.

You can make your own identity-based strategy by subclassing
[`MergeByType`][....MergeByType] and overriding
the [`identity()`][....MergeStrategy.identity] method. If
[`MergeByType`][frequenz.dispatch.MergeByType] and overriding
the [`identity()`][frequenz.dispatch.MergeStrategy.identity] method. If
you require a more complex strategy, you can subclass
[`MergeStrategy`][....MergeStrategy] directly and implement
both the [`identity()`][....MergeStrategy.identity] and
[`filter()`][....MergeStrategy.filter] methods.
[`MergeStrategy`][frequenz.dispatch.MergeStrategy] directly and implement
both the [`identity()`][frequenz.dispatch.MergeStrategy.identity] and
[`filter()`][frequenz.dispatch.MergeStrategy.filter] methods.

Running intervals from multiple dispatches will be merged, according to
the chosen strategy.
Expand Down
29 changes: 16 additions & 13 deletions src/frequenz/dispatch/_dispatcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,11 @@ class Dispatcher(BackgroundService):

The receivers shortly explained:

* [Lifecycle events receiver][.new_lifecycle_events_receiver]:
* [Lifecycle events
receiver][frequenz.dispatch.Dispatcher.new_lifecycle_events_receiver]:
Receives an event whenever a dispatch is created, updated or deleted.
* [Running status change receiver][.new_running_state_event_receiver]:
* [Running status change
receiver][frequenz.dispatch.Dispatcher.new_running_state_event_receiver]:
Receives an event whenever the running status of a dispatch changes.
The running status of a dispatch can change due to a variety of reasons,
such as but not limited to the dispatch being started, stopped, modified
Expand Down Expand Up @@ -324,22 +326,23 @@ async def start_managing(
) -> None:
"""Manage actors for a given dispatch type.

Creates and manages an
[`ActorDispatcher`][...ActorDispatcher] for the given type that will
start, stop and reconfigure actors based on received dispatches.
Creates and manages an [`ActorDispatcher`][frequenz.dispatch.ActorDispatcher]
for the given type that will start, stop and reconfigure actors based on
received dispatches.

You can await the [`Dispatcher`][...Dispatcher] instance to block
until all types registered with [`start_managing`][..start_managing] are stopped
using [`stop_managing`][..stop_managing].
You can await the [`Dispatcher`][frequenz.dispatch.Dispatcher] instance to block
until all types registered with
[`start_managing`][frequenz.dispatch.Dispatcher.start_managing] are stopped
using [`stop_managing`][frequenz.dispatch.Dispatcher.stop_managing].

"Merging" means that when multiple dispatches are active at the same time,
the intervals are merged into one.

This also decides how instances are mapped from dispatches to actors:

* [`MergeByType`][...MergeByType] — All dispatches map to
* [`MergeByType`][frequenz.dispatch.MergeByType] — All dispatches map to
one single instance identified by the dispatch type and dry_run status.
* [`MergeByTypeTarget`][...MergeByTypeTarget] — A
* [`MergeByTypeTarget`][frequenz.dispatch.MergeByTypeTarget] — A
dispatch maps to an instance identified by the dispatch type, dry_run status
and target. So different dispatches with equal type and target will map to
the same instance.
Expand Down Expand Up @@ -457,12 +460,12 @@ async def new_running_state_event_receiver(
- The dispatch was deleted

`merge_strategy` is an instance of a class derived from
[`MergeStrategy`][...MergeStrategy]. Available strategies
[`MergeStrategy`][frequenz.dispatch.MergeStrategy]. Available strategies
are:

* [`MergeByType`][...MergeByType] — merges all dispatches
* [`MergeByType`][frequenz.dispatch.MergeByType] — merges all dispatches
of the same type.
* [`MergeByTypeTarget`][...MergeByTypeTarget] — merges all
* [`MergeByTypeTarget`][frequenz.dispatch.MergeByTypeTarget] — merges all
dispatches of the same type and target.
* `None` — no merging, just send all events (default).

Expand Down