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