Build from source

Prerequisites

  • Rust 1.70+ – install via rustup

  • Python 3.10+ – with a virtual environment active

  • maturin – the Rust/Python build tool

Install maturin:

uv tool install maturin

Or with pip:

pip install maturin

Clone the repository

git clone https://github.com/bluedynamics/zodb-json-codec.git
cd zodb-json-codec

Debug build

For development iteration (faster compile, slower runtime):

maturin develop

This compiles the Rust code and installs the resulting Python extension into the active virtual environment.

Release build

For accurate performance testing:

maturin develop --release

The release profile uses thin LTO and single codegen unit for best runtime performance (configured in Cargo.toml).

Run the test suites

Rust tests

cargo test

This runs the 75 Rust unit tests covering pickle decode/encode, JSON conversion, known type handlers, and BTree flattening.

Python tests

Install the test dependencies first:

pip install ".[test]"

Then run the test suite:

pytest tests/ -v

This runs the 149 Python integration tests covering the full roundtrip through the PyO3 boundary, ZODB record handling, and edge cases.

Project structure

The codebase is organized as:

src/
  lib.rs          # PyO3 module definition and Python-facing functions
  decode.rs       # Pickle byte stream -> PickleValue AST
  encode.rs       # PickleValue AST -> pickle bytes
  json.rs         # PickleValue <-> serde_json::Value (JSON string path)
  pyconv.rs       # PickleValue <-> Py<PyAny> (Python dict path)
  known_types.rs  # Compact markers for datetime, Decimal, UUID, set, etc.
  btrees.rs       # BTree family detection and flattening
  zodb.rs         # ZODB two-pickle record handling
  types.rs        # PickleValue AST definition
  opcodes.rs      # Pickle protocol opcode constants
  json_writer.rs  # Streaming JSON writer (no serde_json allocation)
  error.rs        # Error types
python/
  zodb_json_codec/__init__.py   # Python package re-exports

For detailed architecture information, see the reference documentation.

Rebuild after changes

After modifying Rust code, re-run maturin develop (or maturin develop --release) to recompile and reinstall. Python-only changes in the python/ directory do not require a rebuild.