Skip to main content

ofplang validate

CI PyPI

A validator for Object-flow Programming Language v0 — a YAML-based dataflow workflow IR with linear Object tracking. The language is defined in the ofplang/spec repository.

The validator checks that a document is well-formed portable v0: structure and types, the feature model, linear Object tracking, structured nodes, contracts, and scheduling policies. It reports findings as stable error codes rather than free text, so results are easy to consume in tests and tooling.

Install

pip install ofplang-validate

Requires Python 3.10+. The only runtime dependency is PyYAML. For development, install editable with the test extra from a clone:

pip install -e ".[test]"

Command line

ofp-validate <file>...                 # or: python -m ofplang.validate <file>...
ofp-validate --mode extension-tolerant doc.yaml
ofp-validate --format json doc.yaml

Options: --mode {strict,extension-tolerant}, --format {text,json}, -q/--quiet, --no-color.

Exit codes: 0 all valid, 1 validation errors found, 2 usage/input error.

$ ofp-validate workflow.yaml
workflow.yaml:7:15: error unknown_type  processes.main.inputs.x.type  unknown type in 'Foo'
1 error in 1 of 1 file

Diagnostics carry a file:line:col source position (an imported fragment's own file when the problem is inside an $import); --format json includes file/line/col fields.

This tool is also the validate subcommand of the umbrella ofp CLI (ofplang), which forwards to it in-process: ofp validate doc.yaml is the command above, with the same options and the same exit codes.

Library

from ofplang.validate import validate

result = validate("workflow.yaml", mode="strict")
if not result.ok:
    for d in result.diagnostics:
        print(d.code, d.path, d.message)

validate(source, *, mode="strict") returns a ValidationResult with .ok and .diagnostics (each a Diagnostic(code, message, path, file, line, col)). The validator collects all independent findings rather than stopping at the first; only a YAML parse or $import resolution failure is terminal.

source is a path or an already-loaded document (a mapping), so a caller that builds one in memory — a generator, a notebook, a tool that rewrote a document before running it — can validate exactly what it holds:

result = validate(document)          # the same checks, the same codes

An in-memory document must already be import-expanded (there is no base directory to resolve a relative $import against — call expand() on the file first), and it cannot contain a value v0 has no spelling for, such as a datetime; either raises ValueError. Its diagnostics carry no file:line:col, only path, and no duplicate_key can arise for it: a mapping holds one value per key.

Expanded document

$import (spec §3) is structural inclusion resolved before any other checks, so the document that gets validated is the fully expanded one. To obtain that expanded document — e.g. to hand a downstream tool the exact form it should schedule or run, instead of re-reading the unexpanded file — use:

from ofplang.validate import validate, expand

# structural expansion only (no validation); raises YamlError on import failure
doc = expand("workflow.yaml")

# validate and get the expanded document in one pass
result = validate("workflow.yaml", mode="extension-tolerant", expand=True)
if result.ok:
    run_it(result.document)   # exactly what was validated

expand(source, *, base_dir=None) returns the plain-Python document yaml.safe_load would yield for the resolved tree (fidelity is exact, including non-string scalar tags). base_dir overrides where the root's relative imports resolve. validate(..., expand=True) sets ValidationResult.document to that same value whenever load + $import resolution succeeds (otherwise None).

The package lives under the ofplang PEP 420 namespace (ofplang.validate), shared across the organization's tools.

Scope

Covers graph-time validation of portable v0. Runtime failures, and run/data-phase preflight checks, are out of scope (spec §6.2, §25). Two modes are supported: strict (portable v0) and extension-tolerant (accepts x- extension keys).

v0's seven optional features (spec §4.2) are all checked here, whichever ones the document uses. Whether anything can then act on the document is a separate question: a feature the validator checks may be one the scheduler or the runner does not implement — which §4.1 calls valid v0 but unsupported by that implementation. Their READMEs say which ones they support.

Tests

The behavior is pinned by a spec-derived conformance suite that matches on error codes (see tests/conformance/README.md).

pytest                         # run everything
OFPLANG_STRICT_TESTS=1 pytest  # full contract, no pending escapes

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ofplang_validate-0.2.0.tar.gz (175.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ofplang_validate-0.2.0-py3-none-any.whl (110.6 kB view details)

Uploaded Python 3

File details

Details for the file ofplang_validate-0.2.0.tar.gz.

File metadata

  • Download URL: ofplang_validate-0.2.0.tar.gz
  • Upload date:
  • Size: 175.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for ofplang_validate-0.2.0.tar.gz
Algorithm Hash digest
SHA256 cd21df762c889fc3201096bca07d92af7cf4d22d920296a9930b0716fbbb1b9e
MD5 86f251507a70d5f804cfcc179043ab4d
BLAKE2b-256 98e2c6146e0ae7016292cae61362dd7792610d99ac774ab8a1ff48c88b52a1cd

See more details on using hashes here.

Provenance

The following attestation bundles were made for ofplang_validate-0.2.0.tar.gz:

Publisher: publish.yml on ofplang/validate

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ofplang_validate-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ofplang_validate-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3c1e21a1906cfe0312ba16ff9accb3d7666bc70f1805444ffe205c9e5fa8884a
MD5 960ea6a1713a529d06a503dcb64e1aaf
BLAKE2b-256 d3489b318bc9ae2bce43ccf1b15f0a0dcdba028941d81570fa15196894a6f4ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for ofplang_validate-0.2.0-py3-none-any.whl:

Publisher: publish.yml on ofplang/validate

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.2.1

2 files

This release

0.2.0 This release

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page