Support for values passed in dict format to `ThreeAxisSensor`

This commit is contained in:
Fabio Manganiello 2023-04-02 02:02:08 +02:00
parent 5a6f4bcf57
commit 8d4aa310f4
Signed by: blacklight
GPG Key ID: D90FBA7F76362774
1 changed files with 25 additions and 10 deletions

View File

@ -1,7 +1,8 @@
from typing import Iterable, Mapping, Optional, Union
from sqlalchemy import Column, Integer, ForeignKey from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import reconstructor, validates
from platypush.common.db import Base from platypush.common.db import Base
from platypush.common.sensors import Numeric
from .sensors import RawSensor from .sensors import RawSensor
@ -23,16 +24,30 @@ if 'three_axis_sensor' not in Base.metadata:
'polymorphic_identity': __tablename__, 'polymorphic_identity': __tablename__,
} }
@validates('_value') @RawSensor.value.setter
def check_value(self, _, value): def value(
self, value: Optional[Union[Iterable[Numeric], Mapping[str, Numeric]]]
):
"""
Validates and normalizes the given value to a list of 3 numeric
values.
"""
if value is None:
return
if isinstance(value, dict):
assert set(value.keys()) == {
'x',
'y',
'z',
}, f'Invalid keys for entity of type {self.__class__}: "{value}"'
value = [value[k] for k in ['x', 'y', 'z']] # type: ignore
assert ( assert (
isinstance('_value', (list, tuple)) isinstance(value, (list, tuple))
and len(value) == 3 and len(value) == 3 # type: ignore
and all(isinstance(v, (int, float)) for v in value) and all(isinstance(v, (int, float)) for v in value)
), f'Invalid 3-axis value: {value}' ), f'Invalid 3-axis value: {value}'
return list(value) super(ThreeAxisSensor, type(self)).value.fset(self, value) # type: ignore
@reconstructor
def post_init(self):
self.is_json = True