# -*- coding: utf-8 -*-"""This module provides DataCatalog, a container that manages multiple Datasetinstances rooted under a single directory, and the DatasetMeta / DatasetMetaStatusEnumhelpers used to describe each discovered dataset's health."""importenumfromdataclassesimportdataclassfrompathlibimportPathfrom.datasetimportDatasetfrom.settingimportSetting
[docs]classDatasetMetaStatusEnum(str,enum.Enum):"""Possible states for a dataset discovered inside a DataCatalog root."""setting_not_found="setting_not_found""""The dataset directory exists but contains no ``{name}-setting.json`` file."""setting_valid="setting_valid""""The setting file exists and was parsed successfully."""setting_invalid="setting_invalid""""The setting file exists but could not be parsed (malformed JSON / schema error)."""
[docs]@dataclassclassDatasetMeta:"""Lightweight descriptor returned by :meth:`DataCatalog.scan`."""name:strstatus:DatasetMetaStatusEnum@propertydefis_valid(self)->bool:"""``True`` only when the setting file is present and well-formed."""returnself.status==DatasetMetaStatusEnum.setting_valid
[docs]@dataclassclassDataCatalog:""" A directory-backed registry of named datasets. Expected layout:: dir_root/ {dataset_name_1}/ {dataset_name_1}-setting.json {dataset_name_1}-data.json {dataset_name_1}-index/ icons/ {dataset_name_2}/ ... Each immediate subdirectory of *dir_root* is treated as a potential dataset. A subdirectory is included in scan results only when a matching ``{name}-setting.json`` file is found inside it. """dir_root:Path
[docs]defget_dataset(self,name:str)->Dataset:"""Return a :class:`.Dataset` for the given *name* rooted at ``dir_root/{name}``."""returnDataset(name=name,dir_root=self.dir_root/name)
[docs]defscan(self)->list[DatasetMeta]:"""Scan *dir_root* one level deep and return a :class:`DatasetMeta` for each dataset. - Subdirectories with no matching setting file are silently skipped. - Subdirectories whose setting file cannot be parsed are included with status :attr:`~DatasetMetaStatusEnum.setting_invalid`. - Results are sorted by dataset name. """results=[]forsubdirinsorted(self.dir_root.iterdir()):ifnotsubdir.is_dir():continue# ignore plain files at the root levelname=subdir.namepath_setting=subdir/f"{name}-setting.json"ifnotpath_setting.exists():continue# not a dataset directory — skip silentlytry:Setting.from_json_file(path_setting)status=DatasetMetaStatusEnum.setting_validexceptException:status=DatasetMetaStatusEnum.setting_invalidresults.append(DatasetMeta(name=name,status=status))returnresults