-
Notifications
You must be signed in to change notification settings - Fork 73
Expand file tree
/
Copy pathformencode.compound.html
More file actions
244 lines (243 loc) · 23.4 KB
/
formencode.compound.html
File metadata and controls
244 lines (243 loc) · 23.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
<html>
<head>
<title>formencode.compound</title>
</head>
<body>
formencode.compound
<style>
.coverage pre {float: left; margin: 0px 1em; border: none;
padding: 0px; }
.num pre { margin: 0px }
.nocov, .nocov pre {background-color: #faa}
.cov, .cov pre {background-color: #cfc}
div.coverage div { clear: both; height: 1.1em}
</style>
<div class="stats">
Covered: 17 lines<br/>
Missed: 153 lines<br/>
Skipped 49 lines<br/>
Percent: 10 %<br/>
</div>
<div class="coverage">
<div class="cov"><span class="num"><pre> 1</pre></span><pre>"""</pre></div>
<div class="cov"><span class="num"><pre> 2</pre></span><pre>Validators for applying validations in sequence.</pre></div>
<div class="cov"><span class="num"><pre> 3</pre></span><pre>"""</pre></div>
<div class="skip"><span class="num"><pre> 4</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 5</pre></span><pre>from api import *</pre></div>
<div class="skip"><span class="num"><pre> 6</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre> 7</pre></span><pre># @@ ianb 2005-05: should CompoundValidator be included?</pre></div>
<div class="nocov"><span class="num"><pre> 8</pre></span><pre>__all__ = ['Any', 'All', 'Pipe']</pre></div>
<div class="skip"><span class="num"><pre> 9</pre></span><pre></pre></div>
<div class="skip"><span class="num"><pre> 10</pre></span><pre>############################################################</pre></div>
<div class="skip"><span class="num"><pre> 11</pre></span><pre>## Compound Validators</pre></div>
<div class="skip"><span class="num"><pre> 12</pre></span><pre>############################################################</pre></div>
<div class="skip"><span class="num"><pre> 13</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 14</pre></span><pre>def to_python(validator, value, state):</pre></div>
<div class="cov"><span class="num"><pre> 15</pre></span><pre> return validator.to_python(value, state)</pre></div>
<div class="skip"><span class="num"><pre> 16</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 17</pre></span><pre>def from_python(validator, value, state):</pre></div>
<div class="nocov"><span class="num"><pre> 18</pre></span><pre> return validator.from_python(value, state)</pre></div>
<div class="skip"><span class="num"><pre> 19</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 20</pre></span><pre>class CompoundValidator(FancyValidator):</pre></div>
<div class="skip"><span class="num"><pre> 21</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 22</pre></span><pre> if_invalid = NoDefault</pre></div>
<div class="skip"><span class="num"><pre> 23</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 24</pre></span><pre> validators = []</pre></div>
<div class="skip"><span class="num"><pre> 25</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 26</pre></span><pre> __unpackargs__ = ('*', 'validatorArgs')</pre></div>
<div class="skip"><span class="num"><pre> 27</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 28</pre></span><pre> __mutableattributes__ = ('validators',)</pre></div>
<div class="skip"><span class="num"><pre> 29</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 30</pre></span><pre> def __classinit__(cls, new_attrs):</pre></div>
<div class="cov"><span class="num"><pre> 31</pre></span><pre> toAdd = []</pre></div>
<div class="cov"><span class="num"><pre> 32</pre></span><pre> for name, value in new_attrs.items():</pre></div>
<div class="cov"><span class="num"><pre> 33</pre></span><pre> if name in ('view',):</pre></div>
<div class="nocov"><span class="num"><pre> 34</pre></span><pre> continue</pre></div>
<div class="cov"><span class="num"><pre> 35</pre></span><pre> if is_validator(value) and value is not Identity:</pre></div>
<div class="cov"><span class="num"><pre> 36</pre></span><pre> toAdd.append((name, value))</pre></div>
<div class="skip"><span class="num"><pre> 37</pre></span><pre> # @@: Should we really delete too?</pre></div>
<div class="cov"><span class="num"><pre> 38</pre></span><pre> delattr(cls, name)</pre></div>
<div class="cov"><span class="num"><pre> 39</pre></span><pre> toAdd.sort()</pre></div>
<div class="cov"><span class="num"><pre> 40</pre></span><pre> cls.validators.extend([v for n, v in toAdd])</pre></div>
<div class="skip"><span class="num"><pre> 41</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 42</pre></span><pre> def __init__(self, *args, **kw):</pre></div>
<div class="cov"><span class="num"><pre> 43</pre></span><pre> Validator.__init__(self, *args, **kw)</pre></div>
<div class="cov"><span class="num"><pre> 44</pre></span><pre> self.validators = self.validators[:]</pre></div>
<div class="cov"><span class="num"><pre> 45</pre></span><pre> self.validators.extend(self.validatorArgs)</pre></div>
<div class="skip"><span class="num"><pre> 46</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 47</pre></span><pre> def _reprVars(names):</pre></div>
<div class="nocov"><span class="num"><pre> 48</pre></span><pre> return [n for n in Validator._reprVars(names)</pre></div>
<div class="nocov"><span class="num"><pre> 49</pre></span><pre> if n != 'validatorArgs']</pre></div>
<div class="nocov"><span class="num"><pre> 50</pre></span><pre> _reprVars = staticmethod(_reprVars)</pre></div>
<div class="skip"><span class="num"><pre> 51</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 52</pre></span><pre> def attempt_convert(self, value, state, convertFunc):</pre></div>
<div class="nocov"><span class="num"><pre> 53</pre></span><pre> raise NotImplementedError, "Subclasses must implement attempt_convert"</pre></div>
<div class="skip"><span class="num"><pre> 54</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 55</pre></span><pre> def _to_python(self, value, state=None):</pre></div>
<div class="cov"><span class="num"><pre> 56</pre></span><pre> return self.attempt_convert(value, state,</pre></div>
<div class="cov"><span class="num"><pre> 57</pre></span><pre> to_python)</pre></div>
<div class="skip"><span class="num"><pre> 58</pre></span><pre> </pre></div>
<div class="nocov"><span class="num"><pre> 59</pre></span><pre> def _from_python(self, value, state=None):</pre></div>
<div class="nocov"><span class="num"><pre> 60</pre></span><pre> return self.attempt_convert(value, state,</pre></div>
<div class="nocov"><span class="num"><pre> 61</pre></span><pre> from_python)</pre></div>
<div class="skip"><span class="num"><pre> 62</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 63</pre></span><pre> def subvalidators(self):</pre></div>
<div class="nocov"><span class="num"><pre> 64</pre></span><pre> return self.validators</pre></div>
<div class="skip"><span class="num"><pre> 65</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 66</pre></span><pre>class Any(CompoundValidator):</pre></div>
<div class="skip"><span class="num"><pre> 67</pre></span><pre> </pre></div>
<div class="nocov"><span class="num"><pre> 68</pre></span><pre> """</pre></div>
<div class="nocov"><span class="num"><pre> 69</pre></span><pre> This class is like an 'or' operator for validators. The first</pre></div>
<div class="nocov"><span class="num"><pre> 70</pre></span><pre> validator/converter that validates the value will be used. (You</pre></div>
<div class="nocov"><span class="num"><pre> 71</pre></span><pre> can pass in lists of validators, which will be ANDed)</pre></div>
<div class="nocov"><span class="num"><pre> 72</pre></span><pre> """</pre></div>
<div class="skip"><span class="num"><pre> 73</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 74</pre></span><pre> def attempt_convert(self, value, state, validate):</pre></div>
<div class="nocov"><span class="num"><pre> 75</pre></span><pre> lastException = None</pre></div>
<div class="nocov"><span class="num"><pre> 76</pre></span><pre> if validate is to_python:</pre></div>
<div class="nocov"><span class="num"><pre> 77</pre></span><pre> validators = self.validators[::-1]</pre></div>
<div class="nocov"><span class="num"><pre> 78</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre> 79</pre></span><pre> validators = self.validators</pre></div>
<div class="nocov"><span class="num"><pre> 80</pre></span><pre> for validator in validators:</pre></div>
<div class="nocov"><span class="num"><pre> 81</pre></span><pre> try:</pre></div>
<div class="nocov"><span class="num"><pre> 82</pre></span><pre> return validate(validator, value, state)</pre></div>
<div class="nocov"><span class="num"><pre> 83</pre></span><pre> except Invalid, e:</pre></div>
<div class="nocov"><span class="num"><pre> 84</pre></span><pre> lastException = e</pre></div>
<div class="nocov"><span class="num"><pre> 85</pre></span><pre> if self.if_invalid is NoDefault:</pre></div>
<div class="nocov"><span class="num"><pre> 86</pre></span><pre> raise lastException</pre></div>
<div class="nocov"><span class="num"><pre> 87</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre> 88</pre></span><pre> return self.if_invalid</pre></div>
<div class="skip"><span class="num"><pre> 89</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 90</pre></span><pre> def not_empty__get(self):</pre></div>
<div class="nocov"><span class="num"><pre> 91</pre></span><pre> not_empty = True</pre></div>
<div class="nocov"><span class="num"><pre> 92</pre></span><pre> for validator in self.validators:</pre></div>
<div class="nocov"><span class="num"><pre> 93</pre></span><pre> not_empty = not_empty and getattr(validator, 'not_empty', False)</pre></div>
<div class="nocov"><span class="num"><pre> 94</pre></span><pre> return not_empty</pre></div>
<div class="nocov"><span class="num"><pre> 95</pre></span><pre> not_empty = property(not_empty__get)</pre></div>
<div class="skip"><span class="num"><pre> 96</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre> 97</pre></span><pre> def is_empty(self, value):</pre></div>
<div class="skip"><span class="num"><pre> 98</pre></span><pre> # sub-validators should handle emptiness.</pre></div>
<div class="nocov"><span class="num"><pre> 99</pre></span><pre> return False</pre></div>
<div class="skip"><span class="num"><pre>100</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>101</pre></span><pre>class All(CompoundValidator):</pre></div>
<div class="skip"><span class="num"><pre>102</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>103</pre></span><pre> """</pre></div>
<div class="nocov"><span class="num"><pre>104</pre></span><pre> This class is like an 'and' operator for validators. All</pre></div>
<div class="nocov"><span class="num"><pre>105</pre></span><pre> validators must work, and the results are passed in turn through</pre></div>
<div class="nocov"><span class="num"><pre>106</pre></span><pre> all validators for conversion.</pre></div>
<div class="nocov"><span class="num"><pre>107</pre></span><pre> """</pre></div>
<div class="skip"><span class="num"><pre>108</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>109</pre></span><pre> def __repr__(self):</pre></div>
<div class="nocov"><span class="num"><pre>110</pre></span><pre> return '<All %s>' % self.validators</pre></div>
<div class="skip"><span class="num"><pre>111</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>112</pre></span><pre> def attempt_convert(self, value, state, validate):</pre></div>
<div class="skip"><span class="num"><pre>113</pre></span><pre> # To preserve the order of the transformations, we do them</pre></div>
<div class="skip"><span class="num"><pre>114</pre></span><pre> # differently when we are converting to and from python.</pre></div>
<div class="nocov"><span class="num"><pre>115</pre></span><pre> if validate is to_python:</pre></div>
<div class="nocov"><span class="num"><pre>116</pre></span><pre> validators = list(self.validators)</pre></div>
<div class="nocov"><span class="num"><pre>117</pre></span><pre> validators.reverse()</pre></div>
<div class="nocov"><span class="num"><pre>118</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre>119</pre></span><pre> validators = self.validators</pre></div>
<div class="nocov"><span class="num"><pre>120</pre></span><pre> try:</pre></div>
<div class="nocov"><span class="num"><pre>121</pre></span><pre> for validator in validators:</pre></div>
<div class="nocov"><span class="num"><pre>122</pre></span><pre> value = validate(validator, value, state)</pre></div>
<div class="nocov"><span class="num"><pre>123</pre></span><pre> return value</pre></div>
<div class="nocov"><span class="num"><pre>124</pre></span><pre> except Invalid:</pre></div>
<div class="nocov"><span class="num"><pre>125</pre></span><pre> if self.if_invalid is NoDefault:</pre></div>
<div class="nocov"><span class="num"><pre>126</pre></span><pre> raise</pre></div>
<div class="nocov"><span class="num"><pre>127</pre></span><pre> return self.if_invalid</pre></div>
<div class="skip"><span class="num"><pre>128</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>129</pre></span><pre> def with_validator(self, validator):</pre></div>
<div class="nocov"><span class="num"><pre>130</pre></span><pre> """</pre></div>
<div class="nocov"><span class="num"><pre>131</pre></span><pre> Adds the validator (or list of validators) to a copy of</pre></div>
<div class="nocov"><span class="num"><pre>132</pre></span><pre> this validator.</pre></div>
<div class="nocov"><span class="num"><pre>133</pre></span><pre> """</pre></div>
<div class="nocov"><span class="num"><pre>134</pre></span><pre> new = self.validators[:]</pre></div>
<div class="nocov"><span class="num"><pre>135</pre></span><pre> if isinstance(validator, list) or isinstance(validator, tuple):</pre></div>
<div class="nocov"><span class="num"><pre>136</pre></span><pre> new.extend(validator)</pre></div>
<div class="nocov"><span class="num"><pre>137</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre>138</pre></span><pre> new.append(validator)</pre></div>
<div class="nocov"><span class="num"><pre>139</pre></span><pre> return self.__class__(*new, **{'if_invalid': self.if_invalid})</pre></div>
<div class="skip"><span class="num"><pre>140</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>141</pre></span><pre> def join(cls, *validators):</pre></div>
<div class="nocov"><span class="num"><pre>142</pre></span><pre> """</pre></div>
<div class="nocov"><span class="num"><pre>143</pre></span><pre> Joins several validators together as a single validator,</pre></div>
<div class="nocov"><span class="num"><pre>144</pre></span><pre> filtering out None and trying to keep `All` validators from</pre></div>
<div class="nocov"><span class="num"><pre>145</pre></span><pre> being nested (which isn't needed).</pre></div>
<div class="nocov"><span class="num"><pre>146</pre></span><pre> """</pre></div>
<div class="nocov"><span class="num"><pre>147</pre></span><pre> validators = filter(lambda v: v and v is not Identity, validators)</pre></div>
<div class="nocov"><span class="num"><pre>148</pre></span><pre> if not validators:</pre></div>
<div class="nocov"><span class="num"><pre>149</pre></span><pre> return Identity</pre></div>
<div class="nocov"><span class="num"><pre>150</pre></span><pre> if len(validators) == 1:</pre></div>
<div class="nocov"><span class="num"><pre>151</pre></span><pre> return validators[0]</pre></div>
<div class="nocov"><span class="num"><pre>152</pre></span><pre> elif isinstance(validators[0], All):</pre></div>
<div class="nocov"><span class="num"><pre>153</pre></span><pre> return validators[0].with_validator(validators[1:])</pre></div>
<div class="nocov"><span class="num"><pre>154</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre>155</pre></span><pre> return cls(*validators)</pre></div>
<div class="nocov"><span class="num"><pre>156</pre></span><pre> join = classmethod(join)</pre></div>
<div class="skip"><span class="num"><pre>157</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>158</pre></span><pre> def if_missing__get(self):</pre></div>
<div class="nocov"><span class="num"><pre>159</pre></span><pre> for validator in self.validators:</pre></div>
<div class="nocov"><span class="num"><pre>160</pre></span><pre> v = validator.if_missing</pre></div>
<div class="nocov"><span class="num"><pre>161</pre></span><pre> if v is not NoDefault:</pre></div>
<div class="nocov"><span class="num"><pre>162</pre></span><pre> return v</pre></div>
<div class="nocov"><span class="num"><pre>163</pre></span><pre> return NoDefault</pre></div>
<div class="nocov"><span class="num"><pre>164</pre></span><pre> if_missing = property(if_missing__get)</pre></div>
<div class="skip"><span class="num"><pre>165</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>166</pre></span><pre> def not_empty__get(self):</pre></div>
<div class="nocov"><span class="num"><pre>167</pre></span><pre> not_empty = False</pre></div>
<div class="nocov"><span class="num"><pre>168</pre></span><pre> for validator in self.validators:</pre></div>
<div class="nocov"><span class="num"><pre>169</pre></span><pre> not_empty = not_empty or getattr(validator, 'not_empty', False)</pre></div>
<div class="nocov"><span class="num"><pre>170</pre></span><pre> return not_empty</pre></div>
<div class="nocov"><span class="num"><pre>171</pre></span><pre> not_empty = property(not_empty__get)</pre></div>
<div class="skip"><span class="num"><pre>172</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>173</pre></span><pre> def is_empty(self, value):</pre></div>
<div class="skip"><span class="num"><pre>174</pre></span><pre> # sub-validators should handle emptiness.</pre></div>
<div class="nocov"><span class="num"><pre>175</pre></span><pre> return False</pre></div>
<div class="skip"><span class="num"><pre>176</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>177</pre></span><pre>class Pipe(All):</pre></div>
<div class="nocov"><span class="num"><pre>178</pre></span><pre> """</pre></div>
<div class="nocov"><span class="num"><pre>179</pre></span><pre> This class works like 'All', all validators muss pass, but the result</pre></div>
<div class="nocov"><span class="num"><pre>180</pre></span><pre> of one validation pass is handled over to the next validator. A behaviour</pre></div>
<div class="nocov"><span class="num"><pre>181</pre></span><pre> known to Unix and GNU users as 'pipe'.</pre></div>
<div class="skip"><span class="num"><pre>182</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>183</pre></span><pre> ::</pre></div>
<div class="skip"><span class="num"><pre>184</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>185</pre></span><pre> >>> from validators import DictConverter</pre></div>
<div class="nocov"><span class="num"><pre>186</pre></span><pre> >>> pv = Pipe(validators=[DictConverter({1: 2}), DictConverter({2: 3}), DictConverter({3: 4})])</pre></div>
<div class="nocov"><span class="num"><pre>187</pre></span><pre> >>> pv.to_python(1)</pre></div>
<div class="nocov"><span class="num"><pre>188</pre></span><pre> 4</pre></div>
<div class="nocov"><span class="num"><pre>189</pre></span><pre> >>> pv.to_python(1)</pre></div>
<div class="nocov"><span class="num"><pre>190</pre></span><pre> 4</pre></div>
<div class="nocov"><span class="num"><pre>191</pre></span><pre> >>> pv.from_python(4)</pre></div>
<div class="nocov"><span class="num"><pre>192</pre></span><pre> 1</pre></div>
<div class="nocov"><span class="num"><pre>193</pre></span><pre> >>> pv.from_python(4)</pre></div>
<div class="nocov"><span class="num"><pre>194</pre></span><pre> 1</pre></div>
<div class="nocov"><span class="num"><pre>195</pre></span><pre> >>> pv.to_python(1)</pre></div>
<div class="nocov"><span class="num"><pre>196</pre></span><pre> 4</pre></div>
<div class="skip"><span class="num"><pre>197</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>198</pre></span><pre> """</pre></div>
<div class="skip"><span class="num"><pre>199</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>200</pre></span><pre> def __repr__(self):</pre></div>
<div class="nocov"><span class="num"><pre>201</pre></span><pre> return '<Pipe %s>' % self.validators</pre></div>
<div class="skip"><span class="num"><pre>202</pre></span><pre></pre></div>
<div class="nocov"><span class="num"><pre>203</pre></span><pre> def attempt_convert(self, value, state, validate):</pre></div>
<div class="skip"><span class="num"><pre>204</pre></span><pre> # To preserve the order of the transformations, we do them</pre></div>
<div class="skip"><span class="num"><pre>205</pre></span><pre> # differently when we are converting to and from python.</pre></div>
<div class="nocov"><span class="num"><pre>206</pre></span><pre> if validate is from_python:</pre></div>
<div class="nocov"><span class="num"><pre>207</pre></span><pre> validators = list(self.validators)</pre></div>
<div class="nocov"><span class="num"><pre>208</pre></span><pre> validators.reverse()</pre></div>
<div class="nocov"><span class="num"><pre>209</pre></span><pre> else:</pre></div>
<div class="nocov"><span class="num"><pre>210</pre></span><pre> validators = self.validators</pre></div>
<div class="nocov"><span class="num"><pre>211</pre></span><pre> try:</pre></div>
<div class="nocov"><span class="num"><pre>212</pre></span><pre> for validator in validators:</pre></div>
<div class="nocov"><span class="num"><pre>213</pre></span><pre> value = validate(validator, value, state)</pre></div>
<div class="nocov"><span class="num"><pre>214</pre></span><pre> return value</pre></div>
<div class="nocov"><span class="num"><pre>215</pre></span><pre> except Invalid:</pre></div>
<div class="nocov"><span class="num"><pre>216</pre></span><pre> if self.if_invalid is NoDefault:</pre></div>
<div class="nocov"><span class="num"><pre>217</pre></span><pre> raise</pre></div>
<div class="nocov"><span class="num"><pre>218</pre></span><pre> return self.if_invalid</pre></div>
<div class="skip"><span class="num"><pre>219</pre></span><pre></pre></div>
</div>
</body>
</html>