{"id":51326801,"url":"https://github.com/frenck/probatio","last_synced_at":"2026-07-01T19:02:25.043Z","repository":{"id":367824775,"uuid":"1281730754","full_name":"frenck/probatio","owner":"frenck","description":"⚖️ Probatio. A modern, maintained data validation library for Python. Clean-room, MIT-licensed, drop-in reimplementation of voluptuous.","archived":false,"fork":false,"pushed_at":"2026-06-27T21:19:38.000Z","size":531,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-27T22:03:54.066Z","etag":null,"topics":["dataclasses","deserialization","json","jsonschema","openapi","openapi-schema","parsing","python","serialization","toml","validation","validators","voluptuous","yaml"],"latest_commit_sha":null,"homepage":"http://probatio.frenck.dev/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/frenck.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"frenck","patreon":"frenck","custom":"https://frenck.dev/donate/"}},"created_at":"2026-06-26T21:34:08.000Z","updated_at":"2026-06-27T20:17:31.000Z","dependencies_parsed_at":"2026-06-27T22:04:52.391Z","dependency_job_id":null,"html_url":"https://github.com/frenck/probatio","commit_stats":null,"previous_names":["frenck/probatio"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/frenck/probatio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frenck%2Fprobatio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frenck%2Fprobatio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frenck%2Fprobatio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frenck%2Fprobatio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/frenck","download_url":"https://codeload.github.com/frenck/probatio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frenck%2Fprobatio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35019037,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dataclasses","deserialization","json","jsonschema","openapi","openapi-schema","parsing","python","serialization","toml","validation","validators","voluptuous","yaml"],"created_at":"2026-07-01T19:02:24.160Z","updated_at":"2026-07-01T19:02:25.030Z","avatar_url":"https://github.com/frenck.png","language":"Python","funding_links":["https://github.com/sponsors/frenck","https://patreon.com/frenck","https://frenck.dev/donate/"],"categories":[],"sub_categories":[],"readme":"# ⚖️ Probatio\n\n[![GitHub Release][releases-shield]][releases]\n[![Python Versions][python-versions-shield]][pypi]\n![Project Stage][project-stage-shield]\n![Project Maintenance][maintenance-shield]\n[![License][license-shield]](https://github.com/frenck/probatio/blob/main/LICENSE)\n\n[![Build Status][build-shield]][build]\n[![Code Coverage][codecov-shield]][codecov]\n[![CodSpeed][codspeed-shield]][codspeed]\n[![OpenSSF Scorecard][scorecard-shield]][scorecard]\n\nPut your data to the proof.\n\n## About\n\nProbatio is a modern, maintained data validation library for Python. The model\nis simple: a schema is data, and data describes data. You compose schemas from\nplain Python types, dicts, lists, and a handful of small helpers, then call the\nschema with a value to validate it.\n\nIt is a drop-in for [voluptuous][voluptuous]: the same public API, so you can\nswap the import and keep your existing schemas. Probatio is a clean-room\nreimplementation (the same API written fresh, not a fork), which means it can be\nactively maintained, ships under a clean MIT license, and is free to fix bugs\nand improve its internals without inheriting old decisions. See\n[ADR-001](https://github.com/frenck/probatio/blob/main/adr/001-clean-room-reimplementation-of-voluptuous.md) for the full\nreasoning, and [Credits and inspiration](#credits-and-inspiration) for the\nlineage.\n\nIt does not stop at parity. Probatio clears voluptuous's own backlog (cross-field\nrules, dataclass and TypedDict schemas, network and format validators, errors\nthat carry a path and suggest the key you meant), and it is held to the bar you\nwould want from a library that loads untrusted config. See\n[Why trust it](#why-trust-it).\n\nProbatio is pure Python: no compiler, no build step, no native extension.\nInstall it and import it. Requires Python 3.12 or newer.\n\n## Installation\n\n```bash\npip install probatio\n```\n\nOr with [uv][uv]:\n\n```bash\nuv add probatio\n```\n\n## Usage\n\nDefine a schema, then call it with a value to validate it. A valid value comes\nback (possibly normalized); an invalid one raises `Invalid`.\n\n```python\nfrom probatio import Schema, Required, Optional\n\nschema = Schema(\n    {\n        Required(\"name\"): str,\n        Optional(\"port\", default=8080): int,\n    }\n)\n\nschema({\"name\": \"app\"})\n# {'name': 'app', 'port': 8080}\n```\n\nWhen a value does not match, the error carries a path to the offending value:\n\n```python\nfrom probatio import Schema, Invalid\n\nschema = Schema({\"port\": int})\n\ntry:\n    schema({\"port\": \"nope\"})\nexcept Invalid as err:\n    print(err)\n    # expected int for dictionary value @ data['port']\n```\n\n## Why trust it\n\nIt is a config-loading library, so the real question is whether you would feed it\nuntrusted input. The evidence, not the adjectives:\n\n- **voluptuous 0.16.0 test suite:** runs against Probatio, with every divergence\n  a deliberate, documented deviation. voluptuous's own authors' notion of the\n  contract, checked.\n- **Home Assistant `config_validation`:** the full suite passes, with voluptuous\n  swapped out for Probatio.\n- **100% line and branch coverage**, type-checked under both mypy and ty, in CI.\n- **Fuzzed on every untrusted-input surface.** The first fuzzing pass found\n  hundreds of exception leaks on hostile input. All fixed; none since.\n- **Safer than the original:** a built-in validator only ever raises `Invalid`,\n  never a raw exception, and that is enforced, not hoped for.\n\n## Migrating from voluptuous\n\nProbatio aims to be a drop-in replacement. In most cases the migration is a\nsingle import change:\n\n```python\n# Before\nfrom voluptuous import Schema, Required, Optional, All, Any, Coerce, Invalid\n\n# After\nfrom probatio import Schema, Required, Optional, All, Any, Coerce, Invalid\n```\n\nThe markers (`Required`, `Optional`, `Remove`, `Extra`), combinators (`All`,\n`Any`), helpers (`Coerce`, `Range`, `In`, `Length`, `Match`, and friends), and\nerrors (`Invalid`, `MultipleInvalid`) all behave the way they do in voluptuous.\nSee the [migration guide][docs-migrating] for the current compatibility status.\n\n## Documentation\n\nFull documentation lives at **[probatio.frenck.dev][docs]**: getting started, the\nmigration guide, and the API reference.\n\n## Changelog \u0026 Releases\n\nThis repository keeps a changelog using [GitHub's releases][releases]\nfunctionality. The format of the log is based on\n[Keep a Changelog][keepchangelog]. There is intentionally no `CHANGELOG.md` file:\nthe GitHub Releases are the changelog.\n\nReleases are based on [Semantic Versioning][semver], and use the format\nof `MAJOR.MINOR.PATCH`. In a nutshell, the version will be incremented\nbased on the following:\n\n- `MAJOR`: Incompatible or major changes.\n- `MINOR`: Backward-compatible new features and enhancements.\n- `PATCH`: Backward-compatible bugfixes and package updates.\n\n## Contributing\n\nThis is an active open-source project. We are always open to people who want to\nuse the code or contribute to it.\n\nUsing AI tools to help is fine, but you must review and understand everything you\nsubmit. Please read our [AI Policy](https://github.com/frenck/probatio/blob/main/AI_POLICY.md)\nfirst; autonomous agents are not allowed, and unreviewed AI output will be closed.\n\nBefore you start, read the [contributing guide][contributing], the\n[code of conduct][code-of-conduct], and the [security policy][security]. Bugs and\nfeature requests go to the [issue tracker][issues].\n\nThank you for being involved.\n\n## Credits and inspiration\n\nProbatio owes its design to [voluptuous][voluptuous] by Alec Thomas. The API and\nthe \"schema is data\" validation model are its inspiration. Probatio reimplements\nthem fresh, no code copied, so the result can be maintained and MIT licensed,\nbut the original idea is theirs and the credit belongs to them.\n\nvoluptuous itself drew on earlier work, and it is only fair to pass that on:\nValidino as its major influence, with lighter nods to jsonvalidator and\njson_schema. Probatio stands on that same lineage.\n\n## Authors \u0026 contributors\n\nThe original setup of this repository is by [Franck Nijhof][frenck].\n\nFor a full list of all authors and contributors,\ncheck [the contributors page][contributors].\n\n## License\n\nMIT License\n\nCopyright (c) 2026 Franck Nijhof\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n[build-shield]: https://github.com/frenck/probatio/actions/workflows/tests.yaml/badge.svg\n[build]: https://github.com/frenck/probatio/actions/workflows/tests.yaml\n[codecov-shield]: https://codecov.io/gh/frenck/probatio/graph/badge.svg\n[codecov]: https://codecov.io/gh/frenck/probatio\n[codspeed-shield]: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json\n[codspeed]: https://codspeed.io/frenck/probatio\n[scorecard-shield]: https://api.scorecard.dev/projects/github.com/frenck/probatio/badge\n[scorecard]: https://scorecard.dev/viewer/?uri=github.com/frenck/probatio\n[code-of-conduct]: https://github.com/frenck/probatio/blob/main/.github/CODE_OF_CONDUCT.md\n[contributing]: https://github.com/frenck/probatio/blob/main/.github/CONTRIBUTING.md\n[contributors]: https://github.com/frenck/probatio/graphs/contributors\n[issues]: https://github.com/frenck/probatio/issues\n[security]: https://github.com/frenck/probatio/blob/main/.github/SECURITY.md\n[docs-migrating]: https://probatio.frenck.dev/getting-started/migrating-from-voluptuous/\n[docs]: https://probatio.frenck.dev\n[frenck]: https://github.com/frenck\n[keepchangelog]: http://keepachangelog.com/en/1.0.0/\n[license-shield]: https://img.shields.io/github/license/frenck/probatio.svg\n[maintenance-shield]: https://img.shields.io/maintenance/yes/2026.svg\n[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg\n[pypi]: https://pypi.org/project/probatio/\n[python-versions-shield]: https://img.shields.io/badge/python-3.12_%7C_3.13_%7C_3.14_%7C_3.15-blue?logo=python\u0026logoColor=white\n[releases-shield]: https://img.shields.io/github/release/frenck/probatio.svg\n[releases]: https://github.com/frenck/probatio/releases\n[semver]: http://semver.org/spec/v2.0.0.html\n[uv]: https://docs.astral.sh/uv/\n[voluptuous]: https://github.com/alecthomas/voluptuous\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrenck%2Fprobatio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffrenck%2Fprobatio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrenck%2Fprobatio/lists"}