oml-lang
Parse, validate, and transpile Orchestra pipeline definitions from Python.
oml-lang is the Python binding for the Orchestra pipeline DSL — the same
engine that powers the Orchestra VS Code extension. It ships the
dialect's schema and validators as a native library, so you get full
dialect-aware parsing and validation without calling out to a separate process.
About the dialect
Orchestra pipelines are authored in a KSON-based DSL for defining, validating, and shipping data pipelines. A pipeline describes tasks, dependencies, conditions, triggers, and variables across 95+ integrations (Snowflake, dbt, Fivetran, Databricks, and more).
A minimal pipeline looks like this:
version: v1
name: 'task-references'
pipeline:
producer:
integration: SNOWFLAKE
integrationJob: SNOWFLAKE_RUN_QUERY
parameters:
set_outputs: true
statement: 'SELECT 1'
.
.
consumer:
integration: SNOWFLAKE
integrationJob: SNOWFLAKE_RUN_QUERY
condition: "${{ tasks['producer'].status == 'SUCCEEDED' }}"
parameters:
statement: "SELECT ${{ tasks['producer'].outputs['count'] }}"
.
dependsOn:
- producer
The dialect validates required fields and types, integration-specific parameters, variable references and expressions, task dependencies, cron syntax, and branching conditions. See the Orchestra documentation for the full language reference.
Installation
pip install oml-lang
API
The module exposes five top-level functions and return the raw result objects.
analyze(kson: str) -> Analysis
Statically analyze an Orchestra document. The bundled engine runs the
Orchestra dialect validators automatically, so analyze catches parse
errors, schema violations, expression syntax errors, bad task
references, circular dependencies, invalid cron expressions, and so on.
import oml_lang
src = open("pipeline.oml").read()
analysis = oml_lang.analyze(src)
for msg in analysis.errors():
start = msg.start()
print(f"[{msg.severity()}] {start.line()}:{start.column()} {msg.message()}")
Example output for a pipeline with a broken condition expression and missing required fields:
[MessageSeverity.ERROR] 3:53 Expression syntax error: Expected RPAREN but got ''
[MessageSeverity.WARNING] 0:0 Missing required properties: version, name
The Analysis object
Analysis exposes three views of the analyzed document:
-
errors() -> list[Message]— every error and warning produced by the parser, schema validator, and dialect validators. EachMessagecarries aseverity()(MessageSeverity.ERRORorMessageSeverity.WARNING), amessage()string, andstart()/end()Positions whoseline()andcolumn()methods return zero-based offsets. An empty list means the document is valid. -
tokens() -> list[Token]— the full lexed token stream, useful for syntax highlighting and editor tooling. EachTokenhastoken_type()(aTokenTypeenum),text(), andstart()/end()positions. -
kson_value() -> KsonValue | None— the parsed document as a typed value tree, orNoneif parsing failed fatally. Calltype()to get aKsonValueTypediscriminator, orisinstancecheck againstKsonValue.KsonObject,KsonValue.KsonArray,KsonValue.KsonString,KsonValue.KsonNumber,KsonValue.KsonBoolean,KsonValue.KsonNull, orKsonValue.KsonEmbedto walk the tree.
from oml_lang import analyze, KsonValue
analysis = analyze(src)
root = analysis.kson_value()
if isinstance(root, KsonValue.KsonObject):
# ... walk the object
...
to_json(kson: str, options: TranspileOptions.Json) -> Result
Transpile Orchestra source to JSON. Returns a Result — pattern-match on
Result.Success / Result.Failure:
from oml_lang import to_json, Result, TranspileOptions
result = to_json(src, TranspileOptions.Json(retain_embed_tags=False))
if isinstance(result, Result.Success):
print(result.output())
else:
for err in result.errors():
print(err.message())
to_yaml(kson: str, options: TranspileOptions.Yaml) -> Result
Same shape as to_json, but emits YAML and preserves comments.
from oml_lang import to_yaml, TranspileOptions
result = to_yaml(src, TranspileOptions.Yaml(retain_embed_tags=False))
format(kson: str, format_options: FormatOptions) -> str
Pretty-print Orchestra source with the given formatting options. Applies the
dialect's embed-block rules but not its validators, so this is lossless
reformatting, not validation — run analyze to validate.
import oml_lang
from oml_lang import FormatOptions, FormattingStyle, IndentType
formatted = oml_lang.format(
src,
FormatOptions(
indent_type=IndentType.Spaces(2),
formatting_style=FormattingStyle.PLAIN,
embed_block_rules=[],
),
)
parse_schema(schema_kson: str) -> SchemaResult
Parse a KSON JSON-Schema document and, on success, return a reusable
SchemaValidator.
from oml_lang import parse_schema, SchemaResult
result = parse_schema(open("my.schema.kson").read())
if isinstance(result, SchemaResult.Success):
validator = result.schema_validator()
messages = validator.validate(src, "document.oml")
Links
Release files for orchestra-lang 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| orchestra_lang-0.3.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| orchestra_lang-0.3.0-cp310-abi3-manylinux_2_34_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.34+ x86-64 | Details |
| orchestra_lang-0.3.0-cp310-abi3-manylinux_2_34_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.34+ ARM64 | Details |
| orchestra_lang-0.3.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 79.4 MB
Release files / orchestra_lang-0.3.0-cp310-abi3-win_amd64.whl
| Download URL | orchestra_lang-0.3.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 19.3 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
b31e3b53c4e66cc037ba9149e3dda21f40deec88318519a3952f283210b1d701
|
|
BLAKE2b-256 checksum How to use checksums |
0e71cc0e5e6e4c346e5e24b4783e5fa498dfa5cf0fb65c43bc647e4170f4e8d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Release files / orchestra_lang-0.3.0-cp310-abi3-manylinux_2_34_x86_64.whl
| Download URL | orchestra_lang-0.3.0-cp310-abi3-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 20.8 MB |
| Tags | CPython 3.10 Linux glibc 2.34+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
f6c47f54c16808e7fd333be815923594209e8f1c151acb6d9b05e63877b67bb8
|
|
BLAKE2b-256 checksum How to use checksums |
28a44e18a9304376f5faae508283e1812b7106a16aa885104735cc74e68e2174
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Release files / orchestra_lang-0.3.0-cp310-abi3-manylinux_2_34_aarch64.whl
| Download URL | orchestra_lang-0.3.0-cp310-abi3-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 20.4 MB |
| Tags | CPython 3.10 Linux glibc 2.34+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
34ac81627813c2b1c50f19e11979b1e9ead2163e80ee554f10cfb1011973bee3
|
|
BLAKE2b-256 checksum How to use checksums |
ad303ed18af05fd73bea15412b19656a04fbc9eacd8e96dc9a3f257a1f648df5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Release files / orchestra_lang-0.3.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | orchestra_lang-0.3.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 18.8 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
bbb7a47ee574c6d30759284eb5b9d477b862cae3123d4279d532c2335831c2ab
|
|
BLAKE2b-256 checksum How to use checksums |
a3b4ebba96d29ffd9b0cd072da814b9091f0275ca45080e799fbfa8124b77bc5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|