aboutsummaryrefslogtreecommitdiffstats
path: root/onap_data_provider/config_loader.py
blob: 4507a14a9cb9824f07bcf840054ccd0fdbb0a5f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"""Data loader module."""
"""
   Copyright 2021 Deutsche Telekom AG

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
"""
from pathlib import Path
from typing import Any, Iterator, List
import yaml
from onap_data_provider.tag_handlers import join, generate_random_uuid, resource_property

# register custom tag handlers in yaml.SafeLoader
yaml.add_constructor("!join", join, yaml.SafeLoader)
yaml.add_constructor("!uuid4", generate_random_uuid, yaml.SafeLoader)
yaml.add_constructor("!onap_resource_property", resource_property, yaml.SafeLoader)


class ConfigLoader:
    """Configuration loader class.

    Loads data from file resource.
    """

    YAML_EXTENSIONS = {".yml", ".yaml"}

    def __init__(self, config_file_path: List[Path]) -> None:
        """Initialize configuration loader class.

        Args:
            config_file_path (str): Path to yaml data source file.

        """
        self.config_file_path: List[Path] = config_file_path

    def _yamls_from_dir(self, dir: Path) -> Iterator[Path]:
        for child in dir.iterdir():  # type: Path
            if child.suffix in self.YAML_EXTENSIONS:
                yield child

    @property
    def _yamls(self) -> Iterator[Path]:
        for config_file_path in self.config_file_path:  # type: Path
            if config_file_path.is_file():
                yield config_file_path
            elif config_file_path.is_dir():
                yield from self._yamls_from_dir(config_file_path)
            else:
                raise ValueError("Provided path is neither file nor directory")

    def load(self) -> Iterator[Any]:
        """Get data from the config file.

        Get data from the config file and return parsed to dictionary resource.

        Returns:
             Any: Data from yaml file.

        """
        for yaml_path in self._yamls:  # type: Path
            with yaml_path.open() as f:
                yield yaml.safe_load(f)