diff --git a/configspec/specification.py b/configspec/specification.py index fedc6bb..c30e49c 100644 --- a/configspec/specification.py +++ b/configspec/specification.py @@ -63,6 +63,24 @@ class IntSpec(_ValueSpecification): str(self.maxval)) +@preservable +class FloatSpec(_ValueSpecification): + def __init__(self, minval=None, maxval=None, helptext=""): + super().__init__(helptext) + self.minval = minval + self.maxval = maxval + + def validate(self, value): + if not isinstance(value, float): + raise InvalidConfigError("Config value must be a float") + if self.minval is not None and value < self.minval: + raise InvalidConfigError("Config value must be >= " + + str(self.minval)) + if self.maxval is not None and value > self.maxval: + raise InvalidConfigError("Config value must be <= " + + str(self.maxval)) + + @preservable class StringSpec(_ValueSpecification): def __init__(self, regex=None, helptext=""): diff --git a/tests/test_configspec.py b/tests/test_configspec.py index db1fecd..e9dc625 100644 --- a/tests/test_configspec.py +++ b/tests/test_configspec.py @@ -12,18 +12,22 @@ def example_spec(): confspec.add_spec("boollist_a", ListSpec(BoolSpec(), helptext="Bool List A")) confspec.add_spec("int_a", IntSpec(-4, 4, helptext="Int A")) confspec.add_spec("intlist_a", ListSpec(IntSpec(-4, 4, "Int A"))) + confspec.add_spec("float_a", FloatSpec(-4, 4, helptext="Float A")) + confspec.add_spec("floatlist_a", ListSpec(FloatSpec(-4, 4, "Float A"))) confspec.add_spec("string_a", StringSpec(helptext="String A")) confspec.add_spec("stringlist_a", ListSpec(StringSpec(), helptext="String List A")) confdictspec = confspec.add_spec("dict_a", DictSpec(helptext="Dict A")) confdictspec.add_spec("bool_b", BoolSpec(helptext="Bool B")) confdictspec.add_spec("int_b", IntSpec(helptext="Int B")) + confdictspec.add_spec("float_b", FloatSpec(helptext="Float B")) confdictspec.add_spec("string_b", StringSpec(helptext="String B")) confdictlist = confspec.add_spec("dictlist_a", ListSpec( DictSpec(), helptext="List of Dicts B")) confdictlist.add_specs({"bool_c": BoolSpec(helptext="Bool C"), "int_c": IntSpec(helptext="Int C"), + "float_c": FloatSpec(helptext="Float C"), "string_c": StringSpec(helptext="String C")}) return confspec @@ -35,17 +39,22 @@ def example_values(): 'boollist_a': [False, True], 'int_a': 1, 'intlist_a': [1, 2, 3, 4], + 'float_a': 1.5, + 'floatlist_a': [1.2, 2.1, 3.7, 2.8], 'string_a': 'sometext', 'stringlist_a': ['somemoretext', 'yetmoretext'], 'dict_a': { 'bool_b': False, 'int_b': 0, + 'float_b': 0.5, 'string_b': 'texttesttext'}, 'dictlist_a': [{'bool_c': False, 'int_c': 3, + 'float_c': 3.4, 'string_c': 'string1'}, {'bool_c': True, 'int_c': 0, + 'float_c': 0.4, 'string_c': 'string2'}]} return vals