Skip to content

Commit dac8dae

Browse files
committed
update to ids wip
1 parent 3f7cbbf commit dac8dae

File tree

8 files changed

+68
-47
lines changed

8 files changed

+68
-47
lines changed

src/frequenz/client/dispatch/__main__.py

Lines changed: 10 additions & 6 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,7 +501,9 @@ 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

@@ -537,7 +541,7 @@ async def repl(
537541
@click.argument("dispatch_ids", type=FuzzyIntRange(), nargs=-1) # Allow multiple IDs
538542
@click.pass_context
539543
async def delete(
540-
ctx: click.Context, microgrid_id: int, dispatch_ids: list[list[int]]
544+
ctx: click.Context, microgrid_id: MicrogridId, dispatch_ids: list[list[int]]
541545
) -> None:
542546
"""Delete multiple dispatches.
543547

src/frequenz/client/dispatch/_client.py

Lines changed: 18 additions & 12 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
)
@@ -114,7 +116,7 @@ def stub(self) -> dispatch_pb2_grpc.MicrogridDispatchServiceAsyncStub:
114116
# pylint: disable=too-many-arguments, too-many-locals
115117
async def list(
116118
self,
117-
microgrid_id: int,
119+
microgrid_id: MicrogridId,
118120
*,
119121
target_components: Iterator[TargetComponents] = iter(()),
120122
start_from: datetime | None = None,
@@ -185,7 +187,7 @@ def to_interval(
185187
)
186188

187189
request = ListMicrogridDispatchesRequest(
188-
microgrid_id=microgrid_id,
190+
microgrid_id=int(microgrid_id),
189191
filter=filters,
190192
pagination_params=(
191193
PaginationParams(page_size=page_size) if page_size else None
@@ -211,7 +213,7 @@ def to_interval(
211213
else:
212214
break
213215

214-
def stream(self, microgrid_id: int) -> channels.Receiver[DispatchEvent]:
216+
def stream(self, microgrid_id: MicrogridId) -> channels.Receiver[DispatchEvent]:
215217
"""Receive a stream of dispatch events.
216218
217219
This function returns a receiver channel that can be used to receive
@@ -238,15 +240,15 @@ def stream(self, microgrid_id: int) -> channels.Receiver[DispatchEvent]:
238240
return self._get_stream(microgrid_id).new_receiver()
239241

240242
def _get_stream(
241-
self, microgrid_id: int
243+
self, microgrid_id: MicrogridId
242244
) -> GrpcStreamBroadcaster[StreamMicrogridDispatchesResponse, DispatchEvent]:
243245
"""Get an instance to the streaming helper."""
244246
broadcaster = self._streams.get(microgrid_id)
245247
if broadcaster is not None and not broadcaster.is_running:
246248
del self._streams[microgrid_id]
247249
broadcaster = None
248250
if broadcaster is None:
249-
request = StreamMicrogridDispatchesRequest(microgrid_id=microgrid_id)
251+
request = StreamMicrogridDispatchesRequest(microgrid_id=int(microgrid_id))
250252
broadcaster = GrpcStreamBroadcaster(
251253
stream_name="StreamMicrogridDispatches",
252254
stream_method=lambda: cast(
@@ -266,7 +268,7 @@ def _get_stream(
266268

267269
async def create( # pylint: disable=too-many-positional-arguments
268270
self,
269-
microgrid_id: int,
271+
microgrid_id: MicrogridId,
270272
type: str, # pylint: disable=redefined-builtin
271273
start_time: datetime | Literal["NOW"],
272274
duration: timedelta | None,
@@ -334,8 +336,8 @@ async def create( # pylint: disable=too-many-positional-arguments
334336
async def update(
335337
self,
336338
*,
337-
microgrid_id: int,
338-
dispatch_id: int,
339+
microgrid_id: MicrogridId,
340+
dispatch_id: DispatchId,
339341
new_fields: dict[str, Any],
340342
) -> Dispatch:
341343
"""Update a dispatch.
@@ -423,7 +425,9 @@ async def update(
423425

424426
return Dispatch.from_protobuf(response.dispatch)
425427

426-
async def get(self, *, microgrid_id: int, dispatch_id: int) -> Dispatch:
428+
async def get(
429+
self, *, microgrid_id: MicrogridId, dispatch_id: DispatchId
430+
) -> Dispatch:
427431
"""Get a dispatch.
428432
429433
Args:
@@ -434,7 +438,7 @@ async def get(self, *, microgrid_id: int, dispatch_id: int) -> Dispatch:
434438
Dispatch: The dispatch.
435439
"""
436440
request = GetMicrogridDispatchRequest(
437-
dispatch_id=dispatch_id, microgrid_id=microgrid_id
441+
dispatch_id=int(dispatch_id), microgrid_id=int(microgrid_id)
438442
)
439443
response = await cast(
440444
Awaitable[GetMicrogridDispatchResponse],
@@ -444,15 +448,17 @@ async def get(self, *, microgrid_id: int, dispatch_id: int) -> Dispatch:
444448
)
445449
return Dispatch.from_protobuf(response.dispatch)
446450

447-
async def delete(self, *, microgrid_id: int, dispatch_id: int) -> None:
451+
async def delete(
452+
self, *, microgrid_id: MicrogridId, dispatch_id: DispatchId
453+
) -> None:
448454
"""Delete a dispatch.
449455
450456
Args:
451457
microgrid_id: The microgrid_id to delete the dispatch for.
452458
dispatch_id: The dispatch_id to delete.
453459
"""
454460
request = DeleteMicrogridDispatchRequest(
455-
dispatch_id=dispatch_id, microgrid_id=microgrid_id
461+
dispatch_id=int(dispatch_id), microgrid_id=int(microgrid_id)
456462
)
457463
await cast(
458464
Awaitable[None],

src/frequenz/client/dispatch/_internal_types.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@
1212
from frequenz.api.dispatch.v1.dispatch_pb2 import (
1313
CreateMicrogridDispatchRequest as PBDispatchCreateRequest,
1414
)
15-
from frequenz.api.dispatch.v1.dispatch_pb2 import (
16-
DispatchData,
17-
)
15+
from frequenz.api.dispatch.v1.dispatch_pb2 import DispatchData
1816
from google.protobuf.json_format import MessageToDict
1917
from google.protobuf.struct_pb2 import Struct
2018
from google.protobuf.timestamp_pb2 import Timestamp
2119

2220
from frequenz.client.base.conversion import to_datetime, to_timestamp
21+
from frequenz.client.common.microgrid import MicrogridId
2322

2423
from .recurrence import RecurrenceRule
2524
from .types import (
@@ -36,7 +35,7 @@
3635
class DispatchCreateRequest:
3736
"""Request to create a new dispatch."""
3837

39-
microgrid_id: int
38+
microgrid_id: MicrogridId
4039
"""The identifier of the microgrid to which this dispatch belongs."""
4140

4241
type: str
@@ -93,7 +92,7 @@ def from_protobuf(
9392
)
9493

9594
return DispatchCreateRequest(
96-
microgrid_id=pb_object.microgrid_id,
95+
microgrid_id=MicrogridId(pb_object.microgrid_id),
9796
type=pb_object.dispatch_data.type,
9897
start_time=(
9998
"NOW"
@@ -118,7 +117,7 @@ def to_protobuf(self) -> PBDispatchCreateRequest:
118117
payload.update(self.payload)
119118

120119
return PBDispatchCreateRequest(
121-
microgrid_id=self.microgrid_id,
120+
microgrid_id=int(self.microgrid_id),
122121
dispatch_data=DispatchData(
123122
type=self.type,
124123
start_time=(

src/frequenz/client/dispatch/test/_service.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
# pylint: enable=no-name-in-module
3737
from frequenz.client.base.conversion import to_datetime as _to_dt
38+
from frequenz.client.common.microgrid import MicrogridId
3839

3940
from .._internal_types import DispatchCreateRequest
4041
from ..types import Dispatch, DispatchEvent, Event
@@ -53,7 +54,7 @@ class FakeService:
5354
class StreamEvent:
5455
"""Event for the stream."""
5556

56-
microgrid_id: int
57+
microgrid_id: MicrogridId
5758
"""The microgrid id."""
5859

5960
event: DispatchEvent
@@ -66,7 +67,7 @@ def __init__(self) -> None:
6667
)
6768
self._stream_sender = self._stream_channel.new_sender()
6869

69-
self.dispatches: dict[int, list[Dispatch]] = {}
70+
self.dispatches: dict[MicrogridId, list[Dispatch]] = {}
7071
"""List of dispatches per microgrid."""
7172

7273
self._last_id: int = 0
@@ -129,7 +130,7 @@ async def ListMicrogridDispatches(
129130
"""
130131
self._check_access(metadata)
131132

132-
grid_dispatches = self.dispatches.get(request.microgrid_id, [])
133+
grid_dispatches = self.dispatches.get(MicrogridId(request.microgrid_id), [])
133134

134135
return ListMicrogridDispatchesResponse(
135136
dispatches=map(
@@ -312,9 +313,9 @@ async def UpdateMicrogridDispatch(
312313
| "bymonthdays"
313314
| "bymonths"
314315
):
315-
getattr(pb_dispatch.data.recurrence, split_path[1])[:] = (
316-
getattr(request.update.recurrence, split_path[1])[:]
317-
)
316+
getattr(pb_dispatch.data.recurrence, split_path[1])[
317+
:
318+
] = getattr(request.update.recurrence, split_path[1])[:]
318319

319320
dispatch = Dispatch.from_protobuf(pb_dispatch)
320321
dispatch = replace(

src/frequenz/client/dispatch/test/client.py

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

66
from typing import Any
77

8+
from frequenz.client.common.microgrid import MicrogridId
9+
810
from .. import DispatchApiClient
911
from ..types import Dispatch
1012
from ._service import ALL_KEY, NONE_KEY, FakeService
@@ -34,7 +36,7 @@ def stub(self) -> FakeService: # type: ignore
3436
"""
3537
return self._stuba
3638

37-
def dispatches(self, microgrid_id: int) -> list[Dispatch]:
39+
def dispatches(self, microgrid_id: MicrogridId) -> list[Dispatch]:
3840
"""List of dispatches.
3941
4042
Args:
@@ -45,7 +47,7 @@ def dispatches(self, microgrid_id: int) -> list[Dispatch]:
4547
"""
4648
return self._service.dispatches.get(microgrid_id, [])
4749

48-
def set_dispatches(self, microgrid_id: int, value: list[Dispatch]) -> None:
50+
def set_dispatches(self, microgrid_id: MicrogridId, value: list[Dispatch]) -> None:
4951
"""Set the list of dispatches.
5052
5153
Args:
@@ -74,7 +76,7 @@ def _service(self) -> FakeService:
7476
return self._stuba
7577

7678

77-
def to_create_params(microgrid_id: int, dispatch: Dispatch) -> dict[str, Any]:
79+
def to_create_params(microgrid_id: MicrogridId, dispatch: Dispatch) -> dict[str, Any]:
7880
"""Convert a dispatch to client.create parameters.
7981
8082
Args:

src/frequenz/client/dispatch/test/generator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from ..types import (
1414
BatteryType,
1515
Dispatch,
16+
DispatchId,
1617
EvChargerType,
1718
InverterType,
1819
TargetCategories,
@@ -122,7 +123,7 @@ def generate_dispatch(self) -> Dispatch:
122123
]
123124

124125
return Dispatch(
125-
id=self._last_id,
126+
id=DispatchId(self._last_id),
126127
create_time=create_time,
127128
update_time=create_time + timedelta(seconds=self._rng.randint(0, 1000000)),
128129
type=str(self._rng.randint(0, 100_000)),

src/frequenz/client/dispatch/types.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from dataclasses import dataclass
88
from datetime import datetime, timedelta, timezone
99
from enum import Enum
10-
from typing import Any, Self, SupportsInt, TypeAlias, cast
10+
from typing import Any, Self, SupportsInt, TypeAlias, cast, final
1111

1212
# pylint: enable=no-name-in-module
1313
from frequenz.api.common.v1.microgrid.components.battery_pb2 import (
@@ -28,6 +28,7 @@
2828
StreamMicrogridDispatchesResponse,
2929
)
3030
from frequenz.api.dispatch.v1.dispatch_pb2 import TargetComponents as PBTargetComponents
31+
from frequenz.core.id import BaseId
3132
from google.protobuf.json_format import MessageToDict
3233
from google.protobuf.struct_pb2 import Struct
3334

@@ -37,6 +38,11 @@
3738
from .recurrence import Frequency, RecurrenceRule, Weekday
3839

3940

41+
@final
42+
class DispatchId(BaseId, str_prefix="DID"):
43+
"""A unique identifier for a microgrid."""
44+
45+
4046
class EvChargerType(Enum):
4147
"""Enum representing the type of EV charger."""
4248

@@ -359,7 +365,7 @@ class TimeIntervalFilter:
359365
class Dispatch: # pylint: disable=too-many-instance-attributes
360366
"""Represents a dispatch operation within a microgrid system."""
361367

362-
id: int
368+
id: DispatchId
363369
"""The unique identifier for the dispatch."""
364370

365371
type: str
@@ -534,7 +540,7 @@ def from_protobuf(cls, pb_object: PBDispatch) -> "Dispatch":
534540
The converted dispatch.
535541
"""
536542
return Dispatch(
537-
id=pb_object.metadata.dispatch_id,
543+
id=DispatchId(pb_object.metadata.dispatch_id),
538544
type=pb_object.data.type,
539545
create_time=to_datetime(pb_object.metadata.create_time),
540546
update_time=to_datetime(pb_object.metadata.update_time),
@@ -567,7 +573,7 @@ def to_protobuf(self) -> PBDispatch:
567573

568574
return PBDispatch(
569575
metadata=DispatchMetadata(
570-
dispatch_id=self.id,
576+
dispatch_id=int(self.id),
571577
create_time=to_timestamp(self.create_time),
572578
update_time=to_timestamp(self.update_time),
573579
end_time=(

0 commit comments

Comments
 (0)