panproto
This package exposes panproto's Rust libraries to Python through PyO3. It does not start a subprocess or load the WebAssembly build. Python 3.13 or newer is required.
The package is pre-1.0. A minor release may change the Python API, and the package version follows the Rust workspace version.
Installation
pip install panproto
Release workflows build wheels for Linux on x86-64 and AArch64, macOS on Apple
Silicon and x86-64, and Windows on x86-64. A source build requires Rust and
maturin.
Quick start
Protocol.schema() returns a mutable SchemaBuilder. Builder methods update
the builder and return None; call build() after all changes have been added.
import panproto
atproto = panproto.get_builtin_protocol("atproto")
old_builder = atproto.schema()
old_builder.vertex("post", "record", "app.bsky.feed.post")
old_builder.vertex("post:body", "object")
old_builder.vertex("post:body.text", "string")
old_builder.edge("post", "post:body", "record-schema")
old_builder.edge("post:body", "post:body.text", "prop", "text")
old_schema = old_builder.build()
new_builder = atproto.schema()
new_builder.vertex("post", "record", "app.bsky.feed.post")
new_builder.vertex("post:body", "object")
new_builder.vertex("post:body.content", "string")
new_builder.edge("post", "post:body", "record-schema")
new_builder.edge("post:body", "post:body.content", "prop", "content")
new_schema = new_builder.build()
report = panproto.diff_and_classify(old_schema, new_schema, atproto)
print(report.classification)
print(report.report_text())
CompatReport.classification is one of "fully-compatible",
"backward-compatible", or "breaking". The object also exposes
compatible, breaking_changes, non_breaking_changes, report_json(), and
to_dict().
Migrations and lenses
MigrationBuilder records a source-to-target vertex map. Compile the result
against its source and target schemas:
builder = panproto.MigrationBuilder()
builder.map_vertex("post", "post")
builder.map_vertex("post:body", "post:body")
migration = builder.build()
compiled = panproto.compile_migration(migration, old_schema, new_schema)
CompiledMigration.lift(instance) constructs a target instance from the
mapped part of a source instance. This operation is the library's
source-to-target surviving-fragment transfer. The categorical transports are
separate: Delta reindexes a target instance back to the source, while a general
left Kan extension computes the source-to-target Sigma transport. The vocabulary
in plain terms defines both.
CompiledMigration.get(instance) and Lens.get(instance) project a source
instance to a target-shaped view and return an opaque complement. Their
corresponding put(view, complement) methods reconstruct a source instance.
lens, quality, proposals = panproto.auto_generate_lens(
old_schema, new_schema, atproto
)
view, complement = lens.get(source_instance)
restored_source = lens.put(view, complement)
find_morphisms() and find_best_morphism() search for total schema
morphisms. find_best_morphism() returns None when none exists.
find_span() instead returns a SchemaSpan in every no-overlap case, with an
empty apex representing the absence of shared structure.
The ProtolensChain.from_dsl_*() constructors retain both the structural chain
and the lens-DSL compiler's value-level field transforms. Instantiating the
chain installs those transforms in the compiled migration. to_json() and
from_json() preserve them in the optional field_transforms member.
Tree-sitter grammar packages
The default source build enables the 11 group-core grammars: Python,
JavaScript, TypeScript, Java, C#, C++, PHP, Bash, C, Go, and Rust. Optional
companion wheels register other grammar groups through the
panproto.grammars Python entry-point group. panproto-grammars-all contains
all 261 grammars currently declared by panproto-grammars.
pip install panproto-grammars-functional
Constructing panproto.AstParserRegistry() loads metadata from installed
companions. panproto._native.AstParserRegistry() constructs only the native
registry. A companion whose metadata cannot be registered produces a
RuntimeWarning for that grammar and does not stop the other grammars from
loading.
Object ownership
PyO3 classes own Rust values directly. Several classes share immutable schemas through Rust reference counting, and Python releases those values when their wrappers are collected. There is no numeric handle API and no manual free function.
API reference
| API | Current behavior |
|---|---|
parse_schema_document, parse_schema_source, parse_schema_bundle |
Parse schema documents or source-language definitions through the registered Rust parsers. |
IoRegistry |
Parse and emit instances. Use len(registry) or list_protocols() to inspect the codecs in the installed build. |
Theory, TheoryBuilder, create_theory, colimit_theories |
Construct and combine generalized algebraic theories. |
Repository |
Open or create a filesystem-backed .panproto repository with commits, branches, tags, merge, rebase, stash, blame, bisect, data tracking, and garbage collection. |
VcsRepository |
A separate in-memory wrapper with only add() and list_refs(). It is not a Repository subclass. |
ProjectBuilder, build_project, parse_project |
Assemble multi-file projects. |
AstParserRegistry, parse_source_file, ParseEmitLens |
Parse source files with the tree-sitter grammars present in the build or supplied by companion packages. |
Expr, parse_expr, pretty_print_expr |
Parse, inspect, and evaluate the expression language through methods on Expr. |
The type stub at
src/panproto/_native.pyi gives the complete public
signatures.
Development
Build the extension and run the Python test suite from this directory:
maturin develop
python -m pytest
A development build requires Rust, Python 3.13 or newer, and
maturin.
Further reading
- John Cartmell, Generalised algebraic theories and contextual categories, Annals of Pure and Applied Logic 32, 209-243, 1986.
- J. Nathan Foster et al., Combinators for bidirectional tree transformations, ACM Transactions on Programming Languages and Systems 29(3), article 17, 2007.
- David I. Spivak, Functorial data migration, Information and Computation 217, 31-51, 2012.
License
Metadata
Release files for panproto 0.74.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| panproto-0.74.2-cp313-abi3-win_amd64.whl | CPython 3.13 | abi3 | Windows x86-64 | Details |
| panproto-0.74.2-cp313-abi3-manylinux_2_28_x86_64.whl | CPython 3.13 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| panproto-0.74.2-cp313-abi3-manylinux_2_28_aarch64.whl | CPython 3.13 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| panproto-0.74.2-cp313-abi3-macosx_11_0_arm64.whl | CPython 3.13 | abi3 | macOS 11.0+ ARM64 | Details |
| panproto-0.74.2-cp313-abi3-macosx_10_12_x86_64.whl | CPython 3.13 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 60.8 MB
Release files / panproto-0.74.2-cp313-abi3-win_amd64.whl
| Download URL | panproto-0.74.2-cp313-abi3-win_amd64.whl |
|---|---|
| Size | 13.6 MB |
| Tags | CPython 3.13 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
952a888ca34c4bcfa589ef34d768d002d1c466a9b9183c1c44343e69ebbf5dab
|
|
BLAKE2b-256 checksum How to use checksums |
e44e49cb8f086bba2de834f814a7fde93aeda3e0b19cec4e51c6a79d86bc1b35
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency logRelease files / panproto-0.74.2-cp313-abi3-manylinux_2_28_x86_64.whl
| Download URL | panproto-0.74.2-cp313-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 12.3 MB |
| Tags | CPython 3.13 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
297356467ea7a5c43755ba87ec2331adb374a31e98aadebbd1d58f4ed6623d9c
|
|
BLAKE2b-256 checksum How to use checksums |
ab546807667e0b5adf9d13b2d4097a4cffb3e7e400cd6f607f478b93fe6b282d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency logRelease files / panproto-0.74.2-cp313-abi3-manylinux_2_28_aarch64.whl
| Download URL | panproto-0.74.2-cp313-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 11.4 MB |
| Tags | CPython 3.13 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
8f39852cbe9ee94631d5de179a0a09bb3b88d215757d52edf2f4da0e9658ebf8
|
|
BLAKE2b-256 checksum How to use checksums |
139a4dfb552e5ad8a4d96efb7e5bd5462574729b4acfcc46db85a3a22a05a944
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency logRelease files / panproto-0.74.2-cp313-abi3-macosx_11_0_arm64.whl
| Download URL | panproto-0.74.2-cp313-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 11.3 MB |
| Tags | CPython 3.13 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
27352514eb1b6e3011b5239d47e960112a099e82b2eb5177b082f231bf694381
|
|
BLAKE2b-256 checksum How to use checksums |
5f23e1b4ce391817624b3cd044706046260e25ea40e797a1e698962aa26132a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency logRelease files / panproto-0.74.2-cp313-abi3-macosx_10_12_x86_64.whl
| Download URL | panproto-0.74.2-cp313-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 12.1 MB |
| Tags | CPython 3.13 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
9902c941c41940695e526d0dcd811550d4dbb43e0444e941074535730aadcf38
|
|
BLAKE2b-256 checksum How to use checksums |
49c508dd31c45b803a563cee0590e9ef6d0f5764ff712b746d208821f1f9a27b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency log