OneDM Python library
This Python package is an early work-in-progress to simplify working with One Data Model in Python.
Since OneDM is in early stages, this library intends to follow the progress as best as it can and should hence be considered unstable.
SDF
Currently it supports limited loading, resolving, and generation of SDF documents as specified in the to-be-published RFC 9880.
The Semantic Definition Format (SDF) is concerned with Things, namely physical objects that are available for interaction over a network. SDF is a format for domain experts to use in the creation and maintenance of data and interaction models that describe Things. An SDF specification describes definitions of SDF Objects/SDF Things and their associated interactions (Events, Actions, Properties), as well as the Data types for the information exchanged in those interactions. Tools convert this format to database formats and other serializations as needed.
This library uses Pydantic to parse, validate, and dump model descriptions. The Pydantic models enforce a stricter validation than the current SDF JSON schema where each data type has its own schema.
You can also validate and coerce input values against your data definitions, as well as generating sdf.Data objects from native Python types!
Examples
Loading an existing SDF document:
from onedm import sdf
from onedm.sdf.registry import FileBasedRegistry
# Create a registry for resolving global references.
# This will scan for local .sdf.json files, but you can also implement
# other strategies.
registry = FileBasedRegistry(".")
# Convenience class for loading, resolving, and parsing
loader = sdf.SDFLoader(registry)
loader.load_file("tests/sdf/test.sdf.json")
doc = loader.to_sdf()
doc.info.title
'Example document for SDF (Semantic Definition Format)'
doc.properties["IntegerProperty"]
# IntegerProperty(label='Example integer', description=None, ref=None, type='integer', sdf_type=None, nullable=False, const=None, default=None, choices=None, unit=None, minimum=-2, maximum=2, exclusive_minimum=None, exclusive_maximum=None, multiple_of=2, observable=True, readable=True, writable=True, sdf_required=None)
doc.data["Integer"].validate_input(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "onedm\sdf\data.py", line 129, in validate_input
return super().validate_input(input)
^^^^^^^^^^^^^^^^^^^^^^^
File "onedm\sdf\data.py", line 64, in validate_input
return SchemaValidator(self.get_pydantic_schema()).validate_python(input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pydantic_core._pydantic_core.ValidationError: 1 validation error for constrained-int
Input should be a multiple of 2 [type=multiple_of, input_value=3, input_type=int]
For further information visit https://errors.pydantic.dev/2.8/v/multiple_of
Creating a new document:
from onedm import sdf
doc = sdf.Document()
doc.info.title = "Generic switch document"
doc.things["switch"] = sdf.Thing(label="Generic switch")
doc.things["switch"].actions["on"] = sdf.Action(label="Turn on")
doc.things["switch"].properties["state"] = sdf.BooleanProperty()
print(doc.to_json())
"""
{
"info": {
"title": "Generic switch document"
},
{
"sdfThing": {
"switch": {
"label": "Generic switch",
"sdfProperty": {
"state": {
"type": "boolean"
}
},
"sdfAction": {
"on": {
"label": "Turn on"
}
}
}
}
}
"""
Generating SDF data descriptions from many native Python types:
from onedm.sdf.from_type import data_from_type
data_from_type(bool | None)
# BooleanData(label=None, description=None, ref=None, type='boolean', sdf_type=None, nullable=True, const=None, default=None, choices=None)
Metadata
Release files for onedm 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| onedm-0.3.1.tar.gz | 22.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| onedm-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.4 kB
Release files / onedm-0.3.1.tar.gz
| Download URL | onedm-0.3.1.tar.gz |
|---|---|
| Size | 22.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ff94af2ef94948d09684c94bf60c4c5aa2e793d21ee64ffa76eb539877b73931
|
|
BLAKE2b-256 checksum How to use checksums |
d52d19a91c6df4c8188167c7c32b41394bc8c53f4c4355fda6b655823ac9d74f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 29, 2025.
Transparency logRelease files / onedm-0.3.1-py3-none-any.whl
| Download URL | onedm-0.3.1-py3-none-any.whl |
|---|---|
| Size | 16.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e9c47605f6b87dfd64d97c4269661e953989aa50e3a5e27a11b6120a3f38f1cf
|
|
BLAKE2b-256 checksum How to use checksums |
e9e5fe99d40d474dbd940ecc4ddd4bc219e072b5eaae9f8cfa53639587a98841
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 29, 2025.
Transparency log