def _to_pod(cfg_point, value): if is_pod(value): return value if hasattr(cfg_point.kind, 'to_pod'): return value.to_pod() msg = '{} value "{}" is not serializable' raise ValueError(msg.format(cfg_point.name, value))
def __init__(self, name, kind=None, mandatory=None, default=None, override=False, allowed_values=None, description=None, constraint=None, merge=False, aliases=None, global_alias=None, deprecated=False): """ Create a new Parameter object. :param name: The name of the parameter. This will become an instance member of the plugin object to which the parameter is applied, so it must be a valid python identifier. This is the only mandatory parameter. :param kind: The type of parameter this is. This must be a callable that takes an arbitrary object and converts it to the expected type, or raised ``ValueError`` if such conversion is not possible. Most Python standard types -- ``str``, ``int``, ``bool``, etc. -- can be used here. This defaults to ``str`` if not specified. :param mandatory: If set to ``True``, then a non-``None`` value for this parameter *must* be provided on plugin object construction, otherwise ``ConfigError`` will be raised. :param default: The default value for this parameter. If no value is specified on plugin construction, this value will be used instead. (Note: if this is specified and is not ``None``, then ``mandatory`` parameter will be ignored). :param override: A ``bool`` that specifies whether a parameter of the same name further up the hierarchy should be overridden. If this is ``False`` (the default), an exception will be raised by the ``AttributeCollection`` instead. :param allowed_values: This should be the complete list of allowed values for this parameter. Note: ``None`` value will always be allowed, even if it is not in this list. If you want to disallow ``None``, set ``mandatory`` to ``True``. :param constraint: If specified, this must be a callable that takes the parameter value as an argument and return a boolean indicating whether the constraint has been satisfied. Alternatively, can be a two-tuple with said callable as the first element and a string describing the constraint as the second. :param merge: The default behaviour when setting a value on an object that already has that attribute is to overrided with the new value. If this is set to ``True`` then the two values will be merged instead. The rules by which the values are merged will be determined by the types of the existing and new values -- see ``merge_config_values`` documentation for details. :param aliases: Alternative names for the same configuration point. These are largely for backwards compatibility. :param global_alias: An alias for this parameter that can be specified at the global level. A global_alias can map onto many ConfigurationPoints. :param deprecated: Specify that this parameter is deprecated and its config should be ignored. If supplied WA will display a warning to the user however will continue execution. """ self.name = identifier(name) kind = KIND_MAP.get(kind, kind) if kind is not None and not callable(kind): raise ValueError('Kind must be callable.') self.kind = kind self.mandatory = mandatory if not is_pod(default): msg = "The default for '{}' must be a Plain Old Data type, but it is of type '{}' instead." raise TypeError(msg.format(self.name, type(default))) self.default = default self.override = override self.allowed_values = allowed_values self.description = description if self.kind is None and not self.override: self.kind = str if constraint is not None and not callable(constraint) and not isinstance(constraint, tuple): raise ValueError('Constraint must be callable or a (callable, str) tuple.') self.constraint = constraint self.merge = merge self.aliases = aliases or [] self.global_alias = global_alias self.deprecated = deprecated if self.default is not None: try: self.validate_value("init", self.default) except ConfigError: raise ValueError('Default value "{}" is not valid'.format(self.default))
def __init__(self, name, kind=None, mandatory=None, default=None, override=False, allowed_values=None, description=None, constraint=None, merge=False, aliases=None, global_alias=None): """ Create a new Parameter object. :param name: The name of the parameter. This will become an instance member of the plugin object to which the parameter is applied, so it must be a valid python identifier. This is the only mandatory parameter. :param kind: The type of parameter this is. This must be a callable that takes an arbitrary object and converts it to the expected type, or raised ``ValueError`` if such conversion is not possible. Most Python standard types -- ``str``, ``int``, ``bool``, etc. -- can be used here. This defaults to ``str`` if not specified. :param mandatory: If set to ``True``, then a non-``None`` value for this parameter *must* be provided on plugin object construction, otherwise ``ConfigError`` will be raised. :param default: The default value for this parameter. If no value is specified on plugin construction, this value will be used instead. (Note: if this is specified and is not ``None``, then ``mandatory`` parameter will be ignored). :param override: A ``bool`` that specifies whether a parameter of the same name further up the hierarchy should be overridden. If this is ``False`` (the default), an exception will be raised by the ``AttributeCollection`` instead. :param allowed_values: This should be the complete list of allowed values for this parameter. Note: ``None`` value will always be allowed, even if it is not in this list. If you want to disallow ``None``, set ``mandatory`` to ``True``. :param constraint: If specified, this must be a callable that takes the parameter value as an argument and return a boolean indicating whether the constraint has been satisfied. Alternatively, can be a two-tuple with said callable as the first element and a string describing the constraint as the second. :param merge: The default behaviour when setting a value on an object that already has that attribute is to overrided with the new value. If this is set to ``True`` then the two values will be merged instead. The rules by which the values are merged will be determined by the types of the existing and new values -- see ``merge_config_values`` documentation for details. :param aliases: Alternative names for the same configuration point. These are largely for backwards compatibility. :param global_alias: An alias for this parameter that can be specified at the global level. A global_alias can map onto many ConfigurationPoints. """ self.name = identifier(name) if kind in KIND_MAP: kind = KIND_MAP[kind] if kind is not None and not callable(kind): raise ValueError('Kind must be callable.') self.kind = kind self.mandatory = mandatory if not is_pod(default): msg = "The default for '{}' must be a Plain Old Data type, but it is of type '{}' instead." raise TypeError(msg.format(self.name, type(default))) self.default = default self.override = override self.allowed_values = allowed_values self.description = description if self.kind is None and not self.override: self.kind = str if constraint is not None and not callable(constraint) and not isinstance(constraint, tuple): raise ValueError('Constraint must be callable or a (callable, str) tuple.') self.constraint = constraint self.merge = merge self.aliases = aliases or [] self.global_alias = global_alias if self.default is not None: try: self.validate_value("init", self.default) except ConfigError: raise ValueError('Default value "{}" is not valid'.format(self.default))