Skip to content

Commit 11f5103

Browse files
committed
feat: wire OverkizClientSettings into OverkizClient constructor (#766)
Replace the standalone `action_queue` parameter with `settings: OverkizClientSettings | None` to consolidate all behavioral configuration into a single entry point. This is a v2 breaking change.
1 parent 0753f1b commit 11f5103

3 files changed

Lines changed: 55 additions & 24 deletions

File tree

pyoverkiz/client.py

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121
from backoff.types import Details
2222

2323
from pyoverkiz._case import decamelize
24-
from pyoverkiz.action_queue import ActionQueue, ActionQueueSettings
24+
from pyoverkiz.action_queue import ActionQueue
2525
from pyoverkiz.auth import AuthStrategy, Credentials, build_auth_strategy
26+
from pyoverkiz.client_settings import OverkizClientSettings
2627
from pyoverkiz.const import SUPPORTED_SERVERS
2728
from pyoverkiz.converter import converter
2829
from pyoverkiz.enums import APIType, ExecutionMode, Server
@@ -172,6 +173,7 @@ class OverkizClient:
172173
_ssl: ssl.SSLContext | bool = True
173174
_auth: AuthStrategy
174175
_action_queue: ActionQueue | None = None
176+
_rts_command_duration: int | None = None
175177

176178
def __init__(
177179
self,
@@ -180,15 +182,15 @@ def __init__(
180182
credentials: Credentials,
181183
verify_ssl: bool = True,
182184
session: ClientSession | None = None,
183-
action_queue: bool | ActionQueueSettings = False,
185+
settings: OverkizClientSettings | None = None,
184186
) -> None:
185187
"""Constructor.
186188
187189
:param server: ServerConfig
188190
:param credentials: Credentials for authentication
189191
:param verify_ssl: Enable SSL certificate verification
190192
:param session: optional ClientSession
191-
:param action_queue: enable batching or provide queue settings (default False)
193+
:param settings: behavioral settings for the client (default None)
192194
"""
193195
self.server_config = self._normalize_server(server)
194196

@@ -206,23 +208,15 @@ def __init__(
206208
# Use the prebuilt SSL context with disabled strict validation for local API.
207209
self._ssl = SSL_CONTEXT_LOCAL_API
208210

209-
# Initialize action queue if enabled
210-
queue_settings: ActionQueueSettings | None
211-
if isinstance(action_queue, ActionQueueSettings):
212-
queue_settings = action_queue
213-
elif isinstance(action_queue, bool):
214-
queue_settings = ActionQueueSettings() if action_queue else None
215-
else:
216-
raise TypeError(
217-
"action_queue must be a bool or ActionQueueSettings, "
218-
f"got {type(action_queue).__name__}"
219-
)
211+
# Apply behavioral settings
212+
resolved_settings = settings or OverkizClientSettings()
213+
self._rts_command_duration = resolved_settings.rts_command_duration
220214

221-
if queue_settings:
222-
queue_settings.validate()
215+
if resolved_settings.action_queue:
216+
resolved_settings.action_queue.validate()
223217
self._action_queue = ActionQueue(
224218
executor=self._execute_action_group_direct,
225-
settings=queue_settings,
219+
settings=resolved_settings.action_queue,
226220
)
227221

228222
self._auth = build_auth_strategy(

tests/test_client.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@
1010
import pytest
1111

1212
from pyoverkiz import exceptions
13+
from pyoverkiz.action_queue import ActionQueueSettings
14+
from pyoverkiz.auth import UsernamePasswordCredentials
1315
from pyoverkiz.client import OverkizClient
16+
from pyoverkiz.client_settings import OverkizClientSettings
1417
from pyoverkiz.enums import (
1518
APIType,
1619
DataType,
1720
ExecutionState,
1821
ExecutionSubType,
1922
ExecutionType,
23+
Server,
2024
)
2125
from pyoverkiz.models import (
2226
Action,
@@ -1203,3 +1207,32 @@ async def test_local_schedule_persisted_action_group_unknown_object(
12031207
await local_client.schedule_persisted_action_group(
12041208
"00000000-0000-0000-0000-000000000000", 9999999999
12051209
)
1210+
1211+
1212+
class TestOverkizClientSettings:
1213+
"""Tests for the OverkizClientSettings integration with OverkizClient."""
1214+
1215+
def test_client_with_settings_none(self, client: OverkizClient) -> None:
1216+
"""Client without settings has no action queue and no RTS duration."""
1217+
assert client._action_queue is None
1218+
assert client._rts_command_duration is None
1219+
1220+
@pytest.mark.asyncio
1221+
async def test_client_with_rts_duration(self) -> None:
1222+
"""Client stores RTS command duration from settings."""
1223+
client = OverkizClient(
1224+
server=Server.SOMFY_EUROPE,
1225+
credentials=UsernamePasswordCredentials("user", "pass"),
1226+
settings=OverkizClientSettings(rts_command_duration=0),
1227+
)
1228+
assert client._rts_command_duration == 0
1229+
1230+
@pytest.mark.asyncio
1231+
async def test_client_with_action_queue_via_settings(self) -> None:
1232+
"""Client creates action queue from settings."""
1233+
client = OverkizClient(
1234+
server=Server.SOMFY_EUROPE,
1235+
credentials=UsernamePasswordCredentials("user", "pass"),
1236+
settings=OverkizClientSettings(action_queue=ActionQueueSettings()),
1237+
)
1238+
assert client._action_queue is not None

tests/test_client_queue_integration.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from pyoverkiz.action_queue import ActionQueueSettings
99
from pyoverkiz.auth import UsernamePasswordCredentials
1010
from pyoverkiz.client import OverkizClient
11+
from pyoverkiz.client_settings import OverkizClientSettings
1112
from pyoverkiz.enums import OverkizCommand, Server
1213
from pyoverkiz.models import Action, Command
1314

@@ -18,7 +19,6 @@ async def test_client_without_queue_executes_immediately():
1819
client = OverkizClient(
1920
server=Server.SOMFY_EUROPE,
2021
credentials=UsernamePasswordCredentials("test@example.com", "test"),
21-
action_queue=False,
2222
)
2323

2424
action = Action(
@@ -48,7 +48,7 @@ async def test_client_with_queue_batches_actions():
4848
client = OverkizClient(
4949
server=Server.SOMFY_EUROPE,
5050
credentials=UsernamePasswordCredentials("test@example.com", "test"),
51-
action_queue=ActionQueueSettings(delay=0.1),
51+
settings=OverkizClientSettings(action_queue=ActionQueueSettings(delay=0.1)),
5252
)
5353

5454
actions = [
@@ -98,7 +98,9 @@ async def test_client_manual_flush():
9898
client = OverkizClient(
9999
server=Server.SOMFY_EUROPE,
100100
credentials=UsernamePasswordCredentials("test@example.com", "test"),
101-
action_queue=ActionQueueSettings(delay=10.0), # Long delay
101+
settings=OverkizClientSettings(
102+
action_queue=ActionQueueSettings(delay=10.0)
103+
), # Long delay
102104
)
103105

104106
action = Action(
@@ -138,7 +140,7 @@ async def test_client_close_flushes_queue():
138140
client = OverkizClient(
139141
server=Server.SOMFY_EUROPE,
140142
credentials=UsernamePasswordCredentials("test@example.com", "test"),
141-
action_queue=ActionQueueSettings(delay=10.0),
143+
settings=OverkizClientSettings(action_queue=ActionQueueSettings(delay=10.0)),
142144
)
143145

144146
action = Action(
@@ -171,9 +173,11 @@ async def test_client_queue_respects_max_actions():
171173
client = OverkizClient(
172174
server=Server.SOMFY_EUROPE,
173175
credentials=UsernamePasswordCredentials("test@example.com", "test"),
174-
action_queue=ActionQueueSettings(
175-
delay=10.0,
176-
max_actions=2, # Max 2 actions
176+
settings=OverkizClientSettings(
177+
action_queue=ActionQueueSettings(
178+
delay=10.0,
179+
max_actions=2, # Max 2 actions
180+
),
177181
),
178182
)
179183

0 commit comments

Comments
 (0)