[Zope3-dev] zope.schema.Orderable -- additional tests

Shaun Cutts shaun at cuttshome.net
Thu Jan 19 18:45:21 EST 2006


I have a version of zope.schema.Orderable (in
zope.schema._bootstrapfields.py) that passes additional tests having to
do with combination of missing_value with other constraints. (Released
version fails these.)

What should I do with it? I am new, and haven't contributed anything
before. Does someone want to see it? (Orderable included below.)
Can/should I just put it in SVN? 

Thanks, - Shaun

------------------------------------------------------------------------
----
Here are the additional tests (from zope.schema.tests.test_intfield.py):
------------------------------------------------------------------------
----

    def testValidateMissing( self ):
        field = self._Field_Factory(title=u'Int field', description=u'',
                                    readonly=False, required=False,
                                    missing_value = -1)

        field.validate(-1)
        field.validate(-10)
        field.validate(10)

        self.assertRaises( WrongType, field.validate, None )

    def testValidateRequiredAndMissing(self):
        field = self._Field_Factory(title=u'Int field', description=u'',
                                    readonly=False, required=True,
                                    missing_value = -1)
        
        self.assertRaises(WrongType, field.validate, None)
        self.assertRaises(RequiredMissing, field.validate, -1)

    def testValidateMinAndMissing(self):
        field = self._Field_Factory(title=u'Int field', description=u'',
                                    readonly=False, required=False,
                                    missing_value = -2, min = 0)
        field.validate(-2)
        field.validate( 10 )
        self.assertRaises(TooSmall, field.validate, -1)

    def testValidateMaxAndMissing(self):
        field = self._Field_Factory(title=u'Int field', description=u'',
                                    readonly=False, required=False,
                                    missing_value = 100, max = 0)
        field.validate(0)
        field.validate(100)
        self.assertRaises(TooBig, field.validate, 1)

    def testValidateMinAndMaxAndMissing(self):
        field = self._Field_Factory(title=u'Int field', description=u'',
                                    readonly=False, required=False,
                                    min=0, max=10, missing_value = -1)

        field.validate(-1)
        field.validate(0)
        field.validate(5)
        field.validate(10)
                                     
        self.assertRaises(TooSmall, field.validate, -10)
        self.assertRaises(WrongType, field.validate, None)
        self.assertRaises(TooBig, field.validate, 11)
        self.assertRaises(TooBig, field.validate, 20)

        # in theory, missing_value could be in middle of range
        # (maybe derived type defines invalid subranges, for instance)
        field = self._Field_Factory(title=u'Int field', description=u'',
                                    readonly=False, required=False,
                                    min=0, max=10, missing_value = 5)

        field.validate(0)
        field.validate(5)
        field.validate(10)
                                     
        self.assertRaises(TooSmall, field.validate, -10)
        self.assertRaises(TooSmall, field.validate, -1)
        self.assertRaises(WrongType, field.validate, None)
        self.assertRaises(TooBig, field.validate, 11)
        self.assertRaises(TooBig, field.validate, 20)

        # however, when missing_value is equal to min or max, the
        # bound is undefined
        field = self._Field_Factory(title=u'Int field', description=u'',
                                    readonly=False, required=False,
                                    min=0, max=10, missing_value = 0)

        field.validate(-10)
        field.validate(-1)
        field.validate(0)
        field.validate(5)
        field.validate(10)
                                     
        self.assertRaises(WrongType, field.validate, None)
        self.assertRaises(TooBig, field.validate, 11)
        self.assertRaises(TooBig, field.validate, 20)


------------------------------------------------------------------------
----
new version of Orderable (from _bootstrapfields.py):
------------------------------------------------------------------------
----


class Orderable(object):
    """Values of ordered fields can be sorted.

    They can be restricted to a range of values.

    Orderable is a mixin used in combination with Field.
    """

    min = ValidatedProperty('min')
    max = ValidatedProperty('max')

    __missing_value_marker = object()
    
    def __init__(self, min=__missing_value_marker,
max=__missing_value_marker,
                 default=__missing_value_marker, **kw):

        # Set min and max to None so that we can validate if
        # one of the super methods invoke validation.
        self.min = None
        self.max = None

        super(Orderable, self).__init__(**kw)

        # make sure that unspecified min, max, default get correct
missing value
        if min is self.__missing_value_marker: min = self.missing_value
        if max is self.__missing_value_marker: max = self.missing_value
        if default is self.__missing_value_marker: default =
self.missing_value

        # Now really set min and max
        # NOTE: order matters here with _validate as is -- see _validate
below
        self.min = min
        self.max = max


        # We've taken over setting default so it can be limited by min
        # and max.
        self.default = default


    def _validate(self, value):
        super(Orderable, self)._validate(value)

        if self.min != self.missing_value and value < self.min:
            raise TooSmall(value, self.min)

        if self.max != self.missing_value and self.max < value:
            # when initially setting min, max not set yet,
            # so skip validation when max is missing OR None.
            if self.max != None:
                 raise TooBig(value, self.max)
        




More information about the Zope3-dev mailing list