Skip to content

Commit 7627507

Browse files
committed
Clean up frequenz.sdk.actor public API
Also make some minor improvements to the documentation. Signed-off-by: Leandro Lucarella <[email protected]>
1 parent 58b43ba commit 7627507

File tree

15 files changed

+110
-113
lines changed

15 files changed

+110
-113
lines changed

examples/sdk_resampling_example.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,19 @@
88
from frequenz.channels import Broadcast
99
from frequenz.channels.util import MergeNamed
1010

11-
from frequenz.sdk.actor import ChannelRegistry
12-
from frequenz.sdk.actor.data_sourcing import DataSourcingActor
13-
from frequenz.sdk.actor.resampling import (
14-
ComponentMetricId,
11+
from frequenz.sdk.actor import (
12+
ChannelRegistry,
1513
ComponentMetricRequest,
1614
ComponentMetricsResamplingActor,
15+
DataSourcingActor,
1716
)
18-
from frequenz.sdk.microgrid import ComponentCategory, microgrid_api
17+
from frequenz.sdk.microgrid import ComponentCategory, ComponentMetricId, microgrid_api
1918

2019
HOST = "microgrid.sandbox.api.frequenz.io"
2120
PORT = 61060
2221

2322

24-
async def run() -> None:
23+
async def run() -> None: # pylint: disable=too-many-locals
2524
"""Run main functions that initializes and creates everything."""
2625
await microgrid_api.initialize(HOST, PORT)
2726

src/frequenz/sdk/actor/__init__.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@
33

44
"""A base class for creating simple composable actors."""
55

6-
from .channel_registry import ChannelRegistry
7-
from .decorator import actor
6+
from ._channel_registry import ChannelRegistry
7+
from ._data_sourcing import ComponentMetricRequest, DataSourcingActor
8+
from ._decorator import actor
9+
from ._resampling import ComponentMetricsResamplingActor
810

9-
__all__ = ["actor", "ChannelRegistry"]
11+
__all__ = [
12+
"ChannelRegistry",
13+
"ComponentMetricRequest",
14+
"ComponentMetricsResamplingActor",
15+
"DataSourcingActor",
16+
"actor",
17+
]
File renamed without changes.

src/frequenz/sdk/actor/data_sourcing/__init__.py renamed to src/frequenz/sdk/actor/_data_sourcing/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
"""The DataSourcingActor."""
55

66
from .data_sourcing import DataSourcingActor
7-
from .types import ComponentMetricId, ComponentMetricRequest
7+
from .microgrid_api_source import ComponentMetricRequest
88

99
__all__ = [
10-
"DataSourcingActor",
11-
"ComponentMetricId",
1210
"ComponentMetricRequest",
11+
"DataSourcingActor",
1312
]

src/frequenz/sdk/actor/data_sourcing/data_sourcing.py renamed to src/frequenz/sdk/actor/_data_sourcing/data_sourcing.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
from frequenz.channels import Receiver
77

8-
from .. import ChannelRegistry, actor
9-
from .microgrid_api_source import MicrogridApiSource
10-
from .types import ComponentMetricRequest
8+
from .._channel_registry import ChannelRegistry
9+
from .._decorator import actor
10+
from .microgrid_api_source import ComponentMetricRequest, MicrogridApiSource
1111

1212

1313
@actor

src/frequenz/sdk/actor/data_sourcing/microgrid_api_source.py renamed to src/frequenz/sdk/actor/_data_sourcing/microgrid_api_source.py

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,63 @@
55

66
import asyncio
77
import logging
8+
from dataclasses import dataclass
9+
from datetime import datetime
810
from typing import Any, Callable, Dict, List, Optional, Tuple
911

1012
from frequenz.channels import Receiver, Sender
1113

1214
from ...microgrid import (
1315
BatteryData,
1416
ComponentCategory,
17+
ComponentMetricId,
1518
EVChargerData,
1619
InverterData,
1720
MeterData,
1821
microgrid_api,
1922
)
2023
from ...timeseries import Sample
21-
from .. import ChannelRegistry
22-
from .types import ComponentMetricId, ComponentMetricRequest
24+
from .._channel_registry import ChannelRegistry
25+
26+
27+
@dataclass
28+
class ComponentMetricRequest:
29+
"""A request object to start streaming a metric for a component."""
30+
31+
namespace: str
32+
"""The namespace that this request belongs to.
33+
34+
Metric requests with a shared namespace enable the reuse of channels within
35+
that namespace.
36+
37+
If for example, an actor making a multiple requests, uses the name of the
38+
actor as the namespace, then requests from the actor will get reused when
39+
possible.
40+
"""
41+
42+
component_id: int
43+
"""The ID of the requested component."""
44+
45+
metric_id: ComponentMetricId
46+
"""The ID of the requested component's metric."""
47+
48+
start_time: Optional[datetime]
49+
"""The start time from which data is required.
50+
51+
When None, we will stream only live data.
52+
"""
53+
54+
def get_channel_name(self) -> str:
55+
"""Return a channel name constructed from Self.
56+
57+
This channel name can be used by the sending side and receiving sides to
58+
identify the right channel from the ChannelRegistry.
59+
60+
Returns:
61+
A string denoting a channel name.
62+
"""
63+
return f"{self.component_id}::{self.metric_id.name}::{self.start_time}::{self.namespace}"
64+
2365

2466
_MeterDataMethods: Dict[ComponentMetricId, Callable[[MeterData], float]] = {
2567
ComponentMetricId.ACTIVE_POWER: lambda msg: msg.active_power,
Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,13 @@
1313
from frequenz.channels.util import MergeNamed, Select, Timer
1414

1515
from ..timeseries import GroupResampler, ResamplingFunction, Sample
16-
from . import ChannelRegistry, actor, data_sourcing
16+
from ._channel_registry import ChannelRegistry
17+
from ._data_sourcing import ComponentMetricRequest
18+
from ._decorator import actor
1719

1820
logger = logging.Logger(__name__)
1921

2022

21-
# Re-export the types from the data_sourcing actor as we use the same requests,
22-
# we are only forwarding them for now.
23-
ComponentMetricId = data_sourcing.ComponentMetricId
24-
25-
ComponentMetricRequest = data_sourcing.ComponentMetricRequest
26-
27-
2823
# pylint: disable=unused-argument
2924
def average(samples: Sequence[Sample], resampling_period_s: float) -> float:
3025
"""Calculate average of the provided values.
@@ -157,7 +152,7 @@ async def run() -> None:
157152
self._output_senders: Dict[str, Sender[Sample]] = {}
158153
self._resampling_timer = Timer(interval=self._resampling_period_s)
159154

160-
async def subscribe(self, request: ComponentMetricRequest) -> None:
155+
async def _subscribe(self, request: ComponentMetricRequest) -> None:
161156
"""Subscribe for data for a specific time series.
162157
163158
Args:
@@ -182,7 +177,7 @@ async def subscribe(self, request: ComponentMetricRequest) -> None:
182177
# `data_source_channel_name`
183178
self._output_senders[data_source_channel_name] = sender
184179

185-
def is_sample_valid(self, sample: Sample) -> bool:
180+
def _is_sample_valid(self, sample: Sample) -> bool:
186181
"""Check if the provided sample is valid.
187182
188183
Args:
@@ -224,7 +219,7 @@ async def run(self) -> None:
224219
# which may need to be handled properly here, e.g. unsubscribe
225220
continue
226221
channel_name, sample = msg.inner
227-
if self.is_sample_valid(sample=sample):
222+
if self._is_sample_valid(sample=sample):
228223
self._resampler.add_sample(
229224
time_series_id=channel_name,
230225
sample=sample,
@@ -234,7 +229,7 @@ async def run(self) -> None:
234229
raise ConnectionError(
235230
"Subscription channel connection has been closed!"
236231
)
237-
await self.subscribe(request=msg.inner)
232+
await self._subscribe(request=msg.inner)
238233
# Breaking out from the loop is required to regenerate
239234
# component_data_receivers to be able to fulfil this
240235
# subscription (later can be optimized by checking if

src/frequenz/sdk/actor/data_sourcing/types.py

Lines changed: 0 additions & 71 deletions
This file was deleted.

src/frequenz/sdk/data_ingestion/microgrid_data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from frequenz.channels import Broadcast, Receiver, Sender
1919
from frequenz.channels.util import Merge, Select
2020

21-
from ..actor.decorator import actor
21+
from ..actor import actor
2222
from ..configs import Config
2323
from ..data_handling.time_series import TimeSeriesEntry
2424
from ..microgrid.client import MicrogridApiClient

0 commit comments

Comments
 (0)