Skip to content

Build System

canVODpy uses uv_build as its build backend — a modern, fast backend from the Astral ecosystem with native namespace package support.


Distribution Formats

Pre-built, installed by copying to site-packages. No build step at install time.

canvod_readers-0.1.0-py3-none-any.whl
└── canvod/
    └── readers/          ← namespace package (no canvod/__init__.py)
        ├── __init__.py
        └── base.py

Filename anatomy: {name}-{version}-{python}-{abi}-{platform}.whl. The py3-none-any suffix means: any Python 3, no native extensions, any platform.

canvod_readers-0.1.0.tar.gz — contains source code + metadata. Requires a build step during installation. Provided alongside wheels for PyPI.


Build Configuration

# packages/canvod-readers/pyproject.toml
[build-system]
requires      = ["uv_build>=0.9.17,<0.10.0"]
build-backend = "uv_build"

[tool.uv.build-backend]
module-name = "canvod.readers"       # dot → namespace package
include     = ["src/canvod/readers/data/*.dat"]
exclude     = ["src/canvod/readers/tests/"]

canvod-utils exception

canvod-utils uses hatchling as its build backend — the only package in the monorepo that does not use uv_build.


Building

# Single package
cd packages/canvod-readers
uv build
# → dist/canvod_readers-0.1.0.tar.gz
# → dist/canvod_readers-0.1.0-py3-none-any.whl

# All packages at once
just dist

Package Metadata

[project]
name            = "canvod-readers"
version         = "0.1.0"
description     = "GNSS data format readers for canVODpy"
readme          = "README.md"
license         = {text = "Apache-2.0"}
authors         = [{name = "Nicolas Bader", email = "nicolas.bader@geo.tuwien.ac.at"}]
requires-python = ">=3.14"
keywords        = ["gnss", "rinex", "geodesy", "vod"]

classifiers = [
    "Development Status :: 3 - Alpha",
    "Intended Audience :: Science/Research",
    "License :: OSI Approved :: Apache Software License",
    "Programming Language :: Python :: 3.14",
    "Topic :: Scientific/Engineering :: GIS",
]

dependencies = ["numpy>=2.0", "xarray>=2024.0"]

[project.urls]
Homepage   = "https://github.com/nfb2021/canvodpy"
Repository = "https://github.com/nfb2021/canvodpy"
Issues     = "https://github.com/nfb2021/canvodpy/issues"

Publishing

cd packages/canvod-readers
uv build
uv publish --repository testpypi

# Verify installation
pip install --index-url https://test.pypi.org/simple/ canvod-readers
uv build
uv publish

The just release command handles version bump + publish for all packages. See docs/RELEASING.md for the full release workflow.


Version Management

All packages follow Semantic Versioning with unified version numbers across the monorepo.

just bump patch    # 0.1.0 → 0.1.1  (bug fix)
just bump minor    # 0.1.0 → 0.2.0  (new feature, backwards compatible)
just bump major    # 0.1.0 → 1.0.0  (breaking change)

A version bump:

  1. Updates version in all pyproject.toml files.
  2. Creates a git commit chore: bump version to x.y.z.
  3. Creates a git tag vx.y.z.

Troubleshooting

ModuleNotFoundError after install

Verify module-name in pyproject.toml uses dotted notation:

module-name = "canvod.readers"    # correct
# module-name = "canvod_readers"  # wrong — creates regular package

Wrong package structure in wheel

Run unzip -l dist/*.whl to inspect contents. The wheel must contain canvod/readers/ but not canvod/__init__.py.

Build failures

uv build --verbose    # detailed diagnostics