Skip to content

Commit

Permalink
Added properties helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
akadlec committed Nov 17, 2021
1 parent 45e7902 commit 8986539
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 35 deletions.
Binary file removed devices_module/__pycache__/key.cpython-39.pyc
Binary file not shown.
9 changes: 6 additions & 3 deletions devices_module/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@

# Library libs
from devices_module.exchange import ModuleExchange
from devices_module.key import EntityKey
from devices_module.models import db
from devices_module.repositories import (
ConnectorsRepository,
Expand All @@ -40,6 +39,7 @@
ChannelsControlsRepository,
ChannelsConfigurationRepository,
)
from devices_module.helpers import KeyHashHelpers, PropertiesHelpers

default_settings: Dict[str, Dict[str, Union[str, int, bool, None]]] = {
"database": {
Expand Down Expand Up @@ -84,8 +84,11 @@ def create_container(settings: Dict[str, Dict[str, Union[str, int, bool, None]]]
di[ModuleExchange] = ModuleExchange()
di["fb-devices-module_exchange"] = di[ModuleExchange]

di[EntityKey] = EntityKey()
di["fb-devices-module_entity-key-generator"] = di[EntityKey]
di[PropertiesHelpers] = PropertiesHelpers()
di["fb-devices-module_helpers-properties"] = di[PropertiesHelpers]

di[KeyHashHelpers] = KeyHashHelpers()
di["fb-devices-module_helpers-key-hash"] = di[KeyHashHelpers]

db.bind(
provider="mysql",
Expand Down
68 changes: 57 additions & 11 deletions devices_module/key.py → devices_module/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,27 +14,75 @@
# See the License for the specific language governing permissions and
# limitations under the License.

# pylint: disable=too-many-lines

"""
Devices module entities key generator & utils
Devices module helpers
"""

# Library dependencies
# App dependencies
import math
import time
from typing import Callable, Optional
from typing import Callable, Set, Union, Optional
from kink import inject
from pony.orm import core as orm
from modules_metadata.types import DataType

# Library libs
from devices_module.items import DevicePropertyItem, ChannelPropertyItem


@inject
class PropertiesHelpers: # pylint: disable=too-few-public-methods
"""
Properties helpers
@package FastyBird:DevicesModule!
@module helpers
@author Adam Kadlec <adam.kadlec@fastybird.com>
"""
@staticmethod
def normalize_value( # pylint: disable=too-many-return-statements
item: Union[DevicePropertyItem, ChannelPropertyItem],
value: Union[int, float, str, bool, None],
) -> Union[int, float, str, bool, None]:
"""Normalize property value based od property data type"""
if value is None or item.data_type is None:
return value

if item.data_type == DataType.INT:
return int(value)

if item.data_type == DataType.FLOAT:
return float(value)

if item.data_type == DataType.STRING:
return str(value)

if item.data_type == DataType.BOOLEAN:
value = str(value)

return value.lower() in ["true", "1", "t", "y", "yes", "on"]

if item.data_type == DataType.ENUM:
if (
item.get_format() is not None
and isinstance(item.get_format(), Set)
and str(value) in item.get_format()
):
return str(value)

return None

return value


@inject
class EntityKey:
class KeyHashHelpers:
"""
Entity key generator & parser
Key hash generator & parser
@package FastyBird:DevicesModule!
@module key
@module helpers
@author Adam Kadlec <adam.kadlec@fastybird.com>
"""
Expand Down Expand Up @@ -90,9 +138,7 @@ def encode(self, number: int, max_length: Optional[int] = None) -> str:
# -----------------------------------------------------------------------------

def decode(self, string: str, max_length: Optional[int] = None) -> int:
"""
Convert key hash to number
"""
"""Convert key hash to number"""
string = "".join(reversed(string))
result = 0
length = len(string) - 1
Expand Down
16 changes: 8 additions & 8 deletions devices_module/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@

# Library libs
from devices_module.events import ModelEntityCreatedEvent, ModelEntityUpdatedEvent, ModelEntityDeletedEvent
from devices_module.key import EntityKey
from devices_module.helpers import KeyHashHelpers

# Create devices module database accessor
db: Database = Database()
Expand Down Expand Up @@ -111,7 +111,7 @@ def before_insert(self) -> None:
self.created_at = datetime.datetime.now()

if self.key is None:
self.key = di[EntityKey].generate_key(self)
self.key = di[KeyHashHelpers].generate_key(self)

# -----------------------------------------------------------------------------

Expand Down Expand Up @@ -443,7 +443,7 @@ def before_insert(self) -> None:
self.firmware_manufacturer = self.firmware_manufacturer.lower()

if self.key is None:
self.key = di[EntityKey].generate_key(self)
self.key = di[KeyHashHelpers].generate_key(self)

# -----------------------------------------------------------------------------

Expand Down Expand Up @@ -556,7 +556,7 @@ def before_insert(self) -> None:
self.created_at = datetime.datetime.now()

if self.key is None:
self.key = di[EntityKey].generate_key(self)
self.key = di[KeyHashHelpers].generate_key(self)

# -----------------------------------------------------------------------------

Expand Down Expand Up @@ -797,7 +797,7 @@ def before_insert(self) -> None:
self.created_at = datetime.datetime.now()

if self.key is None:
self.key = di[EntityKey].generate_key(self)
self.key = di[KeyHashHelpers].generate_key(self)

# -----------------------------------------------------------------------------

Expand Down Expand Up @@ -1058,7 +1058,7 @@ def before_insert(self) -> None:
self.created_at = datetime.datetime.now()

if self.key is None:
self.key = di[EntityKey].generate_key(self)
self.key = di[KeyHashHelpers].generate_key(self)

# -----------------------------------------------------------------------------

Expand Down Expand Up @@ -1167,7 +1167,7 @@ def before_insert(self) -> None:
self.created_at = datetime.datetime.now()

if self.key is None:
self.key = di[EntityKey].generate_key(self)
self.key = di[KeyHashHelpers].generate_key(self)

# -----------------------------------------------------------------------------

Expand Down Expand Up @@ -1410,7 +1410,7 @@ def before_insert(self) -> None:
self.created_at = datetime.datetime.now()

if self.key is None:
self.key = di[EntityKey].generate_key(self)
self.key = di[KeyHashHelpers].generate_key(self)

# -----------------------------------------------------------------------------

Expand Down
19 changes: 10 additions & 9 deletions tests/cases/Unit/Subscribers/EntitiesSubscriberTest.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use FastyBird\DevicesModule\Subscribers;
use FastyBird\ExchangePlugin\Publisher as ExchangePluginPublisher;
use FastyBird\ModulesMetadata;
use Mockery;
use Nette\Utils;
use Ninjify\Nunjuck\TestCase\BaseMockeryTestCase;
use stdClass;
use Tester\Assert;
Expand Down Expand Up @@ -43,12 +44,12 @@ final class EntitiesSubscriberTest extends BaseMockeryTestCase
$publisher = Mockery::mock(ExchangePluginPublisher\IPublisher::class);
$publisher
->shouldReceive('publish')
->withArgs(function (string $origin, string $key, array $data): bool {
->withArgs(function (string $origin, string $key, Utils\ArrayHash $data): bool {
unset($data['id']);

Assert::same(ModulesMetadata\Constants::MODULE_DEVICES_ORIGIN, $origin);
Assert::same('fb.bus.entity.created.device', $key);
Assert::equal([
Assert::equal(Utils\ArrayHash::from([
'identifier' => 'device-name',
'key' => 'bLikmS',
'parent' => null,
Expand All @@ -63,7 +64,7 @@ final class EntitiesSubscriberTest extends BaseMockeryTestCase
'firmware_manufacturer' => 'generic',
'firmware_version' => null,
'params' => [],
], $data);
]), $data);

return true;
})
Expand Down Expand Up @@ -98,12 +99,12 @@ final class EntitiesSubscriberTest extends BaseMockeryTestCase
$publisher = Mockery::mock(ExchangePluginPublisher\IPublisher::class);
$publisher
->shouldReceive('publish')
->withArgs(function (string $origin, string $key, array $data): bool {
->withArgs(function (string $origin, string $key, Utils\ArrayHash $data): bool {
unset($data['id']);

Assert::same(ModulesMetadata\Constants::MODULE_DEVICES_ORIGIN, $origin);
Assert::same('fb.bus.entity.updated.device', $key);
Assert::equal([
Assert::equal(Utils\ArrayHash::from([
'identifier' => 'device-name',
'key' => 'bLikmS',
'parent' => null,
Expand All @@ -118,7 +119,7 @@ final class EntitiesSubscriberTest extends BaseMockeryTestCase
'firmware_manufacturer' => 'generic',
'firmware_version' => null,
'params' => [],
], $data);
]), $data);

return true;
})
Expand Down Expand Up @@ -152,12 +153,12 @@ final class EntitiesSubscriberTest extends BaseMockeryTestCase
$publisher = Mockery::mock(ExchangePluginPublisher\IPublisher::class);
$publisher
->shouldReceive('publish')
->withArgs(function (string $origin, string $key, array $data): bool {
->withArgs(function (string $origin, string $key, Utils\ArrayHash $data): bool {
unset($data['id']);

Assert::same(ModulesMetadata\Constants::MODULE_DEVICES_ORIGIN, $origin);
Assert::same('fb.bus.entity.deleted.device', $key);
Assert::equal([
Assert::equal(Utils\ArrayHash::from([
'identifier' => 'device-name',
'key' => 'bLikmS',
'parent' => null,
Expand All @@ -172,7 +173,7 @@ final class EntitiesSubscriberTest extends BaseMockeryTestCase
'firmware_manufacturer' => 'generic',
'firmware_version' => null,
'params' => [],
], $data);
]), $data);

return true;
})
Expand Down
8 changes: 4 additions & 4 deletions tests/pytests/helpers/test_entity_key.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
from pony.orm import core as orm

# Library libs
from devices_module.key import EntityKey
from devices_module.helpers import KeyHashHelpers


class TestEntityKey(unittest.TestCase):
class TestKeyHashUtils(unittest.TestCase):
@patch('devices_module.key.time')
def test_default_generator(self, mock_time) -> None:
mock_time.time_ns = Mock(return_value=1630831410968578000)

entity_key_generator = EntityKey()
entity_key_generator = KeyHashHelpers()

entity = Mock()

Expand All @@ -35,7 +35,7 @@ def test_default_generator(self, mock_time) -> None:
# -----------------------------------------------------------------------------

def test_custom_generator(self) -> None:
entity_key_generator = EntityKey()
entity_key_generator = KeyHashHelpers()
entity_key_generator.set_generator(self.__custom_generator)

entity = Mock()
Expand Down

0 comments on commit 8986539

Please sign in to comment.