Skip to main content

Automatic schema migration and version control for 51 schema languages and 248 programming languages

Project description

panproto

PyPI Python License: MIT

Python bindings for panproto, a schematic version-control system that treats every supported schema language (around 50, including ATProto, OpenAPI, AsyncAPI, Avro, Protobuf, JSON Schema, and Kubernetes CRDs) as views over a single graph format.

The bindings are built with PyO3 against the Rust core directly: no WASM runtime, no subprocess, no shelling out. The full panproto surface is available from Python, including the schema/migration/lens/VCS pipelines and the tree-sitter-driven parser for ~250 programming languages.

Status

panproto is pre-1.0. The 0.x series carries arbitrary breaking changes between minor versions; the panproto package version tracks the workspace version on every release. Python 3.13+ is required (the wheels are abi3 and forward-compatible across newer Python releases).

Installation

pip install panproto

Wheels are published on PyPI for Linux x86_64/aarch64, macOS arm64+x86_64, and Windows x86_64. No Rust toolchain is required to install.

Synopsis

import panproto

# Pick a built-in protocol, or define your own with `Protocol.from_theories`.
atproto = panproto.get_builtin_protocol("atproto")

# Build a schema using the fluent builder.
v1 = atproto.schema()
v1.vertex("post", "record", "app.bsky.feed.post")
v1.vertex("post:body", "object")
v1.vertex("post:body.text", "string")
v1.edge("post", "post:body", "record-schema")
v1.edge("post:body", "post:body.text", "prop", "text")
v1.constraint("post:body.text", "maxLength", "3000")
schema_v1 = v1.build()

# (build schema_v2 the same way, with the field renamed to `content` ...)

# Detect breaking changes.
report = panproto.diff_and_classify(schema_v1, schema_v2, atproto)
print(report.compatible)        # True or False
print(report.report_text())     # human-readable summary

# Auto-generate a bidirectional converter.
lens, quality, _ = panproto.auto_generate_lens(schema_v1, schema_v2, atproto)
view, complement = lens.get(instance)
restored = lens.put(view, complement)

# Version-control schemas.
repo = panproto.Repository.init("/path/to/repo")
repo.add(schema_v1)
repo.commit("initial schema")
repo.branch("feature")
repo.merge("feature")

API overview

Module / class Purpose
Schema, SchemaBuilder Fluent schema construction; Schema.validate(protocol) checks rules.
Protocol Schema-language definition. Protocol.from_theories(...) builds one from a Theory.
get_builtin_protocol(name) Load any of the ~50 builtin protocols by name.
define_protocol(spec) Define a custom protocol from a dict.
Theory, create_theory GAT-level theory construction (sorts, ops, equations, directed_eqs).
diff_schemas, diff_and_classify Structural diff and breaking-change classification.
auto_generate_lens Generate a bidirectional Lens from two schemas.
Lens get(instance) -> (view, complement), put(view, complement) -> instance.
MigrationBuilder, compile_migration, compose_migrations Hand-rolled migration construction.
Instance, IoRegistry Parse/emit data across the 50+ supported formats.
Repository Filesystem-backed VCS: init, commit, branch, merge, log, blame, bisect, stash, tag, plus data versioning.
AstParserRegistry, parse_source_file, ParseEmitLens Full-AST parsing across ~250 languages via tree-sitter.
Expr, parse_expr, pretty_print_expr Embedded expression language.

Companion grammar packs

The published panproto wheel ships only the 11 group-core tree-sitter grammars (Python, JavaScript, TypeScript, Java, C#, C++, PHP, Bash, C, Go, Rust). Beyond that, grammars are distributed as separately-installable companion wheels, one per language group:

Wheel Languages
panproto-grammars-web HTML, CSS, JavaScript, TypeScript, TSX, JSON, Vue, Svelte, Astro, GraphQL
panproto-grammars-systems C, C++, Rust, Go, Zig, D, Nim, Odin, V, Hare
panproto-grammars-jvm Java, Kotlin, Scala, Groovy, Clojure
panproto-grammars-scripting Python, Ruby, Lua, Bash, Perl, R, Julia, Nushell, Fish
panproto-grammars-data JSON, TOML, XML, YAML, SQL, CSV, GraphQL, Protobuf
panproto-grammars-functional Haskell, OCaml, Elm, Gleam, Erlang, Elixir, PureScript, F#, Clojure, Scheme, Racket
panproto-grammars-devops Dockerfile, Terraform, HCL, Nix, Bash, YAML, TOML, Make, CMake
panproto-grammars-mobile Swift, Kotlin, Dart, Java, Objective-C
panproto-grammars-music SuperCollider, LilyPond, ABC, Csound, ChucK, Glicol, Tidal mini-notation, Strudel mini-notation
panproto-grammars-all every grammar in panproto-grammars (around 250 languages)

Install whichever group you need:

pip install panproto-grammars-functional

There is nothing to import from these packages. They register a panproto.grammars entry point on installation; panproto.AstParserRegistry() walks every such entry point and threads the discovered grammar metadata into the native registry on construction. The native class is reachable as panproto._native.AstParserRegistry() for callers who want only the group-core baseline.

How it works under the hood:

  • Each companion is its own pyo3 cdylib depending on panproto-grammars with one group-* feature flag.
  • On import, the companion's grammars_metadata() returns a list of dicts containing the tree-sitter Language pointer plus byte-slice pointer/length pairs (cast to integers for transport across cdylib boundaries).
  • The trust boundary lives on the panproto side, in register_external_from_metadata (crates/panproto-py/src/parse.rs), which decodes the integers back into &'static references and registers a full LanguageParser. The companion's grammar bytes live in its .rodata and stay valid for the process lifetime.
  • A single broken grammar (e.g. an upstream node-types.json with a malformed entry) is skipped with a RuntimeWarning rather than aborting registration; mirrors the resilience of the built-in path.

Performance notes

  • The _native extension talks to the Rust core through PyO3's zero-copy pyclass slabs. Schemas, theories, and lenses are reference-counted Rust objects on the Python side; mutations go through dedicated builder types (SchemaBuilder, MigrationBuilder) that consume on build(), so you can't accidentally observe partial state.
  • Cross-thread sharing of these objects requires the GIL; for parallel work, fan out at the data layer (e.g. parallelise lens.get calls with concurrent.futures) and keep the schema/lens objects per worker.
  • Wheel-load cost is one-time; the import sets up the protocol registry lazily so cold-start is fast.

Contributing

Source: bindings/python. Issues and pull requests at github.com/panproto/panproto/issues.

The native extension lives at crates/panproto-py on the Rust side; bindings/python/src/panproto/__init__.py is the pure-Python re-export layer that maturin ships alongside the compiled extension.

License

MIT © 2026 Aaron Steven White.

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 Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

panproto-0.45.0-cp313-abi3-win_amd64.whl (10.9 MB view details)

Uploaded CPython 3.13+Windows x86-64

panproto-0.45.0-cp313-abi3-manylinux_2_28_x86_64.whl (11.9 MB view details)

Uploaded CPython 3.13+manylinux: glibc 2.28+ x86-64

panproto-0.45.0-cp313-abi3-manylinux_2_28_aarch64.whl (11.4 MB view details)

Uploaded CPython 3.13+manylinux: glibc 2.28+ ARM64

panproto-0.45.0-cp313-abi3-macosx_11_0_arm64.whl (10.9 MB view details)

Uploaded CPython 3.13+macOS 11.0+ ARM64

panproto-0.45.0-cp313-abi3-macosx_10_12_x86_64.whl (11.0 MB view details)

Uploaded CPython 3.13+macOS 10.12+ x86-64

File details

Details for the file panproto-0.45.0-cp313-abi3-win_amd64.whl.

File metadata

  • Download URL: panproto-0.45.0-cp313-abi3-win_amd64.whl
  • Upload date:
  • Size: 10.9 MB
  • Tags: CPython 3.13+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for panproto-0.45.0-cp313-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 089f37dc194cd7d1cfca3d61a7f79b63c86e2699624e9dd2cdc8de7f9f7a63ea
MD5 e35aab3c41be17500ece2e92cfd6d511
BLAKE2b-256 d7f7d4be3cad9814905e7df6da6942eebb2851f7a3d3d44ec92f881897fcfa28

See more details on using hashes here.

Provenance

The following attestation bundles were made for panproto-0.45.0-cp313-abi3-win_amd64.whl:

Publisher: python-wheels.yml on panproto/panproto

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

File details

Details for the file panproto-0.45.0-cp313-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for panproto-0.45.0-cp313-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6a7928a92a9b399fc20cd290aa580a4e19348fd79d22b8d6c94f330fdef4a9fd
MD5 cf18616ef8c4c35f27f6e1f01e2a0531
BLAKE2b-256 fe4ffd135d0267b21bd2b153189bad5085351bed6f4247eaa7756652086e5c7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for panproto-0.45.0-cp313-abi3-manylinux_2_28_x86_64.whl:

Publisher: python-wheels.yml on panproto/panproto

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

File details

Details for the file panproto-0.45.0-cp313-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for panproto-0.45.0-cp313-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 174f8627c5d74fd788d6c00d1fa27291f2a55eedf97359798d313d73f5e58a1b
MD5 a30d06daa7e1b2c85f7ca821d52b2085
BLAKE2b-256 3c242d497b28e5a8686fa0244b1ac8a20c89077d1db6f74fd993a9426a380c66

See more details on using hashes here.

Provenance

The following attestation bundles were made for panproto-0.45.0-cp313-abi3-manylinux_2_28_aarch64.whl:

Publisher: python-wheels.yml on panproto/panproto

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

File details

Details for the file panproto-0.45.0-cp313-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for panproto-0.45.0-cp313-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0ee440dfa9f405735ad3b0038953d0cf85b68af2074a5aaa5701bd75a97ab3d4
MD5 e4cc621429f190dd7bcdff0d650465e1
BLAKE2b-256 f3ab37991522b706f10626a7b844936e1a70ba95cd652c812865b92f91b2ade7

See more details on using hashes here.

Provenance

The following attestation bundles were made for panproto-0.45.0-cp313-abi3-macosx_11_0_arm64.whl:

Publisher: python-wheels.yml on panproto/panproto

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

File details

Details for the file panproto-0.45.0-cp313-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for panproto-0.45.0-cp313-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6c3001b34256604ea5ac220a9bb823c71e2efc04001e1a7581ea6d49ec82c84e
MD5 d7c19ca2628a34cbdfe26021b0a171d3
BLAKE2b-256 6add7c32b2cf91f7a8076d214ac9e9b15e851bf3b98c6c88c318d67c556de8a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for panproto-0.45.0-cp313-abi3-macosx_10_12_x86_64.whl:

Publisher: python-wheels.yml on panproto/panproto

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page