Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

✓ means ready to try

## [v0.3.8] - 2025-11-15

- supports structlog for logging, with colored logs and updated log statements
- SAST with bandit & gitleaks integrated into CI/CD pipelines
- uses pytest instead of unittests
- code improvements with isort, dependency refactoring etc.

## [v0.3.7] - 2025-10-30

- supports MQTT
Expand Down
2 changes: 1 addition & 1 deletion doc
Submodule doc updated from e8ec16 to d4e965
4 changes: 2 additions & 2 deletions hololinked/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "0.3.7"
__version__ = "0.3.8"

from .config import global_config # noqa: F401
from .config import global_config # noqa
import hololinked.core # noqa: F401
2 changes: 1 addition & 1 deletion hololinked/client/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
from .proxy import ObjectProxy as ObjectProxy
from .factory import ClientFactory as ClientFactory
from .proxy import ObjectProxy as ObjectProxy
9 changes: 5 additions & 4 deletions hololinked/client/abstractions.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,17 @@
# copied from wotpy repository

import asyncio
import threading
import typing
import builtins
import logging
import threading
import typing

from dataclasses import dataclass

from ..td import PropertyAffordance, ActionAffordance, EventAffordance
from ..constants import Operations
from ..td import ActionAffordance, EventAffordance, PropertyAffordance
from ..td.forms import Form
from ..utils import get_current_async_loop
from ..constants import Operations


class ConsumedThingAction:
Expand Down
8 changes: 8 additions & 0 deletions hololinked/client/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,11 @@ class ReplyNotArrivedError(Exception):
"""Exception raised when a reply is not received in time."""

pass


class BreakLoop(Exception):
"""
raise and catch to exit a loop from within another function or method
"""

pass
3 changes: 3 additions & 0 deletions hololinked/client/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import threading
import uuid
import warnings

from typing import Any

import aiomqtt
import httpx
import structlog

from paho.mqtt.client import CallbackAPIVersion, MQTTMessage, MQTTProtocolVersion
from paho.mqtt.client import Client as PahoMQTTClient

Expand All @@ -33,6 +35,7 @@
ZMQProperty,
)


set_global_event_loop_policy()


Expand Down
16 changes: 12 additions & 4 deletions hololinked/client/http/consumed_interactions.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,28 @@
import logging
import threading
import typing

from copy import deepcopy
from typing import Any, AsyncIterator, Callable, Iterator

import httpcore
import httpx
from typing import Any, AsyncIterator, Callable, Iterator
from copy import deepcopy

from ...constants import Operations
from ...serializers import Serializers
from ...td.forms import Form
from ...td.interaction_affordance import (
ActionAffordance,
EventAffordance,
PropertyAffordance,
)
from ...td.forms import Form
from ..abstractions import ConsumedThingAction, ConsumedThingEvent, ConsumedThingProperty, raise_local_exception, SSE
from ..abstractions import (
SSE,
ConsumedThingAction,
ConsumedThingEvent,
ConsumedThingProperty,
raise_local_exception,
)


class HTTPConsumedAffordanceMixin:
Expand Down
14 changes: 9 additions & 5 deletions hololinked/client/mqtt/consumed_interactions.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import aiomqtt
import logging

from typing import Any, Callable
from paho.mqtt.client import Client as PahoMQTTClient, MQTTMessage

from ..abstractions import SSE, ConsumedThingEvent
from ...td.interaction_affordance import EventAffordance
import aiomqtt

from paho.mqtt.client import Client as PahoMQTTClient
from paho.mqtt.client import MQTTMessage

from ...serializers import BaseSerializer, Serializers # noqa: F401
from ...td.forms import Form
from ...serializers import Serializers, BaseSerializer # noqa: F401
from ...td.interaction_affordance import EventAffordance
from ..abstractions import SSE, ConsumedThingEvent


class MQTTConsumer(ConsumedThingEvent):
Expand Down
5 changes: 3 additions & 2 deletions hololinked/client/proxy.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import base64
import typing

import structlog
import base64

from .abstractions import ConsumedThingAction, ConsumedThingProperty, ConsumedThingEvent
from .abstractions import ConsumedThingAction, ConsumedThingEvent, ConsumedThingProperty


class ObjectProxy:
Expand Down
39 changes: 22 additions & 17 deletions hololinked/client/zmq/consumed_interactions.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,38 @@
import asyncio
import logging
import typing
import threading
import warnings
import traceback
import typing
import uuid
import warnings

from ...constants import Operations
from ...serializers.payloads import SerializableData
from ...core import Thing, Action # noqa: F401
from ...td import PropertyAffordance, ActionAffordance, EventAffordance
from ...td.forms import Form
from ...core.zmq.message import ResponseMessage
from ...core.zmq.message import EMPTY_BYTE, TIMEOUT, ERROR, INVALID_MESSAGE
from ...core.zmq.brokers import (
SyncZMQClient,
AsyncZMQClient,
EventConsumer,
AsyncEventConsumer,
)
from ...client.abstractions import (
SSE,
ConsumedThingAction,
ConsumedThingEvent,
ConsumedThingProperty,
raise_local_exception,
SSE,
)
from ...constants import Operations
from ...core import Action, Thing # noqa: F401
from ...core.zmq.brokers import (
AsyncEventConsumer,
AsyncZMQClient,
BreakLoop,
EventConsumer,
SyncZMQClient,
)
from ...core.zmq.message import (
EMPTY_BYTE,
ERROR,
INVALID_MESSAGE,
TIMEOUT,
ResponseMessage,
)
from ...serializers.payloads import SerializableData
from ...td import ActionAffordance, EventAffordance, PropertyAffordance
from ...td.forms import Form
from ..exceptions import ReplyNotArrivedError
from ...exceptions import BreakLoop


__error_message_types__ = [TIMEOUT, ERROR, INVALID_MESSAGE]
Expand Down
7 changes: 4 additions & 3 deletions hololinked/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,14 @@
SOFTWARE.
"""

import tempfile
import json
import logging
import os
import tempfile
import typing
import warnings

import zmq.asyncio
import json
import logging


class Configuration:
Expand Down
13 changes: 4 additions & 9 deletions hololinked/constants.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import zmq
import logging
import typing
from enum import StrEnum, IntEnum

from enum import IntEnum, StrEnum

import zmq


# types
Expand Down Expand Up @@ -80,13 +82,6 @@ class ZMQ_TRANSPORTS(StrEnum):
INPROC = "INPROC"


class HTTPServerTypes(StrEnum):
"types of HTTP server"

SYSTEM_HOST = "SYSTEM_HOST"
THING_SERVER = "THING_SERVER"


class ZMQSocketType(IntEnum):
PAIR = zmq.PAIR
PUB = zmq.PUB
Expand Down
8 changes: 4 additions & 4 deletions hololinked/core/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Order of import is reflected in this file to avoid circular imports
from .thing import * # noqa: F403
from .events import * # noqa: F403
from .actions import * # noqa: F403
from .property import * # noqa: F403
from .thing import * # noqa
from .events import * # noqa
from .actions import * # noqa
from .property import * # noqa
from .meta import ThingMeta as ThingMeta
21 changes: 12 additions & 9 deletions hololinked/core/actions.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
import typing
import warnings
import jsonschema

from enum import Enum
from inspect import getfullargspec, iscoroutinefunction
from types import FunctionType, MethodType
from inspect import iscoroutinefunction, getfullargspec

import jsonschema

from pydantic import BaseModel, RootModel

from ..param.parameterized import ParameterizedFunction
from ..constants import JSON
from ..config import global_config
from ..constants import JSON
from ..param.parameterized import ParameterizedFunction
from ..schema_validators.validators import JSONSchemaValidator, PydanticSchemaValidator
from ..utils import (
get_input_model_from_signature,
get_return_type_from_signature,
has_async_def,
get_input_model_from_signature,
issubklass,
isclassmethod,
issubklass,
)
from ..exceptions import StateMachineError
from ..schema_validators.validators import JSONSchemaValidator, PydanticSchemaValidator
from .dataklasses import ActionInfoValidator
from .exceptions import StateMachineError


class Action:
Expand Down Expand Up @@ -128,7 +131,7 @@ def __init__(self, obj: FunctionType, descriptor: Action, owner_inst, owner) ->

def __post_init__(self):
# never called, neither possible to call, only type hinting
from .thing import ThingMeta, Thing
from .thing import Thing, ThingMeta

# owner class and instance
self.owner: ThingMeta
Expand Down
5 changes: 3 additions & 2 deletions hololinked/core/dataklasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
"""

import typing

from enum import Enum
from types import FunctionType, MethodType

from pydantic import BaseModel, RootModel

from ..param.parameters import String, Boolean, Tuple, ClassSelector, Parameter
from ..param.parameterized import ParameterizedMetaclass
from ..constants import USE_OBJECT_NAME
from ..param.parameterized import ParameterizedMetaclass
from ..param.parameters import Boolean, ClassSelector, Parameter, String, Tuple
from ..schema_validators import BaseSchemaValidator
from ..utils import issubklass

Expand Down
6 changes: 4 additions & 2 deletions hololinked/core/events.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import typing

import jsonschema

from ..param.parameterized import Parameterized, ParameterizedMetaclass
from ..constants import JSON
from ..config import global_config
from ..constants import JSON
from ..param.parameterized import Parameterized, ParameterizedMetaclass


class Event:
Expand Down Expand Up @@ -148,6 +149,7 @@ def _set_acknowledgement(self, *args, **kwargs) -> None:

from .zmq.brokers import EventPublisher # noqa: E402


__all__ = [
Event.__name__,
]
File renamed without changes.
15 changes: 8 additions & 7 deletions hololinked/core/logger.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import logging
import typing
import asyncio
import datetime
import logging
import threading
import asyncio
import time
import structlog
import typing

from collections import deque

import structlog

from .actions import action as remote_method
from .events import Event
from .properties import List
from .properties import Integer, Number
from .properties import Integer, List, Number
from .thing import Thing as RemoteObject
from .actions import action as remote_method


log_message_schema = {
Expand Down
Loading