Skip to content

Commit 174be10

Browse files
committed
feat(http-api): Make list_rules an async generator
1 parent 04f7fbd commit 174be10

3 files changed

Lines changed: 15 additions & 7 deletions

File tree

src/enapter/cli/http/api/rule_list_command.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ def register(parent: cli.Subparsers) -> None:
2121
async def run(args: argparse.Namespace) -> None:
2222
"""Run the command."""
2323
async with http.api.Client(http.api.Config.from_env()) as client:
24-
rules = await client.rule_engine.list_rules(site_id=args.site_id)
25-
for rule in rules:
26-
print(json.dumps(rule.to_dto()))
24+
async with client.rule_engine.list_rules(site_id=args.site_id) as stream:
25+
async for rule in stream:
26+
print(json.dumps(rule.to_dto()))

src/enapter/http/api/rule_engine/client.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
"""Rule Engine HTTP API client."""
22

33
import time
4-
from typing import Any, Callable
4+
from typing import Any, AsyncGenerator, Callable
55

66
import httpx
77

8+
from enapter import async_
89
from enapter.http import api
910

1011
from .engine import Engine
@@ -45,12 +46,16 @@ async def resume(self, site_id: str | None = None) -> Engine:
4546
await api.check_error(response)
4647
return Engine.from_dto(response.json()["engine"])
4748

48-
async def list_rules(self, site_id: str | None = None) -> list[Rule]:
49+
@async_.generator
50+
async def list_rules(
51+
self, site_id: str | None = None
52+
) -> AsyncGenerator[Rule, None]:
4953
"""List all rules."""
5054
url = f"{self._url(site_id)}/rules"
5155
response = await self._client.get(url)
5256
await api.check_error(response)
53-
return [Rule.from_dto(dto) for dto in response.json()["rules"]]
57+
for dto in response.json()["rules"]:
58+
yield Rule.from_dto(dto)
5459

5560
async def get_rule(self, rule_id: str, site_id: str | None = None) -> Rule:
5661
"""Get a single rule."""

tests/unit/test_http/test_api/test_rule_engine/test_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,10 @@ async def test_list_rules(client, mock_httpx_client):
113113
}
114114
mock_httpx_client.get = AsyncMock(return_value=mock_response)
115115

116-
rules = await client.list_rules(site_id="site_123")
116+
rules = []
117+
async with client.list_rules(site_id="site_123") as stream:
118+
async for rule in stream:
119+
rules.append(rule)
117120

118121
assert len(rules) == 2
119122
assert rules[0].id == "rule_1"

0 commit comments

Comments
 (0)