From 6ea82ccd4121cd77c6781c1d44cc4033c25fdc4f Mon Sep 17 00:00:00 2001 From: Steven B <51370195+sdb9696@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:46:42 +0000 Subject: [PATCH 1/2] Migrate triggerlogs to mashumaru --- kasa/smart/modules/triggerlogs.py | 13 +++++++------ tests/smart/modules/test_triggerlogs.py | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 tests/smart/modules/test_triggerlogs.py diff --git a/kasa/smart/modules/triggerlogs.py b/kasa/smart/modules/triggerlogs.py index 480c72f5e..d18845e65 100644 --- a/kasa/smart/modules/triggerlogs.py +++ b/kasa/smart/modules/triggerlogs.py @@ -2,19 +2,20 @@ from __future__ import annotations -from datetime import datetime +from dataclasses import dataclass, field -from pydantic.v1 import BaseModel, Field, parse_obj_as +from mashumaro import DataClassDictMixin, field_options from ..smartmodule import SmartModule -class LogEntry(BaseModel): +@dataclass +class LogEntry(DataClassDictMixin): """Presentation of a single log entry.""" id: int - event_id: str = Field(alias="eventId") - timestamp: datetime + event_id: str = field(metadata=field_options(alias="eventId")) + timestamp: int event: str @@ -31,4 +32,4 @@ def query(self) -> dict: @property def logs(self) -> list[LogEntry]: """Return logs.""" - return parse_obj_as(list[LogEntry], self.data["logs"]) + return [LogEntry.from_dict(log) for log in self.data["logs"]] diff --git a/tests/smart/modules/test_triggerlogs.py b/tests/smart/modules/test_triggerlogs.py new file mode 100644 index 000000000..c1d957217 --- /dev/null +++ b/tests/smart/modules/test_triggerlogs.py @@ -0,0 +1,22 @@ +from kasa import Device, Module + +from ...device_fixtures import parametrize + +triggerlogs = parametrize( + "has trigger_logs", + component_filter="trigger_log", + protocol_filter={"SMART", "SMART.CHILD"}, +) + + +@triggerlogs +async def test_trigger_logs(dev: Device): + """Test that features are registered and work as expected.""" + triggerlogs = dev.modules.get(Module.TriggerLogs) + assert triggerlogs is not None + if logs := triggerlogs.logs: + first = logs[0] + assert isinstance(first.id, int) + assert isinstance(first.timestamp, int) + assert isinstance(first.event, str) + assert isinstance(first.event_id, str) From 762026084ae6de642fa2b2e74d2b5e3f9549f0f6 Mon Sep 17 00:00:00 2001 From: Steven B <51370195+sdb9696@users.noreply.github.com> Date: Tue, 19 Nov 2024 18:31:13 +0000 Subject: [PATCH 2/2] Use Annotated Alias --- kasa/smart/modules/triggerlogs.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/kasa/smart/modules/triggerlogs.py b/kasa/smart/modules/triggerlogs.py index d18845e65..be63ff698 100644 --- a/kasa/smart/modules/triggerlogs.py +++ b/kasa/smart/modules/triggerlogs.py @@ -2,9 +2,11 @@ from __future__ import annotations -from dataclasses import dataclass, field +from dataclasses import dataclass +from typing import Annotated -from mashumaro import DataClassDictMixin, field_options +from mashumaro import DataClassDictMixin +from mashumaro.types import Alias from ..smartmodule import SmartModule @@ -14,7 +16,7 @@ class LogEntry(DataClassDictMixin): """Presentation of a single log entry.""" id: int - event_id: str = field(metadata=field_options(alias="eventId")) + event_id: Annotated[str, Alias("eventId")] timestamp: int event: str