Optional Extensions¶
canvodpy ships as a lean core. Packages that only a subset of users need (because their receivers use non-standard filenames, or because they run a specific orchestrator) live in a separate repository so the core install stays small and dependency-free by default:
github.com/TUW-GEO/canvodpy-extensions
canvodpy works fully without any of these. canvod-filemap is used only
for receivers whose settings name a naming recipe (recipe:);
canvod-airflow and canvod-adapters call canvodpy, not the other way
around.
Available extensions¶
| Package | Purpose | Status |
|---|---|---|
canvod-filemap |
Recipe-based filename mapping for non-canonical GNSS filenames (proprietary receiver output, legacy RINEX v2 short names, custom layouts) | Available |
canvod-airflow |
Airflow DAGs: one daily DAG per configured site, plus backfill; the tasks run the code of canvodpy run (canvodpy.workflows.tasks.check_day, process_day) |
Available |
canvod-adapters |
Data exchange between canvodpy and other GNSS-T programs (gnssvod): observations and VOD, checked against canvodpy's dataset contracts | Available |
Installing an extension¶
Each extension is a package on PyPI, released on its own under the tag
<package>-v<version> (for example canvod-filemap-v1.0.0). None has
extras: each package brings what it needs.
uv add canvod-filemap
uv add canvod-airflow
uv add canvod-adapters
In a clone of this repository, canvod-filemap is the dependency group
filemap:
uv sync --group filemap
The group exists only in this repository: it is not part of the canvodpy
package on PyPI, so canvodpy[filemap] does not exist. Its version range
is in the root pyproject.toml:
[dependency-groups]
filemap = ["canvod-filemap>=1.0.0"]
If you have both repositories cloned as sibling directories locally (common
for contributors iterating on canvod-filemap itself), you can point the
group at your checkout in your own uncommitted copy to pick up changes
without releasing:
# pyproject.toml (local override, do not commit)
[tool.uv.sources]
canvod-filemap = { path = "../canvodpy-extensions/packages/canvod-filemap" }
Don't commit a local path source
A path-based source only works on machines that happen to have
canvodpy-extensions cloned as a sibling directory. uv resolves
every dependency group's sources when it locks, even groups that are
not installed, so committing a local path breaks uv sync for
everyone else.
See canvod-filemap's overview
for the recipe format and mapping API,
canvod-airflow's overview
for DAG structure, deployment, and configuration (canvod-airflow depends
on canvodpy, not the other way around), and
canvod-adapters' overview
for the gnssvod conversion, including how merged VOD bands are imported.
What happens if an extension isn't installed¶
canvodpy imports canvod-filemap only for a receiver whose settings set
recipe:. Without a recipe, discovery takes files with canonical canVOD
names only, whether or not the package is installed. A receiver with a
recipe but without canvod-filemap installed stops the run with an error
that says how to install it; it never falls back to guessing file names.
See Configuration \(\rightarrow\) Optional: non-canonical
filenames.