manifest
manifest
Dataset manifests: declaration, discovery, and model-level fetching.
Datasets are declared in TOML manifests. fwl-io ships one manifest for
datasets shared by several models (spectral files, multi-consumer lookup
tables); each model package may ship its own manifest for data only it
consumes and expose it through the fwl_io.manifests entry-point group.
Adding data to a model therefore never requires an fwl-io release.
Manifest schema, one table per dataset, identified by its zenodo key::
manifest_schema = 1 # optional, see below
[interior.eos.wolf_bower_2018]
name = "Wolf & Bower (2018) MgSiO3 equation of state"
zenodo = "10.5281/zenodo.1234567" # version DOI, never a concept DOI
dataverse = "10.34894/ABCDEF" # optional download mirror
required_by = ["aragog", "zalmoxis", "spider"]
extract = "tar" # optional: unpack a single-archive deposit
files = ["eos.dat", "grid.dat"] # optional: use only these files of the record
The optional root manifest_schema names the schema the file was written
against. A manifest that declares one is held to it: only the schema the
installed fwl-io implements is accepted, a higher number meaning the reader is
too old and a lower one meaning the manifest was written for a schema that
stopped loading when the number rose. That is what sharpens the diagnosis
elsewhere, since an unknown field in such a manifest can only be a
misspelling.
The dotted table key is the dataset location below the data root: the table
above resolves into interior/eos/wolf_bower_2018. Key segments are
restricted to letters, digits, _ and -, each starting with a letter,
digit or _, so a key can neither escape the data root nor split into an
unintended path depth. A dataset resolves into <key-as-path>/r<record-id>,
the version directory named for its Zenodo record.
A deposit packaged as one archive declares extract = "tar" or "zip"; its
registry lists the archive, and the fetcher downloads and checksum-verifies it,
then extracts the members into the dataset directory (the archive is not kept).
A deposit that carries more than the dataset needs declares files, a list of
file names within the record. The registry, and with it fetch, check, relocate
and the Dataverse mirror, then covers only those files; without files the
whole record is the dataset. files and extract cannot be combined.
Every dataset requires a Zenodo version DOI: the committed registry is
generated from the Zenodo record, so Dataverse is a download mirror, not an
alternative primary source. Version DOIs are pinned deliberately: a Zenodo
concept DOI resolves to the newest deposit and would let data drift
underneath pinned code, so fwl-io sync rejects concept DOIs.
Every dataset has a committed registry file next to the manifest, named
<dotted-key>.registry.txt, generated by fwl-io sync. Packages that
ship their own manifest must ship the registry files with it (include both
in package-data).
Dataset(*, key, name, zenodo=None, dataverse=None, required_by=tuple(), registry_path=None, extract=None, files=None)
dataclass
A single downloadable dataset declared in a manifest.
subdir
property
Dataset location below the data root, derived from the dotted key.
registry()
Return the committed name-to-hash registry for this dataset.
A dataset that declares files must have a registry naming exactly
those files, so a registry left over from before the list changed is
refused rather than fetched in part or in excess.
Source code in src/fwl_io/manifest.py
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 | |
ErrorKind
ManifestSchemaError
Bases: ValueError
A manifest and the installed fwl-io disagree about the manifest schema.
Raised when a manifest declares something this fwl-io does not understand, something it no longer understands, or a field it reads only inside a dataset table. Subclasses ValueError, so callers that already handle a malformed manifest keep working.
ProviderError(kind, message, models=frozenset())
dataclass
A provider left out of discovery: the reason, the message, and for a conflict the lower-cased models its datasets serve.
verdict
property
The label a report prints for this provider: NOT USED or FAILED TO LOAD.
discover_manifests()
Collect datasets from every installed fwl_io.manifests entry point.
Entry points must resolve to a zero-argument callable returning the
manifest path. A provider whose manifest fails to load, or that conflicts
with another provider, is skipped and reported by fwl-io list and
check_for, so one broken package cannot break data access for every
other model.
Source code in src/fwl_io/manifest.py
635 636 637 638 639 640 641 642 643 644 | |
fetch_for(model, data_root=None, progress=False)
Fetch every dataset a given model requires; return paths per dataset.
All matching datasets are attempted; failures are collected and raised together at the end so one broken dataset does not block the others (files fetched before the error remain in place).
An unreadable manifest counts as a failure here, even when other datasets arrived: a manifest that cannot be parsed may be the one declaring this model, and a model is routinely served by both its own manifest and the shared one. Listing is more forgiving, since it reports per provider and a reader can see which one is missing.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
model
|
str
|
Model name matched (case-insensitively) against |
required |
data_root
|
str | Path | None
|
Override for the data root; defaults to the resolved FWL_DATA tree. |
None
|
progress
|
bool
|
Show a per-file download progress bar. When tqdm is not installed, or
there is no |
False
|
Source code in src/fwl_io/manifest.py
712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 | |
fetcher_for_key(key, data_root=None, progress=False)
Return the fetcher of the dataset key declared in an installed manifest.
It is the fetcher :func:fetch_for uses, with the same mirrors and checks, so a code
that cannot import fwl-io can fetch or locate one dataset through the CLI.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Dotted manifest key of the dataset, e.g. |
required |
data_root
|
str | Path | None
|
Override for the data root; defaults to the resolved FWL_DATA tree. |
None
|
progress
|
bool
|
Show a per-file download progress bar when one can be drawn. |
False
|
Returns:
| Type | Description |
|---|---|
Fetcher
|
Fetcher bound to the dataset's version directory. |
Raises:
| Type | Description |
|---|---|
LookupError
|
No usable installed manifest declares |
Source code in src/fwl_io/manifest.py
677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 | |
load_manifest(path)
Load and validate all datasets declared in one manifest file.
Source code in src/fwl_io/manifest.py
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 | |
shared_manifest_path()
Entry-point target: the manifest of datasets shared across models.
Source code in src/fwl_io/manifest.py
465 466 467 | |
zenodo_record_id(doi)
Return the numeric record id of a Zenodo version DOI.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
doi
|
str
|
A Zenodo DOI of the form |
required |
Returns:
| Type | Description |
|---|---|
str
|
The trailing record-id digits. |
Raises:
| Type | Description |
|---|---|
ValueError
|
When the string is not a Zenodo DOI. |
Source code in src/fwl_io/doi.py
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | |