From 1266d3765c77b22b6d2330546d26fece11540d71 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 18:10:45 +0200 Subject: [PATCH 01/21] update venv with local repo submodule --- .gitmodules | 3 ++ .vscode/settings.json | 11 +++- pyproject.toml | 4 +- repo/hololinked | 1 + uv.lock | 119 ++++++++++++++++++++++++++++++++++-------- 5 files changed, 111 insertions(+), 27 deletions(-) create mode 160000 repo/hololinked diff --git a/.gitmodules b/.gitmodules index c3ca054..2d3dc7c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "deployment/helm/container-helm-chart"] path = deployment/helm/container-helm-chart url = https://gitlab.com/hololinked/kubernetes/helm-charts/container-helm-chart.git +[submodule "hololinked"] + path = repo/hololinked + url = https://github.com/hololinked-dev/hololinked.git diff --git a/.vscode/settings.json b/.vscode/settings.json index 43167ca..e91de5b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,5 +8,12 @@ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "prettier.tabWidth": 2 - } -} \ No newline at end of file + }, + "python.defaultInterpreterPath": "${workspaceFolder}/.venv/Scripts/python.exe", + "python.analysis.extraPaths": [ + "repo/hololinked" + ], + "python.autoComplete.extraPaths": [ + "repo/hololinked" + ] +} diff --git a/pyproject.toml b/pyproject.toml index d2a0198..a3ae578 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,8 +32,8 @@ dev = [ "imageio", ] repo = [ - "hololinked" + "hololinked[all]" ] [tool.uv.sources] -hololinked = { git = "https://github.com/hololinked-dev/hololinked.git", branch = "main" } \ No newline at end of file +hololinked = { path = "repo/hololinked", editable = true } \ No newline at end of file diff --git a/repo/hololinked b/repo/hololinked new file mode 160000 index 0000000..9e85c37 --- /dev/null +++ b/repo/hololinked @@ -0,0 +1 @@ +Subproject commit 9e85c37d0886c956038c45f77afc00a0ff642865 diff --git a/uv.lock b/uv.lock index 7d862e5..a8ff4bd 100644 --- a/uv.lock +++ b/uv.lock @@ -572,29 +572,114 @@ wheels = [ [[package]] name = "hololinked" -version = "0.3.11" -source = { git = "https://github.com/hololinked-dev/hololinked.git?branch=main#7b8c98dea1bfe82eb6402e37aabd177863f22029" } +version = "0.4.0" +source = { editable = "repo/hololinked" } dependencies = [ { name = "aiomqtt" }, { name = "argon2-cffi" }, { name = "bcrypt" }, { name = "cryptography" }, - { name = "fastjsonschema" }, { name = "httpx" }, { name = "ifaddr" }, - { name = "jsonschema" }, { name = "msgspec" }, - { name = "psycopg2-binary" }, { name = "pydantic" }, { name = "pyjwt" }, + { name = "sniffio" }, + { name = "structlog" }, + { name = "tornado" }, +] + +[package.optional-dependencies] +all = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "psycopg2-binary" }, { name = "pymongo" }, { name = "pyzmq" }, { name = "serpent" }, - { name = "sniffio" }, { name = "sqlalchemy" }, - { name = "sqlalchemy-utils" }, - { name = "structlog" }, - { name = "tornado" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiomqtt", specifier = ">=2.4.0" }, + { name = "argon2-cffi", specifier = ">=23.1.0" }, + { name = "bcrypt", specifier = "==4.3.0" }, + { name = "cryptography", specifier = ">=46.0.5" }, + { name = "fastjsonschema", marker = "extra == 'validators'", specifier = "==2.20.0" }, + { name = "hololinked", extras = ["sqlalchemy"], marker = "extra == 'postgresql'" }, + { name = "hololinked", extras = ["sqlalchemy", "postgresql", "mongo"], marker = "extra == 'storage'" }, + { name = "hololinked", extras = ["zmq", "validators", "serializers", "storage"], marker = "extra == 'all'" }, + { name = "httpx", specifier = ">=0.28.1,<29.0" }, + { name = "ifaddr", specifier = ">=0.2.0,<0.3" }, + { name = "jsonschema", marker = "extra == 'validators'", specifier = ">=4.22.0,<5.0" }, + { name = "msgspec", specifier = ">=0.18.6" }, + { name = "psycopg2-binary", marker = "extra == 'postgresql'", specifier = ">=2.9.11" }, + { name = "pydantic", specifier = ">=2.8.0,<3.0.0" }, + { name = "pyjwt", specifier = ">=2.11.0" }, + { name = "pymongo", marker = "extra == 'mongo'", specifier = ">=4.15.2" }, + { name = "pyzmq", marker = "extra == 'zmq'", specifier = ">=25.1.0,<26.2" }, + { name = "serpent", marker = "extra == 'serializers'", specifier = ">=1.41,<2.0" }, + { name = "sniffio", specifier = ">=1.3.1,<2.0" }, + { name = "sqlalchemy", marker = "extra == 'sqlalchemy'", specifier = ">2.0.21" }, + { name = "structlog", specifier = ">=25.5.0" }, + { name = "tornado", specifier = ">=6.3.3" }, +] +provides-extras = ["zmq", "validators", "serializers", "sqlalchemy", "postgresql", "mongo", "storage", "all"] + +[package.metadata.requires-dev] +all = [ + { name = "bandit", specifier = ">=1.9.1" }, + { name = "faker", specifier = "==37.5.0" }, + { name = "fastjsonschema", specifier = "==2.20.0" }, + { name = "ipython", specifier = "==8.12.3" }, + { name = "jsonschema", specifier = ">=4.22.0,<5.0" }, + { name = "jupyter", specifier = ">=1.1.1" }, + { name = "numpy", specifier = ">=2.0.0" }, + { name = "pandas", specifier = "==2.2.3" }, + { name = "pip", specifier = ">=25.2" }, + { name = "pre-commit", specifier = ">=4.5.0" }, + { name = "psycopg2-binary", specifier = ">=2.9.11" }, + { name = "pymongo", specifier = ">=4.15.2" }, + { name = "pytest", specifier = ">=8.0.0" }, + { name = "pytest-asyncio", specifier = ">=1.3.0" }, + { name = "pytest-cov", specifier = ">=4.0.0" }, + { name = "pytest-order", specifier = ">=1.0.0" }, + { name = "pyzmq", specifier = ">=25.1.0,<26.2" }, + { name = "requests", specifier = "==2.32.3" }, + { name = "ruff", specifier = ">=0.12.10" }, + { name = "serpent", specifier = ">=1.41,<2.0" }, + { name = "sqlalchemy", specifier = ">2.0.21" }, + { name = "testcontainers", specifier = ">=4.14.1" }, + { name = "ty", specifier = ">=0.0.24" }, +] +dev = [ + { name = "ipython", specifier = "==8.12.3" }, + { name = "jupyter", specifier = ">=1.1.1" }, + { name = "numpy", specifier = ">=2.0.0" }, + { name = "pandas", specifier = "==2.2.3" }, + { name = "pip", specifier = ">=25.2" }, + { name = "pre-commit", specifier = ">=4.5.0" }, + { name = "ruff", specifier = ">=0.12.10" }, + { name = "ty", specifier = ">=0.0.24" }, +] +scanning = [{ name = "bandit", specifier = ">=1.9.1" }] +test = [ + { name = "faker", specifier = "==37.5.0" }, + { name = "fastjsonschema", specifier = "==2.20.0" }, + { name = "jsonschema", specifier = ">=4.22.0,<5.0" }, + { name = "numpy", specifier = ">=2.0.0" }, + { name = "psycopg2-binary", specifier = ">=2.9.11" }, + { name = "pymongo", specifier = ">=4.15.2" }, + { name = "pytest", specifier = ">=8.0.0" }, + { name = "pytest-asyncio", specifier = ">=1.3.0" }, + { name = "pytest-cov", specifier = ">=4.0.0" }, + { name = "pytest-order", specifier = ">=1.0.0" }, + { name = "pyzmq", specifier = ">=25.1.0,<26.2" }, + { name = "requests", specifier = "==2.32.3" }, + { name = "serpent", specifier = ">=1.41,<2.0" }, + { name = "sqlalchemy", specifier = ">2.0.21" }, + { name = "testcontainers", specifier = ">=4.14.1" }, ] [[package]] @@ -629,7 +714,7 @@ dev = [ { name = "serpent" }, ] repo = [ - { name = "hololinked" }, + { name = "hololinked", extra = ["all"] }, ] [package.metadata] @@ -660,7 +745,7 @@ dev = [ { name = "ruff", specifier = ">=0.12.10" }, { name = "serpent", specifier = "==1.41" }, ] -repo = [{ name = "hololinked", git = "https://github.com/hololinked-dev/hololinked.git?branch=main" }] +repo = [{ name = "hololinked", extras = ["all"], editable = "repo/hololinked" }] [[package]] name = "httpcore" @@ -2161,18 +2246,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224 }, ] -[[package]] -name = "sqlalchemy-utils" -version = "0.41.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sqlalchemy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/e0/6906a8a9b8e9deb82923e02e2c1f750c567d69a34f6e1fe566792494a682/SQLAlchemy-Utils-0.41.1.tar.gz", hash = "sha256:a2181bff01eeb84479e38571d2c0718eb52042f9afd8c194d0d02877e84b7d74", size = 136579 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/d8/3863fdfe6b27f6c0dffc650aaa2929f313b33aea615b102279fd46ab550b/SQLAlchemy_Utils-0.41.1-py3-none-any.whl", hash = "sha256:6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801", size = 92612 }, -] - [[package]] name = "stack-data" version = "0.6.3" From 6eabc750b949fc7712268ee203a3299cb5319493 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 18:20:36 +0200 Subject: [PATCH 02/21] update namespace round #1 --- docs/api-reference/eventloop/contexts.md | 3 ++ docs/api-reference/eventloop/eventloop.md | 36 +++++++++++++ .../eventloop/schedulers/async-scheduler.md | 8 +++ .../eventloop/schedulers/queued-scheduler.md | 9 ++++ .../eventloop/schedulers/scheduler.md | 17 ++++++ .../schedulers/threaded-scheduler.md | 8 +++ docs/api-reference/namespaces.md | 2 +- .../protocols/zmq/brokers/async-zmq-client.md | 1 + .../zmq}/brokers/async-zmq-server.md | 2 +- .../zmq}/brokers/base-zmq.md | 10 ++-- .../zmq}/brokers/event-consumer.md | 6 +-- .../protocols/zmq/brokers/event-publisher.md | 1 + .../brokers/message-mapped-zmq-client-pool.md | 2 +- .../zmq}/brokers/sync-zmq-client.md | 2 +- .../zmq/messaging-contract/event-message.md | 15 ++++++ .../zmq/messaging-contract/headers.md | 8 +++ .../messaging-contract/request-message.md | 2 +- .../messaging-contract/response-message.md | 18 +++++++ .../rpc-server/brokers/async-zmq-client.md | 1 - .../rpc-server/brokers/event-publisher.md | 1 - .../rpc-server/messaging-contract/contexts.md | 3 -- .../messaging-contract/event-message.md | 10 ---- .../rpc-server/messaging-contract/headers.md | 8 --- .../messaging-contract/response-message.md | 12 ----- docs/api-reference/rpc-server/rpc-server.md | 52 ------------------- .../rpc-server/schedulers/async-scheduler.md | 4 -- .../rpc-server/schedulers/queued-scheduler.md | 3 -- .../rpc-server/schedulers/scheduler.md | 2 - .../schedulers/threaded-scheduler.md | 3 -- 29 files changed, 137 insertions(+), 112 deletions(-) create mode 100644 docs/api-reference/eventloop/contexts.md create mode 100644 docs/api-reference/eventloop/eventloop.md create mode 100644 docs/api-reference/eventloop/schedulers/async-scheduler.md create mode 100644 docs/api-reference/eventloop/schedulers/queued-scheduler.md create mode 100644 docs/api-reference/eventloop/schedulers/scheduler.md create mode 100644 docs/api-reference/eventloop/schedulers/threaded-scheduler.md create mode 100644 docs/api-reference/protocols/zmq/brokers/async-zmq-client.md rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/async-zmq-server.md (86%) rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/base-zmq.md (60%) rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/event-consumer.md (75%) create mode 100644 docs/api-reference/protocols/zmq/brokers/event-publisher.md rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/message-mapped-zmq-client-pool.md (83%) rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/sync-zmq-client.md (76%) create mode 100644 docs/api-reference/protocols/zmq/messaging-contract/event-message.md create mode 100644 docs/api-reference/protocols/zmq/messaging-contract/headers.md rename docs/api-reference/{rpc-server => protocols/zmq}/messaging-contract/request-message.md (84%) create mode 100644 docs/api-reference/protocols/zmq/messaging-contract/response-message.md delete mode 100644 docs/api-reference/rpc-server/brokers/async-zmq-client.md delete mode 100644 docs/api-reference/rpc-server/brokers/event-publisher.md delete mode 100644 docs/api-reference/rpc-server/messaging-contract/contexts.md delete mode 100644 docs/api-reference/rpc-server/messaging-contract/event-message.md delete mode 100644 docs/api-reference/rpc-server/messaging-contract/headers.md delete mode 100644 docs/api-reference/rpc-server/messaging-contract/response-message.md delete mode 100644 docs/api-reference/rpc-server/rpc-server.md delete mode 100644 docs/api-reference/rpc-server/schedulers/async-scheduler.md delete mode 100644 docs/api-reference/rpc-server/schedulers/queued-scheduler.md delete mode 100644 docs/api-reference/rpc-server/schedulers/scheduler.md delete mode 100644 docs/api-reference/rpc-server/schedulers/threaded-scheduler.md diff --git a/docs/api-reference/eventloop/contexts.md b/docs/api-reference/eventloop/contexts.md new file mode 100644 index 0000000..7cbaf7f --- /dev/null +++ b/docs/api-reference/eventloop/contexts.md @@ -0,0 +1,3 @@ +::: hololinked.core.eventloop.operations.SchedulerExecutionContext + +::: hololinked.core.eventloop.operations.ThingExecutionContext diff --git a/docs/api-reference/eventloop/eventloop.md b/docs/api-reference/eventloop/eventloop.md new file mode 100644 index 0000000..142d6f8 --- /dev/null +++ b/docs/api-reference/eventloop/eventloop.md @@ -0,0 +1,36 @@ + + +::: hololinked.core.eventloop.eventloop.EventLoop + options: + members: + - __init__ + - things + - per_job_scheduler_types + - per_thing_schedulers + - pending_operations + - add_thing + - add_things + - is_running + - submit + - execute + - execute_operation + - run + - run_things + - run_thing_instance + - tunnel_message_to_things + - run_coro_threadsafe + - add_stop_hook + - stop + +## Attributes + +### `logger` +`structlog.stdlib.BoundLogger`
+`instance-attribute`, `read-only`
+logger instance, bound with `component="eventloop"` and the implementing class name. + +### `event_bus` +`EventBus`
+`instance-attribute`, `read-only`
+publishes events of every served `Thing` to the subscribed protocol servers. +Replaces the ZMQ `EventPublisher` that the RPC server used to own. diff --git a/docs/api-reference/eventloop/schedulers/async-scheduler.md b/docs/api-reference/eventloop/schedulers/async-scheduler.md new file mode 100644 index 0000000..a375ee1 --- /dev/null +++ b/docs/api-reference/eventloop/schedulers/async-scheduler.md @@ -0,0 +1,8 @@ + +::: hololinked.core.eventloop.scheduler.AsyncScheduler + options: + members: + - __init__ + - dispatch_job + - next_job + - has_job diff --git a/docs/api-reference/eventloop/schedulers/queued-scheduler.md b/docs/api-reference/eventloop/schedulers/queued-scheduler.md new file mode 100644 index 0000000..b3a06c0 --- /dev/null +++ b/docs/api-reference/eventloop/schedulers/queued-scheduler.md @@ -0,0 +1,9 @@ + +::: hololinked.core.eventloop.scheduler.QueuedScheduler + options: + members: + - __init__ + - dispatch_job + - next_job + - has_job + - cleanup diff --git a/docs/api-reference/eventloop/schedulers/scheduler.md b/docs/api-reference/eventloop/schedulers/scheduler.md new file mode 100644 index 0000000..b5be972 --- /dev/null +++ b/docs/api-reference/eventloop/schedulers/scheduler.md @@ -0,0 +1,17 @@ + +::: hololinked.core.eventloop.scheduler.Scheduler + options: + members: + - __init__ + - dispatch_job + - next_job + - has_job + - wait_for_job + - wait_for_operation + - wait_for_reply + - last_operation_request + - last_operation_reply + - reset_operation_request + - reset_operation_reply + - format_reply_tuple + - cleanup diff --git a/docs/api-reference/eventloop/schedulers/threaded-scheduler.md b/docs/api-reference/eventloop/schedulers/threaded-scheduler.md new file mode 100644 index 0000000..e239a7d --- /dev/null +++ b/docs/api-reference/eventloop/schedulers/threaded-scheduler.md @@ -0,0 +1,8 @@ + +::: hololinked.core.eventloop.scheduler.ThreadedScheduler + options: + members: + - __init__ + - dispatch_job + - next_job + - has_job diff --git a/docs/api-reference/namespaces.md b/docs/api-reference/namespaces.md index 0bddf38..a121161 100644 --- a/docs/api-reference/namespaces.md +++ b/docs/api-reference/namespaces.md @@ -2,7 +2,7 @@ | Namespace | Description | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `hololinked.core` | Definition of [`Thing`](thing/index.md) class, [`Property`](property/index.md), [`Action`](action/index.md) and [`Event`](event/index.md) classes, [`StateMachine`](state-machine/state-machine.md), [`Logger`](thing/logger.md) & [`RPCServer`](rpc-server/rpc-server.md) | +| `hololinked.core` | Definition of [`Thing`](thing/index.md) class, [`Property`](property/index.md), [`Action`](action/index.md) and [`Event`](event/index.md) classes, [`StateMachine`](state-machine/state-machine.md), [`Logger`](thing/logger.md) & [`EventLoop`](eventloop/eventloop.md) | | `hololinked.serializers` | Serializers for different data formats (JSON, MessagePack, etc.) and [`Serializers`](serializers/index.md) singleton. | | `hololinked.server` | Protocol specific server implementations | | `hololinked.client` | [`ObjectProxy`](clients/object-proxy.md) and protocol specific client implementations, client abstractions and [`ClientFactory`](clients/base.md). | diff --git a/docs/api-reference/protocols/zmq/brokers/async-zmq-client.md b/docs/api-reference/protocols/zmq/brokers/async-zmq-client.md new file mode 100644 index 0000000..1623e75 --- /dev/null +++ b/docs/api-reference/protocols/zmq/brokers/async-zmq-client.md @@ -0,0 +1 @@ +::: hololinked.server.zmq.brokers.AsyncZMQClient \ No newline at end of file diff --git a/docs/api-reference/rpc-server/brokers/async-zmq-server.md b/docs/api-reference/protocols/zmq/brokers/async-zmq-server.md similarity index 86% rename from docs/api-reference/rpc-server/brokers/async-zmq-server.md rename to docs/api-reference/protocols/zmq/brokers/async-zmq-server.md index 06c5242..5477977 100644 --- a/docs/api-reference/rpc-server/brokers/async-zmq-server.md +++ b/docs/api-reference/protocols/zmq/brokers/async-zmq-server.md @@ -1,4 +1,4 @@ -::: hololinked.core.zmq.brokers.AsyncZMQServer +::: hololinked.server.zmq.brokers.AsyncZMQServer options: members: - __init__ diff --git a/docs/api-reference/rpc-server/brokers/base-zmq.md b/docs/api-reference/protocols/zmq/brokers/base-zmq.md similarity index 60% rename from docs/api-reference/rpc-server/brokers/base-zmq.md rename to docs/api-reference/protocols/zmq/brokers/base-zmq.md index 49f6a4a..62c896d 100644 --- a/docs/api-reference/rpc-server/brokers/base-zmq.md +++ b/docs/api-reference/protocols/zmq/brokers/base-zmq.md @@ -1,24 +1,24 @@ -::: hololinked.core.zmq.brokers.BaseZMQ +::: hololinked.server.zmq.brokers.BaseZMQ options: show_root_heading: true heading_level: 2 -::: hololinked.core.zmq.brokers.BaseAsyncZMQ +::: hololinked.server.zmq.brokers.BaseAsyncZMQ options: show_root_heading: true heading_level: 2 -::: hololinked.core.zmq.brokers.BaseSyncZMQ +::: hololinked.server.zmq.brokers.BaseSyncZMQ options: show_root_heading: true heading_level: 2 -::: hololinked.core.zmq.brokers.BaseZMQServer +::: hololinked.server.zmq.brokers.BaseZMQServer options: show_root_heading: true heading_level: 2 -::: hololinked.core.zmq.brokers.BaseZMQClient +::: hololinked.server.zmq.brokers.BaseZMQClient options: show_root_heading: true heading_level: 2 \ No newline at end of file diff --git a/docs/api-reference/rpc-server/brokers/event-consumer.md b/docs/api-reference/protocols/zmq/brokers/event-consumer.md similarity index 75% rename from docs/api-reference/rpc-server/brokers/event-consumer.md rename to docs/api-reference/protocols/zmq/brokers/event-consumer.md index 958906d..ac433b1 100644 --- a/docs/api-reference/rpc-server/brokers/event-consumer.md +++ b/docs/api-reference/protocols/zmq/brokers/event-consumer.md @@ -1,4 +1,4 @@ -::: hololinked.core.zmq.brokers.BaseEventConsumer +::: hololinked.server.zmq.brokers.BaseEventConsumer options: show_root_heading: true heading_level: 2 @@ -8,7 +8,7 @@ - stop_polling - interrupt_message -::: hololinked.core.zmq.brokers.EventConsumer +::: hololinked.server.zmq.brokers.EventConsumer options: show_root_heading: true heading_level: 2 @@ -16,7 +16,7 @@ - receive - interrupt -::: hololinked.core.zmq.brokers.AsyncEventConsumer +::: hololinked.server.zmq.brokers.AsyncEventConsumer options: show_root_heading: true heading_level: 2 diff --git a/docs/api-reference/protocols/zmq/brokers/event-publisher.md b/docs/api-reference/protocols/zmq/brokers/event-publisher.md new file mode 100644 index 0000000..9700311 --- /dev/null +++ b/docs/api-reference/protocols/zmq/brokers/event-publisher.md @@ -0,0 +1 @@ +::: hololinked.server.zmq.brokers.EventPublisher \ No newline at end of file diff --git a/docs/api-reference/rpc-server/brokers/message-mapped-zmq-client-pool.md b/docs/api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md similarity index 83% rename from docs/api-reference/rpc-server/brokers/message-mapped-zmq-client-pool.md rename to docs/api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md index a17d3ea..7dc80e4 100644 --- a/docs/api-reference/rpc-server/brokers/message-mapped-zmq-client-pool.md +++ b/docs/api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md @@ -1,4 +1,4 @@ -::: hololinked.core.zmq.brokers.MessageMappedZMQClientPool +::: hololinked.server.zmq.brokers.MessageMappedZMQClientPool options: members: - __init__ diff --git a/docs/api-reference/rpc-server/brokers/sync-zmq-client.md b/docs/api-reference/protocols/zmq/brokers/sync-zmq-client.md similarity index 76% rename from docs/api-reference/rpc-server/brokers/sync-zmq-client.md rename to docs/api-reference/protocols/zmq/brokers/sync-zmq-client.md index 754119c..89f2162 100644 --- a/docs/api-reference/rpc-server/brokers/sync-zmq-client.md +++ b/docs/api-reference/protocols/zmq/brokers/sync-zmq-client.md @@ -1,4 +1,4 @@ -::: hololinked.core.zmq.brokers.SyncZMQClient +::: hololinked.server.zmq.brokers.SyncZMQClient options: members: - __init__ diff --git a/docs/api-reference/protocols/zmq/messaging-contract/event-message.md b/docs/api-reference/protocols/zmq/messaging-contract/event-message.md new file mode 100644 index 0000000..7346f24 --- /dev/null +++ b/docs/api-reference/protocols/zmq/messaging-contract/event-message.md @@ -0,0 +1,15 @@ +::: hololinked.server.zmq.message.EventMessage + options: + inherited_members: true + members: + - __init__ + - header + - body + - event_id + - id + - type + - sender_id + - receiver_id + - byte_array + - craft_from_arguments + - parse_header diff --git a/docs/api-reference/protocols/zmq/messaging-contract/headers.md b/docs/api-reference/protocols/zmq/messaging-contract/headers.md new file mode 100644 index 0000000..a4ff014 --- /dev/null +++ b/docs/api-reference/protocols/zmq/messaging-contract/headers.md @@ -0,0 +1,8 @@ +# Headers + +::: hololinked.server.zmq.message.RequestHeader + +::: hololinked.server.zmq.message.ResponseHeader + +::: hololinked.server.zmq.message.EventHeader + diff --git a/docs/api-reference/rpc-server/messaging-contract/request-message.md b/docs/api-reference/protocols/zmq/messaging-contract/request-message.md similarity index 84% rename from docs/api-reference/rpc-server/messaging-contract/request-message.md rename to docs/api-reference/protocols/zmq/messaging-contract/request-message.md index 4f1a6f7..baef819 100644 --- a/docs/api-reference/rpc-server/messaging-contract/request-message.md +++ b/docs/api-reference/protocols/zmq/messaging-contract/request-message.md @@ -1,4 +1,4 @@ -::: hololinked.core.zmq.message.RequestMessage +::: hololinked.server.zmq.message.RequestMessage options: members: - __init__ diff --git a/docs/api-reference/protocols/zmq/messaging-contract/response-message.md b/docs/api-reference/protocols/zmq/messaging-contract/response-message.md new file mode 100644 index 0000000..d1eb57c --- /dev/null +++ b/docs/api-reference/protocols/zmq/messaging-contract/response-message.md @@ -0,0 +1,18 @@ +::: hololinked.server.zmq.message.ResponseMessage + options: + members: + - __init__ + - header + - body + - payload + - preserialized_payload + - id + - type + - sender_id + - receiver_id + - byte_array + - craft_from_arguments + - craft_reply_from_request + - craft_with_message_type + - parse_header + - parse_body diff --git a/docs/api-reference/rpc-server/brokers/async-zmq-client.md b/docs/api-reference/rpc-server/brokers/async-zmq-client.md deleted file mode 100644 index 3e635e1..0000000 --- a/docs/api-reference/rpc-server/brokers/async-zmq-client.md +++ /dev/null @@ -1 +0,0 @@ -::: hololinked.core.zmq.brokers.AsyncZMQClient \ No newline at end of file diff --git a/docs/api-reference/rpc-server/brokers/event-publisher.md b/docs/api-reference/rpc-server/brokers/event-publisher.md deleted file mode 100644 index 3ebf209..0000000 --- a/docs/api-reference/rpc-server/brokers/event-publisher.md +++ /dev/null @@ -1 +0,0 @@ -::: hololinked.core.zmq.brokers.EventPublisher \ No newline at end of file diff --git a/docs/api-reference/rpc-server/messaging-contract/contexts.md b/docs/api-reference/rpc-server/messaging-contract/contexts.md deleted file mode 100644 index 53a8d56..0000000 --- a/docs/api-reference/rpc-server/messaging-contract/contexts.md +++ /dev/null @@ -1,3 +0,0 @@ -::: hololinked.core.zmq.message.ServerExecutionContext - -::: hololinked.core.zmq.message.ThingExecutionContext \ No newline at end of file diff --git a/docs/api-reference/rpc-server/messaging-contract/event-message.md b/docs/api-reference/rpc-server/messaging-contract/event-message.md deleted file mode 100644 index 947190a..0000000 --- a/docs/api-reference/rpc-server/messaging-contract/event-message.md +++ /dev/null @@ -1,10 +0,0 @@ -::: hololinked.core.zmq.message.EventMessage - options: - members: - - __init__ - - header - - body - - event_id - - thing_id - - byte_array - - craft_from_arguments \ No newline at end of file diff --git a/docs/api-reference/rpc-server/messaging-contract/headers.md b/docs/api-reference/rpc-server/messaging-contract/headers.md deleted file mode 100644 index 6d9da81..0000000 --- a/docs/api-reference/rpc-server/messaging-contract/headers.md +++ /dev/null @@ -1,8 +0,0 @@ -# Headers - -::: hololinked.core.zmq.message.RequestHeader - -::: hololinked.core.zmq.message.ResponseHeader - -::: hololinked.core.zmq.message.EventHeader - diff --git a/docs/api-reference/rpc-server/messaging-contract/response-message.md b/docs/api-reference/rpc-server/messaging-contract/response-message.md deleted file mode 100644 index 1e3031f..0000000 --- a/docs/api-reference/rpc-server/messaging-contract/response-message.md +++ /dev/null @@ -1,12 +0,0 @@ -::: hololinked.core.zmq.message.ResponseMessage - options: - members: - - __init__ - - header - - body - - thing_id - - byte_array - - craft_from_arguments - - craft_reply_from_request - - parse_header - - parse_body \ No newline at end of file diff --git a/docs/api-reference/rpc-server/rpc-server.md b/docs/api-reference/rpc-server/rpc-server.md deleted file mode 100644 index 8ad8c5c..0000000 --- a/docs/api-reference/rpc-server/rpc-server.md +++ /dev/null @@ -1,52 +0,0 @@ - - -::: hololinked.core.zmq.rpc_server.RPCServer - options: - members: - - __init__ - - run - - stop - - exit - - get_thing_description - - run_zmq_request_listener - - recv_requests_and_dispatch_jobs - - tunnel_message_to_things - - run_things - - run_thing_instance - - execute_operation - - -## Attributes - -### `id` -`str`
-`instance-attribute`, `writable`
-ID of the RPC server, used to direct requests from client. Must be unique. -For IPC & INPROC sockets, ID is used to create the socket as well. For TCP, it is used for -message routing. - -### `things` -`List[Thing]`
-`instance-attribute`, `read-only`
-`Thing` objects that will be served by this RPC server. - -### `logger` -`logging.Logger`
-logger instance - -### `req_rep_server` -`AsyncZMQServer`
-`instance-attribute`, `read-only`
-ZMQ server that handler request-reply pattern. Used for properties & actions. - -### `event_publisher` -`EventPublisher`
-`instance-attribute`, `read-only`
-ZMQ servers that publishes events to clients in publish-subscribe pattern. - -### `schedulers` -`tying.Dict[str, Scheduler]`
-`instance-attribute`
-A map of thing ID to a `Scheduler` object. For actions requiring special scheduling, -additional schdulers with ID "(thing ID).(action name).(opertaion)" is created. - diff --git a/docs/api-reference/rpc-server/schedulers/async-scheduler.md b/docs/api-reference/rpc-server/schedulers/async-scheduler.md deleted file mode 100644 index a6e6956..0000000 --- a/docs/api-reference/rpc-server/schedulers/async-scheduler.md +++ /dev/null @@ -1,4 +0,0 @@ - - - -::: hololinked.core.zmq.rpc_server.AsyncScheduler \ No newline at end of file diff --git a/docs/api-reference/rpc-server/schedulers/queued-scheduler.md b/docs/api-reference/rpc-server/schedulers/queued-scheduler.md deleted file mode 100644 index d8c1e03..0000000 --- a/docs/api-reference/rpc-server/schedulers/queued-scheduler.md +++ /dev/null @@ -1,3 +0,0 @@ - - -::: hololinked.core.zmq.rpc_server.QueuedScheduler \ No newline at end of file diff --git a/docs/api-reference/rpc-server/schedulers/scheduler.md b/docs/api-reference/rpc-server/schedulers/scheduler.md deleted file mode 100644 index cf529be..0000000 --- a/docs/api-reference/rpc-server/schedulers/scheduler.md +++ /dev/null @@ -1,2 +0,0 @@ - -::: hololinked.core.zmq.rpc_server.Scheduler \ No newline at end of file diff --git a/docs/api-reference/rpc-server/schedulers/threaded-scheduler.md b/docs/api-reference/rpc-server/schedulers/threaded-scheduler.md deleted file mode 100644 index 4f6e473..0000000 --- a/docs/api-reference/rpc-server/schedulers/threaded-scheduler.md +++ /dev/null @@ -1,3 +0,0 @@ - - -::: hololinked.core.zmq.rpc_server.ThreadedScheduler \ No newline at end of file From 0137b00c141b94439871bc9dbfc1892eeac3eb8e Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 19:29:21 +0200 Subject: [PATCH 03/21] update namespace #2 --- docs/api-reference/action/bases/index.md | 2 +- docs/api-reference/clients/security/apikey.md | 4 +- docs/api-reference/property/index.md | 2 +- docs/api-reference/protocols/http/index.md | 16 +++++--- docs/api-reference/serializers/index.md | 39 +++++++++---------- docs/api-reference/td/bases/schema.md | 2 +- .../interaction_affordance.md | 8 +++- .../api-reference/thing/bases/event-source.md | 3 +- 8 files changed, 42 insertions(+), 34 deletions(-) diff --git a/docs/api-reference/action/bases/index.md b/docs/api-reference/action/bases/index.md index c3980b4..1b870ec 100644 --- a/docs/api-reference/action/bases/index.md +++ b/docs/api-reference/action/bases/index.md @@ -4,7 +4,7 @@ heading_level: 2 members: - __init__ - - to_affordance + - to_metadata ::: hololinked.core.actions.BoundAction diff --git a/docs/api-reference/clients/security/apikey.md b/docs/api-reference/clients/security/apikey.md index fed13c9..57a8bda 100644 --- a/docs/api-reference/clients/security/apikey.md +++ b/docs/api-reference/clients/security/apikey.md @@ -3,6 +3,6 @@ ::: hololinked.client.security.APIKeySecurity options: members: - - __init__ - value - - http_header_name \ No newline at end of file + - http_header_name + - http_header diff --git a/docs/api-reference/property/index.md b/docs/api-reference/property/index.md index b53f0b8..ac6c57d 100644 --- a/docs/api-reference/property/index.md +++ b/docs/api-reference/property/index.md @@ -4,7 +4,7 @@ members: - __init__ - comparator - - to_affordance + - to_metadata - push_change_event - external_set - validate_and_adapt diff --git a/docs/api-reference/protocols/http/index.md b/docs/api-reference/protocols/http/index.md index 73e3a58..576fff1 100644 --- a/docs/api-reference/protocols/http/index.md +++ b/docs/api-reference/protocols/http/index.md @@ -2,14 +2,20 @@ ::: hololinked.server.http.HTTPServer options: + inherited_members: true members: - __init__ - add_thing - - listen - - stop - - async_stop + - add_things - add_property - add_action - add_event - - add_things - - all_ok \ No newline at end of file + - setup + - start + - run + - stop + - async_stop + - shutdown_tornado + - address + - port + - things diff --git a/docs/api-reference/serializers/index.md b/docs/api-reference/serializers/index.md index 8f7f144..bd364bc 100644 --- a/docs/api-reference/serializers/index.md +++ b/docs/api-reference/serializers/index.md @@ -1,28 +1,25 @@ -::: hololinked.Serializers +::: hololinked.injection.Serializers options: members: + - default + - json + - msgpack + - pickle + - text + - default_content_type + - content_types + - allowed_content_types - for_object - register - - register_content_type_for_object - - register_content_type_for_object_by_name - register_for_object - -## Attributes - -### `json`: `JSONSerializer` -`class-attribute`, `writable`
-The default serializer for all properties, actions and events (`msgspec` based C++ implementation) - -### `pickle`: `PickleSerializer` -`class-attribute`, `writable`
-pickle serializer, unsafe without encryption but useful for faster & flexible serialization of python specific types - -### `msgpack`: `MsgPackSerializer` -`class-attribute`, `writable`
-MessagePack serializer, efficient binary format that is both fast & interoperable between languages but not human readable - -### `default`: `BaseSerializer` -`class-attribute`, `writable`
-`JSONSerializer`, set it to use something else \ No newline at end of file + - register_for_thing_instance + - register_for_object_per_thing_instance + - register_content_type_for_object + - register_content_type_for_thing_instance + - register_content_type_for_object_per_thing_instance + - get_content_type_for_object + - get_content_types + - get_allowed_content_types + - reset \ No newline at end of file diff --git a/docs/api-reference/td/bases/schema.md b/docs/api-reference/td/bases/schema.md index 8b30037..466b07f 100644 --- a/docs/api-reference/td/bases/schema.md +++ b/docs/api-reference/td/bases/schema.md @@ -1,3 +1,3 @@ -::: hololinked.metadata.td.base.Schema \ No newline at end of file +::: hololinked.metadata.td.base.WoTSchema \ No newline at end of file diff --git a/docs/api-reference/td/interaction_affordance/interaction_affordance.md b/docs/api-reference/td/interaction_affordance/interaction_affordance.md index 98f4064..63c47ef 100644 --- a/docs/api-reference/td/interaction_affordance/interaction_affordance.md +++ b/docs/api-reference/td/interaction_affordance/interaction_affordance.md @@ -2,18 +2,22 @@ ::: hololinked.metadata.td.interaction_affordance.InteractionAffordance options: + inherited_members: true members: - what - name - objekt - owner + - owner_cls - thing_cls - thing_id - - generate - build - - build_forms + - from_descriptor + - to_descriptor + - from_metadata - from_TD - retrieve_form + - pop_form - register_descriptor ## TD Supported Fields diff --git a/docs/api-reference/thing/bases/event-source.md b/docs/api-reference/thing/bases/event-source.md index 5355c0c..ead791f 100644 --- a/docs/api-reference/thing/bases/event-source.md +++ b/docs/api-reference/thing/bases/event-source.md @@ -4,4 +4,5 @@ options: members: - create_events_registry - - event_publisher \ No newline at end of file + - events + - event_bus \ No newline at end of file From af59222e6015da7b5e5f213450df7438750f4537 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 19:39:25 +0200 Subject: [PATCH 04/21] round #3 --- docs/api-reference/namespaces.md | 6 ++++-- docs/api-reference/thing/index.md | 22 ++++++++++++++++++++++ docs/beginners-guide/articles/servers.md | 2 +- main.py | 2 +- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/api-reference/namespaces.md b/docs/api-reference/namespaces.md index a121161..d3fb2bb 100644 --- a/docs/api-reference/namespaces.md +++ b/docs/api-reference/namespaces.md @@ -2,10 +2,12 @@ | Namespace | Description | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `hololinked.core` | Definition of [`Thing`](thing/index.md) class, [`Property`](property/index.md), [`Action`](action/index.md) and [`Event`](event/index.md) classes, [`StateMachine`](state-machine/state-machine.md), [`Logger`](thing/logger.md) & [`EventLoop`](eventloop/eventloop.md) | +| `hololinked.core` | Definition of [`Thing`](thing/index.md) class, [`Property`](property/index.md), [`Action`](action/index.md) and [`Event`](events/index.md) classes, [`StateMachine`](state-machine/state-machine.md), [`Logger`](thing/logger.md) & the [`EventLoop`](eventloop/eventloop.md) that executes operations. | | `hololinked.serializers` | Serializers for different data formats (JSON, MessagePack, etc.) and [`Serializers`](serializers/index.md) singleton. | | `hololinked.server` | Protocol specific server implementations | | `hololinked.client` | [`ObjectProxy`](clients/object-proxy.md) and protocol specific client implementations, client abstractions and [`ClientFactory`](clients/base.md). | | `hololinked.param` | Copy of `param` library with implementation specific modifications. | | `hololinked.storage` | Database clients for data persistence. | -| `hololinked.metadata.td` | Thing Description/[ThingModel](td/tm.md) parsing and generation. | +| `hololinked.metadata` | Device description languages a `Thing` can be described in. `hololinked.metadata.td` holds the W3C Web of Things Thing Description/[ThingModel](td/tm.md) parsing and generation. | +| `hololinked.injection` | Dependency injection layer. Holds the lazy adapter registries — `Serializers`, `SchemaValidators`, `StorageBackends` and `MetadataFormats` — that resolve an implementation by name on first use. | +| `hololinked.schema_validators` | Validators that check property, action and event payloads against a schema (JSON Schema, fastjsonschema, pydantic). | diff --git a/docs/api-reference/thing/index.md b/docs/api-reference/thing/index.md index 9cc9003..f6b5089 100644 --- a/docs/api-reference/thing/index.md +++ b/docs/api-reference/thing/index.md @@ -48,4 +48,26 @@ other `Thing`'s that are composed within this `Thing`. `logging.Logger`
{{ thing_logger_doc() }} +### `state_machine` +`StateMachine | None`
+`class-attribute`, `writable`
+the `StateMachine`, `None` when the `Thing` has none. Accessed on an instance it returns a [`BoundFSM`](../state-machine/bound-fsm.md). + +### `state_change_event` +`Event`
+`class-attribute`, `read-only`
+change event pushed whenever `state` changes. Generated automatically because `state` is an +observable `Property`. + +### `event_bus` +`EventBus`
+`instance-attribute`, `read-only`
+the bus this object's events are published through, owned by the +[`EventLoop`](../eventloop/eventloop.md). + +### `thing_model` +`ThingModel`
+`instance-attribute`, `read-only`
+the Thing Model of this object, equivalent to calling `get_thing_model()` with default arguments. + diff --git a/docs/beginners-guide/articles/servers.md b/docs/beginners-guide/articles/servers.md index 71f669a..3e9b93b 100644 --- a/docs/beginners-guide/articles/servers.md +++ b/docs/beginners-guide/articles/servers.md @@ -57,7 +57,7 @@ The exposed properties, actions and events (events are discussed [below](#publis --8<-- "docs/beginners-guide/code/thing_basic_example.py:146:155" ``` -See the [protocols](protocols/index.md) section for more options to serve the `Thing`. +See the [protocols](protocols/general.md) section for more options to serve the `Thing`. All requests to properties and actions are generally queued as the domain of operation under the hood is remote procedure calls (RPC) mediated completely by ZMQ. Therefore, only one request is executed at a time as it is assumed that the hardware normally responds to only one (physical-)operation at a time. diff --git a/main.py b/main.py index e631120..3368e81 100644 --- a/main.py +++ b/main.py @@ -12,7 +12,7 @@ def thing_id_docstring(): return hololinked.core.Thing.id.doc @env.macro - def sub_things_docstring(): # does not work, dont know why + def sub_things_docstring(): return inspect.getdoc(hololinked.core.thing.Thing.sub_things) @env.macro From 517f4bf821fd644591df249f3bedf3715da51277 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 19:46:56 +0200 Subject: [PATCH 05/21] eventloop API --- docs/api-reference/eventloop/job.md | 14 +++++++ docs/api-reference/eventloop/operation.md | 16 ++++++++ docs/api-reference/eventloop/payloads.md | 25 +++++++++++ .../eventloop/pending-operations.md | 10 +++++ docs/api-reference/eventloop/pubsub.md | 41 +++++++++++++++++++ docs/api-reference/eventloop/reply.md | 18 ++++++++ 6 files changed, 124 insertions(+) create mode 100644 docs/api-reference/eventloop/job.md create mode 100644 docs/api-reference/eventloop/operation.md create mode 100644 docs/api-reference/eventloop/payloads.md create mode 100644 docs/api-reference/eventloop/pending-operations.md create mode 100644 docs/api-reference/eventloop/pubsub.md create mode 100644 docs/api-reference/eventloop/reply.md diff --git a/docs/api-reference/eventloop/job.md b/docs/api-reference/eventloop/job.md new file mode 100644 index 0000000..784747b --- /dev/null +++ b/docs/api-reference/eventloop/job.md @@ -0,0 +1,14 @@ + +::: hololinked.core.eventloop.operations.Job + options: + members: + - __init__ + - operation + - future + - started + - completed + - invokation_timeout_task + - execution_timeout_task + - answer + - answer_if_never_started + - answer_if_overdue diff --git a/docs/api-reference/eventloop/operation.md b/docs/api-reference/eventloop/operation.md new file mode 100644 index 0000000..fe44084 --- /dev/null +++ b/docs/api-reference/eventloop/operation.md @@ -0,0 +1,16 @@ + +::: hololinked.core.eventloop.operations.Operation + options: + members: + - __init__ + - thing_id + - objekt + - operation + - payload + - preserialized_payload + - scheduler_execution_context + - thing_execution_context + - sender_id + - id + - qualified_name + - create diff --git a/docs/api-reference/eventloop/payloads.md b/docs/api-reference/eventloop/payloads.md new file mode 100644 index 0000000..35d035e --- /dev/null +++ b/docs/api-reference/eventloop/payloads.md @@ -0,0 +1,25 @@ +# Payloads + +The two containers an `Operation` and a `Reply` carry their data in. + +::: hololinked.core.eventloop.payloads.SerializableData + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - value + - content_type + - serializer + - serialize + - deserialize + - require_serialized + +::: hololinked.core.eventloop.payloads.PreserializedData + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - value + - content_type diff --git a/docs/api-reference/eventloop/pending-operations.md b/docs/api-reference/eventloop/pending-operations.md new file mode 100644 index 0000000..6fa0099 --- /dev/null +++ b/docs/api-reference/eventloop/pending-operations.md @@ -0,0 +1,10 @@ + +::: hololinked.core.eventloop.operations.PendingOperations + options: + members: + - __init__ + - maxsize + - futures + - add + - claim + - clear diff --git a/docs/api-reference/eventloop/pubsub.md b/docs/api-reference/eventloop/pubsub.md new file mode 100644 index 0000000..f7e0551 --- /dev/null +++ b/docs/api-reference/eventloop/pubsub.md @@ -0,0 +1,41 @@ +# Publish-Subscribe + +::: hololinked.core.eventloop.pubsub.EventBus + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - register + - unregister + - subscribe + - unsubscribe + - publish + - event_for + - event_ids + +::: hololinked.core.eventloop.pubsub.EventSubscription + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - event + - bus + - loop + - queue + - dropped + - unique_identifier + - receive + - encode + - event_callback_threadsafe + - unsubscribe + +::: hololinked.core.eventloop.pubsub.RegisteredEvent + options: + show_root_heading: true + heading_level: 2 + members: + - descriptor + - owner + - unique_identifier diff --git a/docs/api-reference/eventloop/reply.md b/docs/api-reference/eventloop/reply.md new file mode 100644 index 0000000..cf5f09f --- /dev/null +++ b/docs/api-reference/eventloop/reply.md @@ -0,0 +1,18 @@ +# Reply + +::: hololinked.core.eventloop.operations.Reply + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - payload + - preserialized_payload + - kind + - is_error + - timed_out + +::: hololinked.core.eventloop.operations.ReplyKind + options: + show_root_heading: true + heading_level: 2 From 0f94410042e87954882387509cb572c53eafd9c6 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 19:53:10 +0200 Subject: [PATCH 06/21] dependenncy injection --- docs/api-reference/injection/index.md | 36 +++++++++++++++++++ .../injection/metadata-formats.md | 9 +++++ .../injection/schema-validators.md | 14 ++++++++ .../injection/storage-backends.md | 22 ++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 docs/api-reference/injection/index.md create mode 100644 docs/api-reference/injection/metadata-formats.md create mode 100644 docs/api-reference/injection/schema-validators.md create mode 100644 docs/api-reference/injection/storage-backends.md diff --git a/docs/api-reference/injection/index.md b/docs/api-reference/injection/index.md new file mode 100644 index 0000000..855070b --- /dev/null +++ b/docs/api-reference/injection/index.md @@ -0,0 +1,36 @@ +# Adapter Registries + +::: hololinked.injection + options: + members: [] + show_root_heading: false + +Each registry below resolves an implementation **by name, on first use**. + +| Registry | Resolves | Adapters live in | +| --- | --- | --- | +| [`Serializers`](../serializers/index.md) | serializers | `hololinked.serializers` | +| [`SchemaValidators`](schema-validators.md) | schema validators | `hololinked.schema_validators` | +| [`StorageBackends`](storage-backends.md) | storage backends | `hololinked.storage` | +| [`MetadataFormats`](metadata-formats.md) | device description languages | `hololinked.metadata` | + +The implementation is either already available in the package or can be supplied by the end user. +All four classes above are singletons, so anything set on them applies process-wide. + +::: hololinked.injection.AdapterRegistry + options: + show_root_heading: true + heading_level: 2 + members: + - adapter_kind + - package + - modules + - tables + - instantiate + - install + - forget_adapters + +::: hololinked.injection.Registry + options: + show_root_heading: true + heading_level: 2 diff --git a/docs/api-reference/injection/metadata-formats.md b/docs/api-reference/injection/metadata-formats.md new file mode 100644 index 0000000..69a4f83 --- /dev/null +++ b/docs/api-reference/injection/metadata-formats.md @@ -0,0 +1,9 @@ + +::: hololinked.injection.MetadataFormats + options: + members: + - wot + - modules + - get + - register + - reset diff --git a/docs/api-reference/injection/schema-validators.md b/docs/api-reference/injection/schema-validators.md new file mode 100644 index 0000000..54ffe69 --- /dev/null +++ b/docs/api-reference/injection/schema-validators.md @@ -0,0 +1,14 @@ + +::: hololinked.injection.SchemaValidators + options: + members: + - json_schema + - pydantic + - modules + - predicates + - for_schema + - name_for_schema + - is_supported + - check_schema + - register + - reset diff --git a/docs/api-reference/injection/storage-backends.md b/docs/api-reference/injection/storage-backends.md new file mode 100644 index 0000000..8d63a3f --- /dev/null +++ b/docs/api-reference/injection/storage-backends.md @@ -0,0 +1,22 @@ +# StorageBackends + +::: hololinked.injection.StorageBackends + options: + show_root_heading: true + heading_level: 2 + members: + - sqlalchemy + - mongo + - json_file + - modules + - flags + - default_name + - for_thing + - name_for_thing + - register + - reset + +::: hololinked.injection.prepare_object_storage + options: + show_root_heading: true + heading_level: 2 From 190e8e7e6a61b0c5d18903e579617d5e9c02f397 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 20:08:11 +0200 Subject: [PATCH 07/21] interfaces --- .../interfaces/configuration-repository.md | 15 ++++ docs/api-reference/interfaces/index.md | 18 +++++ docs/api-reference/interfaces/metadata.md | 72 +++++++++++++++++++ .../interfaces/schema-validator.md | 9 +++ docs/api-reference/interfaces/serializer.md | 10 +++ 5 files changed, 124 insertions(+) create mode 100644 docs/api-reference/interfaces/configuration-repository.md create mode 100644 docs/api-reference/interfaces/index.md create mode 100644 docs/api-reference/interfaces/metadata.md create mode 100644 docs/api-reference/interfaces/schema-validator.md create mode 100644 docs/api-reference/interfaces/serializer.md diff --git a/docs/api-reference/interfaces/configuration-repository.md b/docs/api-reference/interfaces/configuration-repository.md new file mode 100644 index 0000000..71cfb96 --- /dev/null +++ b/docs/api-reference/interfaces/configuration-repository.md @@ -0,0 +1,15 @@ + +::: hololinked.core.interfaces.configuration.BaseConfigurationRepository + options: + members: + - __init__ + - from_thing + - thing + - fetch_own_info + - get_property + - get_properties + - get_all_properties + - set_property + - set_properties + - create_missing_properties + - create_init_properties diff --git a/docs/api-reference/interfaces/index.md b/docs/api-reference/interfaces/index.md new file mode 100644 index 0000000..f3c7653 --- /dev/null +++ b/docs/api-reference/interfaces/index.md @@ -0,0 +1,18 @@ +# Interfaces + +::: hololinked.core.interfaces + options: + members: [] + show_root_heading: false + +These are contracts each replaceable dependency has to satisfy. Subclass from here to implement one's +own tech stack. If one needs a totally new feature, a base class needs to be defined in this namespace with business logic integrated into the repository, these need separate PRs and dont work out of the box. + +| Port | Registry | Adapters | +| --- | --- | --- | +| [`BaseSerializer`](serializer.md) | [`Serializers`](../serializers/index.md) | `hololinked.serializers` | +| [`BaseSchemaValidator`](schema-validator.md) | [`SchemaValidators`](../injection/schema-validators.md) | `hololinked.schema_validators` | +| [`BaseConfigurationRepository`](configuration-repository.md) | [`StorageBackends`](../injection/storage-backends.md) | `hololinked.storage` | +| [`MetadataFormat`](metadata.md) | [`MetadataFormats`](../injection/metadata-formats.md) | `hololinked.metadata` | + +See [Hexagonal Architecture](../../design/hexagonal-architecture.md) for the reasoning behind the split. diff --git a/docs/api-reference/interfaces/metadata.md b/docs/api-reference/interfaces/metadata.md new file mode 100644 index 0000000..2e4b560 --- /dev/null +++ b/docs/api-reference/interfaces/metadata.md @@ -0,0 +1,72 @@ +# Metadata + +Metadata generators are device APIs or device description languages. One can either create a Thing +in code and generate metadata (code-first), or create a Thing *from* a metadata (API-first). The interface +required to do this is defined here. + +A specific metadata format is a bundle of five classes: one per core component - Property, Action, Event and a common base class for common metadata among them, and a class that puts them together. + +See code of `hololinked.core.metadata.td` for a reference implementation for the W3C Web of Things. + +::: hololinked.core.interfaces.metadata.MetadataFormat + options: + show_root_heading: true + heading_level: 2 + members: + - thing + - property + - action + - event + - interaction + +::: hololinked.core.interfaces.metadata.Metadata + options: + show_root_heading: true + heading_level: 2 + members: + - thing + - generate + - produce + - add_interactions + - skip_properties + - skip_actions + - skip_events + - skip_names + - ignore_errors + - json + +::: hololinked.core.interfaces.metadata.InteractionMetadata + options: + show_root_heading: true + heading_level: 2 + members: + - what + - name + - objekt + - owner + - owner_cls + - thing_cls + - thing_id + - build + - build_non_compliant_metadata + - from_descriptor + - to_descriptor + - from_metadata + - override_defaults + - register_descriptor + - json + +::: hololinked.core.interfaces.metadata.PropertyMetadata + options: + show_root_heading: true + heading_level: 2 + +::: hololinked.core.interfaces.metadata.ActionMetadata + options: + show_root_heading: true + heading_level: 2 + +::: hololinked.core.interfaces.metadata.EventMetadata + options: + show_root_heading: true + heading_level: 2 diff --git a/docs/api-reference/interfaces/schema-validator.md b/docs/api-reference/interfaces/schema-validator.md new file mode 100644 index 0000000..4687e74 --- /dev/null +++ b/docs/api-reference/interfaces/schema-validator.md @@ -0,0 +1,9 @@ + +::: hololinked.core.interfaces.schema_validators.BaseSchemaValidator + options: + members: + - __init__ + - schema + - json + - validate + - validate_method_call diff --git a/docs/api-reference/interfaces/serializer.md b/docs/api-reference/interfaces/serializer.md new file mode 100644 index 0000000..7040c25 --- /dev/null +++ b/docs/api-reference/interfaces/serializer.md @@ -0,0 +1,10 @@ + +::: hololinked.core.interfaces.serializer.BaseSerializer + options: + members: + - __init__ + - type + - content_type + - dumps + - loads + - convert_to_bytes From 5fb1f4b3ecd65d0cec42a11c2665a6663c4680fe Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 20:32:57 +0200 Subject: [PATCH 08/21] serializers --- docs/api-reference/serializers/json.md | 26 +++++++++++++++++++++++ docs/api-reference/serializers/msgpack.md | 12 +++++++++++ docs/api-reference/serializers/pickle.md | 9 ++++++++ docs/api-reference/serializers/serpent.md | 9 ++++++++ docs/api-reference/serializers/text.md | 9 ++++++++ 5 files changed, 65 insertions(+) create mode 100644 docs/api-reference/serializers/json.md create mode 100644 docs/api-reference/serializers/msgpack.md create mode 100644 docs/api-reference/serializers/pickle.md create mode 100644 docs/api-reference/serializers/serpent.md create mode 100644 docs/api-reference/serializers/text.md diff --git a/docs/api-reference/serializers/json.md b/docs/api-reference/serializers/json.md new file mode 100644 index 0000000..5d1a69e --- /dev/null +++ b/docs/api-reference/serializers/json.md @@ -0,0 +1,26 @@ +# JSON + +::: hololinked.serializers.json.JSONSerializer + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - type + - content_type + - dumps + - loads + - default + - register_type_replacement + +::: hololinked.serializers.json.PythonBuiltinJSONSerializer + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - type + - dumps + - loads + - dump + - load diff --git a/docs/api-reference/serializers/msgpack.md b/docs/api-reference/serializers/msgpack.md new file mode 100644 index 0000000..feb952d --- /dev/null +++ b/docs/api-reference/serializers/msgpack.md @@ -0,0 +1,12 @@ + +::: hololinked.serializers.msgpack.MsgpackSerializer + options: + members: + - __init__ + - type + - content_type + - dumps + - loads + - default_encode + - ext_decode + - codes diff --git a/docs/api-reference/serializers/pickle.md b/docs/api-reference/serializers/pickle.md new file mode 100644 index 0000000..3a490c8 --- /dev/null +++ b/docs/api-reference/serializers/pickle.md @@ -0,0 +1,9 @@ + +::: hololinked.serializers.pickle.PickleSerializer + options: + members: + - __init__ + - type + - content_type + - dumps + - loads diff --git a/docs/api-reference/serializers/serpent.md b/docs/api-reference/serializers/serpent.md new file mode 100644 index 0000000..b467b6b --- /dev/null +++ b/docs/api-reference/serializers/serpent.md @@ -0,0 +1,9 @@ + +::: hololinked.serializers.serpent.SerpentSerializer + options: + members: + - __init__ + - type + - dumps + - loads + - register_type_replacement diff --git a/docs/api-reference/serializers/text.md b/docs/api-reference/serializers/text.md new file mode 100644 index 0000000..ffd4aee --- /dev/null +++ b/docs/api-reference/serializers/text.md @@ -0,0 +1,9 @@ + +::: hololinked.serializers.text.TextSerializer + options: + members: + - __init__ + - type + - content_type + - dumps + - loads From 92ad97447d55b5519de4e2bc1082dd1601580088 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 21:04:32 +0200 Subject: [PATCH 09/21] update dockerfile --- .dockerignore | 3 ++- Dockerfile | 18 ++++++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/.dockerignore b/.dockerignore index 9b85c8a..6f8747a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,4 +10,5 @@ **/.DS_Store **/logs **/*.env -**/hololinked \ No newline at end of file +# only a stray root-level checkout; the submodule at repo/hololinked must reach the build +hololinked \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index cc843d0..b734dec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-slim AS base +FROM python:3.13-slim AS base # workdir WORKDIR /app @@ -13,18 +13,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ RUN pip install uv==0.7.0 COPY .python-version pyproject.toml uv.lock /app/ +COPY repo/hololinked /app/repo/hololinked +RUN uv venv +RUN uv sync --no-install-project --no-default-groups --group repo -# Create a virtual environment and sync dependencies -RUN uv venv -RUN uv sync --no-install-project --no-default-groups - -# Copy documentation source files COPY . . -# above resets the cache, always clone the latest version of the project -RUN . .venv/bin/activate && git clone https://github.com/hololinked-dev/hololinked.git && \ - cd hololinked && pip install -e . && cd .. - # development image FROM base AS dev # ARG MKDOCS_DIRTY_RELOAD=false @@ -34,9 +28,9 @@ CMD ["/bin/sh", "-c", ". .venv/bin/activate && mkdocs serve -a 0.0.0.0:8000"] # production image FROM base AS build -RUN . .venv/bin/activate && mkdocs build +RUN . .venv/bin/activate && mkdocs build FROM nginx:alpine AS prod COPY --from=build /app/site /usr/share/nginx/html EXPOSE 80 -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file +CMD ["nginx", "-g", "daemon off;"] From 1e9d34aca0dd30b27b1b350223d6d0dc81234cdd Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 21:23:50 +0200 Subject: [PATCH 10/21] update mkdocs.yml --- docs/api-reference/interfaces/metadata.md | 13 ++++- mkdocs.yml | 68 +++++++++++++++-------- 2 files changed, 58 insertions(+), 23 deletions(-) diff --git a/docs/api-reference/interfaces/metadata.md b/docs/api-reference/interfaces/metadata.md index 2e4b560..699b175 100644 --- a/docs/api-reference/interfaces/metadata.md +++ b/docs/api-reference/interfaces/metadata.md @@ -6,7 +6,18 @@ required to do this is defined here. A specific metadata format is a bundle of five classes: one per core component - Property, Action, Event and a common base class for common metadata among them, and a class that puts them together. -See code of `hololinked.core.metadata.td` for a reference implementation for the W3C Web of Things. +The W3C Web of Things bundle in `hololinked.metadata.td` is the reference implementation, and maps +onto the five slots as: + +| slot | W3C WoT class | +| --- | --- | +| `thing` | [`ThingModel`](../td/tm.md) | +| `property` | [`PropertyAffordance`](../td/interaction_affordance/property_affordance.md) | +| `action` | [`ActionAffordance`](../td/interaction_affordance/action_affordance.md) | +| `event` | [`EventAffordance`](../td/interaction_affordance/event_affordance.md) | +| `interaction` | [`InteractionAffordance`](../td/interaction_affordance/interaction_affordance.md) | + +Have a look at their code by using the links above. ::: hololinked.core.interfaces.metadata.MetadataFormat options: diff --git a/mkdocs.yml b/mkdocs.yml index 4d65f0b..a18a9d8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -55,27 +55,21 @@ nav: - StateMachine: - StateMachine: api-reference/state-machine/state-machine.md - BoundFSM: api-reference/state-machine/bound-fsm.md - - RPC Server: - - RPCServer: api-reference/rpc-server/rpc-server.md - - Messaging Contracts: - - RequestMessage: api-reference/rpc-server/messaging-contract/request-message.md - - ResponseMessage: api-reference/rpc-server/messaging-contract/response-message.md - - EventMessage: api-reference/rpc-server/messaging-contract/event-message.md - - Headers: api-reference/rpc-server/messaging-contract/headers.md - - Contexts: api-reference/rpc-server/messaging-contract/contexts.md - - Brokers: - - BaseZMQ: api-reference/rpc-server/brokers/base-zmq.md - - AsyncZMQServer: api-reference/rpc-server/brokers/async-zmq-server.md - - SyncZMQClient: api-reference/rpc-server/brokers/sync-zmq-client.md - - AsyncZMQClient: api-reference/rpc-server/brokers/async-zmq-client.md - - MessageMappedClientPool: api-reference/rpc-server/brokers/message-mapped-zmq-client-pool.md - - EventPublisher: api-reference/rpc-server/brokers/event-publisher.md - - EventConsumer: api-reference/rpc-server/brokers/event-consumer.md - # - Schedulers: - # - Scheduler: api-reference/rpc-server/schedulers/scheduler.md - # - QueuedScheduler: api-reference/rpc-server/schedulers/queued-scheduler.md - # - ThreadedScheduler: api-reference/rpc-server/schedulers/threaded-scheduler.md - # - AsyncScheduler: api-reference/rpc-server/schedulers/async-scheduler.md + - Event Loop: + - EventLoop: api-reference/eventloop/eventloop.md + - Operation Model: + - Operation: api-reference/eventloop/operation.md + - Job: api-reference/eventloop/job.md + - Reply: api-reference/eventloop/reply.md + - PendingOperations: api-reference/eventloop/pending-operations.md + - Payloads: api-reference/eventloop/payloads.md + - Publish-Subscribe: api-reference/eventloop/pubsub.md + - Execution Contexts: api-reference/eventloop/contexts.md + - Schedulers: + - Scheduler: api-reference/eventloop/schedulers/scheduler.md + - QueuedScheduler: api-reference/eventloop/schedulers/queued-scheduler.md + - ThreadedScheduler: api-reference/eventloop/schedulers/threaded-scheduler.md + - AsyncScheduler: api-reference/eventloop/schedulers/async-scheduler.md - Clients: - ClientFactory: api-reference/clients/base.md - ObjectProxy: api-reference/clients/object-proxy.md @@ -91,14 +85,44 @@ nav: - OIDC Direct Access Grant: api-reference/clients/security/oidc.md - Servers: - HTTP: api-reference/protocols/http/index.md - - ZMQ: api-reference/protocols/zmq/index.md + - ZMQ: + - ZMQServer: api-reference/protocols/zmq/index.md + - Messaging Contracts: + - RequestMessage: api-reference/protocols/zmq/messaging-contract/request-message.md + - ResponseMessage: api-reference/protocols/zmq/messaging-contract/response-message.md + - EventMessage: api-reference/protocols/zmq/messaging-contract/event-message.md + - Headers: api-reference/protocols/zmq/messaging-contract/headers.md + - Brokers: + - BaseZMQ: api-reference/protocols/zmq/brokers/base-zmq.md + - AsyncZMQServer: api-reference/protocols/zmq/brokers/async-zmq-server.md + - SyncZMQClient: api-reference/protocols/zmq/brokers/sync-zmq-client.md + - AsyncZMQClient: api-reference/protocols/zmq/brokers/async-zmq-client.md + - MessageMappedClientPool: api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md + - EventPublisher: api-reference/protocols/zmq/brokers/event-publisher.md + - EventConsumer: api-reference/protocols/zmq/brokers/event-consumer.md - MQTT: api-reference/protocols/mqtt/index.md - Security: - Bcrypt: api-reference/protocols/security/bcrypt.md - Argon2: api-reference/protocols/security/argon2.md - Configuration: api-reference/global-config.md + - Interfaces: + - Ports: api-reference/interfaces/index.md + - BaseSerializer: api-reference/interfaces/serializer.md + - BaseSchemaValidator: api-reference/interfaces/schema-validator.md + - BaseConfigurationRepository: api-reference/interfaces/configuration-repository.md + - Metadata: api-reference/interfaces/metadata.md + - Dependency Injection: + - Adapter Registries: api-reference/injection/index.md + - SchemaValidators: api-reference/injection/schema-validators.md + - StorageBackends: api-reference/injection/storage-backends.md + - MetadataFormats: api-reference/injection/metadata-formats.md - Serializers: - Serializers: api-reference/serializers/index.md + - JSON: api-reference/serializers/json.md + - MessagePack: api-reference/serializers/msgpack.md + - Pickle: api-reference/serializers/pickle.md + - Serpent: api-reference/serializers/serpent.md + - Text: api-reference/serializers/text.md # - Thing Descriptions: # - Interaction Affordances: # - InteractionAffordance: api-reference/td/interaction_affordance/interaction_affordance.md From 042c4d31b4efbeaefa077251b4ed126a4c19fe0e Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 21:39:48 +0200 Subject: [PATCH 11/21] schema validators --- .../schema-validators/fast-json-schema.md | 28 +++++++++++++++++++ .../schema-validators/json-schema.md | 12 ++++++++ .../schema-validators/pydantic.md | 11 ++++++++ mkdocs.yml | 4 +++ 4 files changed, 55 insertions(+) create mode 100644 docs/api-reference/schema-validators/fast-json-schema.md create mode 100644 docs/api-reference/schema-validators/json-schema.md create mode 100644 docs/api-reference/schema-validators/pydantic.md diff --git a/docs/api-reference/schema-validators/fast-json-schema.md b/docs/api-reference/schema-validators/fast-json-schema.md new file mode 100644 index 0000000..2b945d4 --- /dev/null +++ b/docs/api-reference/schema-validators/fast-json-schema.md @@ -0,0 +1,28 @@ +# FastJSONSchemaValidator + +Unlike [`JSONSchemaValidator`](json-schema.md) and [`PydanticSchemaValidator`](pydantic.md), this one +is **not** registered under a name in +[`SchemaValidators`](../injection/schema-validators.md), as a default JSON schema validator is available. To use `FastJSONSchemaValidator`: + +```python +from hololinked import SchemaValidators +from hololinked.schema_validators import FastJSONSchemaValidator + +SchemaValidators.register(FastJSONSchemaValidator, "json_schema", predicate=lambda schema: isinstance(schema, dict)) +``` + +It needs the `validators` extra dependencies (`pip install hololinked[validators]`). + +::: hololinked.schema_validators.fast_json_schema.FastJSONSchemaValidator + options: + show_root_heading: true + heading_level: 2 + inherited_members: true + members: + - __init__ + - schema + - json + - validator + - validate + - validate_method_call + - check_schema diff --git a/docs/api-reference/schema-validators/json-schema.md b/docs/api-reference/schema-validators/json-schema.md new file mode 100644 index 0000000..fe9a8b7 --- /dev/null +++ b/docs/api-reference/schema-validators/json-schema.md @@ -0,0 +1,12 @@ + +::: hololinked.schema_validators.json_schema.JSONSchemaValidator + options: + inherited_members: true + members: + - __init__ + - schema + - json + - validator + - validate + - validate_method_call + - check_schema diff --git a/docs/api-reference/schema-validators/pydantic.md b/docs/api-reference/schema-validators/pydantic.md new file mode 100644 index 0000000..1cd0f28 --- /dev/null +++ b/docs/api-reference/schema-validators/pydantic.md @@ -0,0 +1,11 @@ + +::: hololinked.schema_validators.pydantic_model.PydanticSchemaValidator + options: + inherited_members: true + members: + - __init__ + - schema + - json + - validator + - validate + - validate_method_call diff --git a/mkdocs.yml b/mkdocs.yml index a18a9d8..b1271e0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -116,6 +116,10 @@ nav: - SchemaValidators: api-reference/injection/schema-validators.md - StorageBackends: api-reference/injection/storage-backends.md - MetadataFormats: api-reference/injection/metadata-formats.md + - Schema Validators: + - JSONSchemaValidator: api-reference/schema-validators/json-schema.md + - FastJSONSchemaValidator: api-reference/schema-validators/fast-json-schema.md + - PydanticSchemaValidator: api-reference/schema-validators/pydantic.md - Serializers: - Serializers: api-reference/serializers/index.md - JSON: api-reference/serializers/json.md From 392774ab9948e0a18f0931fe64e36b9bf32908a1 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Mon, 7 Sep 2026 22:03:07 +0200 Subject: [PATCH 12/21] update skaffold --- docs/index.md | 14 +++++++++++--- skaffold.yaml | 4 ++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index 27d0cb4..7306f3d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,7 +11,6 @@ As a novice, you have a requirement to control and capture data from your hardwa If you are a web developer or an industry professional looking for a web standards compatible, interoperable (high-speed) IoT runtime, `hololinked` can be a decent choice. By conforming to [W3C Web of Things](https://www.w3.org/WoT/), one can expect a consistent API and flexible bidirectional message flow to interact with your devices, irrespective of the underlying protocol. Currently HTTP, MQTT & ZMQ are supported. -This implementation is based on RPC, built ground-up in python keeping both the latest web technologies and python principles in mind.
@@ -52,6 +51,8 @@ This implementation is based on RPC, built ground-up in python keeping both the
+hololinked demo: a Thing controlled from a browser dashboard + --- ## High Level Overview @@ -89,6 +90,15 @@ Additionally, **state machines** can constrain property and action execution: - _Oscilloscope_ - Cannot start a new measurement while one is ongoing - _Camera_ - Cannot change exposure time while capturing video +#### Benefits you get when you use hololinked: + +- technology independent and technology extensible architecture -> handles technology changes. +- its not a solution that uses "different set of technologies to solve the same problem". It solves a problem irrespective of the underlying technologies. AI included. You chose the tech stack or extend it with your stack (PRs welcome for new tech adapters and new features). +- simple to understand and simplifies contradicting viewpoints +- scalable, performant, interoperable and can be used in different domains (IoT, microservices, networked control systems, web, RPCs etc.) +- metadata rich - use AI agents, API tools, whatever. +- security built in + --- !!! tip "Ready to get started?" @@ -104,5 +114,3 @@ Additionally, **state machines** can constrain property and action execution: - Every Friday 9-10AM CET/CEST, 4-5PM CET/CEST Please email to info@hololinked.dev. You can also ask questions in the [discord group](https://discord.com/invite/kEz87zqQXh) (currently no participants). - - diff --git a/skaffold.yaml b/skaffold.yaml index dbf4a46..c026fc4 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -128,5 +128,5 @@ deploy: image.ports.containerPort: 80 setValueTemplates: image: - repository: docker.io/vigneshvsv/hololinked_docs - tag: prod + repository: "{{ .IMAGE_REPO_hololinked_docs }}" + tag: "{{ .IMAGE_TAG_hololinked_docs }}@{{ .IMAGE_DIGEST_hololinked_docs }}" From 2fe52893dea21b336a3df56ad71a6eac46182d77 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Fri, 11 Sep 2026 18:31:25 +0200 Subject: [PATCH 13/21] storage --- docs/api-reference/storage/bases.md | 12 +++++++ docs/api-reference/storage/config.md | 43 ++++++++++++++++++++++++ docs/api-reference/storage/index.md | 14 ++++++++ docs/api-reference/storage/json-file.md | 18 ++++++++++ docs/api-reference/storage/models.md | 38 +++++++++++++++++++++ docs/api-reference/storage/mongodb.md | 24 +++++++++++++ docs/api-reference/storage/sqlalchemy.md | 43 ++++++++++++++++++++++++ docs/index.md | 2 +- mkdocs.yml | 8 +++++ 9 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 docs/api-reference/storage/bases.md create mode 100644 docs/api-reference/storage/config.md create mode 100644 docs/api-reference/storage/index.md create mode 100644 docs/api-reference/storage/json-file.md create mode 100644 docs/api-reference/storage/models.md create mode 100644 docs/api-reference/storage/mongodb.md create mode 100644 docs/api-reference/storage/sqlalchemy.md diff --git a/docs/api-reference/storage/bases.md b/docs/api-reference/storage/bases.md new file mode 100644 index 0000000..3ef047d --- /dev/null +++ b/docs/api-reference/storage/bases.md @@ -0,0 +1,12 @@ +# BaseDB + +::: hololinked.storage.bases.BaseDB + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - from_thing + - config + - load_conf + - in_batch_call_context \ No newline at end of file diff --git a/docs/api-reference/storage/config.md b/docs/api-reference/storage/config.md new file mode 100644 index 0000000..86ecaa2 --- /dev/null +++ b/docs/api-reference/storage/config.md @@ -0,0 +1,43 @@ +# Storage configuration + +::: hololinked.storage.config.SQLDBConfig + options: + show_root_heading: true + heading_level: 2 + members: + - provider + - host + - port + - database + - user + - password + - dialect + - uri + - URL + +::: hololinked.storage.config.SQLiteConfig + options: + show_root_heading: true + heading_level: 2 + members: + - provider + - dialect + - file + - in_memory + - uri + - URL + +::: hololinked.storage.config.MongoDBConfig + options: + show_root_heading: true + heading_level: 2 + members: + - provider + - host + - port + - database + - user + - password + - authSource + - uri + - URL diff --git a/docs/api-reference/storage/index.md b/docs/api-reference/storage/index.md new file mode 100644 index 0000000..ce399e6 --- /dev/null +++ b/docs/api-reference/storage/index.md @@ -0,0 +1,14 @@ +# Storage + +::: hololinked.storage + options: + show_root_heading: false + members: false + +A storage backend implements the [`BaseConfigurationRepository`](../interfaces/configuration-repository.md). + +| backend | registered name | `Thing` flag | extra | needs a server | +| --- | --- | --- | --- | --- | +| [`JSONFileStorage`](json-file.md) | `json_file` | `use_json_file` | — | no | +| [`SQLAlchemyDB`](sqlalchemy.md) | `sqlalchemy` | `use_default_db` | `sqlalchemy`, `postgresql` | SQLite no, others yes | +| [`MongoDB`](mongodb.md) | `mongo` | `use_mongo_db` | `mongo` | yes | diff --git a/docs/api-reference/storage/json-file.md b/docs/api-reference/storage/json-file.md new file mode 100644 index 0000000..c689265 --- /dev/null +++ b/docs/api-reference/storage/json-file.md @@ -0,0 +1,18 @@ +# JSONFileStorage + +::: hololinked.storage.JSONFileStorage + options: + show_root_heading: true + heading_level: 2 + inherited_members: true + members: + - __init__ + - from_thing + - thing + - filename + - get_property + - get_properties + - get_all_properties + - set_property + - set_properties + - create_missing_properties \ No newline at end of file diff --git a/docs/api-reference/storage/models.md b/docs/api-reference/storage/models.md new file mode 100644 index 0000000..b9cda68 --- /dev/null +++ b/docs/api-reference/storage/models.md @@ -0,0 +1,38 @@ +# Storage models + +The SQLAlchemy table definitions used by [`SQLAlchemyDB`](sqlalchemy.md). + +::: hololinked.storage.models.SerializedProperty + options: + show_root_heading: true + heading_level: 2 + +::: hololinked.storage.models.ThingInformation + options: + show_root_heading: true + heading_level: 2 + members: + - id + - thing_id + - thing_class + - script + - init_kwargs + - server_id + - json + +::: hololinked.storage.models.DeserializedProperty + options: + show_root_heading: true + heading_level: 2 + members: + - thing_id + - name + - value + - created_at + - updated_at + + +::: hololinked.storage.models.ThingTableBase + options: + show_root_heading: true + heading_level: 2 \ No newline at end of file diff --git a/docs/api-reference/storage/mongodb.md b/docs/api-reference/storage/mongodb.md new file mode 100644 index 0000000..c275487 --- /dev/null +++ b/docs/api-reference/storage/mongodb.md @@ -0,0 +1,24 @@ +# MongoDB + +::: hololinked.storage.MongoDB + options: + show_root_heading: true + heading_level: 2 + inherited_members: true + members: + - __init__ + - from_thing + - thing + - config + - client + - db + - properties + - things + - fetch_own_info + - get_property + - get_properties + - get_all_properties + - set_property + - set_properties + - create_missing_properties + - in_batch_call_context diff --git a/docs/api-reference/storage/sqlalchemy.md b/docs/api-reference/storage/sqlalchemy.md new file mode 100644 index 0000000..48014f1 --- /dev/null +++ b/docs/api-reference/storage/sqlalchemy.md @@ -0,0 +1,43 @@ +# SQLAlchemyDB + +::: hololinked.storage.SQLAlchemyDB + options: + show_root_heading: true + heading_level: 2 + inherited_members: true + members: + - __init__ + - from_thing + - thing + - config + - engine + - sync_session + - fetch_own_info + - get_property + - get_properties + - get_all_properties + - set_property + - set_properties + - create_missing_properties + - create_init_properties + - in_batch_call_context + +## batch_db_commit + +::: hololinked.storage.sqlalchemydb.batch_db_commit + options: + show_root_heading: false + heading_level: 3 + members: + - __init__ + +## BaseSyncDB + +::: hololinked.storage.sqlalchemydb.BaseSyncDB + options: + show_root_heading: false + heading_level: 3 + members: + - __init__ + - engine + - sync_session diff --git a/docs/index.md b/docs/index.md index 7306f3d..30494b3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -51,7 +51,7 @@ If you are a web developer or an industry professional looking for a web standar -hololinked demo: a Thing controlled from a browser dashboard +hololinked demo: a Thing controlled from a browser dashboard --- diff --git a/mkdocs.yml b/mkdocs.yml index b1271e0..d096a01 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -127,6 +127,14 @@ nav: - Pickle: api-reference/serializers/pickle.md - Serpent: api-reference/serializers/serpent.md - Text: api-reference/serializers/text.md + - Storage: + - Storage Backends: api-reference/storage/index.md + - JSONFileStorage: api-reference/storage/json-file.md + - SQLAlchemyDB: api-reference/storage/sqlalchemy.md + - MongoDB: api-reference/storage/mongodb.md + - BaseDB: api-reference/storage/bases.md + - Configuration: api-reference/storage/config.md + - Models: api-reference/storage/models.md # - Thing Descriptions: # - Interaction Affordances: # - InteractionAffordance: api-reference/td/interaction_affordance/interaction_affordance.md From 6d907907292c7274d19b4930087e09feb8dbfde9 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Sat, 12 Sep 2026 10:45:02 +0200 Subject: [PATCH 14/21] add servers --- docs/api-reference/injection/index.md | 3 ++- .../injection/protocol-servers.md | 16 +++++++++++ docs/api-reference/interfaces/index.md | 1 + .../interfaces/protocol-server.md | 27 +++++++++++++++++++ docs/api-reference/server/index.md | 27 +++++++++++++++++++ mkdocs.yml | 3 +++ 6 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 docs/api-reference/injection/protocol-servers.md create mode 100644 docs/api-reference/interfaces/protocol-server.md create mode 100644 docs/api-reference/server/index.md diff --git a/docs/api-reference/injection/index.md b/docs/api-reference/injection/index.md index 855070b..5eaaa51 100644 --- a/docs/api-reference/injection/index.md +++ b/docs/api-reference/injection/index.md @@ -13,9 +13,10 @@ Each registry below resolves an implementation **by name, on first use**. | [`SchemaValidators`](schema-validators.md) | schema validators | `hololinked.schema_validators` | | [`StorageBackends`](storage-backends.md) | storage backends | `hololinked.storage` | | [`MetadataFormats`](metadata-formats.md) | device description languages | `hololinked.metadata` | +| [`ProtocolServers`](protocol-servers.md) | protocol servers | `hololinked.server` | The implementation is either already available in the package or can be supplied by the end user. -All four classes above are singletons, so anything set on them applies process-wide. +All classes above are singletons, so anything set on them applies process-wide. ::: hololinked.injection.AdapterRegistry options: diff --git a/docs/api-reference/injection/protocol-servers.md b/docs/api-reference/injection/protocol-servers.md new file mode 100644 index 0000000..4ee0b13 --- /dev/null +++ b/docs/api-reference/injection/protocol-servers.md @@ -0,0 +1,16 @@ +# ProtocolServers + +::: hololinked.injection.ProtocolServers + options: + show_root_heading: true + heading_level: 2 + members: + - http + - mqtt + - zmq + - modules + - protocols + - for_protocol + - register + - reset + diff --git a/docs/api-reference/interfaces/index.md b/docs/api-reference/interfaces/index.md index f3c7653..1c138db 100644 --- a/docs/api-reference/interfaces/index.md +++ b/docs/api-reference/interfaces/index.md @@ -14,5 +14,6 @@ own tech stack. If one needs a totally new feature, a base class needs to be def | [`BaseSchemaValidator`](schema-validator.md) | [`SchemaValidators`](../injection/schema-validators.md) | `hololinked.schema_validators` | | [`BaseConfigurationRepository`](configuration-repository.md) | [`StorageBackends`](../injection/storage-backends.md) | `hololinked.storage` | | [`MetadataFormat`](metadata.md) | [`MetadataFormats`](../injection/metadata-formats.md) | `hololinked.metadata` | +| [`BaseProtocolServer`](protocol-server.md) | [`ProtocolServers`](../injection/protocol-servers.md) | `hololinked.server` | See [Hexagonal Architecture](../../design/hexagonal-architecture.md) for the reasoning behind the split. diff --git a/docs/api-reference/interfaces/protocol-server.md b/docs/api-reference/interfaces/protocol-server.md new file mode 100644 index 0000000..ad06656 --- /dev/null +++ b/docs/api-reference/interfaces/protocol-server.md @@ -0,0 +1,27 @@ +# BaseProtocolServer + +::: hololinked.core.interfaces.protocol_server.BaseProtocolServer + options: + show_root_heading: true + heading_level: 2 + inherited_members: true + members: + - __init__ + - from_params + - id + - port + - logger + - config + - things + - add_thing + - add_things + - add_property + - add_action + - add_event + - setup + - start + - run + - stop + - welcome_lines + +The contract every protocol server must satisfy. diff --git a/docs/api-reference/server/index.md b/docs/api-reference/server/index.md new file mode 100644 index 0000000..2e1a301 --- /dev/null +++ b/docs/api-reference/server/index.md @@ -0,0 +1,27 @@ +# Server + +::: hololinked.server + options: + show_root_heading: false + members: false + +## Entry points + +`run()` and `stop()` knows no protocol in particular — they take already-constructed servers and +drive their lifecycle. Use them when you build servers yourself; `Thing.run(access_points=...)` is +the shorthand that calls `run()`. + +::: hololinked.server.run + options: + show_root_heading: true + heading_level: 3 + +::: hololinked.server.stop + options: + show_root_heading: true + heading_level: 3 + +::: hololinked.server.parse_params + options: + show_root_heading: true + heading_level: 3 diff --git a/mkdocs.yml b/mkdocs.yml index d096a01..4838bc2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -104,6 +104,7 @@ nav: - Security: - Bcrypt: api-reference/protocols/security/bcrypt.md - Argon2: api-reference/protocols/security/argon2.md + - Server: api-reference/server/index.md - Configuration: api-reference/global-config.md - Interfaces: - Ports: api-reference/interfaces/index.md @@ -111,11 +112,13 @@ nav: - BaseSchemaValidator: api-reference/interfaces/schema-validator.md - BaseConfigurationRepository: api-reference/interfaces/configuration-repository.md - Metadata: api-reference/interfaces/metadata.md + - BaseProtocolServer: api-reference/interfaces/protocol-server.md - Dependency Injection: - Adapter Registries: api-reference/injection/index.md - SchemaValidators: api-reference/injection/schema-validators.md - StorageBackends: api-reference/injection/storage-backends.md - MetadataFormats: api-reference/injection/metadata-formats.md + - ProtocolServers: api-reference/injection/protocol-servers.md - Schema Validators: - JSONSchemaValidator: api-reference/schema-validators/json-schema.md - FastJSONSchemaValidator: api-reference/schema-validators/fast-json-schema.md From f2f23490edd2d14abc89ac490bebd23741ffa194 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Sat, 12 Sep 2026 10:45:10 +0200 Subject: [PATCH 15/21] update main branch --- repo/hololinked | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo/hololinked b/repo/hololinked index 9e85c37..ef1c254 160000 --- a/repo/hololinked +++ b/repo/hololinked @@ -1 +1 @@ -Subproject commit 9e85c37d0886c956038c45f77afc00a0ff642865 +Subproject commit ef1c254594b47eab1f9dc5be5a26038d195cbcdd From 733a913c0a845066b1f38f550fa0604bf9bef90e Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Sat, 12 Sep 2026 11:21:08 +0200 Subject: [PATCH 16/21] HTTP --- docs/api-reference/protocols/http/config.md | 34 +++++++++++++ .../protocols/http/handlers/base.md | 21 ++++++++ .../protocols/http/handlers/event.md | 31 +++++++++++ .../protocols/http/handlers/index.md | 8 +++ .../protocols/http/handlers/probes.md | 42 +++++++++++++++ .../protocols/http/handlers/rpc.md | 51 +++++++++++++++++++ docs/api-reference/protocols/http/services.md | 20 ++++++++ mkdocs.yml | 11 +++- 8 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 docs/api-reference/protocols/http/config.md create mode 100644 docs/api-reference/protocols/http/handlers/base.md create mode 100644 docs/api-reference/protocols/http/handlers/event.md create mode 100644 docs/api-reference/protocols/http/handlers/index.md create mode 100644 docs/api-reference/protocols/http/handlers/probes.md create mode 100644 docs/api-reference/protocols/http/handlers/rpc.md create mode 100644 docs/api-reference/protocols/http/services.md diff --git a/docs/api-reference/protocols/http/config.md b/docs/api-reference/protocols/http/config.md new file mode 100644 index 0000000..89e64ef --- /dev/null +++ b/docs/api-reference/protocols/http/config.md @@ -0,0 +1,34 @@ +# HTTP runtime configuration + +::: hololinked.server.http.config.RuntimeConfig + options: + show_root_heading: true + heading_level: 2 + members: + - cors + - allowed_clients + - security_schemes + - server_id + - property_handler + - action_handler + - event_handler + - RW_multiple_properties_handler + - thing_description_handler + - liveness_probe_handler + - readiness_probe_handler + - stop_handler + - thing_description_service + +Pass these as a plain dictionary to the `config` argument of +[`HTTPServer`](index.md) — not as a `RuntimeConfig` instance: + +```python +HTTPServer(config=dict(cors=True, property_handler=MyPropertyHandler)) +``` + +::: hololinked.server.http.config.HandlerMetadata + options: + show_root_heading: true + heading_level: 2 + members: + - http_methods diff --git a/docs/api-reference/protocols/http/handlers/base.md b/docs/api-reference/protocols/http/handlers/base.md new file mode 100644 index 0000000..70bcbf9 --- /dev/null +++ b/docs/api-reference/protocols/http/handlers/base.md @@ -0,0 +1,21 @@ +# BaseHandler + +::: hololinked.server.http.handlers.BaseHandler + options: + show_root_heading: true + heading_level: 2 + members: + - initialize + - has_access_control + - is_authenticated + - is_authorized + - is_method_allowed + - set_access_control_allow_headers + - set_custom_default_headers + - get_execution_parameters + - get_request_payload + - message_id + - get + - post + - put + - delete \ No newline at end of file diff --git a/docs/api-reference/protocols/http/handlers/event.md b/docs/api-reference/protocols/http/handlers/event.md new file mode 100644 index 0000000..4521585 --- /dev/null +++ b/docs/api-reference/protocols/http/handlers/event.md @@ -0,0 +1,31 @@ +# EventHandler + +::: hololinked.server.http.handlers.EventHandler + options: + show_root_heading: true + heading_level: 2 + members: + - initialize + - resource + - set_custom_default_headers + - get + - options + - handle_datastream + +## JPEGImageEventHandler + +::: hololinked.server.http.handlers.JPEGImageEventHandler + options: + show_root_heading: false + heading_level: 3 + members: + - initialize + +## PNGImageEventHandler + +::: hololinked.server.http.handlers.PNGImageEventHandler + options: + show_root_heading: false + heading_level: 3 + members: + - initialize diff --git a/docs/api-reference/protocols/http/handlers/index.md b/docs/api-reference/protocols/http/handlers/index.md new file mode 100644 index 0000000..b0348a7 --- /dev/null +++ b/docs/api-reference/protocols/http/handlers/index.md @@ -0,0 +1,8 @@ +# Request handlers + +Every HTTP route is served by a Tornado `RequestHandler` subclass. + +- [BaseHandler](base.md) — authentication and CORS are decided +- [RPCHandler](rpc.md) — `PropertyHandler` / `ActionHandler` / `RWMultiplePropertiesHandler` +- [EventHandler](event.md) — streams events +- [Probes and control](probes.md) — `ThingDescriptionHandler`, `LivenessProbeHandler`, `ReadinessProbeHandler`, `StopHandler` \ No newline at end of file diff --git a/docs/api-reference/protocols/http/handlers/probes.md b/docs/api-reference/protocols/http/handlers/probes.md new file mode 100644 index 0000000..19fc8e1 --- /dev/null +++ b/docs/api-reference/protocols/http/handlers/probes.md @@ -0,0 +1,42 @@ +# Probes and control + +Single-purpose handlers that do not carry an interaction. + +::: hololinked.server.http.handlers.ThingDescriptionHandler + options: + show_root_heading: true + heading_level: 2 + members: + - initialize + - get + +Serves the Thing Description document, generated by `ThingDescriptionService`. + +::: hololinked.server.http.handlers.LivenessProbeHandler + options: + show_root_heading: true + heading_level: 2 + members: + - initialize + - get + +::: hololinked.server.http.handlers.ReadinessProbeHandler + options: + show_root_heading: true + heading_level: 2 + members: + - initialize + - get + +Liveness answers whether the server process is up; readiness answers whether it is ready to serve +the `Thing`. + +::: hololinked.server.http.handlers.StopHandler + options: + show_root_heading: true + heading_level: 2 + members: + - initialize + - post + +Shuts the server down over HTTP. `POST` only. diff --git a/docs/api-reference/protocols/http/handlers/rpc.md b/docs/api-reference/protocols/http/handlers/rpc.md new file mode 100644 index 0000000..831e572 --- /dev/null +++ b/docs/api-reference/protocols/http/handlers/rpc.md @@ -0,0 +1,51 @@ +# RPCHandler + +::: hololinked.server.http.handlers.RPCHandler + options: + show_root_heading: true + heading_level: 2 + members: + - is_method_allowed + - options + - handle_through_thing + - write_reply + - handle_no_block_response + +## PropertyHandler + +::: hololinked.server.http.handlers.PropertyHandler + options: + show_root_heading: false + heading_level: 3 + members: + - get + - post + - put + - delete + + +## ActionHandler + +::: hololinked.server.http.handlers.ActionHandler + options: + show_root_heading: false + heading_level: 3 + members: + - get + - post + - put + - delete + + +## RWMultiplePropertiesHandler + +::: hololinked.server.http.handlers.RWMultiplePropertiesHandler + options: + show_root_heading: false + heading_level: 3 + members: + - initialize + - get + - post + - put + - patch \ No newline at end of file diff --git a/docs/api-reference/protocols/http/services.md b/docs/api-reference/protocols/http/services.md new file mode 100644 index 0000000..2efc69e --- /dev/null +++ b/docs/api-reference/protocols/http/services.md @@ -0,0 +1,20 @@ +# ThingDescriptionService + +::: hololinked.server.http.services.ThingDescriptionService + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - thing + - server + - config + - logger + - resource + - generate + - add_properties + - add_actions + - add_events + - add_top_level_forms + - add_security_definitions + - add_links \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 4838bc2..ca5547b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -84,7 +84,16 @@ nav: - API Key: api-reference/clients/security/apikey.md - OIDC Direct Access Grant: api-reference/clients/security/oidc.md - Servers: - - HTTP: api-reference/protocols/http/index.md + - HTTP: + - HTTPServer: api-reference/protocols/http/index.md + - Runtime Configuration: api-reference/protocols/http/config.md + - Thing Description Service: api-reference/protocols/http/services.md + - Request Handlers: + - Overview: api-reference/protocols/http/handlers/index.md + - BaseHandler: api-reference/protocols/http/handlers/base.md + - RPCHandler: api-reference/protocols/http/handlers/rpc.md + - EventHandler: api-reference/protocols/http/handlers/event.md + - Probes and Control: api-reference/protocols/http/handlers/probes.md - ZMQ: - ZMQServer: api-reference/protocols/zmq/index.md - Messaging Contracts: From 4b0638754736eca0e13a52c5e5a28bf93098bc65 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Sat, 12 Sep 2026 11:37:10 +0200 Subject: [PATCH 17/21] MQTT --- docs/api-reference/protocols/mqtt/config.md | 18 +++++++++++ docs/api-reference/protocols/mqtt/handlers.md | 31 +++++++++++++++++++ docs/api-reference/protocols/mqtt/index.md | 27 ++++++++++++++-- docs/api-reference/protocols/mqtt/services.md | 16 ++++++++++ mkdocs.yml | 6 +++- 5 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 docs/api-reference/protocols/mqtt/config.md create mode 100644 docs/api-reference/protocols/mqtt/handlers.md create mode 100644 docs/api-reference/protocols/mqtt/services.md diff --git a/docs/api-reference/protocols/mqtt/config.md b/docs/api-reference/protocols/mqtt/config.md new file mode 100644 index 0000000..795175f --- /dev/null +++ b/docs/api-reference/protocols/mqtt/config.md @@ -0,0 +1,18 @@ +# MQTT runtime configuration + +::: hololinked.server.mqtt.config.RuntimeConfig + options: + show_root_heading: true + heading_level: 2 + members: + - qos + - topic_publisher + - thing_description_publisher + - thing_description_service + +Pass these as a plain dictionary to the `config` argument of [`MQTTPublisher`](index.md), not as a +`RuntimeConfig` instance: + +```python +MQTTPublisher(config=dict(qos=2, topic_publisher=MyTopicPublisher)) +``` diff --git a/docs/api-reference/protocols/mqtt/handlers.md b/docs/api-reference/protocols/mqtt/handlers.md new file mode 100644 index 0000000..e3c24bf --- /dev/null +++ b/docs/api-reference/protocols/mqtt/handlers.md @@ -0,0 +1,31 @@ +# Topic publishers + +::: hololinked.server.mqtt.handlers.TopicPublisher + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - client + - resource + - thing + - topic + - qos + - config + - logger + - publish + - stop + +::: hololinked.server.mqtt.handlers.ThingDescriptionPublisher + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - client + - thing + - topic + - thing_description + - config + - logger + - publish diff --git a/docs/api-reference/protocols/mqtt/index.md b/docs/api-reference/protocols/mqtt/index.md index 9fde3a4..f03dd20 100644 --- a/docs/api-reference/protocols/mqtt/index.md +++ b/docs/api-reference/protocols/mqtt/index.md @@ -1,6 +1,27 @@ - - ::: hololinked.server.mqtt.MQTTPublisher options: + inherited_members: true members: - - __init__ \ No newline at end of file + - __init__ + - from_params + - id + - hostname + - port + - username + - password + - ssl_context + - config + - logger + - things + - publishers + - add_thing + - add_things + - add_property + - add_action + - add_event + - setup + - start + - start_publishers + - run + - stop + - welcome_lines \ No newline at end of file diff --git a/docs/api-reference/protocols/mqtt/services.md b/docs/api-reference/protocols/mqtt/services.md new file mode 100644 index 0000000..4a71b85 --- /dev/null +++ b/docs/api-reference/protocols/mqtt/services.md @@ -0,0 +1,16 @@ +# ThingDescriptionService + +::: hololinked.server.mqtt.services.ThingDescriptionService + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - thing + - hostname + - port + - ssl + - logger + - generate + - add_properties + - add_events \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index ca5547b..b5d1539 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -109,7 +109,11 @@ nav: - MessageMappedClientPool: api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md - EventPublisher: api-reference/protocols/zmq/brokers/event-publisher.md - EventConsumer: api-reference/protocols/zmq/brokers/event-consumer.md - - MQTT: api-reference/protocols/mqtt/index.md + - MQTT: + - MQTTPublisher: api-reference/protocols/mqtt/index.md + - Runtime Configuration: api-reference/protocols/mqtt/config.md + - Topic Publishers: api-reference/protocols/mqtt/handlers.md + - Thing Description Service: api-reference/protocols/mqtt/services.md - Security: - Bcrypt: api-reference/protocols/security/bcrypt.md - Argon2: api-reference/protocols/security/argon2.md From 378c7c31ce542d4098b9311d91d6a3509d5a092f Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Sat, 3 Oct 2026 21:10:00 +0200 Subject: [PATCH 18/21] reintroduce deployment in pipeline --- .github/workflows/ci.yaml | 14 +---- .gitmodules | 2 +- deployment/{helm => }/container-helm-chart | 0 deployment/httproute-dev.yaml | 43 ++++++++++++++ httproute.yaml => deployment/httproute.yaml | 0 deployment/ingress-values.yaml | 19 ------- skaffold.yaml | 63 +-------------------- 7 files changed, 49 insertions(+), 92 deletions(-) rename deployment/{helm => }/container-helm-chart (100%) create mode 100644 deployment/httproute-dev.yaml rename httproute.yaml => deployment/httproute.yaml (100%) delete mode 100644 deployment/ingress-values.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 49695d0..f039fbd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,6 +1,8 @@ name: deploy-docs on: + push: + branches: [main] workflow_dispatch: # repository_dispatch: # types: [trigger-downstream] @@ -25,8 +27,6 @@ jobs: with: submodules: recursive - # Install the cosign tool - # https://github.com/sigstore/cosign-installer - name: Install cosign uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0 with: @@ -39,14 +39,9 @@ jobs: chmod +x skaffold sudo mv skaffold /usr/local/bin/skaffold - # Set up BuildKit Docker container builder to be able to build - # multi-platform images and export cache - # https://github.com/docker/setup-buildx-action - name: Set up Docker Buildx uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 - # Login against a Docker registry - # https://github.com/docker/login-action - name: Log into registry ${{ env.REGISTRY }} uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 with: @@ -54,7 +49,6 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - # Build & push with skaffold, and write the build outputs to a JSON file - name: Build with Skaffold (push) run: | skaffold build \ @@ -63,7 +57,6 @@ jobs: --file-output build.out.json \ -m ${{ env.MODULE }} - # Cosign sign each built image by digest from the skaffold build output (keyless with OIDC) - name: Cosign sign images run: | set -euo pipefail @@ -73,7 +66,6 @@ jobs: cosign sign --yes "$REF" done - # Provide your cluster config (example expects a base64-encoded kubeconfig secret) - name: Configure kubeconfig env: KUBECONFIG_B64: ${{ secrets.KUBECONFIG_B64 }} @@ -81,9 +73,9 @@ jobs: mkdir -p ~/.kube echo "${KUBECONFIG_B64}" | base64 -d > ~/.kube/config - # Deploy using the exact images produced in the build job - name: Deploy with Skaffold run: | skaffold deploy \ + --default-repo=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ --build-artifacts build.out.json \ -m ${{ env.MODULE }} diff --git a/.gitmodules b/.gitmodules index 2d3dc7c..2fd7402 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,5 +1,5 @@ [submodule "deployment/helm/container-helm-chart"] - path = deployment/helm/container-helm-chart + path = deployment/container-helm-chart url = https://gitlab.com/hololinked/kubernetes/helm-charts/container-helm-chart.git [submodule "hololinked"] path = repo/hololinked diff --git a/deployment/helm/container-helm-chart b/deployment/container-helm-chart similarity index 100% rename from deployment/helm/container-helm-chart rename to deployment/container-helm-chart diff --git a/deployment/httproute-dev.yaml b/deployment/httproute-dev.yaml new file mode 100644 index 0000000..b34cf7b --- /dev/null +++ b/deployment/httproute-dev.yaml @@ -0,0 +1,43 @@ +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: docs-dev + annotations: + external-dns.alpha.kubernetes.io/enabled: "true" + external-dns.alpha.kubernetes.io/ttl: "3600" +spec: + parentRefs: + - name: gateway + namespace: development + sectionName: https-docs-dev-hololinked-net + hostnames: + - docs.dev.hololinked.net + rules: + - matches: + - path: + type: PathPrefix + value: / + backendRefs: + - name: dev-python-docs + port: 80 +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: docs-dev-redirect + annotations: + external-dns.alpha.kubernetes.io/enabled: "true" + external-dns.alpha.kubernetes.io/ttl: "3600" +spec: + parentRefs: + - name: gateway + namespace: development + sectionName: http-docs-dev-hololinked-net + hostnames: + - docs.dev.hololinked.net + rules: + - filters: + - type: RequestRedirect + requestRedirect: + scheme: https + statusCode: 301 diff --git a/httproute.yaml b/deployment/httproute.yaml similarity index 100% rename from httproute.yaml rename to deployment/httproute.yaml diff --git a/deployment/ingress-values.yaml b/deployment/ingress-values.yaml deleted file mode 100644 index 378bb60..0000000 --- a/deployment/ingress-values.yaml +++ /dev/null @@ -1,19 +0,0 @@ -annotations: - cert-manager.io/cluster-issuer: letsencrypt-test - -tls: - - hosts: - - docs.dev.hololinked.net - secretName: docs-staging-hololinked-net-tls - -rules: -- host: docs.dev.hololinked.net - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: dev-python-docs - port: - number: 80 \ No newline at end of file diff --git a/skaffold.yaml b/skaffold.yaml index c026fc4..86a9a75 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -28,7 +28,7 @@ deploy: helm: releases: - name: dev-python-docs - chartPath: deployment/helm/container-helm-chart + chartPath: deployment/container-helm-chart namespace: development createNamespace: true setValues: @@ -39,65 +39,6 @@ deploy: repository: "{{ .IMAGE_REPO_hololinked_docs_dev }}" tag: "{{ .IMAGE_TAG_hololinked_docs_dev }}@{{ .IMAGE_DIGEST_hololinked_docs_dev }}" - - name: dev-python-docs-ingress - chartPath: deployment/helm/ingress-helm-chart - namespace: development - createNamespace: true - valuesFiles: - - deployment/helm/ingress-helm-chart/values.yaml - - deployment/ingress-values.yaml - setValues: - nameOverride: dev-python-docs-ingress - ---- -# staging a production version of the Python docs -apiVersion: skaffold/v4beta13 -kind: Config -metadata: - name: staging-docs -build: - artifacts: - - image: hololinked_docs_staging - context: . - docker: - dockerfile: Dockerfile - target: prod - tagPolicy: - envTemplate: - template: staging - local: - push: true -deploy: - helm: - releases: - - name: staging-python-docs - chartPath: deployment/helm/container-helm-chart - namespace: staging - createNamespace: true - setValues: - nameOverride: staging-python-docs - image.ports.containerPort: 80 - setValueTemplates: - image: - repository: "{{ .IMAGE_REPO_hololinked_docs_staging }}" - tag: "{{ .IMAGE_TAG_hololinked_docs_staging }}@{{ .IMAGE_DIGEST_hololinked_docs_staging }}" - - - name: staging-python-docs-ingress - chartPath: deployment/helm/ingress-helm-chart - namespace: staging - createNamespace: true - valuesFiles: - - deployment/helm/ingress-helm-chart/values.yaml - - deployment/ingress-values.yaml - setValues: - nameOverride: staging-python-docs-ingress - rules[0].host: docs.staging.hololinked.dev - rules[0].http.paths[0].backend.service.name: staging-python-docs - tls[0].hosts[0]: docs.staging.hololinked.dev - tls[0].secretName: docs-staging-hololinked-dev-tls - annotations: - cert-manager\.io/cluster-issuer: letsencrypt-prod - --- # production version of the Python docs apiVersion: skaffold/v4beta13 @@ -120,7 +61,7 @@ deploy: helm: releases: - name: hololinked-python-docs - chartPath: deployment/helm/container-helm-chart + chartPath: deployment/container-helm-chart namespace: website createNamespace: true setValues: From f2921063b6992f19db6a4744bf6b4d8125899722 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Sat, 3 Oct 2026 21:18:56 +0200 Subject: [PATCH 19/21] update CI file --- .github/workflows/ci.yaml | 87 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f039fbd..4f69178 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -3,6 +3,7 @@ name: deploy-docs on: push: branches: [main] + pull_request: workflow_dispatch: # repository_dispatch: # types: [trigger-downstream] @@ -14,7 +15,7 @@ env: jobs: build: - name: build, sign & deploy + name: build & sign runs-on: ubuntu-latest permissions: contents: read @@ -28,6 +29,7 @@ jobs: submodules: recursive - name: Install cosign + if: github.event_name != 'pull_request' uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0 with: cosign-release: "v2.2.4" @@ -43,13 +45,25 @@ jobs: uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + # --push=false overrides local.push in skaffold.yaml, which would otherwise push anyway + # and overwrite the constant :prod tag with a pull request build. + - name: Build with Skaffold (validate only) + if: github.event_name == 'pull_request' + run: | + skaffold build \ + --default-repo=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ + --push=false \ + -m ${{ env.MODULE }} + - name: Build with Skaffold (push) + if: github.event_name != 'pull_request' run: | skaffold build \ --default-repo=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ @@ -58,14 +72,48 @@ jobs: -m ${{ env.MODULE }} - name: Cosign sign images + if: github.event_name != 'pull_request' run: | set -euo pipefail - # Extract full refs (they include @sha256:...); sign each jq -r '.builds[].tag' build.out.json | while read -r REF; do echo "Signing $REF" cosign sign --yes "$REF" done + - name: Upload build output + if: github.event_name != 'pull_request' + uses: actions/upload-artifact@v4 + with: + name: build-out + path: build.out.json + retention-days: 1 + + deploy: + name: deploy + needs: build + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Skaffold + run: | + set -euo pipefail + curl -L "https://storage.googleapis.com/skaffold/releases/v2.16.1/skaffold-linux-amd64" -o skaffold + chmod +x skaffold + sudo mv skaffold /usr/local/bin/skaffold + + - name: Download build output + uses: actions/download-artifact@v4 + with: + name: build-out + - name: Configure kubeconfig env: KUBECONFIG_B64: ${{ secrets.KUBECONFIG_B64 }} @@ -79,3 +127,38 @@ jobs: --default-repo=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ --build-artifacts build.out.json \ -m ${{ env.MODULE }} + + httproute: + name: apply httproute + needs: deploy + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Configure kubeconfig + env: + KUBECONFIG_B64: ${{ secrets.KUBECONFIG_B64 }} + run: | + mkdir -p ~/.kube + echo "${KUBECONFIG_B64}" | base64 -d > ~/.kube/config + + - name: Apply HTTPRoute + run: | + set -euo pipefail + kubectl apply --dry-run=server -f deployment/httproute.yaml -n website + kubectl apply -f deployment/httproute.yaml -n website + + - name: Wait for route to be accepted + run: | + set -euo pipefail + for route in docs docs-redirect; do + for cond in Accepted ResolvedRefs; do + kubectl wait --timeout=60s -n website "httproute/$route" \ + --for=jsonpath="{.status.parents[0].conditions[?(@.type==\"$cond\")].status}"=True + done + done From a4b7aedbd47a4e711356837fa4fb54d90ce184c1 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Sat, 3 Oct 2026 21:28:18 +0200 Subject: [PATCH 20/21] make container helm chart local --- .gitmodules | 3 - deployment/container-helm-chart | 1 - deployment/container-helm-chart/.helmignore | 23 +++++ deployment/container-helm-chart/Chart.yaml | 6 ++ deployment/container-helm-chart/LICENSE | 21 +++++ deployment/container-helm-chart/README.md | 3 + .../container-helm-chart/templates/NOTES.txt | 0 .../templates/_helpers.tpl | 51 +++++++++++ .../templates/deployment.yaml | 84 +++++++++++++++++++ .../container-helm-chart/templates/hpa.yaml | 32 +++++++ .../templates/service.yaml | 15 ++++ deployment/container-helm-chart/values.yaml | 63 ++++++++++++++ .../protocols/zmq/brokers/zmq-server-pool.md | 29 +++++++ docs/api-reference/protocols/zmq/config.md | 14 ++++ docs/api-reference/protocols/zmq/index.md | 35 +++++++- docs/api-reference/protocols/zmq/services.md | 16 ++++ mkdocs.yml | 3 + 17 files changed, 392 insertions(+), 7 deletions(-) delete mode 160000 deployment/container-helm-chart create mode 100644 deployment/container-helm-chart/.helmignore create mode 100644 deployment/container-helm-chart/Chart.yaml create mode 100644 deployment/container-helm-chart/LICENSE create mode 100644 deployment/container-helm-chart/README.md create mode 100644 deployment/container-helm-chart/templates/NOTES.txt create mode 100644 deployment/container-helm-chart/templates/_helpers.tpl create mode 100644 deployment/container-helm-chart/templates/deployment.yaml create mode 100644 deployment/container-helm-chart/templates/hpa.yaml create mode 100644 deployment/container-helm-chart/templates/service.yaml create mode 100644 deployment/container-helm-chart/values.yaml create mode 100644 docs/api-reference/protocols/zmq/brokers/zmq-server-pool.md create mode 100644 docs/api-reference/protocols/zmq/config.md create mode 100644 docs/api-reference/protocols/zmq/services.md diff --git a/.gitmodules b/.gitmodules index 2fd7402..f9d0aba 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "deployment/helm/container-helm-chart"] - path = deployment/container-helm-chart - url = https://gitlab.com/hololinked/kubernetes/helm-charts/container-helm-chart.git [submodule "hololinked"] path = repo/hololinked url = https://github.com/hololinked-dev/hololinked.git diff --git a/deployment/container-helm-chart b/deployment/container-helm-chart deleted file mode 160000 index 105c3fc..0000000 --- a/deployment/container-helm-chart +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 105c3fc6a3ed2ac9fde927d846841ecce92f1f6d diff --git a/deployment/container-helm-chart/.helmignore b/deployment/container-helm-chart/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/deployment/container-helm-chart/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deployment/container-helm-chart/Chart.yaml b/deployment/container-helm-chart/Chart.yaml new file mode 100644 index 0000000..e5134d1 --- /dev/null +++ b/deployment/container-helm-chart/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: apps +description: A Helm chart for Kubernetes +type: application +version: 0.1.0 +appVersion: "0.1.0" diff --git a/deployment/container-helm-chart/LICENSE b/deployment/container-helm-chart/LICENSE new file mode 100644 index 0000000..10cf77a --- /dev/null +++ b/deployment/container-helm-chart/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 hololinked + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/deployment/container-helm-chart/README.md b/deployment/container-helm-chart/README.md new file mode 100644 index 0000000..c4bd604 --- /dev/null +++ b/deployment/container-helm-chart/README.md @@ -0,0 +1,3 @@ +# Container Helm Chart + +Generic Container Helm Chart for hololinked TLD & associated projects. \ No newline at end of file diff --git a/deployment/container-helm-chart/templates/NOTES.txt b/deployment/container-helm-chart/templates/NOTES.txt new file mode 100644 index 0000000..e69de29 diff --git a/deployment/container-helm-chart/templates/_helpers.tpl b/deployment/container-helm-chart/templates/_helpers.tpl new file mode 100644 index 0000000..bd41ed9 --- /dev/null +++ b/deployment/container-helm-chart/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "apps.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "apps.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "apps.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "apps.labels" -}} +helm.sh/chart: {{ include "apps.chart" . }} +{{ include "apps.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "apps.selectorLabels" -}} +app.kubernetes.io/name: {{ include "apps.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} diff --git a/deployment/container-helm-chart/templates/deployment.yaml b/deployment/container-helm-chart/templates/deployment.yaml new file mode 100644 index 0000000..6afc5aa --- /dev/null +++ b/deployment/container-helm-chart/templates/deployment.yaml @@ -0,0 +1,84 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "apps.fullname" . }} + labels: + {{- include "apps.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "apps.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "apps.labels" . | nindent 8 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.podSecurityContext }} + securityContext: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + {{- with .Values.securityContext }} + securityContext: + {{- toYaml . | nindent 12 }} + {{- end }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.image.ports.containerPort }} + protocol: TCP + {{- if .Values.env }} + env: + {{- range .Values.env }} + - name: {{ .name }} + value: {{ .value | quote }} + {{- end }} + {{- end }} + {{- with .Values.livenessProbe }} + livenessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.readinessProbe }} + readinessProbe: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.resources }} + resources: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.volumeMounts }} + volumeMounts: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.volumes }} + volumes: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/deployment/container-helm-chart/templates/hpa.yaml b/deployment/container-helm-chart/templates/hpa.yaml new file mode 100644 index 0000000..200294b --- /dev/null +++ b/deployment/container-helm-chart/templates/hpa.yaml @@ -0,0 +1,32 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "apps.fullname" . }} + labels: + {{- include "apps.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "apps.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/deployment/container-helm-chart/templates/service.yaml b/deployment/container-helm-chart/templates/service.yaml new file mode 100644 index 0000000..91c6c39 --- /dev/null +++ b/deployment/container-helm-chart/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "apps.fullname" . }} + labels: + {{- include "apps.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "apps.selectorLabels" . | nindent 4 }} diff --git a/deployment/container-helm-chart/values.yaml b/deployment/container-helm-chart/values.yaml new file mode 100644 index 0000000..9e86660 --- /dev/null +++ b/deployment/container-helm-chart/values.yaml @@ -0,0 +1,63 @@ +replicaCount: 1 + +image: + repository: nginx + pullPolicy: Always + tag: "" + ports: + containerPort: 80 + +nameOverride: "" +fullnameOverride: "" + +podAnnotations: {} +podLabels: {} +podSecurityContext: {} + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +# livenessProbe: +# httpGet: +# path: / +# port: http +# readinessProbe: +# httpGet: +# path: / +# port: http + +# This section is for setting up autoscaling more information can be found here: https://kubernetes.io/docs/concepts/workloads/autoscaling/ +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +volumes: [] +volumeMounts: [] + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +env: {} diff --git a/docs/api-reference/protocols/zmq/brokers/zmq-server-pool.md b/docs/api-reference/protocols/zmq/brokers/zmq-server-pool.md new file mode 100644 index 0000000..ed0a597 --- /dev/null +++ b/docs/api-reference/protocols/zmq/brokers/zmq-server-pool.md @@ -0,0 +1,29 @@ +# ZMQServerPool + +::: hololinked.server.zmq.brokers.ZMQServerPool + options: + show_root_heading: true + heading_level: 2 + inherited_members: true + members: + - __init__ + - id + - context + - poller + - pool + - logger + - create_socket + - register_server + - deregister_server + - poll_timeout + - poll + - async_recv_request + - async_recv_requests + - async_send_response + - stop_polling + - exit + - handshake + - handle_invalid_message + - handle_timeout + - handle_error_message + - handled_default_message_types diff --git a/docs/api-reference/protocols/zmq/config.md b/docs/api-reference/protocols/zmq/config.md new file mode 100644 index 0000000..b7d60b8 --- /dev/null +++ b/docs/api-reference/protocols/zmq/config.md @@ -0,0 +1,14 @@ +# ZMQ runtime configuration + +::: hololinked.server.zmq.config.RuntimeConfig + options: + show_root_heading: true + heading_level: 2 + members: + - thing_description_service + +Pass as a plain dictionary to the `config` argument of [`ZMQServer`](index.md): + +```python +ZMQServer(config=dict(thing_description_service=MyService)) +``` \ No newline at end of file diff --git a/docs/api-reference/protocols/zmq/index.md b/docs/api-reference/protocols/zmq/index.md index 9831a90..0754573 100644 --- a/docs/api-reference/protocols/zmq/index.md +++ b/docs/api-reference/protocols/zmq/index.md @@ -1,8 +1,37 @@ - - ::: hololinked.server.zmq.ZMQServer options: + inherited_members: true members: - __init__ + - from_params + - id + - config + - context + - logger + - things + - add_thing + - add_things + - add_property + - add_action + - add_event + - inproc_server + - ipc_server + - tcp_server + - transport_servers + - inproc_event_publisher + - ipc_event_publisher + - tcp_event_publisher + - event_publishers + - setup + - start + - run + - polling + - recv_requests + - process_request + - stop_polling + - get_thing_description - stop - - exit \ No newline at end of file + - exit + - welcome_lines + +Requires the `zmq` extra. Note the pin: `pyzmq<26.2`, which is what keeps IPC working on Windows. \ No newline at end of file diff --git a/docs/api-reference/protocols/zmq/services.md b/docs/api-reference/protocols/zmq/services.md new file mode 100644 index 0000000..4c4428a --- /dev/null +++ b/docs/api-reference/protocols/zmq/services.md @@ -0,0 +1,16 @@ +# ThingDescriptionService + +::: hololinked.server.zmq.services.ThingDescriptionService + options: + show_root_heading: true + heading_level: 2 + members: + - __init__ + - server + - logger + - generate + - socket_addresses_for + - content_type_for + - add_properties + - add_actions + - add_events diff --git a/mkdocs.yml b/mkdocs.yml index b5d1539..ee1cf57 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -96,6 +96,8 @@ nav: - Probes and Control: api-reference/protocols/http/handlers/probes.md - ZMQ: - ZMQServer: api-reference/protocols/zmq/index.md + - Runtime Configuration: api-reference/protocols/zmq/config.md + - Thing Description Service: api-reference/protocols/zmq/services.md - Messaging Contracts: - RequestMessage: api-reference/protocols/zmq/messaging-contract/request-message.md - ResponseMessage: api-reference/protocols/zmq/messaging-contract/response-message.md @@ -109,6 +111,7 @@ nav: - MessageMappedClientPool: api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md - EventPublisher: api-reference/protocols/zmq/brokers/event-publisher.md - EventConsumer: api-reference/protocols/zmq/brokers/event-consumer.md + - ZMQServerPool: api-reference/protocols/zmq/brokers/zmq-server-pool.md - MQTT: - MQTTPublisher: api-reference/protocols/mqtt/index.md - Runtime Configuration: api-reference/protocols/mqtt/config.md From 717e753358a49c3776025f3a72df26544ea3a7e4 Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Vaidyanathan <62492557+VigneshVSV@users.noreply.github.com> Date: Sat, 3 Oct 2026 21:37:03 +0200 Subject: [PATCH 21/21] clone submodule fix --- .github/workflows/ci.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4f69178..b06d5b5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,7 +26,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 with: - submodules: recursive + submodules: false + + - name: Check out the repo submodule + run: git submodule update --init --depth 1 repo/hololinked - name: Install cosign if: github.event_name != 'pull_request' @@ -100,7 +103,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 with: - submodules: recursive + submodules: false - name: Install Skaffold run: |