Source code for wasp_general.config

# -*- coding: utf-8 -*-
# wasp_general/config.py
#
# Copyright (C) 2016 the wasp-general authors and contributors
# <see AUTHORS file>
#
# This file is part of wasp-general.
#
# Wasp-general is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Wasp-general is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with wasp-general.  If not, see <http://www.gnu.org/licenses/>.

# noinspection PyUnresolvedReferences
from wasp_general.version import __author__, __version__, __credits__, __license__, __copyright__, __email__
# noinspection PyUnresolvedReferences
from wasp_general.version import __status__

from configparser import ConfigParser
import os

from wasp_general.verify import verify_type, verify_value


[docs]class WConfig(ConfigParser): """ Improved ConfigParser. Has single method to merge config data (see :meth:`.WConfig.merge` method) and method, that split coma-separated option value (see :meth:`.WConfig.split_option` method). """
[docs] @verify_type(section=str, option=str) def split_option(self, section, option): """ Return list of strings that are made by splitting coma-separated option value. Method returns empty list if option value is empty string :param section: option section name :param option: option name :return: list of strings """ value = self[section][option].strip() if value == "": return [] return [x.strip() for x in (value.split(","))]
[docs] @verify_type(config=(str, ConfigParser)) @verify_value(config=lambda x: isinstance(x, ConfigParser) or os.path.isfile(x)) def merge(self, config): """ Load configuration from given configuration. :param config: config to load. If config is a string type, then it's treated as .ini filename :return: None """ if isinstance(config, ConfigParser) is True: self.update(config) elif isinstance(config, str): self.read(config)
[docs] @verify_type(config=ConfigParser, section_to=str, section_from=(str, None)) def merge_section(self, config, section_to, section_from=None): """ Load configuration section from other configuration. If specified section doesn't exist in current configuration, then it will be added automatically. :param config: source configuration :param section_to: destination section name :param section_from: source section name (if it is None, then section_to is used as source section name) :return: None """ section_from = section_from if section_from is not None else section_to if section_from not in config.sections(): raise ValueError('There is no such section "%s" in config' % section_from) if section_to not in self.sections(): self.add_section(section_to) for option in config[section_from].keys(): self.set(section_to, option, config[section_from][option])