Skip to content

Commit 8197735

Browse files
committed
chg: Improve use of models
1 parent d3b0db0 commit 8197735

5 files changed

Lines changed: 73 additions & 47 deletions

File tree

poetry.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pylookyloomonitoring/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def main() -> None:
2828
print(f'Unable to reach {client.root_url}. Is the server up?')
2929
sys.exit(1)
3030
if args.monitor_url:
31-
response = client.monitor({'url': args.monitor_url, 'listing': False}, frequency='hourly')
31+
response = client.monitor(capture_settings={'url': args.monitor_url, 'listing': False}, frequency='hourly')
3232
else:
3333
response = client.changes(args.compare)
3434
print(json.dumps(response, indent=2))

pylookyloomonitoring/api.py

Lines changed: 60 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from importlib.metadata import version
88
from datetime import datetime
99
from pathlib import Path
10-
from typing import TypedDict, Any
10+
from typing import TypedDict, Any, overload
1111
from urllib.parse import urljoin, urlparse
1212

1313
import requests
@@ -127,7 +127,7 @@ def settings_monitor(self, uuid: str) -> MonitorCaptureSettings:
127127
:param uuid: The UUID we want the settings of.
128128
"""
129129
r = self.session.get(urljoin(self.root_url, str(Path('settings_monitor', uuid))))
130-
return MonitorCaptureSettings(**r.json())
130+
return MonitorCaptureSettings.model_validate(r.json())
131131

132132
def stop_monitor(self, uuid: str) -> bool | dict[str, str]:
133133
"""Stop monitoring a specific capture
@@ -170,17 +170,17 @@ def update_monitor(self, monitor_uuid: str, *,
170170
_comp_s: CompareSettings | None
171171
_ns: NotificationSettings | None
172172
if isinstance(capture_settings, dict):
173-
_cs = LookylooCaptureSettings(**capture_settings)
173+
_cs = LookylooCaptureSettings.model_validate(capture_settings)
174174
else:
175175
_cs = capture_settings
176176

177177
if isinstance(compare_settings, dict):
178-
_comp_s = CompareSettings(**compare_settings)
178+
_comp_s = CompareSettings.model_validate(compare_settings)
179179
else:
180180
_comp_s = compare_settings
181181

182182
if isinstance(notification, dict):
183-
_ns = NotificationSettings(**notification)
183+
_ns = NotificationSettings.model_validate(notification)
184184
else:
185185
_ns = notification
186186

@@ -194,10 +194,28 @@ def update_monitor(self, monitor_uuid: str, *,
194194
notification=_ns
195195
)
196196
r = self.session.post(urljoin(self.root_url, str(Path('update_monitor', monitor_uuid))),
197-
data=to_post.model_dump_json())
197+
data=to_post.model_dump_json(exclude_none=True))
198198
return r.json()
199199

200-
def monitor(self, capture_settings: LookylooCaptureSettings | dict[str, Any], /, frequency: str, *,
200+
@overload
201+
def monitor(self, *, monitor_capture_settings: MonitorCaptureSettings | dict[str, Any] | None=None) -> str:
202+
...
203+
204+
@overload
205+
def monitor(self, *,
206+
capture_settings: LookylooCaptureSettings | dict[str, Any] | None=None,
207+
frequency: str | None = None,
208+
expire_at: datetime | str | int | float | None=None,
209+
never_expire: bool=False,
210+
collection: str | None=None,
211+
compare_settings: CompareSettings | dict[str, Any] | None=None,
212+
notification: NotificationSettings | dict[str, Any] | None=None) -> str:
213+
...
214+
215+
def monitor(self, *,
216+
monitor_capture_settings: MonitorCaptureSettings | dict[str, Any] | None=None,
217+
capture_settings: LookylooCaptureSettings | dict[str, Any] | None=None,
218+
frequency: str | None = None,
201219
expire_at: datetime | str | int | float | None=None,
202220
never_expire: bool=False,
203221
collection: str | None=None,
@@ -213,34 +231,42 @@ def monitor(self, capture_settings: LookylooCaptureSettings | dict[str, Any], /,
213231
:param compare_settings: The comparison settings.
214232
:param notification: The notification settings.
215233
"""
216-
_cs: LookylooCaptureSettings | None
217-
_comp_s: CompareSettings | None
218-
_ns: NotificationSettings | None
219-
if isinstance(capture_settings, dict):
220-
_cs = LookylooCaptureSettings(**capture_settings)
221-
else:
222-
_cs = capture_settings
223-
224-
if isinstance(compare_settings, dict):
225-
_comp_s = CompareSettings(**compare_settings)
234+
to_post: MonitorCaptureSettings
235+
if monitor_capture_settings:
236+
if isinstance(monitor_capture_settings, dict):
237+
to_post = MonitorCaptureSettings.model_validate(monitor_capture_settings)
238+
else:
239+
to_post = monitor_capture_settings
226240
else:
227-
_comp_s = compare_settings
228-
229-
if isinstance(notification, dict):
230-
_ns = NotificationSettings(**notification)
231-
else:
232-
_ns = notification
233-
234-
to_post = MonitorCaptureSettings(
235-
capture_settings=_cs,
236-
frequency=frequency,
237-
never_expire=never_expire,
238-
expire_at=expire_at,
239-
collection=collection,
240-
compare_settings=_comp_s,
241-
notification=_ns
242-
)
243-
r = self.session.post(urljoin(self.root_url, 'monitor'), data=to_post.model_dump_json())
241+
print(capture_settings)
242+
_cs: LookylooCaptureSettings | None
243+
_comp_s: CompareSettings | None
244+
_ns: NotificationSettings | None
245+
if isinstance(capture_settings, dict):
246+
_cs = LookylooCaptureSettings.model_validate(capture_settings)
247+
else:
248+
_cs = capture_settings
249+
250+
if isinstance(compare_settings, dict):
251+
_comp_s = CompareSettings.model_validate(compare_settings)
252+
else:
253+
_comp_s = compare_settings
254+
255+
if isinstance(notification, dict):
256+
_ns = NotificationSettings.model_validate(notification)
257+
else:
258+
_ns = notification
259+
260+
to_post = MonitorCaptureSettings(
261+
capture_settings=_cs,
262+
frequency=frequency,
263+
never_expire=never_expire,
264+
expire_at=expire_at,
265+
collection=collection,
266+
compare_settings=_comp_s,
267+
notification=_ns
268+
)
269+
r = self.session.post(urljoin(self.root_url, 'monitor'), data=to_post.model_dump_json(exclude_none=True))
244270
return r.json()
245271

246272
def instance_settings(self) -> MonitoringInstanceSettings:

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "pylookyloomonitoring"
3-
version = "1.3.0"
3+
version = "1.3.1"
44
description = "Python API to connect to lookyloo monitoring"
55
authors = [
66
{name="Raphaël Vinot", email="raphael.vinot@circl.lu"}
@@ -45,7 +45,7 @@ pylint = "^4.0.5"
4545
mypy = "^1.19.1"
4646
types-requests = "^2.32.4.20260107"
4747
pytest = "^9.0.2"
48-
types-dateparser = "^1.3.0.20260211"
48+
types-dateparser = "^1.3.0.20260323"
4949

5050
[build-system]
5151
requires = ["poetry-core>=2.0"]

tests/test_web.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def test_instance_settings(self) -> None:
2727

2828
def test_monitor_update(self) -> None:
2929
capture_settings = LookylooCaptureSettings(url='https://circl.lu')
30-
monitor_uuid = self.client.monitor(capture_settings,
30+
monitor_uuid = self.client.monitor(capture_settings=capture_settings,
3131
frequency='hourly',
3232
expire_at=datetime.now() + timedelta(hours=2),
3333
collection="testing")
@@ -43,7 +43,7 @@ def test_monitor_update(self) -> None:
4343

4444
def test_monitor_expire(self) -> None:
4545
capture_settings = LookylooCaptureSettings(url='https://circl.lu')
46-
monitor_uuid = self.client.monitor(capture_settings,
46+
monitor_uuid = self.client.monitor(capture_settings=capture_settings,
4747
frequency='hourly',
4848
expire_at=datetime.now() + timedelta(hours=2),
4949
collection="testing")

0 commit comments

Comments
 (0)