Source code for bdf._registry
from __future__ import annotations
import json
import os
from collections.abc import Iterable
from pathlib import Path
from typing import Any
# -------------------------------
# Registry loading (accepts either {"datasets":[...]} or {"entries":[...]})
# -------------------------------
def _find_repo_root(markers=("pyproject.toml", ".git"), max_up: int = 8) -> Path:
p = Path.cwd().resolve()
for _ in range(max_up):
if any((p / m).exists() for m in markers):
return p
p = p.parent
return Path.cwd().resolve()
[docs]
def load_registry(path: str | Path | None = None) -> dict[str, Any]:
"""
Load datasets registry.
Accepted shapes:
{ "schema_version": "0.2", "datasets": [ { ... } ] }
{ "schema_version": "0.3", "entries": [ { ... } ] }
Default lookup order:
1) explicit 'path'
2) env BDF_DATASETS
3) <repo-root>/data/datasets.json
"""
if path:
p = Path(path)
with open(p, encoding="utf-8") as f:
return json.load(f)
env = os.getenv("BDF_DATASETS")
if env:
p = Path(env)
if p.exists():
with open(p, encoding="utf-8") as f:
return json.load(f)
root = _find_repo_root()
default_path = root / "data" / "datasets.json"
if default_path.exists():
with open(default_path, encoding="utf-8") as f:
return json.load(f)
raise FileNotFoundError("datasets.json not found. Provide path or set BDF_DATASETS.")
# -------------------------------
# Helpers
# -------------------------------
def _iter_dataset_dicts(reg: dict[str, Any]) -> Iterable[dict[str, Any]]:
if isinstance(reg, dict):
if isinstance(reg.get("datasets"), list):
yield from (d for d in reg["datasets"] if isinstance(d, dict))
return
if isinstance(reg.get("entries"), list):
yield from (d for d in reg["entries"] if isinstance(d, dict))
return
if isinstance(reg, list):
for d in reg:
if isinstance(d, dict):
yield d
def list_datasets(path: str | Path | None = None) -> list[str]:
"""Return list of dataset IDs from the registry."""
reg = load_registry(path)
out: list[str] = []
for d in _iter_dataset_dicts(reg):
if "id" in d and d["id"] is not None:
out.append(str(d["id"]))
return out
[docs]
def get_entry(registry: dict[str, Any], entry_id: str) -> dict[str, Any]:
"""Return the entry dict with matching id (case-insensitive)."""
key = (entry_id or "").lower()
for d in _iter_dataset_dicts(registry):
if str(d.get("id", "")).lower() == key:
return d
raise KeyError(f"Dataset id not found: {entry_id}")
__all__ = ["load_registry", "list_datasets", "get_entry"]