Bidirectional OBML <-> OSI (Open Semantic Interchange) converter for OrionBelt semantic models
Project description
osi-orionbelt
Bidirectional converter between OBML (OrionBelt Markup Language) semantic models and OSI (Open Semantic Interchange), the open standard for portable semantic models (metrics, dimensions, relationships).
This package is licensed under Apache-2.0 and may be used freely. It is the
OrionBelt converter in the OSI converter ecosystem. The canonical source is
developed in the
orionbelt-semantic-layer
repository (under packages/osi-orionbelt) and published to PyPI from there;
file issues and contributions upstream.
Requirements
- Python 3.12+
- uv (recommended) or pip
Install
pip install osi-orionbelt
Optional deep OBML semantic validation (cycles, duplicate names, invalid refs) via the full OrionBelt engine:
pip install "osi-orionbelt[obml-validation]"
Without that extra, OBML validation runs JSON-schema checks only and emits a warning for the deeper semantic pass.
CLI
A single osi-orionbelt command with two subcommands (mirroring osi-dbt):
| Subcommand | Direction | In | Out |
|---|---|---|---|
obml-to-osi |
OBML -> OSI core-spec | OBML YAML | OSI YAML |
obml-to-osi --ontology |
OBML -> OSI ontology | OBML YAML | OSI ontology YAML |
osi-to-obml |
OSI core-spec -> OBML | OSI YAML | OBML YAML |
osi-orionbelt obml-to-osi -i model.obml.yaml -o model.osi.yaml
osi-orionbelt obml-to-osi --ontology -i model.obml.yaml -o model.ontology.yaml
osi-orionbelt osi-to-obml -i model.osi.yaml -o model.obml.yaml
-i/--input and -o/--output are required. Each subcommand prints conversion
warnings and a validation summary to stderr, and exits non-zero when the
produced document fails schema validation (unless --no-validate). Run
osi-orionbelt --help or osi-orionbelt obml-to-osi --help for the full
option list.
Python API
import yaml
from osi_orionbelt import OBMLtoOSI, OSItoOBML, validate_osi
obml = yaml.safe_load(open("model.obml.yaml"))
osi = OBMLtoOSI(obml, "sales", "Sales model").convert()
result = validate_osi(osi)
assert result.valid
obml_again = OSItoOBML(osi).convert()
Vendor extensions
OSI custom_extensions carry vendor-tagged payloads. This converter:
- emits OrionBelt/OBML-proprietary data under the
ORIONBELTvendor on OBML to OSI (OBML-only filters, settings, owner, refresh, type info, etc.); - stashes OSI-native fields that OBML can't represent (unique keys, field
labels, leftover
ai_context) under theOSIvendor when going OSI to OBML, restoring them to first-class OSI fields on the way back; - preserves third-party vendor extensions verbatim (e.g.
SNOWFLAKE,DBT,SALESFORCE,GOODDATA) at the model, dataset, field, and measure/metric levels, so a full OSI to OBML to OSI roundtrip keeps the original vendor and data. OSI has no separate dimension entity, so an OBML dimension's foreign extensions surface on its OSI field.
Legacy COMMON / OBSL tags from earlier converter versions are still accepted
on read.
Limitations / unsupported constructs
Some OBML constructs have no native OSI equivalent and are carried in vendor
custom_extensions (obml_* payloads) so they round-trip without loss back to
OBML, but are not interpreted by other OSI consumers:
- Many-to-many joins - represented in OBML join cardinality; flagged on export.
- Named secondary join paths - OBML's multiple join paths between the same pair of objects are an OBML-specific topology feature.
- Measures / metrics and column-level value concepts in the ontology layer - not represented in the OSI ontology export.
- OSI metrics with no OBML representation - a metric whose only expression is
in a non-SQL dialect (
MDX,TABLEAU,MAQL), or whose SQL expression cannot be decomposed into OBML measures/metrics, is not dropped: the original OSI metric is preserved verbatim in a model-levelOSI-vendorcustom_extension(obml_unconverted_metrics) and re-emitted on OBML to OSI, so the OSI to OBML to OSI roundtrip stays lossless. ALOSSY:warning is raised for each such metric because it is not queryable through OBML. SQL expressions in theANSI_SQL,SNOWFLAKE, andDATABRICKSdialects are all read on import.
OSI v0.1.x inputs are accepted on read via a legacy normalization shim; output targets OSI v0.2.0.dev0.
See osi_obml_mapping_analysis.md for the
full OBML <-> OSI core-spec mapping and
osi_obml_ontology_mapping_analysis.md
for the ontology-layer mapping and its documented gaps.
Development
uv sync # install
uv run pytest # run the test suite (includes a TPC-DS baseline)
uv run ruff check && uv run mypy src/osi_orionbelt
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 osi_orionbelt-0.1.1.tar.gz.
File metadata
- Download URL: osi_orionbelt-0.1.1.tar.gz
- Upload date:
- Size: 84.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91d2cfbb773953479c944269978f6ceef5e31214e1a9f65352200deef261412a
|
|
| MD5 |
e2517674f69168ace518247047ee077f
|
|
| BLAKE2b-256 |
be3cfa419c991408a266aef457af227be3908181016a801355c29f0d7d6d93f0
|
Provenance
The following attestation bundles were made for osi_orionbelt-0.1.1.tar.gz:
Publisher:
pypi-publish.yml on ralforion/orionbelt-semantic-layer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
osi_orionbelt-0.1.1.tar.gz -
Subject digest:
91d2cfbb773953479c944269978f6ceef5e31214e1a9f65352200deef261412a - Sigstore transparency entry: 2176297892
- Sigstore integration time:
-
Permalink:
ralforion/orionbelt-semantic-layer@3591137d5256178044590b36d46eb67c50267363 -
Branch / Tag:
refs/tags/v2.22.0 - Owner: https://github.com/ralforion
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@3591137d5256178044590b36d46eb67c50267363 -
Trigger Event:
push
-
Statement type:
File details
Details for the file osi_orionbelt-0.1.1-py3-none-any.whl.
File metadata
- Download URL: osi_orionbelt-0.1.1-py3-none-any.whl
- Upload date:
- Size: 57.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
22c53aedbc19da5be510aab2178d67a1a21b409ebe1bd488fe4113684a606bfd
|
|
| MD5 |
ed2d348f422b8f5c107d4dd7fd62d9dd
|
|
| BLAKE2b-256 |
d8522d41cc4e294ef95feee4ef2d4c5c7d4062869b403948d6bdb833bdab379f
|
Provenance
The following attestation bundles were made for osi_orionbelt-0.1.1-py3-none-any.whl:
Publisher:
pypi-publish.yml on ralforion/orionbelt-semantic-layer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
osi_orionbelt-0.1.1-py3-none-any.whl -
Subject digest:
22c53aedbc19da5be510aab2178d67a1a21b409ebe1bd488fe4113684a606bfd - Sigstore transparency entry: 2176297977
- Sigstore integration time:
-
Permalink:
ralforion/orionbelt-semantic-layer@3591137d5256178044590b36d46eb67c50267363 -
Branch / Tag:
refs/tags/v2.22.0 - Owner: https://github.com/ralforion
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@3591137d5256178044590b36d46eb67c50267363 -
Trigger Event:
push
-
Statement type: