Skip to main content

pyverge

Schema evolution and migrations for versioned data models. Version your models, define migrations between versions, and converge payloads to a target schema at runtime.

The engine is provider-agnostic: it works on plain dicts and only touches a model library through the ModelAdapter seam. A Pydantic adapter ships today; adapters for other providers (dataclasses, attrs, marshmallow, MessagePack, etc.) plug in the same way.

Installation

# Core library (versioned registry, migration engine, diffing)
pip install git+https://github.com/JoHa-HQ/pyverge.git

# With CLI (init, validate, migrate, diff, export commands)
pip install "git+https://github.com/JoHa-HQ/pyverge.git#egg=pyverge[cli]"

Development dependencies are managed as a dependency group; install them with uv sync --group dev (or hatch/your tool's equivalent).

Quick Start

from typing import Literal

import semver
from pydantic import BaseModel

from pyverge.migration import (
    MigrationSettings,
    ModelManager,
    PydanticModelAdapter,
)

# A manager binds a version strategy to an adapter and settings.
UserManager = ModelManager[semver.Version].scoped(
    PydanticModelAdapter(),
    settings=MigrationSettings(),
)


# Register versioned models. Version and kind are read from the class itself.
@UserManager.model()
class UserV1(BaseModel):
    kind: Literal["User"] = "User"
    version: Literal["1.0.0"] = "1.0.0"
    name: str
    email: str


@UserManager.model()
class UserV2(BaseModel):
    kind: Literal["User"] = "User"
    version: Literal["2.0.0"] = "2.0.0"
    name: str
    email: str
    age: int | None = None


# Register a migration between two versions.
@UserManager.migration("User", "1.0.0", "2.0.0")
def add_age(data: dict) -> dict:
    return {**data, "age": None}


manager = UserManager()

# Migrate data — converges every versioned entry to the configured target.
migrated = manager.migrate(
    {"kind": "User", "version": "1.0.0", "name": "Alice", "email": "a@b.com"}
)
# -> {"kind": "User", "version": "2.0.0", "name": "Alice", "email": "a@b.com", "age": None}

CLI

# Requires: pip install "pyverge[cli]"

pyverge init          # Bootstrap a new project
pyverge validate      # Validate data against a schema version
pyverge migrate       # Migrate data between versions
pyverge diff          # Show differences between versions
pyverge export        # Export JSON Schema definitions
pyverge info          # List registered models and versions
pyverge managers      # List available managers from configuration

Configuration lives in a pyverge.toml (or [tool.pyverge] in pyproject.toml), pointing at the module that defines your manager.

Features

  • Versioned model registry — decorator-based registration with semver or ISO date versioning
  • Provider adapters — pluggable ModelAdapter; Pydantic ships today, other providers (dataclasses, attrs, marshmallow, MessagePack) plug in the same way
  • Convergent migration engine — graph-driven, with automatic migration of nested versioned entries
  • Target policies — converge to latest, earliest, a pinned version, or per-kind overrides
  • Executors — sequential or level-parallel batch convergence
  • Model diffing — breaking-change detection with JSON Patch rendering
  • Migration hooks — observability via before/after/error callbacks, plus an OpenTelemetry hook

Documentation

Plan

Items intentionally out of scope for this documentation pass, tracked here for follow-up:

  • CLI/manager facade alignmentModelManager now exposes get, get_latest, and list_versions. The CLI still expects validate_data, diff, list_models, dump_schemas, and migrate(data, schema, from_version, to_version) before those commands work end-to-end.
  • Additional model providers — adapters for dataclasses, attrs, marshmallow, and MessagePack, mirroring PydanticModelAdapter behind the ModelAdapter seam.
  • Real-source integrationsshowcases/ projects wiring for document storage (converge on read), Kafka consumers, RabbitMQ/streams workers, and MQTT/IoT gateways on the high-level ModelManager API, with thin adapters around real drivers (motor, confluent-kafka, aio-pika, paho-mqtt). The transport glue is not shipped yet.
  • API reference — an auto-generated API reference page will be restored once the SDK surface is stable.

Download files

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

Source Distribution

pyverge-0.2.1.tar.gz (174.1 kB view details)

Uploaded Source

Built Distribution

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

pyverge-0.2.1-py3-none-any.whl (52.0 kB view details)

Uploaded Python 3

File details

Details for the file pyverge-0.2.1.tar.gz.

File metadata

  • Download URL: pyverge-0.2.1.tar.gz
  • Upload date:
  • Size: 174.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","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}

File hashes

Hashes for pyverge-0.2.1.tar.gz
Algorithm Hash digest
SHA256 cf2a6fe9cb3ea4116490a59786cdd7ef21acfccdf079fa333441f63a2dca82b0
MD5 677524d8f79352b86d19795c304cc333
BLAKE2b-256 65381946437f6eb64fcfe41e0630324ff091ca6b57be70739cb0d90f229285e8

See more details on using hashes here.

File details

Details for the file pyverge-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: pyverge-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 52.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","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}

File hashes

Hashes for pyverge-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 02b6d91b08f7abd7f6426a81a312dafab0ed9aa9938fe78340367dabee787814
MD5 5ba1fe289dbbad908f3a70e5db9b35e2
BLAKE2b-256 71c121ac1c293a97a931f4267d9de4fb72530d7f52a37d7d825cfd066dc512e2

See more details on using hashes here.

Release history Release notifications | RSS feed

0.5.0

2 files

0.4.0

2 files

0.3.0

2 files

This release

0.2.1 This release

2 files

0.2.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