6.1 Adding a condition to XInt

In the following example, we write a new class which inherit from XInt to ensure that a value is a multiple of something:

# --
# Copyright (C) CEA, EDF
# Author : Erwan ADAM (CEA)
# --

import unittest

from xdata import *

class XIntWithMultiple(XInt):
    __init__xattributes__ = XInt.__init__xattributes__ + [
        XAttribute("multiple", xtype=XInt(not_into=[0]), default_value=None),
        ]
    def __call__(self, value):
        value = XInt.__call__(self, value)
        multiple = self.multiple
        if multiple is not None:
            residual = value%multiple
            if residual != 0:
                msg = "%s is not a multiple of %s"%(value, multiple)
                raise XValueError(msg)
            pass
        return value
    pass

class XIntWithMultipleTestCase(unittest.TestCase):
    def test(self):
        x = XIntWithMultiple(multiple=5)
        self.failUnlessEqual(x(10), 10)
        self.failUnlessEqual(x(0), 0)
        self.failUnlessEqual(x("15"), 15)
        self.failUnlessRaises(XValueError, x, 1)
        return
    def test_multiple(self):
        self.failUnlessRaises(XValueError, XIntWithMultiple, multiple="toto")
        self.failUnlessRaises(XValueError, XIntWithMultiple, multiple=0)
        return
    def testwithmin(self):
        x = XIntWithMultiple(multiple=5, min=1)
        self.failUnlessEqual(x(10), 10)
        self.failUnlessEqual(x("15"), 15)
        self.failUnlessRaises(XValueError, x, 0)
        self.failUnlessRaises(XValueError, x, 1)
        return
    pass

if __name__ == '__main__':
    unittest.main()
    pass