Skip to content

Commit ce985a7

Browse files
authored
Update to use BaseId' ids (#181)
2 parents 10e3986 + 5e87950 commit ce985a7

File tree

13 files changed

+187
-131
lines changed

13 files changed

+187
-131
lines changed

RELEASE_NOTES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ While the new TargetCategory class supports subtypes, only reading them is curre
1212
* `TargetIds(ComponentIds(1), ComponentIds(2), ComponentIds(3))`
1313
* `TargetCategories` can be used to specify one or more target categories:
1414
* `TargetCategories(ComponentCategory.BATTERY, ComponentCategory.INVERTER)`
15+
* Dispatch ids and microgrid ids are no longer simple `int` types but are now wrapped in `DispatchId` and `MicrogridId` classes, respectively. This allows for better type safety and clarity in the codebase.
1516

1617
## New Features
1718

pyproject.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ classifiers = [
3636
]
3737
requires-python = ">= 3.11, < 4"
3838
dependencies = [
39-
"typing-extensions >= 4.6.1, < 5",
39+
"typing-extensions >= 4.13.0, < 5",
4040
"frequenz-api-dispatch == 1.0.0-rc2",
4141
"frequenz-client-base >= 0.8.0, < 0.12.0",
42-
"frequenz-client-common >= 0.1.0, < 0.4.0",
42+
"frequenz-client-common >= 0.3.2, < 0.4.0",
43+
"frequenz-core >= 1.0.2, < 2.0.0",
4344
"grpcio >= 1.70.0, < 2",
4445
"python-dateutil >= 2.8.2, < 3.0",
4546
]

src/frequenz/client/dispatch/__main__.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
from prompt_toolkit.patch_stdout import patch_stdout
1919
from prompt_toolkit.shortcuts import CompleteStyle
2020

21+
from frequenz.client.common.microgrid import MicrogridId
22+
2123
from ._cli_types import (
2224
FuzzyDateTime,
2325
FuzzyIntRange,
@@ -27,7 +29,7 @@
2729
)
2830
from ._client import DispatchApiClient
2931
from .recurrence import EndCriteria, Frequency, RecurrenceRule, Weekday
30-
from .types import Dispatch, DispatchEvent
32+
from .types import Dispatch, DispatchEvent, DispatchId
3133

3234

3335
def format_datetime(dt: datetime | None) -> str:
@@ -260,7 +262,7 @@ async def list_(ctx: click.Context, /, **filters: Any) -> None:
260262
@cli.command("stream")
261263
@click.pass_context
262264
@click.argument("microgrid-id", required=True, type=int)
263-
async def stream(ctx: click.Context, microgrid_id: int) -> None:
265+
async def stream(ctx: click.Context, microgrid_id: MicrogridId) -> None:
264266
"""Stream dispatches."""
265267
event_stream: Receiver[DispatchEvent] = ctx.obj["client"].stream(
266268
microgrid_id=microgrid_id
@@ -452,8 +454,8 @@ async def create(
452454
async def update(
453455
ctx: click.Context,
454456
/,
455-
microgrid_id: int,
456-
dispatch_id: int,
457+
microgrid_id: MicrogridId,
458+
dispatch_id: DispatchId,
457459
**new_fields: dict[str, Any],
458460
) -> None:
459461
"""Update a dispatch."""
@@ -499,14 +501,17 @@ def skip_field(value: Any) -> bool:
499501
@click.argument("microgrid-id", required=True, type=int)
500502
@click.argument("dispatch_ids", type=int, nargs=-1) # Allow multiple IDs
501503
@click.pass_context
502-
async def get(ctx: click.Context, microgrid_id: int, dispatch_ids: List[int]) -> None:
504+
async def get(
505+
ctx: click.Context, microgrid_id: MicrogridId, dispatch_ids: List[int]
506+
) -> None:
503507
"""Get one or multiple dispatches."""
504508
num_failed = 0
505509

506510
for dispatch_id in dispatch_ids:
507511
try:
508512
dispatch = await ctx.obj["client"].get(
509-
microgrid_id=microgrid_id, dispatch_id=dispatch_id
513+
microgrid_id=microgrid_id,
514+
dispatch_id=DispatchId(dispatch_id),
510515
)
511516
if ctx.obj["raw"]:
512517
click.echo(pformat(dispatch, compact=True))
@@ -537,7 +542,7 @@ async def repl(
537542
@click.argument("dispatch_ids", type=FuzzyIntRange(), nargs=-1) # Allow multiple IDs
538543
@click.pass_context
539544
async def delete(
540-
ctx: click.Context, microgrid_id: int, dispatch_ids: list[list[int]]
545+
ctx: click.Context, microgrid_id: MicrogridId, dispatch_ids: list[list[int]]
541546
) -> None:
542547
"""Delete multiple dispatches.
543548

src/frequenz/client/dispatch/_client.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@
3636
from frequenz.client.base.exception import ClientNotConnected
3737
from frequenz.client.base.retry import LinearBackoff
3838
from frequenz.client.base.streaming import GrpcStreamBroadcaster
39+
from frequenz.client.common.microgrid import MicrogridId
3940

4041
from ._internal_types import DispatchCreateRequest
4142
from .recurrence import RecurrenceRule
4243
from .types import (
4344
Dispatch,
4445
DispatchEvent,
46+
DispatchId,
4547
TargetComponents,
4648
_target_components_to_protobuf,
4749
)
@@ -83,7 +85,8 @@ def __init__(
8385
)
8486
self._metadata = (("key", key),)
8587
self._streams: dict[
86-
int, GrpcStreamBroadcaster[StreamMicrogridDispatchesResponse, DispatchEvent]
88+
MicrogridId,
89+
GrpcStreamBroadcaster[StreamMicrogridDispatchesResponse, DispatchEvent],
8790
] = {}
8891
"""A dictionary of streamers, keyed by microgrid_id."""
8992

@@ -114,7 +117,7 @@ def stub(self) -> dispatch_pb2_grpc.MicrogridDispatchServiceAsyncStub:
114117
# pylint: disable=too-many-arguments, too-many-locals
115118
async def list(
116119
self,
117-
microgrid_id: int,
120+
microgrid_id: MicrogridId,
118121
*,
119122
target_components: Iterator[TargetComponents] = iter(()),
120123
start_from: datetime | None = None,
@@ -138,7 +141,7 @@ async def list(
138141
key="key",
139142
server_url="grpc://dispatch.url.goes.here.example.com"
140143
)
141-
async for page in client.list(microgrid_id=1):
144+
async for page in client.list(microgrid_id=MicrogridId(1)):
142145
for dispatch in page:
143146
print(dispatch)
144147
```
@@ -185,7 +188,7 @@ def to_interval(
185188
)
186189

187190
request = ListMicrogridDispatchesRequest(
188-
microgrid_id=microgrid_id,
191+
microgrid_id=int(microgrid_id),
189192
filter=filters,
190193
pagination_params=(
191194
PaginationParams(page_size=page_size) if page_size else None
@@ -211,7 +214,7 @@ def to_interval(
211214
else:
212215
break
213216

214-
def stream(self, microgrid_id: int) -> channels.Receiver[DispatchEvent]:
217+
def stream(self, microgrid_id: MicrogridId) -> channels.Receiver[DispatchEvent]:
215218
"""Receive a stream of dispatch events.
216219
217220
This function returns a receiver channel that can be used to receive
@@ -238,15 +241,15 @@ def stream(self, microgrid_id: int) -> channels.Receiver[DispatchEvent]:
238241
return self._get_stream(microgrid_id).new_receiver()
239242

240243
def _get_stream(
241-
self, microgrid_id: int
244+
self, microgrid_id: MicrogridId
242245
) -> GrpcStreamBroadcaster[StreamMicrogridDispatchesResponse, DispatchEvent]:
243246
"""Get an instance to the streaming helper."""
244247
broadcaster = self._streams.get(microgrid_id)
245248
if broadcaster is not None and not broadcaster.is_running:
246249
del self._streams[microgrid_id]
247250
broadcaster = None
248251
if broadcaster is None:
249-
request = StreamMicrogridDispatchesRequest(microgrid_id=microgrid_id)
252+
request = StreamMicrogridDispatchesRequest(microgrid_id=int(microgrid_id))
250253
broadcaster = GrpcStreamBroadcaster(
251254
stream_name="StreamMicrogridDispatches",
252255
stream_method=lambda: cast(
@@ -266,7 +269,7 @@ def _get_stream(
266269

267270
async def create( # pylint: disable=too-many-positional-arguments
268271
self,
269-
microgrid_id: int,
272+
microgrid_id: MicrogridId,
270273
type: str, # pylint: disable=redefined-builtin
271274
start_time: datetime | Literal["NOW"],
272275
duration: timedelta | None,
@@ -334,8 +337,8 @@ async def create( # pylint: disable=too-many-positional-arguments
334337
async def update(
335338
self,
336339
*,
337-
microgrid_id: int,
338-
dispatch_id: int,
340+
microgrid_id: MicrogridId,
341+
dispatch_id: DispatchId,
339342
new_fields: dict[str, Any],
340343
) -> Dispatch:
341344
"""Update a dispatch.
@@ -359,7 +362,7 @@ async def update(
359362
ValueError: If updating `type` or `dry_run`.
360363
"""
361364
msg = UpdateMicrogridDispatchRequest(
362-
dispatch_id=dispatch_id, microgrid_id=microgrid_id
365+
dispatch_id=int(dispatch_id), microgrid_id=int(microgrid_id)
363366
)
364367

365368
for key, val in new_fields.items():
@@ -423,7 +426,9 @@ async def update(
423426

424427
return Dispatch.from_protobuf(response.dispatch)
425428

426-
async def get(self, *, microgrid_id: int, dispatch_id: int) -> Dispatch:
429+
async def get(
430+
self, *, microgrid_id: MicrogridId, dispatch_id: DispatchId
431+
) -> Dispatch:
427432
"""Get a dispatch.
428433
429434
Args:
@@ -434,7 +439,7 @@ async def get(self, *, microgrid_id: int, dispatch_id: int) -> Dispatch:
434439
Dispatch: The dispatch.
435440
"""
436441
request = GetMicrogridDispatchRequest(
437-
dispatch_id=dispatch_id, microgrid_id=microgrid_id
442+
dispatch_id=int(dispatch_id), microgrid_id=int(microgrid_id)
438443
)
439444
response = await cast(
440445
Awaitable[GetMicrogridDispatchResponse],
@@ -444,15 +449,17 @@ async def get(self, *, microgrid_id: int, dispatch_id: int) -> Dispatch:
444449
)
445450
return Dispatch.from_protobuf(response.dispatch)
446451

447-
async def delete(self, *, microgrid_id: int, dispatch_id: int) -> None:
452+
async def delete(
453+
self, *, microgrid_id: MicrogridId, dispatch_id: DispatchId
454+
) -> None:
448455
"""Delete a dispatch.
449456
450457
Args:
451458
microgrid_id: The microgrid_id to delete the dispatch for.
452459
dispatch_id: The dispatch_id to delete.
453460
"""
454461
request = DeleteMicrogridDispatchRequest(
455-
dispatch_id=dispatch_id, microgrid_id=microgrid_id
462+
dispatch_id=int(dispatch_id), microgrid_id=int(microgrid_id)
456463
)
457464
await cast(
458465
Awaitable[None],

src/frequenz/client/dispatch/_internal_types.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from google.protobuf.timestamp_pb2 import Timestamp
2121

2222
from frequenz.client.base.conversion import to_datetime, to_timestamp
23+
from frequenz.client.common.microgrid import MicrogridId
2324

2425
from .recurrence import RecurrenceRule
2526
from .types import (
@@ -36,7 +37,7 @@
3637
class DispatchCreateRequest:
3738
"""Request to create a new dispatch."""
3839

39-
microgrid_id: int
40+
microgrid_id: MicrogridId
4041
"""The identifier of the microgrid to which this dispatch belongs."""
4142

4243
type: str
@@ -93,7 +94,7 @@ def from_protobuf(
9394
)
9495

9596
return DispatchCreateRequest(
96-
microgrid_id=pb_object.microgrid_id,
97+
microgrid_id=MicrogridId(pb_object.microgrid_id),
9798
type=pb_object.dispatch_data.type,
9899
start_time=(
99100
"NOW"
@@ -118,7 +119,7 @@ def to_protobuf(self) -> PBDispatchCreateRequest:
118119
payload.update(self.payload)
119120

120121
return PBDispatchCreateRequest(
121-
microgrid_id=self.microgrid_id,
122+
microgrid_id=int(self.microgrid_id),
122123
dispatch_data=DispatchData(
123124
type=self.type,
124125
start_time=(

0 commit comments

Comments
 (0)