Skip to content

Commit 4d10271

Browse files
authored
Merge pull request #11 from bj00rn/chore/rework-utils
fix: rework system property, remove ranged property
2 parents 4613918 + c969714 commit 4d10271

File tree

2 files changed

+60
-58
lines changed

2 files changed

+60
-58
lines changed

src/pysaleryd/utils.py

+47-36
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
"""Utils"""
2+
from __future__ import annotations
3+
24
import logging
35
from dataclasses import dataclass
4-
from typing import Any
6+
from typing import TYPE_CHECKING
7+
8+
if TYPE_CHECKING:
9+
from typing import Optional, Union
10+
from .const import DataKeyEnum
511

6-
from .const import DataKeyEnum, MessageTypeEnum, PayloadSeparatorEnum
12+
from .const import MessageTypeEnum, PayloadSeparatorEnum
713

814
_LOGGER: logging.Logger = logging.getLogger(__package__)
915

@@ -62,47 +68,52 @@ def from_str(msg: str) -> tuple[DataKeyEnum, str, MessageTypeEnum]:
6268
raise ParseError(f"Failed to parse message {msg}") from exc
6369

6470

65-
@dataclass
66-
class SystemProperty:
67-
"""HRV system property"""
68-
69-
key: DataKeyEnum = None
70-
value: Any = None
71-
72-
@classmethod
73-
def from_str(cls, key, raw_value):
74-
"""Create instance from string"""
75-
return cls(key=key, value=raw_value.strip())
71+
class BaseSystemProperty:
72+
"""HRV System property"""
7673

7774

78-
@dataclass
79-
class RangedSystemProperty(SystemProperty):
80-
"""HRV System property with min max"""
75+
class SystemProperty(BaseSystemProperty):
76+
"""HRV System property with value, min, max"""
8177

82-
min_value: int = None
83-
max_value: int = None
84-
time_left: int = None
78+
def __init__(
79+
self,
80+
key: DataKeyEnum,
81+
value: Optional[int | str] = None,
82+
min_value: Optional[int | str] = None,
83+
max_value: Optional[int | str] = None,
84+
*_args,
85+
):
86+
self.key = key
87+
self.value = value
88+
self.min_value = min_value
89+
self.max_value = max_value
8590

8691
@classmethod
87-
def from_str(cls, key, raw_value: str):
92+
def from_str(cls, key: DataKeyEnum, raw_value: str):
8893
"""Create instance from from string"""
89-
[value, min_value, max_value, time_left] = [
90-
int(v) if v.isnumeric() else int(v.strip()) for v in raw_value.split("+")
91-
]
92-
return cls(
93-
key=key,
94-
value=value,
95-
min_value=min_value,
96-
max_value=max_value,
97-
time_left=time_left,
94+
95+
def maybe_cast(x: str) -> Union[int, float, str, None]:
96+
"""Cast value if it is numeric"""
97+
if x is None:
98+
return x
99+
if x.isdigit():
100+
return int(x)
101+
if x.replace(".", "", 1).isdigit():
102+
return float(x)
103+
return x
104+
105+
[*positions] = (
106+
[maybe_cast(v.strip()) for v in raw_value.split("+")]
107+
if raw_value is not None
108+
else []
98109
)
99110

111+
return cls(key, *positions)
100112

101-
@dataclass
102-
class ErrorSystemProperty(SystemProperty):
103-
key: DataKeyEnum
104-
value: list[str]
105113

106-
@classmethod
107-
def from_str(cls, key, raw_value):
108-
raise NotImplementedError()
114+
class ErrorSystemProperty(BaseSystemProperty):
115+
"""HRV System error property"""
116+
117+
def __init__(self, key: DataKeyEnum, value: Optional[list[str]] = None):
118+
self.key = key
119+
self.value = value

tests/test_parser.py

+13-22
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,8 @@
22

33
import pytest
44

5-
from pysaleryd.utils import (
6-
DataKeyEnum,
7-
IncomingMessage,
8-
MessageTypeEnum,
9-
ParseError,
10-
RangedSystemProperty,
11-
SystemProperty,
12-
)
5+
from pysaleryd.const import DataKeyEnum, MessageTypeEnum
6+
from pysaleryd.utils import IncomingMessage, ParseError, SystemProperty
137

148
__author__ = "Björn Dalfors"
159
__copyright__ = "Björn Dalfors"
@@ -71,23 +65,20 @@ def test_parse_error():
7165
IncomingMessage.from_str("wer")
7266

7367

74-
def test_parse_ranged_system_property():
75-
"""Test parse RangedSystemProperty from str"""
76-
key = "MF"
77-
value_str = "1+ 2+ 3+ 10"
78-
parsed = RangedSystemProperty.from_str(key, value_str)
79-
assert isinstance(parsed, RangedSystemProperty)
80-
assert parsed.key == DataKeyEnum.MODE_FAN
81-
assert parsed.value == 1
82-
assert parsed.min_value == 2
83-
assert parsed.max_value == 3
84-
assert parsed.time_left == 10
85-
86-
8768
def test_parse_system_property():
8869
"""Test parse SystemProperty"""
8970
key = DataKeyEnum.INSTALLER_PASSWORD
9071
value_str = "1"
9172
parsed = SystemProperty.from_str(key, value_str)
9273
assert parsed.key == DataKeyEnum.INSTALLER_PASSWORD
93-
assert parsed.value == "1"
74+
assert parsed.value == 1
75+
76+
value_str = "1+ 2+ 3+0"
77+
parsed = SystemProperty.from_str(key, value_str)
78+
assert parsed.value == 1
79+
assert parsed.min_value == 2
80+
assert parsed.max_value == 3
81+
82+
value_str = "test"
83+
parsed = SystemProperty.from_str(key, value_str)
84+
assert parsed.value == "test"

0 commit comments

Comments
 (0)