diff --git a/src/frequenz/channels/_latest_value_cache.py b/src/frequenz/channels/_latest_value_cache.py index fa04355b..a9ddd364 100644 --- a/src/frequenz/channels/_latest_value_cache.py +++ b/src/frequenz/channels/_latest_value_cache.py @@ -44,6 +44,7 @@ import asyncio import typing +from collections.abc import Set from ._receiver import Receiver @@ -145,6 +146,13 @@ def unique_id(self) -> str: """The unique identifier of this instance.""" return self._unique_id + def keys(self) -> Set[HashableT]: + """Return the set of keys for which values have been received. + + If no key function is provided, this will return an empty set. + """ + return self._latest_value_by_key.keys() + def get(self, key: HashableT | Sentinel = NO_KEY) -> T_co: """Return the latest value that has been received. diff --git a/tests/test_latest_value_cache_integration.py b/tests/test_latest_value_cache_integration.py index 97020c42..46cef2c4 100644 --- a/tests/test_latest_value_cache_integration.py +++ b/tests/test_latest_value_cache_integration.py @@ -44,6 +44,8 @@ async def test_latest_value_cache() -> None: assert cache.get() == 19 + assert cache.keys() == set() + @pytest.mark.integration async def test_latest_value_cache_key() -> None: @@ -59,6 +61,8 @@ async def test_latest_value_cache_key() -> None: with pytest.raises(ValueError, match="No value received for key: 0"): cache.get(0) + assert cache.keys() == set() + await sender.send((5, "a")) await sender.send((6, "b")) await sender.send((5, "c")) @@ -73,6 +77,8 @@ async def test_latest_value_cache_key() -> None: assert cache.get(5) == (5, "c") assert cache.get(6) == (6, "b") + assert cache.keys() == {5, 6} + with pytest.raises(ValueError, match="No value received for key: 7"): cache.get(7) @@ -92,3 +98,5 @@ async def test_latest_value_cache_key() -> None: await asyncio.sleep(0) assert cache.get(6) == (6, "g") + + assert cache.keys() == {5, 6, 12}