arg_validator: support generating default value for ArgValidatorDict

Some dictionaries may wish to have a default value that is a dictionary
with the default of all keys.

Add a method to generate this.

This returns a callable instead of a plain dictionary. In practice, the
generated default value should always be the same. However, we also
expect that ArgValidator validation gives a result that is owned by the
caller. In case of mutable values (like a dictionary), we want a deep
clone.

Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
Thomas Haller 2021-07-15 12:58:57 +02:00 committed by Gris Ge
parent e0a1b6af68
commit e01e550c59

View file

@ -337,11 +337,14 @@ class ArgValidatorDict(ArgValidator):
default_value=None,
all_missing_during_validate=False,
):
ArgValidator.__init__(self, name, required, default_value)
if nested is not None:
self.nested = dict([(v.name, v) for v in nested])
nested = dict([(v.name, v) for v in nested])
else:
self.nested = {}
nested = {}
if default_value is ArgValidator.DEFAULT:
default_value = self.generate_default
ArgValidator.__init__(self, name, required, default_value)
self.nested = nested
self.all_missing_during_validate = all_missing_during_validate
def _validate_impl(self, value, name):
@ -378,6 +381,18 @@ class ArgValidatorDict(ArgValidator):
result[setting] = default
return result
@staticmethod
def generate_default_from_nested(nested):
result = {}
for name, validator in nested.items():
default = validator.get_default_value()
if default is not ArgValidator.MISSING:
result[name] = default
return result
def generate_default(self):
return ArgValidatorDict.generate_default_from_nested(self.nested)
class ArgValidatorList(ArgValidator):
def __init__(self, name, nested, default_value=None):