In the parameters system, we have been checking for a positive list of
values which get converted to None. The problem is that this method can
in some cases throw warnings when type coercion doesn't work
(particularly, string to unicode). Instead, any values that evaluate to
False that are neither numeric nor boolean should be converted to None.
>From 98911a96a9b023081458e0f3674bf8096f8f5c43 Mon Sep 17 00:00:00 2001
From: Nathaniel McCallum <npmccal...@redhat.com>
Date: Fri, 21 Feb 2014 11:38:32 -0500
Subject: [PATCH] Remove NULLS from constants.py

In the parameters system, we have been checking for a positive list of values
which get converted to None. The problem is that this method can in some
cases throw warnings when type coercion doesn't work (particularly, string
to unicode). Instead, any values that evaluate to False that are neither
numeric nor boolean should be converted to None.
---
 ipalib/constants.py                     |  3 ---
 ipalib/parameters.py                    | 19 +++++++++++--------
 ipatests/test_ipalib/test_parameters.py |  4 +++-
 3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/ipalib/constants.py b/ipalib/constants.py
index ae0827729764983675d5ae59bbd16bad1c0805ce..5a304daeba1f05cb0ad3dadb10e10e3c706105d7 100644
--- a/ipalib/constants.py
+++ b/ipalib/constants.py
@@ -32,9 +32,6 @@ except:
     except:
         FQDN = None
 
-# The parameter system treats all these values as None:
-NULLS = (None, '', u'', tuple(), [])
-
 # regular expression NameSpace member names must match:
 NAME_REGEX = r'^[a-z][_a-z0-9]*[a-z0-9]$|^[a-z]$'
 
diff --git a/ipalib/parameters.py b/ipalib/parameters.py
index b4fb3402df0ab1af8fb71086ccf22ee3a704b322..0b354969dc2d50ce10e0d09eb19cc6cefdeb39f3 100644
--- a/ipalib/parameters.py
+++ b/ipalib/parameters.py
@@ -109,11 +109,14 @@ from text import _ as ugettext
 from plugable import ReadOnly, lock, check_name
 from errors import ConversionError, RequirementError, ValidationError
 from errors import PasswordMismatch, Base64DecodeError
-from constants import NULLS, TYPE_ERROR, CALLABLE_ERROR
+from constants import TYPE_ERROR, CALLABLE_ERROR
 from text import Gettext, FixMe
 from util import json_serialize
 from ipapython.dn import DN
 
+def _is_null(value):
+    return not value and value != 0 # NOTE: False == 0
+
 class DefaultFrom(ReadOnly):
     """
     Derive a default value from other supplied values.
@@ -550,7 +553,7 @@ class Param(ReadOnly):
         """
         One stop shopping.
         """
-        if value in NULLS:
+        if _is_null(value):
             value = self.get_default(**kw)
         else:
             value = self.convert(self.normalize(value))
@@ -740,16 +743,16 @@ class Param(ReadOnly):
 
         (Note that `Str` is a subclass of `Param`.)
 
-        All values in `constants.NULLS` will be converted to ``None``.  For
-        example:
+        All non-numeric, non-boolean values which evaluate to False will be
+        converted to None.  For example:
 
         >>> scalar.convert(u'') is None  # An empty string
         True
         >>> scalar.convert([]) is None  # An empty list
         True
 
-        Likewise, values in `constants.NULLS` will be filtered out of a
-        multivalue parameter.  For example:
+        Likewise, they will be filtered out of a multivalue parameter.
+        For example:
 
         >>> multi = Str('my_multi', multivalue=True)
         >>> multi.convert([1.5, '', 17, None, u'Hello'])
@@ -772,14 +775,14 @@ class Param(ReadOnly):
 
         :param value: A proposed value for this parameter.
         """
-        if value in NULLS:
+        if _is_null(value):
             return
         if self.multivalue:
             if type(value) not in (tuple, list):
                 value = (value,)
             values = tuple(
                 self._convert_scalar(v, i) for (i, v) in filter(
-                    lambda iv: iv[1] not in NULLS, enumerate(value)
+                    lambda iv: not _is_null(iv[1]), enumerate(value)
                 )
             )
             if len(values) == 0:
diff --git a/ipatests/test_ipalib/test_parameters.py b/ipatests/test_ipalib/test_parameters.py
index d1956beded9ad07a408db0e6fc230bb6c3497e43..278e07165f194137d79246a7289813c0dcae0db7 100644
--- a/ipatests/test_ipalib/test_parameters.py
+++ b/ipatests/test_ipalib/test_parameters.py
@@ -31,11 +31,13 @@ from ipatests.util import raises, ClassChecker, read_only
 from ipatests.util import dummy_ugettext, assert_equal
 from ipatests.data import binary_bytes, utf8_bytes, unicode_str
 from ipalib import parameters, text, errors, config
-from ipalib.constants import TYPE_ERROR, CALLABLE_ERROR, NULLS
+from ipalib.constants import TYPE_ERROR, CALLABLE_ERROR
 from ipalib.errors import ValidationError, ConversionError
 from ipalib import _
 from xmlrpclib import MAXINT, MININT
 
+NULLS = (None, '', u'', tuple(), [])
+
 class test_DefaultFrom(ClassChecker):
     """
     Test the `ipalib.parameters.DefaultFrom` class.
-- 
1.8.5.3

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to