Source code for zarr_vectors.core.backends.base

"""StorageBackend protocol.

A :class:`StorageBackend` is a scheme-agnostic key/value store rooted at a
single URL.  All keys are forward-slash-separated relative paths under that
root.  Backends know nothing about ZV conventions (``.zattrs``, chunk-key
naming, group hierarchy) — those live in :class:`zarr_vectors.core.group.Group`.

This split lets new backends ship as ~50 lines of byte plumbing without
re-implementing format conventions.
"""

from __future__ import annotations

from typing import Iterator, Protocol, runtime_checkable


[docs] @runtime_checkable class StorageBackend(Protocol): """Byte-level key/value backend rooted at a single URL. Implementations must provide the methods below. All ``key`` arguments are forward-slash-separated relative paths under the store root. Empty string refers to the root itself. """ @property def url(self) -> str: """Canonical URL of the store root (e.g. ``"file:///C:/x/y"``).""" ...
[docs] def put_bytes(self, key: str, data: bytes) -> None: """Write raw bytes to ``key``, overwriting any existing value.""" ...
[docs] def get_bytes(self, key: str) -> bytes: """Read raw bytes from ``key``. Raises: KeyError: If ``key`` does not exist. """ ...
[docs] def exists(self, key: str) -> bool: """Return True if ``key`` exists.""" ...
[docs] def delete(self, key: str) -> None: """Delete a single key. Silent if absent.""" ...
[docs] def delete_prefix(self, prefix: str) -> None: """Delete every key whose path starts with ``prefix``. Used to implement ``rmtree``-style subtree removal. """ ...
[docs] def list_prefix( self, prefix: str, *, recursive: bool = False ) -> Iterator[str]: """Yield keys under ``prefix``. - ``recursive=True``: yields every descendant *file* key. Keys are full paths relative to the store root. No trailing ``/``. - ``recursive=False``: yields immediate children — files and containers. Container entries are flagged with a trailing ``/`` so callers can tell them apart from files. Yields nothing if ``prefix`` does not exist. """ ...
[docs] def ensure_prefix(self, prefix: str) -> None: """Best-effort create a container at ``prefix``. On filesystem backends this calls ``mkdir(parents=True, exist_ok=True)``. On flat object stores this is a no-op — the prefix exists implicitly once any key under it is written. """ ...
[docs] def close(self) -> None: """Release any connections / file handles.""" ...