Skip to content

Commit 97da4db

Browse files
authored
Switch to the LatestValueCache from the channels package (#1002)
2 parents 7b236d2 + 54ed0d0 commit 97da4db

File tree

6 files changed

+12
-92
lines changed

6 files changed

+12
-92
lines changed

src/frequenz/sdk/_internal/_channels.py

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,10 @@
44
"""General purpose classes for use with channels."""
55

66
import abc
7-
import asyncio
87
import typing
98

109
from frequenz.channels import Receiver
1110

12-
from ._asyncio import cancel_and_await
13-
1411
T_co = typing.TypeVar("T_co", covariant=True)
1512
U_co = typing.TypeVar("U_co", covariant=True)
1613

@@ -58,82 +55,3 @@ def new_receiver(self, *, limit: int = 50) -> Receiver[U_co]:
5855
A receiver instance.
5956
"""
6057
return self._mapping_function(self._fetcher.new_receiver(limit=limit))
61-
62-
63-
class _Sentinel:
64-
"""A sentinel to denote that no value has been received yet."""
65-
66-
def __str__(self) -> str:
67-
"""Return a string representation of this sentinel."""
68-
return "<no value received yet>"
69-
70-
71-
class LatestValueCache(typing.Generic[T_co]):
72-
"""A cache that stores the latest value in a receiver."""
73-
74-
def __init__(
75-
self, receiver: Receiver[T_co], *, unique_id: str | None = None
76-
) -> None:
77-
"""Create a new cache.
78-
79-
Args:
80-
receiver: The receiver to cache.
81-
unique_id: A string to help uniquely identify this instance. If not
82-
provided, a unique identifier will be generated from the object's
83-
[`id()`][]. It is used mostly for debugging purposes.
84-
"""
85-
self._receiver = receiver
86-
self._unique_id: str = hex(id(self)) if unique_id is None else unique_id
87-
self._latest_value: T_co | _Sentinel = _Sentinel()
88-
self._task = asyncio.create_task(
89-
self._run(), name=f"LatestValueCache«{self._unique_id}»"
90-
)
91-
92-
@property
93-
def unique_id(self) -> str:
94-
"""The unique identifier of this instance."""
95-
return self._unique_id
96-
97-
def get(self) -> T_co:
98-
"""Return the latest value that has been received.
99-
100-
This raises a `ValueError` if no value has been received yet. Use `has_value` to
101-
check whether a value has been received yet, before trying to access the value,
102-
to avoid the exception.
103-
104-
Returns:
105-
The latest value that has been received.
106-
107-
Raises:
108-
ValueError: If no value has been received yet.
109-
"""
110-
if isinstance(self._latest_value, _Sentinel):
111-
raise ValueError("No value has been received yet.")
112-
return self._latest_value
113-
114-
def has_value(self) -> bool:
115-
"""Check whether a value has been received yet.
116-
117-
Returns:
118-
`True` if a value has been received, `False` otherwise.
119-
"""
120-
return not isinstance(self._latest_value, _Sentinel)
121-
122-
async def _run(self) -> None:
123-
async for value in self._receiver:
124-
self._latest_value = value
125-
126-
async def stop(self) -> None:
127-
"""Stop the cache."""
128-
await cancel_and_await(self._task)
129-
130-
def __repr__(self) -> str:
131-
"""Return a string representation of this cache."""
132-
return (
133-
f"<LatestValueCache latest_value={self._latest_value!r}, "
134-
f"receiver={self._receiver!r}, unique_id={self._unique_id!r}>"
135-
)
136-
137-
def __str__(self) -> str:
138-
"""Return the last value seen by this cache."""
139-
return str(self._latest_value)

src/frequenz/sdk/actor/power_distributing/_component_managers/_battery_manager.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import typing
1111
from datetime import timedelta
1212

13-
from frequenz.channels import Receiver, Sender
13+
from frequenz.channels import LatestValueCache, Receiver, Sender
1414
from frequenz.client.microgrid import (
1515
BatteryData,
1616
ClientError,
@@ -21,7 +21,6 @@
2121
from typing_extensions import override
2222

2323
from .... import microgrid
24-
from ...._internal._channels import LatestValueCache
2524
from ...._internal._math import is_close_to_zero
2625
from ....microgrid import connection_manager
2726
from ....timeseries._quantities import Power

src/frequenz/sdk/actor/power_distributing/_component_managers/_ev_charger_manager/_ev_charger_manager.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,14 @@
88
import logging
99
from datetime import datetime, timedelta, timezone
1010

11-
from frequenz.channels import Broadcast, Sender, merge, select, selected_from
11+
from frequenz.channels import (
12+
Broadcast,
13+
LatestValueCache,
14+
Sender,
15+
merge,
16+
select,
17+
selected_from,
18+
)
1219
from frequenz.client.microgrid import (
1320
ApiClient,
1421
ClientError,
@@ -19,7 +26,6 @@
1926

2027
from frequenz.sdk import microgrid
2128

22-
from ....._internal._channels import LatestValueCache
2329
from ....._internal._math import is_close_to_zero
2430
from .....timeseries import Power, Sample3Phase, Voltage
2531
from ..._component_pool_status_tracker import ComponentPoolStatusTracker

src/frequenz/sdk/actor/power_distributing/_component_managers/_pv_inverter_manager/_pv_inverter_manager.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import logging
99
from datetime import timedelta
1010

11-
from frequenz.channels import Broadcast, Sender
11+
from frequenz.channels import Broadcast, LatestValueCache, Sender
1212
from frequenz.client.microgrid import (
1313
ClientError,
1414
ComponentCategory,
@@ -17,7 +17,6 @@
1717
)
1818
from typing_extensions import override
1919

20-
from ....._internal._channels import LatestValueCache
2120
from ....._internal._math import is_close_to_zero
2221
from .....microgrid import connection_manager
2322
from .....timeseries import Power

src/frequenz/sdk/timeseries/ev_charger_pool/_set_current_bounds.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@
88
from dataclasses import dataclass
99
from datetime import timedelta
1010

11-
from frequenz.channels import Broadcast, Sender, select, selected_from
11+
from frequenz.channels import Broadcast, LatestValueCache, Sender, select, selected_from
1212
from frequenz.channels.timer import SkipMissedAndDrift, Timer
1313
from frequenz.client.microgrid import ComponentCategory, MeterData
1414

1515
from ..._internal._asyncio import cancel_and_await
16-
from ..._internal._channels import LatestValueCache
1716
from ...microgrid import connection_manager
1817

1918
_logger = logging.getLogger(__name__)

tests/timeseries/_battery_pool/test_battery_pool_control_methods.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@
1010
from unittest.mock import AsyncMock, MagicMock
1111

1212
import pytest
13-
from frequenz.channels import Sender
13+
from frequenz.channels import LatestValueCache, Sender
1414
from pytest_mock import MockerFixture
1515

1616
from frequenz.sdk import microgrid, timeseries
17-
from frequenz.sdk._internal._channels import LatestValueCache
1817
from frequenz.sdk.actor import ResamplerConfig, power_distributing
1918
from frequenz.sdk.actor.power_distributing import ComponentPoolStatus
2019
from frequenz.sdk.actor.power_distributing._component_pool_status_tracker import (

0 commit comments

Comments
 (0)