Exemple #1
0
def verify_rules_dict_identifier(identifier, kind, allow_keywords=[]):
    """Helper function to verify validity of identifiers used in rules dicts.

    :param str identifier: the identifier to be validated
    :param str kind: kind of identifier for error messages
    :param list(str) allow_keywords: list of keywords that are allowed
        for this identifier
    :raises ValueError: if ``identifier`` is not valid
    """
    rules_dict_keywords = {'any_os', 'any_version', 'default_installer',
                           'unset_installers', 'any_key'}
    # FIXME: implement this whitelist differently (specific to where it
    #        might occur)
    rules_dict_whitelist = {'mountain lion'}
    # NOTE: 'unset_installers' is reserved for future use, not yet implemented.
    if not isinstance(identifier, text_type):
        raise ValueError(type_error_msg("str", identifier, what_for=kind))
    if identifier in rules_dict_keywords - set(allow_keywords):
        raise ValueError("{0} is disallowed keyword '{1}'.".
                         format(kind, identifier))
    if identifier in rules_dict_whitelist:
        return
    if not re.match('(?u)^[\w.’+-]+$', identifier):
        raise ValueError(
            "{0} '{1}' has disallowed characters. Allowed are: alphanumeric, "
            "dash, dot, underscore.".format(kind, identifier))
Exemple #2
0
 def from_yaml(self, value):
     if value == UNSET_YAML:
         return self.unset_value()
     if not isinstance(value, list):
         raise ConfigValueError(type_error_msg('list', value))
     return self.verify(
         [self.element_type.from_yaml(elt) for elt in value])
Exemple #3
0
    def __init__(self, os, version):
        """Setup the `OSOverride` with given os object and version string.

        :param OS os: object of class derived from `OS` that this object
            imitates
        :param str version: version of the imitated OS; if None is
            passed, the version is detected
        :type version: `str` or ``None``
        :raises UnsupportedOSError: if ``os`` is not valid
        :raises UnsupportedOSVersionError: if ``version`` is not a known
            version for ``os``; for ``version is None`` if the version
            cannot be detected
        """
        if not isinstance(os, OS):
            raise UnsupportedOSError(
                type_error_msg("OS", os, what_for="os override"))
        self.os = os
        if version is None:
            self.version = os.get_version()
        else:
            if version not in os.known_versions:
                raise UnsupportedOSVersionError(
                    "Cannot override OS '{}' with unknown version '{}'.".
                    format(os.name, version))
            self.version = version
Exemple #4
0
 def from_yaml(self, value):
     if value == UNSET_YAML:
         return self.unset_value()
     if not isinstance(value, dict):
         raise ConfigValueError(type_error_msg("dict", value))
     result = {}
     for k, v in six.iteritems(value):
         result[self.key_type.from_yaml(k)] = \
             self.value_type.from_yaml(v)
     return self.verify(result)
Exemple #5
0
 def verify(self, value):
     if not self.is_unset(value):
         if not isinstance(value, list):
             raise ConfigValueError(type_error_msg('list', value))
         try:
             for elt in value:
                 self.element_type.verify(elt)
         except ConfigValueError as e:
             raise_from(ConfigValueError, "invalid list element", e)
     return value
Exemple #6
0
 def verify(self, value):
     if not self.is_unset(value):
         if not isinstance(value, dict):
             raise ConfigValueError(type_error_msg('dict', value))
         try:
             for k, v in six.iteritems(value):
                 self.key_type.verify(k)
                 self.value_type.verify(v)
         except ConfigValueError as e:
             raise_from(ConfigValueError, "invalid key or value", e)
     return value
Exemple #7
0
 def parse_single(input):
     try:
         result = load_yaml(input)
     except YAMLError:
         result = None
     if not isinstance(result, dict):
         # special parsing allowing lists without enclosing `{}`
         try:
             result = load_yaml("{" + input + "}")
         except YAMLError as e:
             raise_from(ConfigValueError,
                        "failed to parse `{}` as dict".format(input), e)
     if not isinstance(result, dict):
         raise ConfigValueError(type_error_msg("dict", result))
     return result
Exemple #8
0
def process_config_file_yaml(config):
    """Utility for parsing yaml config files.

    Handles empty files and makes sure config file is dictionary with
    strings as keys.

    :raises ConfigValueError: if config is not ``None`` or dictionary
        with string keys
    """
    if config is None:
        # allow empty config file
        config = dict()
    if not isinstance(config, dict):
        raise ConfigValueError(
            "Config file cannot be interpreted as dictionary. "
            "Parsed as type '{}'.".format(type_name(config)))
    for key in config:
        if not isinstance(key, text_type):
            raise ConfigValueError(
                type_error_msg('text', key, what_for="config key"))
    return config
Exemple #9
0
 def verify(self, value):
     if not self.is_unset(value):
         if not isinstance(value, bool):
             raise ConfigValueError(type_error_msg('bool', value))
     return value
Exemple #10
0
 def verify(self, value):
     if not self.is_unset(value):
         if not isinstance(value, text_type):
             raise ConfigValueError(type_error_msg('string', value))
     return value