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/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 49695d0..b06d5b5 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -1,6 +1,9 @@
name: deploy-docs
on:
+ push:
+ branches: [main]
+ pull_request:
workflow_dispatch:
# repository_dispatch:
# types: [trigger-downstream]
@@ -12,7 +15,7 @@ env:
jobs:
build:
- name: build, sign & deploy
+ name: build & sign
runs-on: ubuntu-latest
permissions:
contents: read
@@ -23,11 +26,13 @@ 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
- # Install the cosign tool
- # https://github.com/sigstore/cosign-installer
- name: Install cosign
+ if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0
with:
cosign-release: "v2.2.4"
@@ -39,23 +44,29 @@ 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 }}
+ 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 }}
- # Build & push with skaffold, and write the build outputs to a JSON file
+ # --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 }} \
@@ -63,17 +74,49 @@ 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
+ 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
- # Provide your cluster config (example expects a base64-encoded kubeconfig secret)
+ - 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: false
+
+ - 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 }}
@@ -81,9 +124,44 @@ 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 }}
+
+ 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
diff --git a/.gitmodules b/.gitmodules
index c3ca054..f9d0aba 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
-[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/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;"]
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/deployment/helm/container-helm-chart b/deployment/helm/container-helm-chart
deleted file mode 160000
index 105c3fc..0000000
--- a/deployment/helm/container-helm-chart
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 105c3fc6a3ed2ac9fde927d846841ecce92f1f6d
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/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/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/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
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/injection/index.md b/docs/api-reference/injection/index.md
new file mode 100644
index 0000000..5eaaa51
--- /dev/null
+++ b/docs/api-reference/injection/index.md
@@ -0,0 +1,37 @@
+# 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` |
+| [`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 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/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/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
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..1c138db
--- /dev/null
+++ b/docs/api-reference/interfaces/index.md
@@ -0,0 +1,19 @@
+# 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` |
+| [`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/metadata.md b/docs/api-reference/interfaces/metadata.md
new file mode 100644
index 0000000..699b175
--- /dev/null
+++ b/docs/api-reference/interfaces/metadata.md
@@ -0,0 +1,83 @@
+# 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.
+
+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:
+ 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/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/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
diff --git a/docs/api-reference/namespaces.md b/docs/api-reference/namespaces.md
index 0bddf38..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) & [`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`](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/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/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/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/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/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/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/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/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/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/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
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/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/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
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/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/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
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/docs/index.md b/docs/index.md
index 27d0cb4..30494b3 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.
+
---
## 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/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
diff --git a/mkdocs.yml b/mkdocs.yml
index 4d65f0b..ee1cf57 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
@@ -90,15 +84,76 @@ 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
- - ZMQ: api-reference/protocols/zmq/index.md
- - MQTT: api-reference/protocols/mqtt/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
+ - 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
+ - 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
+ - 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
+ - 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
+ - Server: api-reference/server/index.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
+ - 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
+ - PydanticSchemaValidator: api-reference/schema-validators/pydantic.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
+ - 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
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..ef1c254
--- /dev/null
+++ b/repo/hololinked
@@ -0,0 +1 @@
+Subproject commit ef1c254594b47eab1f9dc5be5a26038d195cbcdd
diff --git a/skaffold.yaml b/skaffold.yaml
index dbf4a46..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:
@@ -128,5 +69,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 }}"
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"