@@ -9,9 +9,12 @@ class SchemaError(Exception):
9
9
10
10
"""Error during Schema validation."""
11
11
12
- def __init__ (self , autos , errors ):
12
+ def __init__ (self , autos , errors , value ):
13
13
self .autos = autos if type (autos ) is list else [autos ]
14
14
self .errors = errors if type (errors ) is list else [errors ]
15
+ self .value = value
16
+ self .errors = [None if e is None else e .format (value = self .value )
17
+ for e in self .errors ]
15
18
Exception .__init__ (self , self .code )
16
19
17
20
@property
@@ -47,14 +50,14 @@ def validate(self, data):
47
50
class Or (And ):
48
51
49
52
def validate (self , data ):
50
- x = SchemaError ([], [])
53
+ x = SchemaError ([], [], None )
51
54
for s in [Schema (s , error = self ._error ) for s in self ._args ]:
52
55
try :
53
56
return s .validate (data )
54
57
except SchemaError as _x :
55
58
x = _x
56
59
raise SchemaError (['%r did not validate %r' % (self , data )] + x .autos ,
57
- [self ._error ] + x .errors )
60
+ [self ._error ] + x .errors , data )
58
61
59
62
60
63
class Use (object ):
@@ -71,10 +74,11 @@ def validate(self, data):
71
74
try :
72
75
return self ._callable (data )
73
76
except SchemaError as x :
74
- raise SchemaError ([None ] + x .autos , [self ._error ] + x .errors )
77
+ raise SchemaError ([None ] + x .autos , [self ._error ] + x .errors , data )
75
78
except BaseException as x :
76
79
f = self ._callable .__name__
77
- raise SchemaError ('%s(%r) raised %r' % (f , data , x ), self ._error )
80
+ raise SchemaError ('%s(%r) raised %r' % (f , data , x ), self ._error ,
81
+ data )
78
82
79
83
80
84
def priority (s ):
@@ -118,9 +122,9 @@ def validate(self, data):
118
122
for skey in sorted (s , key = priority ):
119
123
svalue = s [skey ]
120
124
try :
121
- nkey = Schema (skey , error = e ).validate (key )
125
+ nkey = Schema (skey ).validate (key ) # error got forgotten
122
126
try :
123
- nvalue = Schema (svalue , error = e ).validate (value )
127
+ nvalue = Schema (svalue ).validate (value )
124
128
except SchemaError as _x :
125
129
x = _x
126
130
raise
@@ -135,44 +139,47 @@ def validate(self, data):
135
139
elif skey is not None :
136
140
if x is not None :
137
141
raise SchemaError (['key %r is required' % key ] +
138
- x .autos , [e ] + x .errors )
142
+ x .autos , [e ] + x .errors , data )
139
143
else :
140
- raise SchemaError ('key %r is required' % skey , e )
144
+ raise SchemaError ('key %r is required' % skey , e , data )
141
145
coverage = set (k for k in coverage if type (k ) is not Optional )
142
146
required = set (k for k in s if type (k ) is not Optional )
143
147
if coverage != required :
144
- raise SchemaError ('missed keys %r' % (required - coverage ), e )
148
+ raise SchemaError ('missed keys %r' % (required - coverage ), e ,
149
+ data )
145
150
if len (new ) != len (data ):
146
- raise SchemaError ('wrong keys %r in %r' % (new , data ), e )
151
+ raise SchemaError ('wrong keys %r in %r' % (new , data ), e , data )
147
152
return new
148
153
if hasattr (s , 'validate' ):
149
154
try :
150
155
return s .validate (data )
151
156
except SchemaError as x :
152
- raise SchemaError ([None ] + x .autos , [e ] + x .errors )
157
+ raise SchemaError ([None ] + x .autos , [e ] + x .errors , data )
153
158
except BaseException as x :
154
159
raise SchemaError ('%r.validate(%r) raised %r' % (s , data , x ),
155
- self ._error )
160
+ self ._error , data )
156
161
if type (s ) is type :
157
162
if isinstance (data , s ):
158
163
return data
159
164
else :
160
- raise SchemaError ('%r should be instance of %r' % (data , s ), e )
165
+ raise SchemaError ('%r should be instance of %r' % (data , s ), e ,
166
+ data )
161
167
if callable (s ):
162
168
f = s .__name__
163
169
try :
164
170
if s (data ):
165
171
return data
166
172
except SchemaError as x :
167
- raise SchemaError ([None ] + x .autos , [e ] + x .errors )
173
+ raise SchemaError ([None ] + x .autos , [e ] + x .errors , data )
168
174
except BaseException as x :
169
175
raise SchemaError ('%s(%r) raised %r' % (f , data , x ),
170
- self ._error )
171
- raise SchemaError ('%s(%r) should evaluate to True' % (f , data ), e )
176
+ self ._error , data )
177
+ raise SchemaError ('%s(%r) should evaluate to True' % (f , data ), e ,
178
+ data )
172
179
if s == data :
173
180
return data
174
181
else :
175
- raise SchemaError ('%r does not match %r' % (s , data ), e )
182
+ raise SchemaError ('%r does not match %r' % (s , data ), e , data )
176
183
177
184
178
185
class Optional (Schema ):
0 commit comments