Skip to content

Commit 5138200

Browse files
authored
Cleanup public interface (#78)
Do a cleanup of the public interface, exposing only symbols that are relevant to the user. Also hide modules and symbols that are: * Internal * Scheduled to be deprecated * Still with a very unstable interface Actors are also moved to the `frequenz.sdk.actor` package.
2 parents 58b43ba + 08284c2 commit 5138200

File tree

94 files changed

+674
-528
lines changed

Some content is hidden

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

94 files changed

+674
-528
lines changed

.github/labeler.yml

+4-3
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@
1616
- "src/frequenz/sdk/_internal/**"
1717

1818
"part:data-pipeline":
19-
- "src/frequenz/sdk/data_handling/**"
20-
- "src/frequenz/sdk/data_ingestion/**"
19+
- "src/frequenz/sdk/_data_handling/**"
20+
- "src/frequenz/sdk/_data_ingestion/**"
21+
- "src/frequenz/sdk/timeseries/**"
2122

2223
"part:docs":
2324
- "**/*.md"
@@ -28,7 +29,7 @@
2829
- "src/frequenz/sdk/microgrid/**"
2930

3031
"part:power-distribution":
31-
- "src/frequenz/sdk/power_distribution/**"
32+
- "src/frequenz/sdk/power/**"
3233

3334
"part:tests":
3435
- "tests/**"

RELEASE_NOTES.md

+57-6
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ https://frequenz-floss.github.io/frequenz-sdk-python/
99
For now the documentation is pretty scarce but we will be improving it with
1010
time.
1111

12-
## Upgrading
12+
The most prominent changes in this release is the cleanup of the public API,
13+
which is much more concise and clear now and the addition of classes
14+
implementing the new data flow design, in particular the `DataSourcingActor`
15+
and the `ComponentMetricsResamplingActor`.
1316

14-
<!-- Here goes notes on how to upgrade from previous versions, including deprecations and what they should be replaced with -->
17+
## Upgrading
1518

1619
* `EVChargerData`'s `active_power_consumption` has been renamed to `active_power`
1720

@@ -27,14 +30,62 @@ time.
2730
changes](https://github.com/frequenz-floss/frequenz-channels-python/blob/v0.11.0/RELEASE_NOTES.md#upgrading-breaking-changes)
2831
you should be aware of.
2932

30-
## New Features
33+
* The public API has been cleaned up, several symbols were moved or exposed in
34+
a single module, and some symbols were hidden because they are either
35+
schedule for deprecation or not yet stabilized.
36+
37+
* `frequenz.sdk.actor`: The `decorator` sub-module was hidden and now the
38+
`@actor` decorator is exposed directly only in the main module.
39+
40+
* `frequenz.sdk.configs`: was renamed to `frequenz.sdk.config`, `Config` is
41+
only exposed in the main module and the `ConfigManager` was moved to
42+
`frequenz.sdk.actor.ConfigManagingActor`.
43+
44+
* The modules `frequenz.sdk.data_handling` and `frequenz.sdk.data_ingestion`
45+
were hidden from the public interface and will probably be removed in the
46+
future. They are still available as `frequenz.sdk._data_handling` and
47+
`frequenz.sdk._data_ingestion` for users still needing them.
48+
49+
* The module `frequenz.sdk.power_distribution` was renamed to
50+
`frequenz.sdk.power` and the `PowerDistributor` was moved to
51+
`frequenz.sdk.actor.power_distributing.PowerDistributingActor` (with the
52+
utility classes `Request` and `Result`).
53+
54+
* The module `frequenz.sdk.microgrid` was simplified.
55+
56+
* All component-related symbols (`.component`, `.component_data`,
57+
`.component_states`) were moved to the sub-module
58+
`frequenz.sdk.microgrid.component`.
3159

32-
<!-- Here goes the main new features and examples or instructions on how to use them -->
60+
* All API client-related symbols (`.client`, `.connection`, `.retry`) were
61+
moved to the sub-module `frequenz.sdk.microgrid.client`.
62+
63+
* The `ComponentGraph` is exposed directly in the main module (and only
64+
there).
65+
66+
* The `microgrid_api` module is now exposed via the main module directly
67+
(and thus indirectly renamed to `microgrid`, so instead of using `from
68+
frequenz.sdk.microgrid import microgrid_api; microgrid_api.initialize()`
69+
(for example) you should use `from frequenz.sdk.microgrid import
70+
microgridi; microgrid.initialize()`.
71+
72+
* The `MicrogridApi` class was renamed to `Microgrid` to make it clear it
73+
is not exclusively about the API.
74+
75+
* The `Microgrid.microgrid_api_client` attribute was renamed to
76+
`Microgrid.api_client` to avoid the redundancy.
77+
78+
## New Features
3379

3480
* `MeterData` objects now expose the AC `frequency` measured by the meter.
81+
3582
* `BatteryData` objects now expose the temperature of the hottest block in the
3683
battery as `temperature_max`
3784

38-
## Bug Fixes
85+
* A new `frequenz.sdk.actor.DataSourcingActor` was added.
86+
87+
* A new `frequenz.sdk.actor.ComponentMetricsResamplingActor` was added.
88+
89+
* A new `frequenz.sdk.actor.ChannelRegistry` was added.
3990

40-
<!-- Here goes notable bug fixes that are worth a special mention or explanation -->
91+
* A new module `frequenz.sdk.timeseries` was added.

benchmarks/data_ingestion/benchmark_microgrid_data.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,18 @@
2121
from frequenz.channels.util import MergeNamed, Select
2222
from google.protobuf.timestamp_pb2 import Timestamp # pylint:disable=no-name-in-module
2323

24-
import frequenz.sdk.microgrid.graph as gr
25-
from frequenz.sdk.data_handling.time_series import TimeSeriesEntry, TimeSeriesFormula
26-
from frequenz.sdk.data_ingestion.formula_calculator import FormulaCalculator
27-
from frequenz.sdk.data_ingestion.microgrid_data import MicrogridData
28-
from frequenz.sdk.microgrid import BatteryData, InverterData, MeterData
29-
from frequenz.sdk.microgrid.client import MicrogridGrpcClient
30-
from frequenz.sdk.microgrid.component import Component, ComponentCategory
31-
from frequenz.sdk.microgrid.connection import Connection
24+
import frequenz.sdk.microgrid._graph as gr
25+
from frequenz.sdk._data_handling.time_series import TimeSeriesEntry, TimeSeriesFormula
26+
from frequenz.sdk._data_ingestion.formula_calculator import FormulaCalculator
27+
from frequenz.sdk._data_ingestion.microgrid_data import MicrogridData
28+
from frequenz.sdk.microgrid.client import Connection, MicrogridGrpcClient
29+
from frequenz.sdk.microgrid.component import (
30+
BatteryData,
31+
Component,
32+
ComponentCategory,
33+
InverterData,
34+
MeterData,
35+
)
3236

3337

3438
def gen_market_data(component_id: int) -> MeterData:

benchmarks/power_distribution/power_distributor.py

+11-6
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@
1313
import grpc.aio as grpcaio
1414
from frequenz.channels import Bidirectional
1515

16+
from frequenz.sdk.actor.power_distributing import (
17+
PowerDistributingActor,
18+
Request,
19+
Result,
20+
)
21+
from frequenz.sdk.microgrid import ComponentGraph
22+
from frequenz.sdk.microgrid._graph import _MicrogridComponentGraph
1623
from frequenz.sdk.microgrid.client import MicrogridApiClient, MicrogridGrpcClient
1724
from frequenz.sdk.microgrid.component import Component, ComponentCategory
18-
from frequenz.sdk.microgrid.graph import ComponentGraph, _MicrogridComponentGraph
19-
from frequenz.sdk.power_distribution import PowerDistributor, Request, Result
2025

2126
HOST = "157.90.243.180"
2227
PORT = 61060
@@ -31,7 +36,7 @@ class User:
3136

3237

3338
async def run_user(user: User, batteries: Set[int], request_num: int) -> List[Result]:
34-
"""Send requests to the PowerDistributor and wait for the response.
39+
"""Send requests to the PowerDistributingActor and wait for the response.
3540
3641
Args:
3742
user: user that should send request
@@ -42,7 +47,7 @@ async def run_user(user: User, batteries: Set[int], request_num: int) -> List[Re
4247
SystemError: If the channel was closed.
4348
4449
Returns:
45-
List of the results from the PowerDistributor.
50+
List of the results from the PowerDistributingActor.
4651
"""
4752
result: List[Result] = []
4853
for _ in range(request_num):
@@ -101,7 +106,7 @@ async def run_test( # pylint: disable=too-many-locals
101106
users_num: Number of users to register
102107
requests_per_user: How many request user should send.
103108
batteries: Set of batteries for each request.
104-
distributor: PowerDistributor instance.
109+
distributor: PowerDistributingActor instance.
105110
106111
Returns:
107112
Dictionary with statistics.
@@ -117,7 +122,7 @@ async def run_test( # pylint: disable=too-many-locals
117122
user_id: channel.service_handle for user_id, channel in channels.items()
118123
}
119124

120-
distributor = PowerDistributor(api, graph, service_channels)
125+
distributor = PowerDistributingActor(api, graph, service_channels)
121126

122127
tasks: List[Coroutine[Any, Any, List[Result]]] = []
123128
for user_id, channel in channels.items():

examples/sdk_resampling_example.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,22 @@
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 import microgrid
12+
from frequenz.sdk.actor import (
13+
ChannelRegistry,
1514
ComponentMetricRequest,
1615
ComponentMetricsResamplingActor,
16+
DataSourcingActor,
1717
)
18-
from frequenz.sdk.microgrid import ComponentCategory, microgrid_api
18+
from frequenz.sdk.microgrid.component import ComponentCategory, ComponentMetricId
1919

2020
HOST = "microgrid.sandbox.api.frequenz.io"
2121
PORT = 61060
2222

2323

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

2828
channel_registry = ChannelRegistry(name="Microgrid Channel Registry")
2929

@@ -53,7 +53,7 @@ async def run() -> None:
5353
resampling_period_s=1.0,
5454
)
5555

56-
components = await microgrid_api.get().microgrid_api_client.components()
56+
components = await microgrid.get().api_client.components()
5757
battery_ids = [
5858
comp.component_id
5959
for comp in components

examples/sdk_usage_example.py

+21-22
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"""Frequenz Python SDK usage examples.
55
66
This example creates two users.
7-
One user sends request with power to apply in PowerDistributor.
7+
One user sends request with power to apply in PowerDistributingActor.
88
Second user receives requests and set that power.
99
"""
1010

@@ -18,17 +18,17 @@
1818

1919
from frequenz.channels import Bidirectional, Broadcast, Receiver, Sender
2020

21+
from frequenz.sdk import microgrid
22+
from frequenz.sdk._data_handling import TimeSeriesEntry
23+
from frequenz.sdk._data_ingestion import MicrogridData
24+
from frequenz.sdk._data_ingestion.formula_calculator import FormulaCalculator
2125
from frequenz.sdk.actor import actor
22-
from frequenz.sdk.data_handling import TimeSeriesEntry
23-
from frequenz.sdk.data_ingestion import MicrogridData
24-
from frequenz.sdk.data_ingestion.formula_calculator import FormulaCalculator
25-
from frequenz.sdk.microgrid import (
26-
Component,
27-
ComponentCategory,
28-
MicrogridApi,
29-
microgrid_api,
26+
from frequenz.sdk.actor.power_distributing import (
27+
PowerDistributingActor,
28+
Request,
29+
Result,
3030
)
31-
from frequenz.sdk.power_distribution import PowerDistributor, Request, Result
31+
from frequenz.sdk.microgrid.component import Component, ComponentCategory
3232

3333
_logger = logging.getLogger(__name__)
3434
HOST = "microgrid.sandbox.api.frequenz.io" # it should be the host name.
@@ -92,11 +92,11 @@ async def run(self) -> None:
9292
)
9393
except asyncio.exceptions.TimeoutError:
9494
_logger.error(
95-
"Got timeout error when waiting for response from PowerDistributor"
95+
"Got timeout error when waiting for response from PowerDistributingActor"
9696
)
9797
continue
9898
if result is None:
99-
raise RuntimeError("PowerDistributor channel has been closed.")
99+
raise RuntimeError("PowerDistributingActor channel has been closed.")
100100
if result.status != Result.Status.SUCCESS:
101101
_logger.error(
102102
"Could not set %d power. Result: %s", power_to_set, str(result)
@@ -153,10 +153,9 @@ async def run() -> None:
153153
logging.basicConfig(
154154
level=logging.DEBUG, format="%(asctime)s %(name)s %(levelname)s:%(message)s"
155155
)
156-
await microgrid_api.initialize(HOST, PORT)
156+
await microgrid.initialize(HOST, PORT)
157157

158158
# await initialize(HOST, PORT) # in v0.8.0
159-
api: MicrogridApi = microgrid_api.get()
160159

161160
# Create MicrogridData
162161
microgrid_data_channels = {
@@ -165,11 +164,11 @@ async def run() -> None:
165164
),
166165
}
167166

168-
formula_calculator = FormulaCalculator(api.component_graph)
167+
formula_calculator = FormulaCalculator(microgrid.get().component_graph)
169168
microgrid_data = MicrogridData(
170-
microgrid_client=api.microgrid_api_client,
169+
microgrid_client=microgrid.get().api_client,
171170
# microgrid_client=microgrid_api.microgrid_api, # in v0.8.0
172-
component_graph=api.component_graph,
171+
component_graph=microgrid.get().component_graph,
173172
outputs={
174173
key: channel.new_sender()
175174
for key, channel in microgrid_data_channels.items()
@@ -181,14 +180,14 @@ async def run() -> None:
181180
# Bidirectional channel is used for one sender - one receiver communication
182181
power_distributor_channels = {
183182
sending_actor_id: Bidirectional[Request, Result](
184-
client_id=sending_actor_id, service_id="PowerDistributor"
183+
client_id=sending_actor_id, service_id="PowerDistributingActor"
185184
)
186185
}
187186

188-
power_distributor = PowerDistributor(
189-
microgrid_api=api.microgrid_api_client,
187+
power_distributor = PowerDistributingActor(
188+
microgrid_api=microgrid.get().api_client,
190189
# microgrid_api=microgrid_api.microgrid_api, in v0.8.0
191-
component_graph=api.component_graph,
190+
component_graph=microgrid.get().component_graph,
192191
users_channels={
193192
key: channel.service_handle
194193
for key, channel in power_distributor_channels.items()
@@ -200,7 +199,7 @@ async def run() -> None:
200199

201200
# You should get components from ComponentGraph, not from the api.
202201
# It is faster and and non blocking approach.
203-
batteries: Set[Component] = api.component_graph.components(
202+
batteries: Set[Component] = microgrid.get().component_graph.components(
204203
# component_type=set(ComponentType.BATTERY) in v0.8.0
205204
component_category={ComponentCategory.BATTERY}
206205
)

src/frequenz/sdk/data_handling/handle_historic_data.py src/frequenz/sdk/_data_handling/handle_historic_data.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import numpy as np
1414
import pandas as pd
1515

16-
from ..data_ingestion.load_historic_data import (
16+
from .._data_ingestion.load_historic_data import (
1717
LoadHistoricData,
1818
LoadHistoricDataSettings,
1919
)

src/frequenz/sdk/data_ingestion/component_info.py src/frequenz/sdk/_data_ingestion/component_info.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
from dataclasses import dataclass
88
from typing import Dict, List, Optional, Tuple
99

10+
from ..microgrid import ComponentGraph
1011
from ..microgrid.component import ComponentCategory
11-
from ..microgrid.graph import ComponentGraph
1212

1313
logger = logging.Logger(__name__)
1414

src/frequenz/sdk/data_ingestion/formula_calculator.py src/frequenz/sdk/_data_ingestion/formula_calculator.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import sympy
1313

14-
from ..data_handling.time_series import (
14+
from .._data_handling.time_series import (
1515
BatteryField,
1616
EVChargerField,
1717
InverterField,
@@ -22,7 +22,8 @@
2222
TimeSeriesEntry,
2323
TimeSeriesFormula,
2424
)
25-
from ..microgrid import ComponentCategory, ComponentGraph
25+
from ..microgrid import ComponentGraph
26+
from ..microgrid.component import ComponentCategory
2627
from .component_info import infer_microgrid_config
2728
from .constants import (
2829
METRIC_BATTERIES_ACTIVE_POWER,

src/frequenz/sdk/data_ingestion/gen_component_receivers.py src/frequenz/sdk/_data_ingestion/gen_component_receivers.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
from frequenz.channels.util import Merge
1010

1111
from ..microgrid import client
12-
from ..microgrid.component import ComponentCategory
13-
from ..microgrid.component_data import (
12+
from ..microgrid.component import (
1413
BatteryData,
14+
ComponentCategory,
1515
EVChargerData,
1616
InverterData,
1717
MeterData,

src/frequenz/sdk/data_ingestion/microgrid_data.py src/frequenz/sdk/_data_ingestion/microgrid_data.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
from frequenz.channels import Broadcast, Receiver, Sender
1919
from frequenz.channels.util import Merge, Select
2020

21-
from ..actor.decorator import actor
22-
from ..configs import Config
23-
from ..data_handling.time_series import TimeSeriesEntry
21+
from .._data_handling.time_series import TimeSeriesEntry
22+
from ..actor import actor
23+
from ..config import Config
24+
from ..microgrid import ComponentGraph
2425
from ..microgrid.client import MicrogridApiClient
25-
from ..microgrid.graph import ComponentGraph
2626
from .component_info import infer_microgrid_config
2727
from .formula_calculator import FormulaCalculator
2828
from .gen_component_receivers import gen_component_receivers

0 commit comments

Comments
 (0)