CBOR Model: Add CBOR and CDDL support to Pydantic models
Project description
CBOR Model
cbor-model adds CBOR serialization and CDDL schema generation to Pydantic
models.
Installation
pip install cbor-model
or with uv:
uv add cbor-model
Quick start
Map encoding
Fields are encoded as a CBOR map keyed by the integer or string supplied to
CBORField(key=...).
from typing import Annotated
from cbor_model import CBORModel, CBORField
class Sensor(CBORModel):
name: Annotated[str, CBORField(key=0)]
value: Annotated[float, CBORField(key=1)]
sensor = Sensor(name="temp", value=21.5)
data = sensor.model_dump_cbor() # a2006474656d7001fb4035800000000000
assert Sensor.model_validate_cbor(data) == sensor
Array encoding
Switch to array encoding by setting CBORConfig(encoding="array") and using
CBORField(index=...) — fields are serialized in index order.
from typing import Annotated
from cbor_model import CBORModel, CBORField, CBORConfig
class Point(CBORModel):
cbor_config = CBORConfig(encoding="array")
x: Annotated[int, CBORField(index=0)]
y: Annotated[int, CBORField(index=1)]
pt = Point(x=4, y=2)
data = pt.model_dump_cbor() # 820402
assert Point.model_validate_cbor(data) == pt
CBOR tags
Wrap a field's value in a CBOR tag using CBORField(tag=...), or tag the entire
model with CBORConfig(tag=...).
from typing import Annotated
from cbor_model import CBORModel, CBORField, CBORConfig
class Reading(CBORModel):
cbor_config = CBORConfig(tag=40001)
sensor_id: Annotated[int, CBORField(key=0)]
raw: Annotated[bytes, CBORField(key=1, tag=40002)]
Serialization context
Pass a CBORSerializationContext to control None and empty-collection exclusion:
from cbor_model import CBORSerializationContext
ctx = CBORSerializationContext(exclude_none=False, exclude_empty=False)
data = sensor.model_dump_cbor(context=ctx)
Custom encoders
Register encoders for types not natively supported by cbor2:
import decimal
from cbor_model import CBORConfig
class MyModel(CBORModel):
cbor_config = CBORConfig(
encoders={decimal.Decimal: lambda d: str(d)}
)
amount: Annotated[decimal.Decimal, CBORField(key=0)]
CDDL generation
Generate a CDDL schema from one or more models:
from cbor_model.cddl import CDDLGenerator
print(CDDLGenerator().generate(Sensor))
# sensor_name = 0
# sensor_value = 1
#
# Sensor = {
# ? sensor_name: tstr,
# ? sensor_value: float
# }
Map-encoded models always emit a per-model block of integer-key constants
(prefix is the model class name converted to snake_case) and reference
those constants in the map body. Use CBORField(description=...) to
attach a free-text comment that is rendered as ; <text> after the
field definition, and CBORField(override_name=...) to override the
identifier (used verbatim).
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 cbor_model-0.3.0.tar.gz.
File metadata
- Download URL: cbor_model-0.3.0.tar.gz
- Upload date:
- Size: 13.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
decac2a20ab1805bfa7f19899bb4202b6581bb9e537110705556dbabf832f6c2
|
|
| MD5 |
30ce10724bc018cdd5188f35390c350d
|
|
| BLAKE2b-256 |
4c0e1d7fc999f6e951bcfb415a7315b7e4a0816a1924ba199990d8117763532d
|
File details
Details for the file cbor_model-0.3.0-py3-none-any.whl.
File metadata
- Download URL: cbor_model-0.3.0-py3-none-any.whl
- Upload date:
- Size: 17.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b017b495749ad71d0c4196bc07aaba44fdf688ee8503d5ecee3ead4f1f2069b
|
|
| MD5 |
7e2ffd0ae03470a6488e94796a5910bb
|
|
| BLAKE2b-256 |
f235c0d75a9487c293e38e0c704b987249c2f2b9f4421d40d22d7b97865b6949
|