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.
@@ -52,6 +51,8 @@ This implementation is based on RPC, built ground-up in python keeping both the
+hololinked demo: a Thing controlled from a browser dashboard + --- ## High Level Overview @@ -89,6 +90,15 @@ Additionally, **state machines** can constrain property and action execution: - _Oscilloscope_ - Cannot start a new measurement while one is ongoing - _Camera_ - Cannot change exposure time while capturing video +#### Benefits you get when you use hololinked: + +- technology independent and technology extensible architecture -> handles technology changes. +- its not a solution that uses "different set of technologies to solve the same problem". It solves a problem irrespective of the underlying technologies. AI included. You chose the tech stack or extend it with your stack (PRs welcome for new tech adapters and new features). +- simple to understand and simplifies contradicting viewpoints +- scalable, performant, interoperable and can be used in different domains (IoT, microservices, networked control systems, web, RPCs etc.) +- metadata rich - use AI agents, API tools, whatever. +- security built in + --- !!! tip "Ready to get started?" @@ -104,5 +114,3 @@ Additionally, **state machines** can constrain property and action execution: - Every Friday 9-10AM CET/CEST, 4-5PM CET/CEST Please email to info@hololinked.dev. You can also ask questions in the [discord group](https://discord.com/invite/kEz87zqQXh) (currently no participants). - - diff --git a/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"