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.13.0,<0.14.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/"]

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         = "Apache-2.0"
license-files   = ["LICENSE", "NOTICE"]
authors         = [{name = "Nicolas Bader", email = "support@canvodpy.eu"}]
requires-python = ">=3.14"
keywords        = ["gnss", "rinex", "geodesy", "vod"]

classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Intended Audience :: Science/Research",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3.14",
    "Topic :: Scientific/Engineering",
]

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

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

Publishing

uv build
uv publish

just release prepares the release commit for the packages the maintainer chose; a maintainer tags the merged commit and starts the PyPI publish of the packages tagged there. See Release process for the full release workflow.


Version management

Each package has its own version, following Semantic Versioning; canvodpy pins every package exactly (Versioning). The maintainer chooses the versions:

just release-status                               # commits per package since its last tag
just release canvod-store=1.1.0 canvodpy=1.1.0    # versions, pins, changelogs, uv.lock

just release updates version of each released package, canvodpy's pins, the CHANGELOG.md files and uv.lock, and commits them on a release branch; it makes no tag (just tag-release on the merged commit).


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