Generated Pydantic / enum types for the openccu-loom REST + WebSocket contract
Project description
openccu-loom-types
Generated Pydantic models + enum definitions for the openccu-loom
REST + WebSocket contract. Sister-repo to the
openccu-loom daemon;
publishable as openccu-loom-types on PyPI.
What this package provides
openccu_loom_types.enums— every enum from the daemon'spkg/hmenum. Each enum is astr-typed PythonEnumwhose values match the wire strings the CCU emits. Source of truth:assets/schemas/enums.jsonin the openccu-loom repo.openccu_loom_types.rest— Pydantic models for the REST surface. Generated fromassets/openapi.yamlviadatamodel-code-generator.openccu_loom_types.ws— Pydantic models for the WebSocket envelope + push payloads. Generated from the same OpenAPI document (the WS envelope schemas live incomponents.schemasper ADR-0020).
Why this exists (asks.md C1 + C3)
Higher-level clients (openccu-loom-client, the future
homematicip_local refactor) need stable typed bindings against the
daemon. Without a published types package each consumer would
duplicate the model code and drift away from the daemon's wire
contract. This package is the single import every Python consumer
shares — version-pinned and CI-rebuilt on every openccu-loom release.
Regeneration workflow
Set OPENCCU_LOOM_REPO to a local checkout of the daemon repo
(default: ../openccu-loom):
# Step 1 — make sure the daemon repo's schema export is fresh:
make -C "$OPENCCU_LOOM_REPO" export-schemas
# Step 2 — regenerate this package's models:
make generate
The two-step split keeps the daemon repo authoritative; this package never re-parses Go source.
Tooling required
- Python >= 3.11
datamodel-code-generator>= 0.25 (for REST + WS Pydantic models)
Install both with pip install -e '.[dev]'.
Versioning & contract identity
The package version (const.VERSION) is independent of the daemon
version; the regeneration workflow bumps the patch number on every
daemon release. The daemon coupling is carried by two stamped
constants in const.py (written by make generate →
scripts/stamp_const.py):
SCHEMA_DIGEST— canonical digest of the daemon's contract assets these types were generated from (definition: daemon ADR-0028). Clients compare it againstGET /api/v1/info.schema_digestto verify exact type/daemon parity at connect time.DAEMON_API_VERSION— the daemon'sapi_versionat generation time. Minor bumps add fields without breaking existing consumers; major bumps remove or rename payload fields, scopes, or capabilities — see ADR-0020 in the daemon repo.
Regeneration and release are automated end to end. The daemon's
release workflow fires a repository_dispatch (daemon-release) at
this repo, which drives this chain:
regenerate-on-daemon-releasechecks out the daemon at the released tag, regenerates all modules, stamps the constants, bumps the version, seeds a baseline changelog section, opens a PR from aregen/daemon-<tag>branch, and enables auto-merge.ciruns on the PR:Test(the suite) andRegen clean(re-runsmake generateagainst the branch's daemon tag and fails on any drift, so hand-edits to generated modules are caught).- Once the required checks are green the PR squash-merges;
tag-on-regen-mergethen pushesv<version>. - The tag triggers
release-on-tag→ GitHub Release →python-publish→ PyPI.
Manual fallback: workflow_dispatch with the tag, or the local
two-step flow above.
CI / release setup
The automation needs three one-time repository settings; without them the chain stops after step 1:
- A
RELEASE_PATsecret — a fine-grained PAT (or GitHub App token) withcontents: write+pull-requests: write. The regen PR and the release tag are pushed with it, because a branch/PR/tag created via the defaultGITHUB_TOKENdoes not trigger the downstream CI and release workflows (GitHub's recursive-workflow guard). - Branch protection on
mainrequiring theTestandRegen cleanstatus checks — auto-merge waits on these. - Allow auto-merge enabled in the repository settings.
What this package does NOT contain
- HTTP / WebSocket transport — see
openccu-loom-client(when published) for the higher-level client. - Any business logic — types only.
- Async helpers — types are framework-neutral.
Development
Parts of openccu-loom-types are developed with agentic AI assistance, primarily Claude Code. Submitted issues are likewise triaged and analysed with agentic help. Every change is still reviewed by a human maintainer and must pass the project's tests before it lands — the AI speeds up the work, it does not replace the review gate.
License
MIT. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file openccu_loom_types-0.1.50.tar.gz.
File metadata
- Download URL: openccu_loom_types-0.1.50.tar.gz
- Upload date:
- Size: 36.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
89f0281f6473f5d00279ddb4cdc8393cf76bcfbf4cf30fa31b4c7f91ca1fcc82
|
|
| MD5 |
7743709a6ac3ffaaaed661ddee3a6e6f
|
|
| BLAKE2b-256 |
8371f5246fdc5d32f26ce5da90a380e1c77545557170da8e9c57950f00ae1d7b
|
Provenance
The following attestation bundles were made for openccu_loom_types-0.1.50.tar.gz:
Publisher:
python-publish.yml on SukramJ/openccu-loom-types
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openccu_loom_types-0.1.50.tar.gz -
Subject digest:
89f0281f6473f5d00279ddb4cdc8393cf76bcfbf4cf30fa31b4c7f91ca1fcc82 - Sigstore transparency entry: 2066395666
- Sigstore integration time:
-
Permalink:
SukramJ/openccu-loom-types@62f65ca95a4b2e0ec6dc9b5d65cb62f582b53f42 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/SukramJ
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@62f65ca95a4b2e0ec6dc9b5d65cb62f582b53f42 -
Trigger Event:
repository_dispatch
-
Statement type:
File details
Details for the file openccu_loom_types-0.1.50-py3-none-any.whl.
File metadata
- Download URL: openccu_loom_types-0.1.50-py3-none-any.whl
- Upload date:
- Size: 34.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce8f944963229517bb6e33a9789bdfd40566c0f73167e4f577062b7162ba6cc1
|
|
| MD5 |
79b0cf2d1b45e831d5399607524f9ebb
|
|
| BLAKE2b-256 |
3a7e63ac28ae7143de041896b8617653ae5c4806fc102e3761276d96b744c6e6
|
Provenance
The following attestation bundles were made for openccu_loom_types-0.1.50-py3-none-any.whl:
Publisher:
python-publish.yml on SukramJ/openccu-loom-types
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openccu_loom_types-0.1.50-py3-none-any.whl -
Subject digest:
ce8f944963229517bb6e33a9789bdfd40566c0f73167e4f577062b7162ba6cc1 - Sigstore transparency entry: 2066395763
- Sigstore integration time:
-
Permalink:
SukramJ/openccu-loom-types@62f65ca95a4b2e0ec6dc9b5d65cb62f582b53f42 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/SukramJ
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@62f65ca95a4b2e0ec6dc9b5d65cb62f582b53f42 -
Trigger Event:
repository_dispatch
-
Statement type: