Extensions¶
The remote_store.ext package provides higher-level operations built
on top of the core Store API.
Available Extensions¶
| Module | Extra | Description | Guide | Example |
|---|---|---|---|---|
ext.batch |
(none) | Bulk delete, copy, and exists operations | Guide | Example |
ext.cache |
(none) | Store-level caching with TTL and auto-invalidation | Guide | Example |
ext.glob |
(none) | Portable glob pattern matching for file listing | Guide | Example |
ext.integrity |
(none) | Checksum computation and verification helpers | — | — |
ext.observe |
(none) | Callback-based observability hooks for Store operations | Guide | Example |
ext.partition |
(none) | Hive-style partition path helpers | — | — |
ext.streams |
(none) | Composable BinaryIO wrappers for progress and checksums | — | — |
ext.transfer |
(none) | Upload, download, and cross-store transfer | Guide | Example |
ext.write |
(none) | Write helpers with guaranteed client-side content hashing | Guide | — |
aio.ext.write |
(none) | Async write helpers with guaranteed client-side content hashing | Guide | — |
ext.arrow |
arrow |
PyArrow FileSystem adapter | Guide | Example |
ext.parquet |
arrow |
Managed Parquet datasets with manifests and completion markers | Guide | Example |
ext.otel |
otel |
OpenTelemetry tracing and metrics bridge | Guide | Example |
ext.pydantic |
pydantic |
Pydantic BaseModel/BaseSettings adapter | — | Example |
ext.yaml |
yaml |
YAML config file loader | — | Example |
ext.dagster |
dagster |
Dagster IO Manager adapter | Guide | Example |
Using Extensions¶
Always-available extensions (pure Python)¶
Extensions with no extra dependencies (marked *(none)* in the table above)
are re-exported from the top-level package for convenience:
from remote_store import batch_delete, glob_files, observe, upload, download
from remote_store import cache # ext.cache
from remote_store import checksum, verify # ext.integrity
from remote_store import partition_path, parse_partition # ext.partition
from remote_store import ProgressReader, ChecksumReader # ext.streams
from remote_store import write_with_hash, open_atomic_with_hash, HashingAtomicWriter # ext.write
Or import from the extension module directly:
from remote_store.ext.batch import batch_delete
from remote_store.ext.cache import cache
from remote_store.ext.glob import glob_files
from remote_store.ext.integrity import checksum, verify
from remote_store.ext.observe import observe
from remote_store.ext.partition import partition_path, parse_partition
from remote_store.ext.streams import ProgressReader, ChecksumReader
from remote_store.ext.transfer import upload
from remote_store.ext.write import write_with_hash, open_atomic_with_hash, HashingAtomicWriter
aio.ext.write has no extra dependency but is not re-exported from remote_store — import it from its module directly:
Seekable reads are built into the core API via Store.read_seekable() —
no extension import needed.
Optional-dependency extensions¶
ext.arrow and ext.parquet require PyArrow, ext.otel requires the
OpenTelemetry API, ext.pydantic requires Pydantic v2, and ext.dagster
requires Dagster. Install the relevant extra first:
pip install "remote-store[arrow]" # PyArrow filesystem adapter + parquet datasets
pip install "remote-store[otel]" # OpenTelemetry tracing and metrics
pip install "remote-store[pydantic]" # Pydantic BaseSettings adapter
pip install "remote-store[yaml]" # YAML config file loader
pip install "remote-store[dagster]" # Dagster IO Manager adapter
Then import from the extension module directly:
from remote_store.ext.arrow import pyarrow_fs
from remote_store.ext.parquet import ParquetDatasetStore
from remote_store.ext.otel import otel_hooks
from remote_store.ext.pydantic import from_pydantic
from remote_store.ext.yaml import from_yaml
from remote_store.ext.dagster import dagster_io_manager
If the required dependency is not installed, importing the extension
module raises a ModuleNotFoundError with installation instructions.
Extension Guarantees¶
All extensions follow the same contract — see the extension architecture and optional-extension export rules ADRs for the rationale:
- Public API only — extensions use only the public Store / Backend API. They never access private internals.
- No lifecycle ownership — extensions never close the Store. The caller owns the Store's lifecycle.
- CapabilityNotSupported propagates — if a backend lacks a required capability, the error reaches the caller immediately.
Writing Your Own Extension¶
See the "Adding an Extension" checklist in CONTRIBUTING.md.
See also¶
- API reference — core Store interface that extensions build on
- Architecture — extension design principles