odcslint
A fast, Rust-powered linter for Open Data Contract Standard (ODCS) contracts. Full documentation: feliblo.github.io/odcslint
- Fast validation against the official ODCS schema
- 40-1,800× faster than
datacontract lint(see the benchmarks)
- 40-1,800× faster than
- Custom business rules in simple YAML, with autofix
- approved owners and known domains
- column order: primary keys first, metadata columns last
- naming conventions, required fields and tags
- Automatic upgrades between ODCS versions with
odcslint upgrade- converts breaking changes for you, such as team lists and quality rules
- keeps your comments and formatting
--dry-runshows what would change first
Installation
uv
uv tool install odcslint # as a standalone tool
uv add --dev odcslint # as a dev dependency of your project
pip
pip install odcslint
Homebrew
brew install feliblo/tap/odcslint
Shell (macOS / Linux)
curl -LsSf https://github.com/feliblo/odcslint/releases/latest/download/odcslint-installer.sh | sh
PowerShell (Windows)
powershell -ExecutionPolicy Bypass -c "irm https://github.com/feliblo/odcslint/releases/latest/download/odcslint-installer.ps1 | iex"
prek / pre-commit
repos:
- repo: https://github.com/feliblo/odcslint
rev: v0.3.0
hooks:
- id: odcslint-fix # or `odcslint` to only check
GitHub Action
- uses: feliblo/odcslint@v0.3.0
with:
paths: contracts/
From source
cargo install --git https://github.com/feliblo/odcslint
Quickstart
odcslint init # write a starter odcslint.yml
odcslint check # check every *.odcs.yaml below the current directory
odcslint check --fix # apply fixes in place
odcslint upgrade # move contracts to the newest ODCS version
$ odcslint check contracts/
contracts/orders.odcs.yaml
13:17 error allowed_owners team member username `mallory` is not allowed; allowed values: alice, bob
20:9 error property_order expected `order_id` at position 1 of `orders`, found `_loaded_at` [*]
contracts/payments.odcs.yaml
6:1 error schema unexpected property `owner`
Found 3 errors and 0 warnings (2 files checked). 1 finding marked [*] can be fixed with `odcslint check --fix`.
Enable rules in odcslint.yml:
rules:
- type: property_order # primary keys first, metadata columns last (fixable)
- type: allowed_owners # only these people may own a contract
values: [alice, bob]
See the rules and configuration docs for everything else.
Acknowledgements
odcslint stands on the work of the Bitol community and the LF AI & Data Foundation, who develop and maintain the Open Data Contract Standard in the open. Their JSON Schemas are embedded in odcslint, and their examples and negative tests make up much of its test suite. Thank you to everyone who contributes to the standard.
License
odcslint is released under the MIT license. The embedded ODCS JSON Schemas are © The Bitol Contributors and licensed under Apache-2.0 (see licenses/).
Metadata
Release files for odcslint 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 | |||
|---|---|---|---|---|
| odcslint-0.3.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| odcslint-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| odcslint-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| odcslint-0.3.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| odcslint-0.3.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 16.9 MB
Release files / odcslint-0.3.0-py3-none-win_amd64.whl
| Download URL | odcslint-0.3.0-py3-none-win_amd64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d489dd0d4677aeb375c55a062504865b0eb946f7dedf882351ade81d706af1b1
|
|
BLAKE2b-256 checksum How to use checksums |
ae9c9275a4a7d03c770510989d582fd16d1c689f86c1dbbb4f9eb7edd36f8c28
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","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}
|
Release files / odcslint-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | odcslint-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
12feee8c1c241fb3055c94ee6d8047de94e0037f52a36408b380bd53b9d5fe4e
|
|
BLAKE2b-256 checksum How to use checksums |
382d196362e43e973265a0a68de1380fecc55886eb7daf188206cca93cc48a62
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","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}
|
Release files / odcslint-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | odcslint-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
e3b06c2883641810f0e9a62725a585e2e6d7a43324f82ea46b71d1f44e6c5602
|
|
BLAKE2b-256 checksum How to use checksums |
6efc17afc75a04388b0438558886507f5ca70849064805b2436761501bf418af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","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}
|
Release files / odcslint-0.3.0-py3-none-macosx_11_0_arm64.whl
| Download URL | odcslint-0.3.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c3df241717bcee98303d9bc9042f8521471286d95d35a4f1254d43df4f22d606
|
|
BLAKE2b-256 checksum How to use checksums |
f4f1802f5a2694bcf671a6a9301e52229e07c3836d1843632e117a2db343ee00
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","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}
|
Release files / odcslint-0.3.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | odcslint-0.3.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.4 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
1333d0c5a9b0b43f96e1081dd1eb5216db05c0eb6efe6450a98b846fbd14c4e5
|
|
BLAKE2b-256 checksum How to use checksums |
6d7a0cebd6cefb334ac6f5916c2155d57f5f85313beb71fd7d21ff391c2c110e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","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}
|
Security for odcslint 0.3.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.