1
#Copyright ReportLab Europe Ltd. 2000-2004
2
#see license.txt for license details
3
#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/validators.py
4
__version__=''' $Id$ '''
6
This module contains some standard verifying functions which can be
7
used in an attribute map.
12
_SequenceTypes = (ListType,TupleType)
13
_NumberTypes = (FloatType,IntType)
14
from reportlab.lib import colors
15
if sys.hexversion<0x2030000:
20
"base validator class"
25
return getattr(self,'_str',self.__class__.__name__)
27
def normalize(self,x):
30
def normalizeTest(self,x):
37
class _isAnything(Validator):
41
class _isNothing(Validator):
45
class _isBoolean(Validator):
46
if sys.hexversion>=0x2030000:
48
if type(x) in (IntType,BooleanType): return x in (0,1)
49
return self.normalizeTest(x)
52
if type(x) is IntType: return x in (0,1)
53
return self.normalizeTest(x)
55
def normalize(self,x):
56
if x in (0,1): return x
60
raise ValueError, 'Must be boolean'
61
if S in ('YES','TRUE'): return True
62
if S in ('NO','FALSE',None): return False
63
raise ValueError, 'Must be boolean'
65
class _isString(Validator):
67
return type(x) is StringType
69
class _isNumber(Validator):
71
if type(x) in _NumberTypes: return True
72
return self.normalizeTest(x)
74
def normalize(self,x):
80
class _isInt(Validator):
82
if type(x) not in (IntType,StringType): return False
83
return self.normalizeTest(x)
85
def normalize(self,x):
88
class _isNumberOrNone(_isNumber):
90
return x is None or isNumber(x)
92
def normalize(self,x):
93
if x is None: return x
94
return _isNumber.normalize(x)
96
class _isListOfNumbersOrNone(Validator):
97
"ListOfNumbersOrNone validator class."
99
if x is None: return True
100
return isListOfNumbers(x)
102
class _isListOfShapes(Validator):
103
"ListOfShapes validator class."
105
from reportlab.graphics.shapes import Shape
106
if type(x) in _SequenceTypes:
109
if not isinstance(x, Shape):
115
class _isListOfStringsOrNone(Validator):
116
"ListOfStringsOrNone validator class."
119
if x is None: return True
120
return isListOfStrings(x)
122
class _isTransform(Validator):
123
"Transform validator class."
125
if type(x) in _SequenceTypes:
128
if not isNumber(element):
136
class _isColor(Validator):
137
"Color validator class."
139
return isinstance(x, colors.Color)
141
class _isColorOrNone(Validator):
142
"ColorOrNone validator class."
144
if x is None: return True
147
class _isValidChild(Validator):
148
"ValidChild validator class."
150
"""Is this child allowed in a drawing or group?
151
I.e. does it descend from Shape or UserNode?
154
from reportlab.graphics.shapes import UserNode, Shape
155
return isinstance(x, UserNode) or isinstance(x, Shape)
157
class _isValidChildOrNone(_isValidChild):
159
return _isValidChild.test(self,x) or x is None
161
class _isCallable(Validator):
165
class OneOf(Validator):
166
"""Make validator functions for list of choices.
169
f = reportlab.lib.validators.OneOf('happy','sad')
171
f = reportlab.lib.validators.OneOf(('happy','sad'))
172
f('sad'),f('happy'), f('grumpy')
175
def __init__(self, enum,*args):
176
if type(enum) in [ListType,TupleType]:
178
raise ValueError, "Either all singleton args or a single sequence argument"
179
self._enum = tuple(enum)+args
181
self._enum = (enum,)+args
184
return x in self._enum
186
class SequenceOf(Validator):
187
def __init__(self,elemTest,name=None,emptyOK=1, NoneOK=0, lo=0,hi=0x7fffffff):
188
self._elemTest = elemTest
189
self._emptyOK = emptyOK
190
self._NoneOK = NoneOK
191
self._lo, self._hi = lo, hi
192
if name: self._str = name
195
if type(x) not in _SequenceTypes:
196
if x is None: return self._NoneOK
200
elif not self._lo<=len(x)<=self._hi: return False
202
if not self._elemTest(e): return False
205
class EitherOr(Validator):
206
def __init__(self,tests,name=None):
207
if type(tests) not in _SequenceTypes: tests = (tests,)
209
if name: self._str = name
212
for t in self._tests:
216
class NoneOr(Validator):
217
def __init__(self,elemTest,name=None):
218
self._elemTest = elemTest
219
if name: self._str = name
222
if x is None: return True
223
return self._elemTest(x)
225
class isInstanceOf(Validator):
226
def __init__(self,klass=None):
229
return isinstance(x,self._klass)
231
isBoolean = _isBoolean()
232
isString = _isString()
233
isNumber = _isNumber()
235
isNoneOrInt = NoneOr(isInt,'isNoneOrInt')
236
isNumberOrNone = _isNumberOrNone()
237
isTextAnchor = OneOf('start','middle','end','boxauto')
238
isListOfNumbers = SequenceOf(isNumber,'isListOfNumbers')
239
isListOfNumbersOrNone = _isListOfNumbersOrNone()
240
isListOfShapes = _isListOfShapes()
241
isListOfStrings = SequenceOf(isString,'isListOfStrings')
242
isListOfStringsOrNone = _isListOfStringsOrNone()
243
isTransform = _isTransform()
245
isListOfColors = SequenceOf(isColor,'isListOfColors')
246
isColorOrNone = _isColorOrNone()
247
isShape = isValidChild = _isValidChild()
248
isNoneOrShape = isValidChildOrNone = _isValidChildOrNone()
249
isAnything = _isAnything()
250
isNothing = _isNothing()
251
isXYCoord = SequenceOf(isNumber,lo=2,hi=2,emptyOK=0)
252
isBoxAnchor = OneOf('nw','n','ne','w','c','e','sw','s','se', 'autox', 'autoy')
253
isNoneOrString = NoneOr(isString,'NoneOrString')
254
isNoneOrListOfNoneOrStrings=SequenceOf(isNoneOrString,'isNoneOrListOfNoneOrStrings',NoneOK=1)
255
isListOfNoneOrString=SequenceOf(isNoneOrString,'isListOfNoneOrString',NoneOK=0)
256
isNoneOrListOfNoneOrNumbers=SequenceOf(isNumberOrNone,'isNoneOrListOfNoneOrNumbers',NoneOK=1)
257
isCallable = _isCallable()
258
isStringOrCallable=EitherOr((isString,isCallable),'isStringOrCallable')
259
isStringOrCallableOrNone=NoneOr(isStringOrCallable,'isStringOrCallableNone')
260
isStringOrNone=NoneOr(isString,'isStringOrNone')