Skip to content

Commit 020e625

Browse files
authored
Update frequenz dependencies (#23)
2 parents e6bb87f + 4dc8b0f commit 020e625

File tree

5 files changed

+45
-54
lines changed

5 files changed

+45
-54
lines changed

mkdocs.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ plugins:
114114
import:
115115
# See https://mkdocstrings.github.io/python/usage/#import for details
116116
- https://docs.python.org/3/objects.inv
117-
- https://frequenz-floss.github.io/frequenz-channels-python/v0.16/objects.inv
118-
- https://frequenz-floss.github.io/frequenz-client-dispatch-python/v0.1/objects.inv
117+
- https://frequenz-floss.github.io/frequenz-channels-python/v1.0/objects.inv
118+
- https://frequenz-floss.github.io/frequenz-client-dispatch-python/v0.2/objects.inv
119119
- https://frequenz-floss.github.io/frequenz-sdk-python/v1.0-pre/objects.inv
120120
- https://grpc.github.io/grpc/python/objects.inv
121121
- https://typing-extensions.readthedocs.io/en/stable/objects.inv

pyproject.toml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,12 @@ dependencies = [
3131
# Make sure to update the version for cross-referencing also in the
3232
# mkdocs.yml file when changing the version here (look for the config key
3333
# plugins.mkdocstrings.handlers.python.import)
34-
"frequenz-sdk == v1.0.0-rc5",
35-
"frequenz-channels == 1.0.0b2",
36-
"frequenz-dispatch-client @ git+https://github.com/frequenz-floss/frequenz-client-dispatch-python.git@00dcb3c",
37-
"frequenz-api-dispatch @ git+https://github.com/frequenz-floss/frequenz-api-dispatch.git@223315c",
38-
# "frequenz-api-dispatch >= 0.13.0, < 0.14",
39-
"frequenz-client-base >= 0.2.1, < 0.4.0",
40-
# Directly use unreleased commit until the first release
41-
"frequenz-client-common @ git+https://github.com/frequenz-floss/frequenz-client-common-python.git@5e6e7b7",
34+
"frequenz-sdk == v1.0.0-rc6",
35+
"frequenz-channels == 1.0.0",
36+
"frequenz-api-dispatch >= 0.13.0, < 0.14",
37+
"frequenz-client-dispatch == 0.2.0",
38+
"frequenz-client-base >= 0.3.0, < 0.4.0",
39+
"frequenz-client-common >= 0.1.0, < 0.2.0",
4240
]
4341
dynamic = ["version"]
4442

@@ -90,6 +88,8 @@ dev-pytest = [
9088
"pytest-asyncio == 0.23.6",
9189
"async-solipsism == 0.6",
9290
"time-machine == 2.14.1",
91+
# Currently pinned due to v6.1.0 breaking our code
92+
"sybil == 6.0.3",
9393
]
9494
dev = [
9595
"frequenz-dispatch[dev-mkdocs,dev-flake8,dev-formatting,dev-mkdocs,dev-mypy,dev-noxfile,dev-pylint,dev-pytest]",

src/frequenz/dispatch/_dispatcher.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,22 @@
1313
from frequenz.dispatch._event import DispatchEvent
1414
from frequenz.dispatch.actor import DispatchingActor
1515

16-
ReceivedT = TypeVar("ReceivedT")
16+
ReceivedT_co = TypeVar("ReceivedT_co", covariant=True)
1717
"""The type being received."""
1818

1919

20-
class ReceiverFetcher(Protocol[ReceivedT]):
20+
class ReceiverFetcher(Protocol[ReceivedT_co]):
2121
"""An interface that just exposes a `new_receiver` method."""
2222

2323
@abc.abstractmethod
2424
def new_receiver(
25-
self, name: str | None = None, maxsize: int = 50
26-
) -> Receiver[ReceivedT]:
25+
self, *, name: str | None = None, limit: int = 50
26+
) -> Receiver[ReceivedT_co]:
2727
"""Get a receiver from the channel.
2828
2929
Args:
3030
name: A name to identify the receiver in the logs.
31-
maxsize: The maximum size of the receiver.
31+
limit: The maximum size of the receiver.
3232
3333
Returns:
3434
A receiver instance.
@@ -107,8 +107,8 @@ def __init__(
107107
grpc_channel: The gRPC channel.
108108
svc_addr: The service address.
109109
"""
110-
self._ready_channel = Broadcast[Dispatch]("ready_dispatches")
111-
self._updated_channel = Broadcast[DispatchEvent]("new_dispatches")
110+
self._ready_channel = Broadcast[Dispatch](name="ready_dispatches")
111+
self._updated_channel = Broadcast[DispatchEvent](name="new_dispatches")
112112
self._actor = DispatchingActor(
113113
microgrid_id,
114114
grpc_channel,

src/frequenz/dispatch/actor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import grpc.aio
1212
from dateutil import rrule
1313
from frequenz.channels import Sender
14-
from frequenz.channels.util import Timer
14+
from frequenz.channels.timer import SkipMissedAndDrift, Timer
1515
from frequenz.client.dispatch import Client
1616
from frequenz.client.dispatch.types import Dispatch, Frequency, Weekday
1717
from frequenz.sdk.actor import Actor
@@ -94,7 +94,7 @@ def __init__(
9494
self._microgrid_id = microgrid_id
9595
self._updated_dispatch_sender = updated_dispatch_sender
9696
self._ready_dispatch_sender = ready_dispatch_sender
97-
self._poll_timer = Timer.timeout(poll_interval)
97+
self._poll_timer = Timer(poll_interval, SkipMissedAndDrift())
9898

9999
async def _run(self) -> None:
100100
"""Run the actor."""

tests/test_frequenz_dispatch.py

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@
77
from dataclasses import dataclass, replace
88
from datetime import datetime, timedelta, timezone
99
from random import randint
10-
from typing import AsyncIterator, Iterator, TypeVar
10+
from typing import AsyncIterator, Iterator
1111
from unittest.mock import MagicMock
1212

1313
import async_solipsism
1414
import time_machine
1515
from frequenz.channels import Broadcast, Receiver
16-
from frequenz.channels._broadcast import Sender
1716
from frequenz.client.dispatch.test.client import FakeClient, to_create_params
1817
from frequenz.client.dispatch.test.generator import DispatchGenerator
1918
from frequenz.client.dispatch.types import Dispatch, Frequency
@@ -63,32 +62,16 @@ class ActorTestEnv:
6362
@fixture
6463
async def actor_env() -> AsyncIterator[ActorTestEnv]:
6564
"""Return an actor test environment."""
66-
T = TypeVar("T")
67-
68-
class YieldingSender(Sender[T]):
69-
"""A sender that yields after sending.
70-
71-
For testing we want to manipulate the time after a call to send.
72-
73-
The normal sender normally doesn't yield/await, robbing us of the
74-
opportunity to manipulate the time.
75-
"""
76-
77-
async def send(self, msg: T) -> None:
78-
"""Send the value and yield."""
79-
await super().send(msg)
80-
await asyncio.sleep(1)
81-
82-
updated_dispatches = Broadcast[DispatchEvent]("updated_dispatches")
83-
ready_dispatches = Broadcast[Dispatch]("ready_dispatches")
65+
updated_dispatches = Broadcast[DispatchEvent](name="updated_dispatches")
66+
ready_dispatches = Broadcast[Dispatch](name="ready_dispatches")
8467
microgrid_id = randint(1, 100)
8568

8669
actor = DispatchingActor(
8770
microgrid_id=microgrid_id,
8871
grpc_channel=MagicMock(),
8972
svc_addr="localhost",
90-
updated_dispatch_sender=YieldingSender(updated_dispatches),
91-
ready_dispatch_sender=YieldingSender(ready_dispatches),
73+
updated_dispatch_sender=updated_dispatches.new_sender(),
74+
ready_dispatch_sender=ready_dispatches.new_sender(),
9275
)
9376

9477
client = FakeClient()
@@ -144,9 +127,12 @@ async def _test_new_dispatch_created(
144127
case Deleted(dispatch) | Updated(dispatch):
145128
assert False, "Expected a created event"
146129
case Created(dispatch):
147-
sample.update_time = dispatch.update_time
148-
sample.create_time = dispatch.create_time
149-
sample.id = dispatch.id
130+
sample = replace(
131+
sample,
132+
update_time=dispatch.update_time,
133+
create_time=dispatch.create_time,
134+
id=dispatch.id,
135+
)
150136
assert dispatch == sample
151137

152138
return sample
@@ -159,16 +145,19 @@ async def test_existing_dispatch_updated(
159145
) -> None:
160146
"""Test that an existing dispatch is updated."""
161147
sample = generator.generate_dispatch(actor_env.microgrid_id)
162-
sample.active = False
163-
sample.recurrence.frequency = Frequency.DAILY
148+
sample = replace(
149+
sample,
150+
active=False,
151+
recurrence=replace(sample.recurrence, frequency=Frequency.DAILY),
152+
)
164153

165154
fake_time.shift(timedelta(seconds=1))
166155

167-
await _test_new_dispatch_created(actor_env, sample)
156+
sample = await _test_new_dispatch_created(actor_env, sample)
168157
fake_time.shift(timedelta(seconds=1))
169158

170159
await actor_env.client.update(
171-
sample.id,
160+
dispatch_id=sample.id,
172161
new_fields={
173162
"active": True,
174163
"recurrence.frequency": Frequency.UNSPECIFIED,
@@ -181,11 +170,13 @@ async def test_existing_dispatch_updated(
181170
case Created(dispatch) | Deleted(dispatch):
182171
assert False, "Expected an updated event"
183172
case Updated(dispatch):
184-
sample.update_time = dispatch.update_time
185-
sample.active = True
186-
sample.recurrence = replace(
187-
sample.recurrence, frequency=Frequency.UNSPECIFIED
173+
sample = replace(
174+
sample,
175+
active=True,
176+
recurrence=replace(sample.recurrence, frequency=Frequency.UNSPECIFIED),
177+
update_time=dispatch.update_time,
188178
)
179+
189180
assert dispatch == sample
190181

191182

@@ -197,7 +188,7 @@ async def test_existing_dispatch_deleted(
197188
"""Test that an existing dispatch is deleted."""
198189
sample = generator.generate_dispatch(actor_env.microgrid_id)
199190

200-
await _test_new_dispatch_created(actor_env, sample)
191+
sample = await _test_new_dispatch_created(actor_env, sample)
201192

202193
await actor_env.client.delete(sample.id)
203194
fake_time.shift(timedelta(seconds=1))
@@ -207,7 +198,7 @@ async def test_existing_dispatch_deleted(
207198
case Created(dispatch) | Updated(dispatch):
208199
assert False, "Expected a deleted event"
209200
case Deleted(dispatch):
210-
sample.create_time = dispatch.create_time
201+
sample = replace(sample, update_time=dispatch.update_time)
211202
assert dispatch == sample
212203

213204

0 commit comments

Comments
 (0)