Example #1
0
    def unset_value(self, key):
        """Unset a value in the configuration.
        """
        self._ensure_have_load_only()

        if key not in self._config[self.load_only]:
            raise ConfigurationError("No such key - {}".format(key))

        fname, parser = self._get_parser_to_modify()

        if parser is not None:
            section, name = _disassemble_key(key)

            # Remove the key in the parser
            modified_something = False
            if parser.has_section(section):
                # Returns whether the option was removed or not
                modified_something = parser.remove_option(section, name)

            if modified_something:
                # name removed from parser, section may now be empty
                if next(iter(parser.items(section)), None) is None:
                    parser.remove_section(section)

                self._mark_as_modified(fname, parser)
            else:
                raise ConfigurationError(
                    "Fatal Internal error [id=1]. Please report as a bug.")

        del self._config[self.load_only][key]
Example #2
0
 def get_value(self, key):
     """Get a value from the configuration.
     """
     try:
         return self._dictionary[key]
     except KeyError:
         raise ConfigurationError("No such key - {}".format(key))
Example #3
0
    def _get_parser_to_modify(self):
        # Determine which parser to modify
        parsers = self._parsers[self.load_only]
        if not parsers:
            # This should not happen if everything works correctly.
            raise ConfigurationError(
                "Fatal Internal error [id=2]. Please report as a bug.")

        # Use the highest priority parser.
        return parsers[-1]
Example #4
0
    def __init__(self, isolated, load_only=None):
        super(Configuration, self).__init__()

        _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.VENV, None]
        if load_only not in _valid_load_only:
            raise ConfigurationError(
                "Got invalid value for load_only - should be one of {}".format(
                    ", ".join(map(repr, _valid_load_only[:-1]))))
        self.isolated = isolated
        self.load_only = load_only

        # The order here determines the override order.
        self._override_order = [
            kinds.GLOBAL, kinds.USER, kinds.VENV, kinds.ENV, kinds.ENV_VAR
        ]

        # Because we keep track of where we got the data from
        self._parsers = {variant: [] for variant in self._override_order}
        self._config = {variant: {} for variant in self._override_order}
        self._modified_parsers = []
Example #5
0
 def _ensure_have_load_only(self):
     if self.load_only is None:
         raise ConfigurationError("Needed a specific file to be modifying.")
     logger.debug("Will be working with %s variant only", self.load_only)