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