source: rtems-central/rtemsqual/util.py @ 4733ad3

Last change on this file since 4733ad3 was 4733ad3, checked in by Sebastian Huber <sebastian.huber@…>, on 04/17/20 at 12:12:42

util: New module

Add recursive include for configuration file.

  • Property mode set to 100644
File size: 2.4 KB
Line 
1# SPDX-License-Identifier: BSD-2-Clause
2""" This module provides utility functions. """
3
4# Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25# POSSIBILITY OF SUCH DAMAGE.
26
27import os
28from typing import Any
29import yaml
30
31
32def load_config(config_filename: str) -> Any:
33    """ Loads the configuration file with recursive includes. """
34    class IncludeLoader(yaml.SafeLoader):  # pylint: disable=too-many-ancestors
35        """ YAML loader customization to process custom include tags. """
36        _filenames = [config_filename]
37
38        def include(self, node):
39            """ Processes the custom include tag. """
40            container = IncludeLoader._filenames[0]
41            dirname = os.path.dirname(container)
42            filename = os.path.join(dirname, self.construct_scalar(node))
43            IncludeLoader._filenames.insert(0, filename)
44            with open(filename, "r") as included_file:
45                data = yaml.load(included_file, IncludeLoader)
46            IncludeLoader._filenames.pop()
47            return data
48
49    IncludeLoader.add_constructor("!include", IncludeLoader.include)
50    with open(config_filename, "r") as config_file:
51        return yaml.load(config_file.read(), Loader=IncludeLoader)
Note: See TracBrowser for help on using the repository browser.