Skip to main content

Datamonger Python client

This package is the Python reference client for Datamonger's feature-frozen revision 1 contracts. Its public interfaces may change until specification revision 1 is independently certified.

Installation and status

The package requires Python 3.11 or newer and has not yet been published to PyPI. Install it from the repository root with:

python -m pip install ./packages/python

For development, enter the repository's devenv shell and use the locked environment documented in the contributor guide.

The package requires pandas, NumPy, SciPy, platformdirs, and portalocker. The project code is MIT-licensed; datasets retain their own licenses and terms. See the repository's trust model before relying on registry license, distribution, or preservation metadata.

Quick start

The client bundles the immutable proof-0001 registry snapshot and verifies it against a trusted digest shipped in the package. It is the default registry, so the index remains available without network access:

from datamonger import fetch_data

iris = fetch_data("iris", source="uci")
heart = fetch_data("heart_scale", source="libsvm")

Only the registry index is bundled; retrieving an uncached dataset artifact still requires network access. The active registry is selected, in descending precedence, by a registry= argument, a session setting, the nearest project selector, and finally BUNDLED_REGISTRY. Updates are always explicit—none of these scopes resolves a floating release name.

For a reproducible analysis, pass an explicit dataset version and use return_info=True. Retain the resolved dataset_id, registry_release, registry_index_sha256, artifact digests, verification level, canonical-form version, and canonical digest.

Registry selection

To discover a published selector by its bare release name, make an explicit catalog lookup:

from datamonger import fetch_data, resolve_registry

registry = resolve_registry("candidate-0002")
print(registry.index_sha256)
iris = fetch_data("iris", source="uci", registry=registry)

resolve_registry() reads the mutable catalog over HTTPS and returns a frozen Registry containing the resolved release, index digest, and index URL. The lookup is trusted only as strongly as that TLS session. Record and reuse the returned selector when reproducibility matters; looking up the same bare name again is not a cryptographic pin. The API accepts a custom HTTPS catalog_url for alternate registries. It does not support floating aliases such as latest.

Pass a Registry for one call when the selection belongs to one operation:

from datamonger import Registry, fetch_data

registry = Registry(
    release="2026.08",
    index_sha256="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
    index_url="https://registry.example/2026.08/index.json",
)
iris = fetch_data("iris", source="uci", registry=registry)

Use set_registry(registry) to keep that selector active for the Python session, and use set_registry(None) to clear it. active_registry() reports the selector that an unqualified call would use:

from datamonger import active_registry, set_registry

set_registry(registry)
assert active_registry() == registry
set_registry(None)

To pin a project, check the selector into .datamonger/selector.json at the project root:

{
  "schema_version": 1,
  "release": "2026.08",
  "index_sha256": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  "index_url": "https://registry.example/2026.08/index.json"
}

Datamonger searches from the current working directory toward the filesystem root and uses the nearest such file. A malformed project selector is an error; it never causes a fallback to another registry. The release and digest form the strong selector. The URL is only its retrieval location, and possession of a digest authenticates nothing beyond the channel from which the selector came.

Return types and decoded verification

The decoded return type is fixed by the representation:

Representation Artifact formats Python return type
delimited-text CSV or TSV pandas.DataFrame
libsvm LIBSVM or SVMLight SparseDataset
libsvm-split LIBSVM or SVMLight SparseDatasetSplit

Delimited frames use pandas' nullable Float64, Int64, string, and boolean dtypes, according to the declared logical column types. A frozen SparseDataset record contains a float64 SciPy CSR features matrix and an int64 or float64 NumPy response vector, according to label_type. A frozen SparseDatasetSplit has separate train and test fields containing those same records, so neither input is concatenated or discarded. The public DatasetData type alias is the union of these three return types.

return_info=True wraps the same decoded object in FetchResult.data; it does not change its representation. Pandas, NumPy, and SciPy are required dependencies, so return types never depend on which optional packages happen to be installed.

CSV, TSV, LIBSVM, and SVMLight artifacts support manifest-declared none, gzip, and bzip2 compression. The client verifies and caches the exact compressed artifact, then decompresses it for decoding; file names and URLs do not determine the compression method.

Use return_info=True to receive a FetchResult containing the resolved dataset identity, registry selector, artifact digests, and decoded-verification record. Decoded verification is enabled by default for every representation. It checks both the expected component shapes and the canonical SHA-256. For diagnostic or performance-sensitive work, verify_decoded=False explicitly skips those checks while retaining mandatory artifact size and SHA-256 verification; FetchInfo.verification then reports "artifact" rather than "decoded".

Metadata and artifact access

Inspect registry metadata without retrieving an artifact with data_info(), or enumerate every version in the active immutable release with list_data():

from datamonger import data_info, list_data

iris_info = data_info("iris", source="uci")
assert iris_info.dataset_id == "uci:iris@1"
for info in list_data():
    print(info.dataset_id, info.modality, info.representation["expect"])

Both operations use the same registry selection as fetch_data(), and data_info() uses its default-version resolution. A DataInfo includes the registry selector, provenance, licensing, artifacts and their distribution and preservation records, the full representation, expected_components, verification_records, related datasets, and task metadata. Pass offline=True to require a bundled or already cached registry index.

To retrieve verified artifact bytes without decoding them, use fetch_artifact():

from datamonger import fetch_artifact

iris_csv = fetch_artifact("iris", source="uci")

The function returns a pathlib.Path in the content-addressed cache. An artifact name may be omitted only when the resolved dataset version has one artifact; otherwise, pass it explicitly with artifact="train". Retrieval locations are tried in manifest order, and size and SHA-256 verification cannot be disabled. The cached bytes retain any artifact compression declared by the manifest—HTTP content coding is a separate transport detail.

Pass offline=True to fetch_data() or fetch_artifact() when network access must not be attempted. The selected registry does not change in offline mode. Remote registry indexes and artifacts must already be present and valid in the cache; the package's bundled registry index remains available, but its dataset artifacts are not bundled. Missing or corrupt cached content raises RegistryOfflineError for an index and OfflineError for an artifact.

Error taxonomy

Expected failures derive from DatamongerError and are exported by datamonger.errors. The shared semantic categories map to Python as follows:

Category Python type
unknown-dataset UnknownDatasetError
unsupported-registry UnsupportedRegistryError
unsupported-decoder UnsupportedDecoderError
artifact-unavailable ArtifactUnavailableError
artifact-offline OfflineError
retrieval-exhausted RetrievalLocationsError
artifact-integrity ArtifactIntegrityError
decoded-integrity DecodedIntegrityError
cache CacheError
decode DecodeError

All artifact selection and retrieval failures derive from RetrievalError. ArtifactSelectionError additionally distinguishes an omitted, ambiguous, or unknown artifact name. RegistryError is the base for RegistryIntegrityError, RegistryOfflineError, RegistryReleaseError, and RegistryRetrievalError; UnsupportedRegistryError is also a registry failure.

Cache management

Inspect the cache with cache_info():

from datamonger import cache_info

info = cache_info()
print(info.location, info.total_size)
for entry in info.entries:
    print(entry.kind, entry.sha256, entry.size, entry.datasets, entry.valid)

The inventory covers cached registry indexes and artifacts, hashes every entry, and associates artifact digests with canonical dataset versions found in the bundled and cached indexes. Use cache_clean(dataset="uci:iris@1") to remove the artifacts referenced by one version, or use older_than=timedelta(days=30) to remove old entries. The two filters intersect when combined. Calling cache_clean() without filters selects the entire cache. Its result lists both removed entries and entries skipped because another process is publishing or reading them. Cache eviction is always explicit; the client never evicts data automatically.

Every public operation that reads or changes the cache accepts cache_dir=. Pass the same private directory consistently to isolate an application or test. The platform-default location is reported by cache_info().location.

Cache coordination

The Python client coordinates each cached registry and artifact through an operating-system file lease at .leases/<namespace>/sha256/<digest>.lock. Publishers and readers take shared leases. A cleaner tries the exclusive side without waiting and skips the object when that attempt fails. A separate <digest>.publish.lock serializes the brief validation and commit phases while allowing downloads for the same digest to overlap.

Downloads remain in destination-directory .download-* files until they have been flushed, size-checked, and hash-checked. Publication uses an atomic rename, and a publisher rechecks the target under the publication lock so that it does not replace a complete object committed by another publisher. Readers retain their shared lease through registry parsing or dataset decoding.

Lease files deliberately remain on disk as rendezvous records. Their presence does not indicate ownership; the operating system's lock state does. Process termination releases that state, and a restarted host has no surviving lock owners, so a stale record is immediately reclaimable without a timeout that could misclassify a slow but live reader. The cache root is client-private and must reside on a filesystem that implements local advisory file locking and atomic replacement.

Public API summary

Name Purpose
fetch_data() Resolve, retrieve, verify, and decode one dataset.
fetch_artifact() Retrieve one verified artifact without decoding it.
data_info() Inspect metadata for one resolved dataset version.
list_data() List every version in the selected registry.
resolve_registry() Discover a strong selector through an HTTPS catalog.
active_registry() Report the selector an unqualified call will use.
set_registry() Set or clear the process-local session selector.
cache_info() Inspect cached indexes and artifacts without network access.
cache_clean() Explicitly evict matching inactive cache entries.

The package also exports these public values and immutable result types:

Name Contents
BUNDLED_REGISTRY The package's default strong selector.
Registry A selector's release, index digest, URL, and schema version.
FetchResult Decoded data and its FetchInfo.
FetchInfo Resolved identity, selector, artifact digests, and verification record.
DataInfo Provenance, license, artifacts, representation, expectations, relations, and tasks.
SparseDataset A CSR feature matrix and response vector.
SparseDatasetSplit Separate train and test SparseDataset records.
DatasetData The union of all decoded return types.
CacheEntry One inspected registry or artifact cache object.
CacheInfo Cache location, total size, and entries.
CacheCleanResult Removed and skipped entries, plus bytes_removed.

Expected public failures are exported from datamonger.errors; all derive from DatamongerError.

Metadata

Release files for datamonger 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for datamonger 0.1.0
File Size Uploaded
datamonger-0.1.0.tar.gz 151.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for datamonger 0.1.0
File Interpreter ABI Platform
datamonger-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 190.5 kB

Release files / datamonger-0.1.0.tar.gz

Download URL datamonger-0.1.0.tar.gz
Size 151.3 kB
Tags Source
SHA-256 checksum
How to use checksums
3257e6a5ec16e3367f5c3467814b6f065b47e82071b1e85655d57791f9ba07ab
BLAKE2b-256 checksum
How to use checksums
7b5a750681f6faaf1dff0ed27eadca64d9d4bb04e604efdf92374f51ba06aca4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 7, 2026.

Transparency log

Release files / datamonger-0.1.0-py3-none-any.whl

Download URL datamonger-0.1.0-py3-none-any.whl
Size 39.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
37e899f75c5c96cd31bda6df05d6b0cffe6aafcebe1c7c3665504a6c7c760dc6
BLAKE2b-256 checksum
How to use checksums
4278b9f968afec2162b0612942af919c3017b724c7c40470312aa2ac18c34329
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 7, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page