[Freeipa-devel] [PATCH] [Resend] Reading INT parameter class should respect radix prefix

Rob Crittenden rcritten at redhat.com
Mon Nov 23 21:53:58 UTC 2009


John Dennis wrote:
> This modifies the original patch by including a unit test, handling floats
> when passed as unicode, and handling large magnitude values beyond maxint.
> 
> The INT parameter class was not respecting any radix prefix (e.g. 0x) the user
> may have supplied. This patch implements _convert_scalar method for the Int
> class so that we can pass the special radix base of zero to the int constructor
> telling it to determine the radix from the prefix (if present).
> ---
> From: John Dennis <jdennis at redhat.com>
> Subject: [PATCH] Reading INT parameter class should respect radix prefix
> 
> 
>  ipalib/parameters.py                 |   29 +++++++++++++++++++++++++++++
>  tests/test_ipalib/test_parameters.py |   27 +++++++++++++++++++++++++++
>  2 files changed, 56 insertions(+), 0 deletions(-)
> 
> diff --git a/ipalib/parameters.py b/ipalib/parameters.py
> index 227757d..8a1aede 100644
> --- a/ipalib/parameters.py
> +++ b/ipalib/parameters.py
> @@ -909,6 +909,35 @@ class Int(Number):
>                      self.nice, self.minvalue, self.maxvalue)
>              )
>  
> +    def _convert_scalar(self, value, index=None):
> +        """
> +        Convert a single scalar value.
> +        """
> +        if type(value) in (int, long):
> +            return value
> +        if type(value) is unicode:
> +            # permit floating point strings
> +            if value.find(u'.') >= 0:
> +                try:
> +                    return int(float(value))
> +                except ValueError:
> +                    pass
> +            else:
> +                try:
> +                    # 2nd arg is radix base, 2nd arg only accepted for strings.
> +                    # Zero means determine radix base from prefix (e.g. 0x for hex)
> +                    return int(value, 0)
> +                except ValueError:
> +                    pass
> +        if type(value) is float:
> +            try:
> +                return int(value)
> +            except ValueError:
> +                pass
> +        raise ConversionError(name=self.name, index=index,
> +            error=ugettext(self.type_error),
> +        )
> +
>      def _rule_minvalue(self, _, value):
>          """
>          Check min constraint.
> diff --git a/tests/test_ipalib/test_parameters.py b/tests/test_ipalib/test_parameters.py
> index f6bc66f..d1c5f7f 100644
> --- a/tests/test_ipalib/test_parameters.py
> +++ b/tests/test_ipalib/test_parameters.py
> @@ -22,6 +22,7 @@ Test the `ipalib.parameters` module.
>  """
>  
>  import re
> +import sys
>  from types import NoneType
>  from inspect import isclass
>  from tests.util import raises, ClassChecker, read_only
> @@ -1225,6 +1226,32 @@ class test_Int(ClassChecker):
>              assert dummy.called() is True
>              dummy.reset()
>  
> +    def test_convert_scalar(self):
> +        """
> +        Test the `ipalib.parameters.Int._convert_scalar` method.
> +        Assure radix prefixes work, str objects fail,
> +        floats (native & string) are truncated,
> +        large magnitude values are promoted to long,
> +        empty strings & invalid numerical representations fail
> +        """
> +        o = self.cls('my_number')
> +        # Assure invalid inputs raise error
> +        for bad in ['hello', u'hello', True, None, '10', u'', u'.']:
> +            e = raises(errors.ConversionError, o._convert_scalar, bad)
> +            assert e.name == 'my_number'
> +            assert e.index is None
> +        # Assure large magnatude values are handled correctly
> +        assert type(o._convert_scalar(sys.maxint*2)) == long
> +        assert o._convert_scalar(sys.maxint*2) == sys.maxint*2
> +        assert o._convert_scalar(unicode(sys.maxint*2)) == sys.maxint*2
> +        assert o._convert_scalar(long(16)) == 16
> +        # Assure normal conversions produce expected result
> +        assert o._convert_scalar(u'16.99') == 16
> +        assert o._convert_scalar(16.99)    == 16
> +        assert o._convert_scalar(u'16')    == 16
> +        assert o._convert_scalar(u'0x10')  == 16
> +        assert o._convert_scalar(u'020')   == 16
> +
>  class test_Float(ClassChecker):
>      """
>      Test the `ipalib.parameters.Float` class.
> 
> _______________________________________________
> Freeipa-devel mailing list
> Freeipa-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/freeipa-devel

ack, pushed to master




More information about the Freeipa-devel mailing list