From 948d36fa42d751a573706b3871a6d829430aa0d6 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 24 May 2017 18:04:57 +0200 Subject: [PATCH] library: extend ArgValidatorInt for float and rename to ArgValidatorNum Let's handle floating point types similarly to integer types. The only difference is the "numeric_type" argument. --- library/network_connections.py | 27 +++++++++++++++++---------- library/test_network_connections.py | 20 +++++++++++++++----- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/library/network_connections.py b/library/network_connections.py index 8e8773f..c430049 100755 --- a/library/network_connections.py +++ b/library/network_connections.py @@ -453,18 +453,25 @@ class ArgValidatorStr(ArgValidator): raise ValidationError(name, 'cannot be empty') return v -class ArgValidatorInt(ArgValidator): - def __init__(self, name, required = False, val_min = None, val_max = None, default_value = 0): - ArgValidator.__init__(self, name, required, default_value) +class ArgValidatorNum(ArgValidator): + def __init__(self, name, required = False, val_min = None, val_max = None, + default_value = ArgValidator.MISSING, + numeric_type = int): + ArgValidator.__init__(self, name, required, \ + numeric_type(0) if default_value is ArgValidator.MISSING else default_value) self.val_min = val_min self.val_max = val_max + self.numeric_type = numeric_type def _validate(self, value, name): v = None try: - if isinstance(value, int): + if isinstance(value, self.numeric_type): v = value - if isinstance(value, Util.STRING_TYPE): - v = int(value) + else: + v2 = self.numeric_type(value) + if isinstance(value, Util.STRING_TYPE) \ + or v2 == value: + v = v2 except: pass if v is None: @@ -590,10 +597,10 @@ class ArgValidator_DictIP(ArgValidatorDict): ArgValidatorBool('dhcp4', default_value = None), ArgValidatorBool('dhcp4_send_hostname', default_value = None), ArgValidatorIP ('gateway4', family = socket.AF_INET), - ArgValidatorInt ('route_metric4', val_min = -1, val_max = 0xFFFFFFFF, default_value = None), + ArgValidatorNum ('route_metric4', val_min = -1, val_max = 0xFFFFFFFF, default_value = None), ArgValidatorBool('auto6', default_value = None), ArgValidatorIP ('gateway6', family = socket.AF_INET6), - ArgValidatorInt ('route_metric6', val_min = -1, val_max = 0xFFFFFFFF, default_value = None), + ArgValidatorNum ('route_metric6', val_min = -1, val_max = 0xFFFFFFFF, default_value = None), ArgValidatorList('address', nested = ArgValidatorIPAddr('address[?]'), default_value = list, @@ -648,7 +655,7 @@ class ArgValidator_DictConnection(ArgValidatorDict): nested = [ ArgValidatorStr ('name'), ArgValidatorStr ('state', enum_values = ArgValidator_DictConnection.VALID_STATES), - ArgValidatorInt ('wait', val_min = 0, val_max = 3600), + ArgValidatorNum ('wait', val_min = 0, val_max = 3600), ArgValidatorStr ('type', enum_values = ArgValidator_DictConnection.VALID_TYPES), ArgValidatorBool('autoconnect', default_value = True), ArgValidatorStr ('slave_type', enum_values = ArgValidator_DictConnection.VALID_SLAVE_TYPES), @@ -657,7 +664,7 @@ class ArgValidator_DictConnection(ArgValidatorDict): ArgValidatorMac ('mac'), ArgValidatorBool('check_iface_exists', default_value = True), ArgValidatorStr ('parent'), - ArgValidatorInt ('vlan_id', val_min = 0, val_max = 4095, default_value = None), + ArgValidatorNum ('vlan_id', val_min = 0, val_max = 4095, default_value = None), ArgValidatorBool('ignore_errors', default_value = None), ArgValidator_DictIP(), ], diff --git a/library/test_network_connections.py b/library/test_network_connections.py index 199772c..19ef018 100755 --- a/library/test_network_connections.py +++ b/library/test_network_connections.py @@ -27,13 +27,23 @@ class TestValidator(unittest.TestCase): def test_validate_int(self): - v = n.ArgValidatorInt('state', default_value = None) + v = n.ArgValidatorNum('state', default_value = None, numeric_type = float) self.assertEqual(1, v.validate(1)) - self.assertEqual(1, v.validate("1")) + self.assertEqual(1.5, v.validate(1.5)) + self.assertEqual(1.5, v.validate("1.5")) self.assertValidationError(v, None) self.assertValidationError(v, "1a") - v = n.ArgValidatorInt('state', required = True) + v = n.ArgValidatorNum('state', default_value = None) + self.assertEqual(1, v.validate(1)) + self.assertEqual(1, v.validate(1.0)) + self.assertEqual(1, v.validate("1")) + self.assertValidationError(v, None) + self.assertValidationError(v, None) + self.assertValidationError(v, 1.5) + self.assertValidationError(v, "1.5") + + v = n.ArgValidatorNum('state', required = True) self.assertValidationError(v, None) def test_validate_bool(self): @@ -56,7 +66,7 @@ class TestValidator(unittest.TestCase): v = n.ArgValidatorDict( 'dict', nested = [ - n.ArgValidatorInt('i', required = True), + n.ArgValidatorNum('i', required = True), n.ArgValidatorStr('s', required = False, default_value = 's_default'), n.ArgValidatorStr('l', required = False, default_value = n.ArgValidator.MISSING), ]) @@ -87,7 +97,7 @@ class TestValidator(unittest.TestCase): v = n.ArgValidatorList( 'list', - nested = n.ArgValidatorInt('i') + nested = n.ArgValidatorNum('i') ) self.assertEqual( [ 1, 5 ],