Source code for colour_datasets.records.configuration

"""
Configuration
=============

Defines various objects related to the configuration of *Colour - Datasets*.
"""

from __future__ import annotations

import functools
import os

from colour.hints import Any, Callable, Dict
from colour.utilities import Structure
from colour.utilities.documentation import (
    DocstringDict,
    is_documentation_building,
)

__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__ = [
    "DEFAULT_CONFIGURATION",
    "Configuration",
    "use_sandbox",
    "sandbox",
]

DEFAULT_CONFIGURATION: Dict = {
    "repository": os.environ.get(
        "COLOUR_SCIENCE__COLOUR_DATASETS__REPOSITORY",
        os.path.join(
            os.path.expanduser("~"),
            ".colour-science",
            "colour-datasets",
        ),
    ),
    "downloads_directory": "downloads",
    "deflate_directory": "dataset",
    "api_url": "https://zenodo.org/api",
    "community": "colour-science-datasets",
    "urls_txt_file": "urls.txt",
}
if is_documentation_building():  # pragma: no cover
    DEFAULT_CONFIGURATION = DocstringDict(DEFAULT_CONFIGURATION)
    DEFAULT_CONFIGURATION.__doc__ = """
*Colour - Datasets* default configuration.
"""


[docs] class Configuration(Structure): """ *Colour - Datasets* configuration factory based on :class:`colour.utilities.Structure` class and allowing to access key values using dot syntax. Parameters ---------- configuration Configuration to use instead of the default one. """ def __init__(self, configuration: Dict | None = None) -> None: super().__init__( DEFAULT_CONFIGURATION if configuration is None else configuration )
[docs] def use_sandbox( state: bool = True, api_url: str = "https://sandbox.zenodo.org/api", community: str = "colour-science-datasets", ): """ Modify the *Colour - Datasets* configuration to use *Zenodo* sandbox. Parameters ---------- state Whether to use *Zenodo* sandbox. api_url *Zenodo* sandbox url. community *Zenodo* community. """ global DEFAULT_CONFIGURATION # noqa: PLW0602 if state: DEFAULT_CONFIGURATION["api_url"] = api_url DEFAULT_CONFIGURATION["community"] = community else: DEFAULT_CONFIGURATION["api_url"] = "https://zenodo.org/api" DEFAULT_CONFIGURATION["community"] = "colour-science-datasets"
[docs] class sandbox: """ A context manager and decorator temporarily setting the configuration to the *Zenodo* sandbox. Parameters ---------- api_url *Zenodo* sandbox url. community *Zenodo* community. """
[docs] def __init__( self, api_url: str = "https://sandbox.zenodo.org/api", community: str = "colour-science-datasets", ) -> None: self._api_url = api_url self._community = community
def __enter__(self) -> sandbox: """ Set the configuration to the *Zenodo* sandbox upon entering the context manager. """ use_sandbox(True, self._api_url, self._community) return self def __exit__(self, *args: Any): """Restore the configuration upon exiting the context manager.""" use_sandbox(False) def __call__(self, function: Callable) -> Callable: """Call the wrapped definition.""" @functools.wraps(function) def wrapper(*args: Any, **kwargs: Any) -> Callable: with self: return function(*args, **kwargs) return wrapper