0001"""
0002Constraints
0003"""
0004
0005import sys
0006if sys.version_info[0] > 2:
0007    # alias for python 3 compatability
0008    long = int
0009
0010
0011class BadValue(ValueError):
0012
0013    def __init__(self, desc, obj, col, value, *args):
0014        self.desc = desc
0015        self.col = col
0016
0017        # I want these objects to be garbage-collectable, so
0018        # I just keep their repr:
0019        self.obj = repr(obj)
0020        self.value = repr(value)
0021        fullDesc = "%s.%s %s (you gave: %s)"                      % (obj, col.name, desc, value)
0023        ValueError.__init__(self, fullDesc, *args)
0024
0025
0026def isString(obj, col, value):
0027    if not isinstance(value, str):
0028        raise BadValue("only allows strings", obj, col, value)
0029
0030
0031def notNull(obj, col, value):
0032    if value is None:
0033        raise BadValue("is defined NOT NULL", obj, col, value)
0034
0035
0036def isInt(obj, col, value):
0037    if not isinstance(value, (int, long)):
0038        raise BadValue("only allows integers", obj, col, value)
0039
0040
0041def isFloat(obj, col, value):
0042    if not isinstance(value, (int, long, float)):
0043        raise BadValue("only allows floating point numbers", obj, col, value)
0044
0045
0046def isBool(obj, col, value):
0047    if not isinstance(value, bool):
0048        raise BadValue("only allows booleans", obj, col, value)
0049
0050
0051class InList:
0052
0053    def __init__(self, l):
0054        self.list = l
0055
0056    def __call__(self, obj, col, value):
0057        if value not in self.list:
0058            raise BadValue("accepts only values in %s" % repr(self.list),
0059                           obj, col, value)
0060
0061
0062class MaxLength:
0063
0064    def __init__(self, length):
0065        self.length = length
0066
0067    def __call__(self, obj, col, value):
0068        try:
0069            length = len(value)
0070        except TypeError:
0071            raise BadValue("object does not have a length",
0072                           obj, col, value)
0073        if length > self.length:
0074            raise BadValue("must be shorter in length than %s"
0075                           % self.length,
0076                           obj, col, value)