Source code for colour_hdri.utilities.common

"""
Common Utilities
================

Defines the common utilities objects that don't fall in any specific category.
"""

from __future__ import annotations

import os
import re
from collections import defaultdict

from colour.hints import Dict, List, Sequence

__author__ = "Colour Developers"
__copyright__ = "Copyright 2015 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__ = [
    "vivification",
    "vivified_to_dict",
    "path_exists",
    "filter_files",
]


[docs] def vivification() -> defaultdict: """ Implement supports for vivification of the underlying dict like data-structure, magical! Returns ------- :class:`defaultdict` Examples -------- >>> vivified = vivification() >>> vivified["my"]["attribute"] = 1 >>> vivified["my"] # doctest: +SKIP defaultdict(<function vivification at 0x...>, {u'attribute': 1}) >>> vivified["my"]["attribute"] 1 """ return defaultdict(vivification)
[docs] def vivified_to_dict(vivified: Dict | defaultdict) -> Dict: """ Convert given vivified data-structure to dictionary. Parameters ---------- vivified Vivified data-structure. Returns ------- :class:`dict` Examples -------- >>> vivified = vivification() >>> vivified["my"]["attribute"] = 1 >>> vivified_to_dict(vivified) # doctest: +SKIP {u'my': {u'attribute': 1}} """ if isinstance(vivified, defaultdict): vivified = {key: vivified_to_dict(value) for key, value in vivified.items()} return vivified
[docs] def path_exists(path: str | None) -> bool: """ Return whether given path exists. Parameters ---------- path Path to check the existence. Returns ------- :class:`bool` Whether given path exists. Examples -------- >>> path_exists(__file__) True >>> path_exists("") False """ if path is None: return False else: return os.path.exists(path)
[docs] def filter_files(directory: str, extensions: Sequence[str]) -> List[str]: """ Filter given directory for files matching given extensions. Parameters ---------- directory Directory to filter. extensions Extensions to filter on. Returns ------- :class:`list` Filtered files. """ return [ os.path.join(directory, path) for path in filter( lambda x: re.search(f"{'|'.join(extensions)}$", x), sorted(os.listdir(directory)), ) ]