Source code for zephon.build_index

# Copyright 2025 DatologyAI
# SPDX-License-Identifier: Apache-2.0

"""Build an ``index.json`` for a dataset directory (fast shard discovery).

CLI: ``python -m zephon.build_index <format> <dataset_dir>``.
"""

from __future__ import annotations

import importlib
import sys
from pathlib import Path

from zephon._internal.io.index.index_builder import create_index as _create_index

# A format's index module registers its builder on import but pulls an optional
# dep (pyarrow / vortex), so import it on demand to keep this module dep-free.
_FORMAT_INDEX_MODULES = {
    "jsonl": "zephon._internal.io.index.jsonl_index",
    "parquet": "zephon._internal.io.index.parquet_index",
    "vortex": "zephon._internal.io.index.vortex_index",
}


[docs] def build_index( format_name: str, dataset_dir: str | Path, *, output_path: str | Path | None = None, progress: bool = True, max_workers: int = 8, ) -> str: """Build an ``index.json`` for a JSONL, Parquet, or Vortex dataset. Writes to ``dataset_dir/index.json`` unless *output_path* is given, printing progress when *progress* is true. Local paths and remote roots supported by Zephon's storage backend are accepted. Returns the output path or URL as a string. At most ``max_workers`` shards are inspected concurrently; set it to 1 for sequential indexing. """ module = _FORMAT_INDEX_MODULES.get(format_name) if module is not None: importlib.import_module(module) return _create_index( format_name, dataset_dir, output_path=output_path, progress=progress, max_workers=max_workers, )
def _cli() -> None: if len(sys.argv) != 3: formats = ", ".join(sorted(_FORMAT_INDEX_MODULES)) print("Usage: python -m zephon.build_index <format> <dataset_dir>") print() print("Creates index.json for fast dataset discovery.") print(f"Indexable formats: {formats}") sys.exit(1) try: build_index(sys.argv[1], sys.argv[2]) except Exception as exc: print(f"Error: {exc}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": _cli() __all__ = ["build_index"]