Source code for colour_datasets.loaders.abstract

"""
Abstract Dataset Loader
=======================

Defines the abstract class implementing support for dataset loading:

-   :class:`colour_datasets.loaders.AbstractDatasetLoader`
"""

from __future__ import annotations

from abc import ABC, abstractmethod

from colour.hints import Any

from colour_datasets.records import Record

__author__ = "Colour Developers"
__copyright__ = "Copyright 2019 Colour Developers"
__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
__maintainer__ = "Colour Developers"
__email__ = "colour-developers@colour-science.org"
__status__ = "Production"

__all__ = [
    "AbstractDatasetLoader",
]


[docs] class AbstractDatasetLoader(ABC): """ Define the base class for a dataset loader. This is an :class:`ABCMeta` abstract class that must be inherited by sub-classes. The sub-classes are expected to implement the :meth:`colour_datasets.loaders.AbstractDatasetLoader.load` method that handles the syncing, parsing, conversion and return of the dataset content as a *Python* object. Attributes ---------- - :attr:`colour_datasets.loaders.AbstractDatasetLoader.ID` - :attr:`colour_datasets.loaders.AbstractDatasetLoader.record` - :attr:`colour_datasets.loaders.AbstractDatasetLoader.id` - :attr:`colour_datasets.loaders.AbstractDatasetLoader.content` Methods ------- - :meth:`colour_datasets.loaders.AbstractDatasetLoader.__init__` - :meth:`colour_datasets.loaders.AbstractDatasetLoader.load` - :meth:`colour_datasets.loaders.AbstractDatasetLoader.sync` Parameters ---------- record Dataset record. """ ID: str = "Undefined" """Dataset record id, i.e. the *Zenodo* record number.""" def __init__(self, record: Record) -> None: self._record: Record = record self._content: Any | None = None @property def record(self) -> Record: """ Getter property for the dataset record. Returns ------- :class:`colour_datasets.Record` Dataset record. """ return self._record @property def id(self) -> str: """ Getter property for the dataset id. Returns ------- :class:`str` Dataset id. """ return self.__class__.ID @property def content(self) -> Any: """ Getter property for the dataset content. Returns ------- :class:`object` Dataset content. """ return self._content
[docs] @abstractmethod def load(self) -> Any: """ Sync, parse, convert and return the dataset content as a *Python* object. Returns ------- :class:`object` Dataset content as a *Python* object. Notes ----- - Sub-classes are required to call :meth:`colour_datasets.loaders.AbstractDatasetLoader.sync` method when they implement it, e.g. ``super().sync()``. """
[docs] def sync(self): """ Sync the dataset content, i.e. checks whether it is synced and pulls it if required. """ if not self.record.synced(): self.record.pull()