summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/_build/doctrees/environment.picklebin145406 -> 175229 bytes
-rw-r--r--docs/_build/doctrees/index.doctreebin4866 -> 4899 bytes
-rw-r--r--docs/_build/doctrees/modules.doctreebin2517 -> 2562 bytes
-rw-r--r--docs/_build/doctrees/voluptuous.doctreebin284212 -> 318146 bytes
-rw-r--r--docs/_build/doctrees/voluptuous.tests.doctreebin112046 -> 160419 bytes
-rw-r--r--docs/_build/html/_modules/voluptuous/error.html14
-rw-r--r--docs/_build/html/_modules/voluptuous/schema_builder.html245
-rw-r--r--docs/_build/html/_modules/voluptuous/tests/tests.html659
-rw-r--r--docs/_build/html/_modules/voluptuous/util.html17
-rw-r--r--docs/_build/html/_modules/voluptuous/validators.html263
-rw-r--r--docs/_build/html/genindex.html200
-rw-r--r--docs/_build/html/objects.invbin1572 -> 1844 bytes
-rw-r--r--docs/_build/html/searchindex.js2
-rw-r--r--docs/_build/html/voluptuous.html160
-rw-r--r--docs/_build/html/voluptuous.tests.html220
15 files changed, 1505 insertions, 275 deletions
diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle
index 60b5476..128a9f4 100644
--- a/docs/_build/doctrees/environment.pickle
+++ b/docs/_build/doctrees/environment.pickle
Binary files differ
diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree
index 40b0bbe..e5e3205 100644
--- a/docs/_build/doctrees/index.doctree
+++ b/docs/_build/doctrees/index.doctree
Binary files differ
diff --git a/docs/_build/doctrees/modules.doctree b/docs/_build/doctrees/modules.doctree
index 99ca649..a7e9f71 100644
--- a/docs/_build/doctrees/modules.doctree
+++ b/docs/_build/doctrees/modules.doctree
Binary files differ
diff --git a/docs/_build/doctrees/voluptuous.doctree b/docs/_build/doctrees/voluptuous.doctree
index 5cd1eda..7194dad 100644
--- a/docs/_build/doctrees/voluptuous.doctree
+++ b/docs/_build/doctrees/voluptuous.doctree
Binary files differ
diff --git a/docs/_build/doctrees/voluptuous.tests.doctree b/docs/_build/doctrees/voluptuous.tests.doctree
index 1b9a506..b0dada3 100644
--- a/docs/_build/doctrees/voluptuous.tests.doctree
+++ b/docs/_build/doctrees/voluptuous.tests.doctree
Binary files differ
diff --git a/docs/_build/html/_modules/voluptuous/error.html b/docs/_build/html/_modules/voluptuous/error.html
index de5b09b..240357a 100644
--- a/docs/_build/html/_modules/voluptuous/error.html
+++ b/docs/_build/html/_modules/voluptuous/error.html
@@ -144,6 +144,10 @@
<span class="sd">&quot;&quot;&quot;The value was found invalid by evaluation function.&quot;&quot;&quot;</span></div>
+<div class="viewcode-block" id="ContainsInvalid"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.error.ContainsInvalid">[docs]</a><span class="k">class</span> <span class="nc">ContainsInvalid</span><span class="p">(</span><span class="n">Invalid</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;List does not contain item&quot;&quot;&quot;</span></div>
+
+
<div class="viewcode-block" id="ScalarInvalid"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.error.ScalarInvalid">[docs]</a><span class="k">class</span> <span class="nc">ScalarInvalid</span><span class="p">(</span><span class="n">Invalid</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Scalars did not match.&quot;&quot;&quot;</span></div>
@@ -226,6 +230,16 @@
<div class="viewcode-block" id="ExactSequenceInvalid"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.error.ExactSequenceInvalid">[docs]</a><span class="k">class</span> <span class="nc">ExactSequenceInvalid</span><span class="p">(</span><span class="n">Invalid</span><span class="p">):</span>
<span class="k">pass</span></div>
+
+
+<div class="viewcode-block" id="NotEnoughValid"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.error.NotEnoughValid">[docs]</a><span class="k">class</span> <span class="nc">NotEnoughValid</span><span class="p">(</span><span class="n">Invalid</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;The value did not pass enough validations.&quot;&quot;&quot;</span>
+ <span class="k">pass</span></div>
+
+
+<div class="viewcode-block" id="TooManyValid"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.error.TooManyValid">[docs]</a><span class="k">class</span> <span class="nc">TooManyValid</span><span class="p">(</span><span class="n">Invalid</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;The value passed more than expected validations.&quot;&quot;&quot;</span>
+ <span class="k">pass</span></div>
</pre></div>
</div>
diff --git a/docs/_build/html/_modules/voluptuous/schema_builder.html b/docs/_build/html/_modules/voluptuous/schema_builder.html
index d715ad5..8309cab 100644
--- a/docs/_build/html/_modules/voluptuous/schema_builder.html
+++ b/docs/_build/html/_modules/voluptuous/schema_builder.html
@@ -48,10 +48,8 @@
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">contextmanager</span>
-<span class="k">try</span><span class="p">:</span>
- <span class="kn">import</span> <span class="nn">error</span> <span class="kn">as</span> <span class="nn">er</span>
-<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">error</span> <span class="k">as</span> <span class="n">er</span>
+<span class="kn">import</span> <span class="nn">itertools</span>
+<span class="kn">from</span> <span class="nn">voluptuous</span> <span class="kn">import</span> <span class="n">error</span> <span class="k">as</span> <span class="n">er</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,):</span>
<span class="nb">long</span> <span class="o">=</span> <span class="nb">int</span>
@@ -153,6 +151,9 @@
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s1">&#39;_fields&#39;</span><span class="p">)</span>
+<span class="n">primitive_types</span> <span class="o">=</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">,</span> <span class="nb">bool</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span>
+
+
<div class="viewcode-block" id="Undefined"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.Undefined">[docs]</a><span class="k">class</span> <span class="nc">Undefined</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">False</span>
@@ -164,6 +165,10 @@
<span class="n">UNDEFINED</span> <span class="o">=</span> <span class="n">Undefined</span><span class="p">()</span>
+<div class="viewcode-block" id="Self"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.Self">[docs]</a><span class="k">def</span> <span class="nf">Self</span><span class="p">():</span>
+ <span class="k">raise</span> <span class="n">er</span><span class="o">.</span><span class="n">SchemaError</span><span class="p">(</span><span class="s1">&#39;&quot;Self&quot; should never be called&#39;</span><span class="p">)</span></div>
+
+
<div class="viewcode-block" id="default_factory"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.default_factory">[docs]</a><span class="k">def</span> <span class="nf">default_factory</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="n">UNDEFINED</span> <span class="ow">or</span> <span class="nb">callable</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="k">return</span> <span class="n">value</span>
@@ -239,11 +244,57 @@
<span class="bp">self</span><span class="o">.</span><span class="n">extra</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">extra</span><span class="p">)</span> <span class="c1"># ensure the value is an integer</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_compiled</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compile</span><span class="p">(</span><span class="n">schema</span><span class="p">)</span>
+ <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="Schema.infer"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.Schema.infer">[docs]</a> <span class="k">def</span> <span class="nf">infer</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Create a Schema from concrete data (e.g. an API response).</span>
+
+<span class="sd"> For example, this will take a dict like:</span>
+
+<span class="sd"> {</span>
+<span class="sd"> &#39;foo&#39;: 1,</span>
+<span class="sd"> &#39;bar&#39;: {</span>
+<span class="sd"> &#39;a&#39;: True,</span>
+<span class="sd"> &#39;b&#39;: False</span>
+<span class="sd"> },</span>
+<span class="sd"> &#39;baz&#39;: [&#39;purple&#39;, &#39;monkey&#39;, &#39;dishwasher&#39;]</span>
+<span class="sd"> }</span>
+
+<span class="sd"> And return a Schema:</span>
+
+<span class="sd"> {</span>
+<span class="sd"> &#39;foo&#39;: int,</span>
+<span class="sd"> &#39;bar&#39;: {</span>
+<span class="sd"> &#39;a&#39;: bool,</span>
+<span class="sd"> &#39;b&#39;: bool</span>
+<span class="sd"> },</span>
+<span class="sd"> &#39;baz&#39;: [str]</span>
+<span class="sd"> }</span>
+
+<span class="sd"> Note: only very basic inference is supported.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">def</span> <span class="nf">value_to_schema_type</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">dict</span>
+ <span class="k">return</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">value_to_schema_type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">value</span><span class="p">)}</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">list</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="p">[</span><span class="n">value_to_schema_type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span>
+ <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">value_to_schema_type</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
+
<span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
- <span class="k">if</span> <span class="nb">str</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="o">==</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">schema</span><span class="p">):</span>
- <span class="c1"># Because repr is combination mixture of object and schema</span>
- <span class="k">return</span> <span class="bp">True</span>
- <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Schema</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">return</span> <span class="n">other</span><span class="o">.</span><span class="n">schema</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span>
+
+ <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
+ <span class="k">return</span> <span class="ow">not</span> <span class="p">(</span><span class="bp">self</span> <span class="o">==</span> <span class="n">other</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">schema</span><span class="p">)</span>
@@ -266,18 +317,24 @@
<span class="k">def</span> <span class="nf">_compile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">):</span>
<span class="k">if</span> <span class="n">schema</span> <span class="ow">is</span> <span class="n">Extra</span><span class="p">:</span>
<span class="k">return</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">v</span><span class="p">:</span> <span class="n">v</span>
+ <span class="k">if</span> <span class="n">schema</span> <span class="ow">is</span> <span class="n">Self</span><span class="p">:</span>
+ <span class="k">return</span> <span class="k">lambda</span> <span class="n">p</span><span class="p">,</span> <span class="n">v</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compiled</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="s2">&quot;__voluptuous_compile__&quot;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">schema</span><span class="o">.</span><span class="n">__voluptuous_compile__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">Object</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compile_object</span><span class="p">(</span><span class="n">schema</span><span class="p">)</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">collections</span><span class="o">.</span><span class="n">Mapping</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">schema</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">collections</span><span class="o">.</span><span class="n">Mapping</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compile_dict</span><span class="p">(</span><span class="n">schema</span><span class="p">)</span>
- <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">schema</span><span class="p">):</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compile_list</span><span class="p">(</span><span class="n">schema</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compile_tuple</span><span class="p">(</span><span class="n">schema</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="p">(</span><span class="nb">frozenset</span><span class="p">,</span> <span class="nb">set</span><span class="p">)):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compile_set</span><span class="p">(</span><span class="n">schema</span><span class="p">)</span>
<span class="n">type_</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">schema</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">type_</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">schema</span><span class="p">):</span>
<span class="n">type_</span> <span class="o">=</span> <span class="n">schema</span>
- <span class="k">if</span> <span class="n">type_</span> <span class="ow">in</span> <span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">long</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">complex</span><span class="p">,</span> <span class="nb">object</span><span class="p">,</span>
+ <span class="k">if</span> <span class="n">type_</span> <span class="ow">in</span> <span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">long</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">complex</span><span class="p">,</span> <span class="nb">object</span><span class="p">,</span>
<span class="nb">list</span><span class="p">,</span> <span class="nb">dict</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">None</span><span class="p">))</span> <span class="ow">or</span> <span class="nb">callable</span><span class="p">(</span><span class="n">schema</span><span class="p">):</span>
<span class="k">return</span> <span class="n">_compile_scalar</span><span class="p">(</span><span class="n">schema</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">er</span><span class="o">.</span><span class="n">SchemaError</span><span class="p">(</span><span class="s1">&#39;unsupported schema data type </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span>
@@ -306,24 +363,50 @@
<span class="n">candidates</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">_iterate_mapping_candidates</span><span class="p">(</span><span class="n">_compiled_schema</span><span class="p">))</span>
+ <span class="c1"># After we have the list of candidates in the correct order, we want to apply some optimization so that each</span>
+ <span class="c1"># key in the data being validated will be matched against the relevant schema keys only.</span>
+ <span class="c1"># No point in matching against different keys</span>
+ <span class="n">additional_candidates</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">candidates_by_key</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">skey</span><span class="p">,</span> <span class="p">(</span><span class="n">ckey</span><span class="p">,</span> <span class="n">cvalue</span><span class="p">)</span> <span class="ow">in</span> <span class="n">candidates</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">skey</span><span class="p">)</span> <span class="ow">in</span> <span class="n">primitive_types</span><span class="p">:</span>
+ <span class="n">candidates_by_key</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">skey</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">skey</span><span class="p">,</span> <span class="p">(</span><span class="n">ckey</span><span class="p">,</span> <span class="n">cvalue</span><span class="p">)))</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">skey</span><span class="p">,</span> <span class="n">Marker</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">type</span><span class="p">(</span><span class="n">skey</span><span class="o">.</span><span class="n">schema</span><span class="p">)</span> <span class="ow">in</span> <span class="n">primitive_types</span><span class="p">:</span>
+ <span class="n">candidates_by_key</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">skey</span><span class="o">.</span><span class="n">schema</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">skey</span><span class="p">,</span> <span class="p">(</span><span class="n">ckey</span><span class="p">,</span> <span class="n">cvalue</span><span class="p">)))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># These are wildcards such as &#39;int&#39;, &#39;str&#39;, &#39;Remove&#39; and others which should be applied to all keys</span>
+ <span class="n">additional_candidates</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">skey</span><span class="p">,</span> <span class="p">(</span><span class="n">ckey</span><span class="p">,</span> <span class="n">cvalue</span><span class="p">)))</span>
+
<span class="k">def</span> <span class="nf">validate_mapping</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">iterable</span><span class="p">,</span> <span class="n">out</span><span class="p">):</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">util</span> <span class="kn">import</span> <span class="n">to_utf8_py2</span>
- <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">.util</span> <span class="kn">import</span> <span class="n">to_utf8_py2</span>
<span class="n">required_keys</span> <span class="o">=</span> <span class="n">all_required_keys</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
- <span class="c1"># keeps track of all default keys that haven&#39;t been filled</span>
- <span class="n">default_keys</span> <span class="o">=</span> <span class="n">all_default_keys</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
+
+ <span class="c1"># Build a map of all provided key-value pairs.</span>
+ <span class="c1"># The type(out) is used to retain ordering in case a ordered</span>
+ <span class="c1"># map type is provided as input.</span>
+ <span class="n">key_value_map</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">out</span><span class="p">)()</span>
+ <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">:</span>
+ <span class="n">key_value_map</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+ <span class="c1"># Insert default values for non-existing keys.</span>
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">all_default_keys</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">default</span><span class="p">,</span> <span class="n">Undefined</span><span class="p">)</span> <span class="ow">and</span> \
+ <span class="n">key</span><span class="o">.</span><span class="n">schema</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">key_value_map</span><span class="p">:</span>
+ <span class="c1"># A default value has been specified for this missing</span>
+ <span class="c1"># key, insert it.</span>
+ <span class="n">key_value_map</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">schema</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">default</span><span class="p">()</span>
+
<span class="n">error</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">:</span>
- <span class="n">key</span> <span class="o">=</span> <span class="n">to_utf8_py2</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">key_value_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">key_path</span> <span class="o">=</span> <span class="n">path</span> <span class="o">+</span> <span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="n">remove_key</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="c1"># Optimization. Validate against the matching key first, then fallback to the rest</span>
+ <span class="n">relevant_candidates</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span><span class="n">candidates_by_key</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="p">[]),</span> <span class="n">additional_candidates</span><span class="p">)</span>
+
<span class="c1"># compare each given key/value against all compiled key/values</span>
<span class="c1"># schema key, (compiled key, compiled value)</span>
- <span class="k">for</span> <span class="n">skey</span><span class="p">,</span> <span class="p">(</span><span class="n">ckey</span><span class="p">,</span> <span class="n">cvalue</span><span class="p">)</span> <span class="ow">in</span> <span class="n">candidates</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">skey</span><span class="p">,</span> <span class="p">(</span><span class="n">ckey</span><span class="p">,</span> <span class="n">cvalue</span><span class="p">)</span> <span class="ow">in</span> <span class="n">relevant_candidates</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">new_key</span> <span class="o">=</span> <span class="n">ckey</span><span class="p">(</span><span class="n">key_path</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
<span class="k">except</span> <span class="n">er</span><span class="o">.</span><span class="n">Invalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
@@ -364,12 +447,10 @@
<span class="n">required_keys</span><span class="o">.</span><span class="n">discard</span><span class="p">(</span><span class="n">skey</span><span class="p">)</span>
<span class="k">break</span>
- <span class="c1"># Key and value okay, mark any Required() fields as found.</span>
+ <span class="c1"># Key and value okay, mark as found in case it was</span>
+ <span class="c1"># a Required() field.</span>
<span class="n">required_keys</span><span class="o">.</span><span class="n">discard</span><span class="p">(</span><span class="n">skey</span><span class="p">)</span>
- <span class="c1"># No need for a default if it was filled</span>
- <span class="n">default_keys</span><span class="o">.</span><span class="n">discard</span><span class="p">(</span><span class="n">skey</span><span class="p">)</span>
-
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">remove_key</span><span class="p">:</span>
@@ -381,13 +462,6 @@
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">er</span><span class="o">.</span><span class="n">Invalid</span><span class="p">(</span><span class="s1">&#39;extra keys not allowed&#39;</span><span class="p">,</span> <span class="n">key_path</span><span class="p">))</span>
<span class="c1"># else REMOVE_EXTRA: ignore the key so it&#39;s removed from output</span>
- <span class="c1"># set defaults for any that can have defaults</span>
- <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">default_keys</span><span class="p">:</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">default</span><span class="p">,</span> <span class="n">Undefined</span><span class="p">):</span> <span class="c1"># if the user provides a default with the node</span>
- <span class="n">out</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">schema</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">default</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">required_keys</span><span class="p">:</span>
- <span class="n">required_keys</span><span class="o">.</span><span class="n">discard</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
-
<span class="c1"># for any required keys left that weren&#39;t found and don&#39;t have defaults:</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">required_keys</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">msg</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="s1">&#39;msg&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">key</span><span class="o">.</span><span class="n">msg</span> <span class="k">else</span> <span class="s1">&#39;required key not provided&#39;</span>
@@ -438,7 +512,7 @@
<span class="sd"> A dictionary schema will only validate a dictionary:</span>
-<span class="sd"> &gt;&gt;&gt; validate = Schema({&#39;prop&#39;: str})</span>
+<span class="sd"> &gt;&gt;&gt; validate = Schema({})</span>
<span class="sd"> &gt;&gt;&gt; with raises(er.MultipleInvalid, &#39;expected a dictionary&#39;):</span>
<span class="sd"> ... validate([])</span>
@@ -453,6 +527,7 @@
<span class="sd"> &gt;&gt;&gt; with raises(er.MultipleInvalid, &quot;extra keys not allowed @ data[&#39;two&#39;]&quot;):</span>
<span class="sd"> ... validate({&#39;two&#39;: &#39;three&#39;})</span>
+
<span class="sd"> Validation function, in this case the &quot;int&quot; type:</span>
<span class="sd"> &gt;&gt;&gt; validate = Schema({&#39;one&#39;: &#39;two&#39;, &#39;three&#39;: &#39;four&#39;, int: str})</span>
@@ -462,17 +537,10 @@
<span class="sd"> &gt;&gt;&gt; validate({10: &#39;twenty&#39;})</span>
<span class="sd"> {10: &#39;twenty&#39;}</span>
-<span class="sd"> An empty dictionary is matched as value:</span>
-
-<span class="sd"> &gt;&gt;&gt; validate = Schema({})</span>
-<span class="sd"> &gt;&gt;&gt; with raises(er.MultipleInvalid, &#39;not a valid value&#39;):</span>
-<span class="sd"> ... validate([])</span>
-
<span class="sd"> By default, a &quot;type&quot; in the schema (in this case &quot;int&quot;) will be used</span>
<span class="sd"> purely to validate that the corresponding value is of that type. It</span>
<span class="sd"> will not Coerce the value:</span>
-<span class="sd"> &gt;&gt;&gt; validate = Schema({&#39;one&#39;: &#39;two&#39;, &#39;three&#39;: &#39;four&#39;, int: str})</span>
<span class="sd"> &gt;&gt;&gt; with raises(er.MultipleInvalid, &quot;extra keys not allowed @ data[&#39;10&#39;]&quot;):</span>
<span class="sd"> ... validate({&#39;10&#39;: &#39;twenty&#39;})</span>
@@ -560,7 +628,7 @@
<span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">er</span><span class="o">.</span><span class="n">MultipleInvalid</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
- <span class="n">out</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">out</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">__class__</span><span class="p">()</span>
<span class="k">return</span> <span class="n">base_validate</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">out</span><span class="p">)</span>
<span class="k">return</span> <span class="n">validate_dict</span>
@@ -587,6 +655,10 @@
<span class="c1"># Empty seq schema, allow any data.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">schema</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">data</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">er</span><span class="o">.</span><span class="n">MultipleInvalid</span><span class="p">([</span>
+ <span class="n">er</span><span class="o">.</span><span class="n">ValueInvalid</span><span class="p">(</span><span class="s1">&#39;not a valid value&#39;</span><span class="p">,</span> <span class="p">[</span><span class="n">value</span><span class="p">])</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">data</span>
+ <span class="p">])</span>
<span class="k">return</span> <span class="n">data</span>
<span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
@@ -648,6 +720,46 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_compile_sequence</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">_compile_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Validate a set.</span>
+
+<span class="sd"> A set is an unordered collection of unique elements.</span>
+
+<span class="sd"> &gt;&gt;&gt; validator = Schema({int})</span>
+<span class="sd"> &gt;&gt;&gt; validator(set([42])) == set([42])</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; with raises(er.Invalid, &#39;expected a set&#39;):</span>
+<span class="sd"> ... validator(42)</span>
+<span class="sd"> &gt;&gt;&gt; with raises(er.MultipleInvalid, &#39;invalid value in set&#39;):</span>
+<span class="sd"> ... validator(set([&#39;a&#39;]))</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">type_</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">schema</span><span class="p">)</span>
+ <span class="n">type_name</span> <span class="o">=</span> <span class="n">type_</span><span class="o">.</span><span class="n">__name__</span>
+
+ <span class="k">def</span> <span class="nf">validate_set</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">type_</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">er</span><span class="o">.</span><span class="n">Invalid</span><span class="p">(</span><span class="s1">&#39;expected a </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">type_name</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+
+ <span class="n">_compiled</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_compile</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">schema</span><span class="p">]</span>
+ <span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">validate</span> <span class="ow">in</span> <span class="n">_compiled</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">validate</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="k">break</span>
+ <span class="k">except</span> <span class="n">er</span><span class="o">.</span><span class="n">Invalid</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">invalid</span> <span class="o">=</span> <span class="n">er</span><span class="o">.</span><span class="n">Invalid</span><span class="p">(</span><span class="s1">&#39;invalid value in </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">type_name</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+ <span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">invalid</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">er</span><span class="o">.</span><span class="n">MultipleInvalid</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">data</span>
+
+ <span class="k">return</span> <span class="n">validate_set</span>
+
<div class="viewcode-block" id="Schema.extend"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.Schema.extend">[docs]</a> <span class="k">def</span> <span class="nf">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create a new `Schema` by merging this and the provided `schema`.</span>
@@ -677,7 +789,7 @@
<span class="c1"># for each item in the extension schema, replace duplicates</span>
<span class="c1"># or add new keys</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">schema</span><span class="p">):</span>
-
+
<span class="c1"># if the key is already in the dictionary, we need to replace it</span>
<span class="c1"># transform key to literal before checking presence</span>
<span class="k">if</span> <span class="n">key_literal</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">in</span> <span class="n">result_key_map</span><span class="p">:</span>
@@ -726,7 +838,7 @@
<span class="sd"> &gt;&gt;&gt; with raises(er.Invalid, &#39;not a valid value&#39;):</span>
<span class="sd"> ... _compile_scalar(lambda v: float(v))([], &#39;a&#39;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">schema</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">validate_instance</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">schema</span><span class="p">):</span>
<span class="k">return</span> <span class="n">data</span>
@@ -829,7 +941,6 @@
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">slots</span><span class="p">:</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">!=</span> <span class="s1">&#39;__dict__&#39;</span><span class="p">:</span>
<span class="k">yield</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">key</span><span class="p">))</span>
- <span class="k">raise</span> <span class="ne">StopIteration</span><span class="p">()</span>
<div class="viewcode-block" id="Msg"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.Msg">[docs]</a><span class="k">class</span> <span class="nc">Msg</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
@@ -905,15 +1016,11 @@
<div class="viewcode-block" id="Marker"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.Marker">[docs]</a><span class="k">class</span> <span class="nc">Marker</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Mark nodes for special treatment.&quot;&quot;&quot;</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema_</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">util</span> <span class="kn">import</span> <span class="n">to_utf8_py2</span>
- <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">.util</span> <span class="kn">import</span> <span class="n">to_utf8_py2</span>
- <span class="n">schema_</span> <span class="o">=</span> <span class="n">to_utf8_py2</span><span class="p">(</span><span class="n">schema_</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema_</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">=</span> <span class="n">schema_</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">schema_</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">=</span> <span class="n">description</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
@@ -930,7 +1037,18 @@
<span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">schema</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">&lt;</span> <span class="n">other</span><span class="o">.</span><span class="n">schema</span></div>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Marker</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">&lt;</span> <span class="n">other</span><span class="o">.</span><span class="n">schema</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">&lt;</span> <span class="n">other</span>
+
+ <span class="k">def</span> <span class="nf">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">schema</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">==</span> <span class="n">other</span>
+
+ <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
+ <span class="k">return</span> <span class="ow">not</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">==</span> <span class="n">other</span><span class="p">)</span></div>
<div class="viewcode-block" id="Optional"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.Optional">[docs]</a><span class="k">class</span> <span class="nc">Optional</span><span class="p">(</span><span class="n">Marker</span><span class="p">):</span>
@@ -956,8 +1074,9 @@
<span class="sd"> {&#39;key2&#39;: &#39;value&#39;}</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">UNDEFINED</span><span class="p">):</span>
- <span class="nb">super</span><span class="p">(</span><span class="n">Optional</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">UNDEFINED</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">(</span><span class="n">Optional</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">,</span>
+ <span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="n">default_factory</span><span class="p">(</span><span class="n">default</span><span class="p">)</span></div>
@@ -997,15 +1116,16 @@
<span class="sd"> ... &#39;social&#39;: {&#39;social_network&#39;: &#39;barfoo&#39;, &#39;token&#39;: &#39;tEMp&#39;}})</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="n">group_of_exclusion</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
- <span class="nb">super</span><span class="p">(</span><span class="n">Exclusive</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="n">group_of_exclusion</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">(</span><span class="n">Exclusive</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">,</span>
+ <span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">group_of_exclusion</span> <span class="o">=</span> <span class="n">group_of_exclusion</span></div>
<div class="viewcode-block" id="Inclusive"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.Inclusive">[docs]</a><span class="k">class</span> <span class="nc">Inclusive</span><span class="p">(</span><span class="n">Optional</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; Mark a node in the schema as inclusive.</span>
-<span class="sd"> Exclusive keys inherited from Optional:</span>
+<span class="sd"> Inclusive keys inherited from Optional:</span>
<span class="sd"> &gt;&gt;&gt; schema = Schema({</span>
<span class="sd"> ... Inclusive(&#39;filename&#39;, &#39;file&#39;): str,</span>
@@ -1064,8 +1184,9 @@
<span class="sd"> {&#39;key&#39;: []}</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">UNDEFINED</span><span class="p">):</span>
- <span class="nb">super</span><span class="p">(</span><span class="n">Required</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">UNDEFINED</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="nb">super</span><span class="p">(</span><span class="n">Required</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">,</span>
+ <span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="n">default_factory</span><span class="p">(</span><span class="n">default</span><span class="p">)</span></div>
@@ -1089,7 +1210,10 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="s2">&quot;Remove(</span><span class="si">%r</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">schema</span><span class="p">,)</span></div>
+ <span class="k">return</span> <span class="s2">&quot;Remove(</span><span class="si">%r</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">schema</span><span class="p">,)</span>
+
+ <span class="k">def</span> <span class="nf">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">object</span><span class="o">.</span><span class="n">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<div class="viewcode-block" id="message"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.schema_builder.message">[docs]</a><span class="k">def</span> <span class="nf">message</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">cls</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
@@ -1194,7 +1318,8 @@
<span class="n">returns</span> <span class="o">=</span> <span class="n">schema_arguments</span><span class="p">[</span><span class="n">RETURNS_KEY</span><span class="p">]</span>
<span class="k">del</span> <span class="n">schema_arguments</span><span class="p">[</span><span class="n">RETURNS_KEY</span><span class="p">]</span>
- <span class="n">input_schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">schema_arguments</span><span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">schema_arguments</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="k">else</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span>
+ <span class="n">input_schema</span> <span class="o">=</span> <span class="p">(</span><span class="n">Schema</span><span class="p">(</span><span class="n">schema_arguments</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="n">ALLOW_EXTRA</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">schema_arguments</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="k">else</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">)</span>
<span class="n">output_schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">returns</span><span class="p">)</span> <span class="k">if</span> <span class="n">returns_defined</span> <span class="k">else</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span>
<span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
diff --git a/docs/_build/html/_modules/voluptuous/tests/tests.html b/docs/_build/html/_modules/voluptuous/tests/tests.html
index ca19f2d..373fc6d 100644
--- a/docs/_build/html/_modules/voluptuous/tests/tests.html
+++ b/docs/_build/html/_modules/voluptuous/tests/tests.html
@@ -43,16 +43,20 @@
<h1>Source code for voluptuous.tests.tests</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">import</span> <span class="nn">collections</span>
-<span class="kn">from</span> <span class="nn">nose.tools</span> <span class="kn">import</span> <span class="n">assert_equal</span><span class="p">,</span> <span class="n">assert_raises</span><span class="p">,</span> <span class="n">assert_true</span>
+<span class="kn">import</span> <span class="nn">os</span>
+<span class="kn">import</span> <span class="nn">sys</span>
+
+<span class="kn">from</span> <span class="nn">nose.tools</span> <span class="kn">import</span> <span class="n">assert_equal</span><span class="p">,</span> <span class="n">assert_false</span><span class="p">,</span> <span class="n">assert_raises</span><span class="p">,</span> <span class="n">assert_true</span>
<span class="kn">from</span> <span class="nn">voluptuous</span> <span class="kn">import</span> <span class="p">(</span>
- <span class="n">Schema</span><span class="p">,</span> <span class="n">Required</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Extra</span><span class="p">,</span> <span class="n">Invalid</span><span class="p">,</span> <span class="n">In</span><span class="p">,</span> <span class="n">Remove</span><span class="p">,</span> <span class="n">Literal</span><span class="p">,</span>
- <span class="n">Url</span><span class="p">,</span> <span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">LiteralInvalid</span><span class="p">,</span> <span class="n">NotIn</span><span class="p">,</span> <span class="n">Match</span><span class="p">,</span> <span class="n">Email</span><span class="p">,</span>
+ <span class="n">Schema</span><span class="p">,</span> <span class="n">Required</span><span class="p">,</span> <span class="n">Exclusive</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Extra</span><span class="p">,</span> <span class="n">Invalid</span><span class="p">,</span> <span class="n">In</span><span class="p">,</span> <span class="n">Remove</span><span class="p">,</span> <span class="n">Literal</span><span class="p">,</span>
+ <span class="n">Url</span><span class="p">,</span> <span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">LiteralInvalid</span><span class="p">,</span> <span class="n">TypeInvalid</span><span class="p">,</span> <span class="n">NotIn</span><span class="p">,</span> <span class="n">Match</span><span class="p">,</span> <span class="n">Email</span><span class="p">,</span>
<span class="n">Replace</span><span class="p">,</span> <span class="n">Range</span><span class="p">,</span> <span class="n">Coerce</span><span class="p">,</span> <span class="n">All</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Length</span><span class="p">,</span> <span class="n">FqdnUrl</span><span class="p">,</span> <span class="n">ALLOW_EXTRA</span><span class="p">,</span> <span class="n">PREVENT_EXTRA</span><span class="p">,</span>
- <span class="n">validate</span><span class="p">,</span> <span class="n">ExactSequence</span><span class="p">,</span> <span class="n">Equal</span><span class="p">,</span> <span class="n">Unordered</span><span class="p">,</span> <span class="n">Number</span><span class="p">,</span> <span class="n">Date</span><span class="p">,</span> <span class="n">Datetime</span>
-<span class="p">)</span>
+ <span class="n">validate</span><span class="p">,</span> <span class="n">ExactSequence</span><span class="p">,</span> <span class="n">Equal</span><span class="p">,</span> <span class="n">Unordered</span><span class="p">,</span> <span class="n">Number</span><span class="p">,</span> <span class="n">Maybe</span><span class="p">,</span> <span class="n">Datetime</span><span class="p">,</span> <span class="n">Date</span><span class="p">,</span>
+ <span class="n">Contains</span><span class="p">,</span> <span class="n">Marker</span><span class="p">,</span> <span class="n">IsDir</span><span class="p">,</span> <span class="n">IsFile</span><span class="p">,</span> <span class="n">PathExists</span><span class="p">,</span> <span class="n">SomeOf</span><span class="p">,</span> <span class="n">TooManyValid</span><span class="p">,</span> <span class="n">Self</span><span class="p">,</span>
+ <span class="n">raises</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">voluptuous.humanize</span> <span class="kn">import</span> <span class="n">humanize_error</span>
-<span class="kn">from</span> <span class="nn">voluptuous.util</span> <span class="kn">import</span> <span class="n">to_utf8_py2</span><span class="p">,</span> <span class="n">u</span>
+<span class="kn">from</span> <span class="nn">voluptuous.util</span> <span class="kn">import</span> <span class="n">u</span>
<div class="viewcode-block" id="test_exact_sequence"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_exact_sequence">[docs]</a><span class="k">def</span> <span class="nf">test_exact_sequence</span><span class="p">():</span>
@@ -116,6 +120,17 @@
<span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise NotInInvalid&quot;</span></div>
+<div class="viewcode-block" id="test_contains"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_contains">[docs]</a><span class="k">def</span> <span class="nf">test_contains</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Verify contains validation method.&quot;&quot;&quot;</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s1">&#39;color&#39;</span><span class="p">:</span> <span class="n">Contains</span><span class="p">(</span><span class="s1">&#39;red&#39;</span><span class="p">)})</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s1">&#39;color&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;blue&#39;</span><span class="p">,</span> <span class="s1">&#39;red&#39;</span><span class="p">,</span> <span class="s1">&#39;yellow&#39;</span><span class="p">]})</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s1">&#39;color&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;blue&#39;</span><span class="p">,</span> <span class="s1">&#39;yellow&#39;</span><span class="p">]})</span>
+ <span class="k">except</span> <span class="n">Invalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
+ <span class="s2">&quot;value is not allowed for dictionary value @ data[&#39;color&#39;]&quot;</span><span class="p">)</span></div>
+
+
<div class="viewcode-block" id="test_remove"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_remove">[docs]</a><span class="k">def</span> <span class="nf">test_remove</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;Verify that Remove works.&quot;&quot;&quot;</span>
<span class="c1"># remove dict keys</span>
@@ -184,6 +199,39 @@
<span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span></div>
+<div class="viewcode-block" id="test_class"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_class">[docs]</a><span class="k">def</span> <span class="nf">test_class</span><span class="p">():</span>
+ <span class="k">class</span> <span class="nc">C1</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="k">pass</span>
+
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">C1</span><span class="p">)</span>
+ <span class="n">schema</span><span class="p">(</span><span class="n">C1</span><span class="p">())</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="s2">&quot;expected C1&quot;</span><span class="p">)</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errors</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">TypeInvalid</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span>
+
+ <span class="c1"># In Python 2, this will be an old-style class (classobj instance)</span>
+ <span class="k">class</span> <span class="nc">C2</span><span class="p">:</span>
+ <span class="k">pass</span>
+
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">C2</span><span class="p">)</span>
+ <span class="n">schema</span><span class="p">(</span><span class="n">C2</span><span class="p">())</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="s2">&quot;expected C2&quot;</span><span class="p">)</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errors</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">TypeInvalid</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span></div>
+
+
<div class="viewcode-block" id="test_email_validation"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_email_validation">[docs]</a><span class="k">def</span> <span class="nf">test_email_validation</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with valid email &quot;&quot;&quot;</span>
<span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;email&quot;</span><span class="p">:</span> <span class="n">Email</span><span class="p">()})</span>
@@ -406,6 +454,69 @@
<span class="n">assert_equal</span><span class="p">(</span><span class="n">extended</span><span class="o">.</span><span class="n">schema</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;a&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;b&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="s1">&#39;c&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> <span class="s1">&#39;e&#39;</span><span class="p">:</span> <span class="nb">int</span><span class="p">},</span> <span class="s1">&#39;d&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">})</span></div>
+<div class="viewcode-block" id="test_equality"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_equality">[docs]</a><span class="k">def</span> <span class="nf">test_equality</span><span class="p">():</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">Schema</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">),</span> <span class="n">Schema</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">))</span>
+
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">Schema</span><span class="p">([</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">]),</span>
+ <span class="n">Schema</span><span class="p">([</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">]))</span>
+
+ <span class="c1"># Ensure two Schemas w/ two equivalent dicts initialized in a different</span>
+ <span class="c1"># order are considered equal.</span>
+ <span class="n">dict_a</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">dict_a</span><span class="p">[</span><span class="s1">&#39;foo&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="n">dict_a</span><span class="p">[</span><span class="s1">&#39;bar&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span>
+ <span class="n">dict_a</span><span class="p">[</span><span class="s1">&#39;baz&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span>
+
+ <span class="n">dict_b</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">dict_b</span><span class="p">[</span><span class="s1">&#39;baz&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span>
+ <span class="n">dict_b</span><span class="p">[</span><span class="s1">&#39;bar&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span>
+ <span class="n">dict_b</span><span class="p">[</span><span class="s1">&#39;foo&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">Schema</span><span class="p">(</span><span class="n">dict_a</span><span class="p">),</span> <span class="n">Schema</span><span class="p">(</span><span class="n">dict_b</span><span class="p">))</span></div>
+
+
+<div class="viewcode-block" id="test_equality_negative"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_equality_negative">[docs]</a><span class="k">def</span> <span class="nf">test_equality_negative</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Verify that Schema objects are not equal to string representations&quot;&quot;&quot;</span>
+ <span class="n">assert_false</span><span class="p">(</span><span class="n">Schema</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;foo&#39;</span><span class="p">)</span>
+
+ <span class="n">assert_false</span><span class="p">(</span><span class="n">Schema</span><span class="p">([</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">])</span> <span class="o">==</span> <span class="s2">&quot;[&#39;foo&#39;, &#39;bar&#39;]&quot;</span><span class="p">)</span>
+ <span class="n">assert_false</span><span class="p">(</span><span class="n">Schema</span><span class="p">([</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">])</span> <span class="o">==</span> <span class="n">Schema</span><span class="p">(</span><span class="s2">&quot;[&#39;foo&#39;, &#39;bar&#39;]&quot;</span><span class="p">))</span>
+
+ <span class="n">assert_false</span><span class="p">(</span><span class="n">Schema</span><span class="p">({</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">})</span> <span class="o">==</span> <span class="s2">&quot;{&#39;foo&#39;: 1, &#39;bar&#39;: 2}&quot;</span><span class="p">)</span>
+ <span class="n">assert_false</span><span class="p">(</span><span class="n">Schema</span><span class="p">({</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">})</span> <span class="o">==</span> <span class="n">Schema</span><span class="p">(</span><span class="s2">&quot;{&#39;foo&#39;: 1, &#39;bar&#39;: 2}&quot;</span><span class="p">))</span></div>
+
+
+<div class="viewcode-block" id="test_inequality"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_inequality">[docs]</a><span class="k">def</span> <span class="nf">test_inequality</span><span class="p">():</span>
+ <span class="n">assert_true</span><span class="p">(</span><span class="n">Schema</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="s1">&#39;foo&#39;</span><span class="p">)</span>
+
+ <span class="n">assert_true</span><span class="p">(</span><span class="n">Schema</span><span class="p">([</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">])</span> <span class="o">!=</span> <span class="s2">&quot;[&#39;foo&#39;, &#39;bar&#39;]&quot;</span><span class="p">)</span>
+ <span class="n">assert_true</span><span class="p">(</span><span class="n">Schema</span><span class="p">([</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">])</span> <span class="o">!=</span> <span class="n">Schema</span><span class="p">(</span><span class="s2">&quot;[&#39;foo&#39;, &#39;bar&#39;]&quot;</span><span class="p">))</span>
+
+ <span class="n">assert_true</span><span class="p">(</span><span class="n">Schema</span><span class="p">({</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">})</span> <span class="o">!=</span> <span class="s2">&quot;{&#39;foo&#39;: 1, &#39;bar&#39;: 2}&quot;</span><span class="p">)</span>
+ <span class="n">assert_true</span><span class="p">(</span><span class="n">Schema</span><span class="p">({</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">})</span> <span class="o">!=</span> <span class="n">Schema</span><span class="p">(</span><span class="s2">&quot;{&#39;foo&#39;: 1, &#39;bar&#39;: 2}&quot;</span><span class="p">))</span></div>
+
+
+<div class="viewcode-block" id="test_inequality_negative"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_inequality_negative">[docs]</a><span class="k">def</span> <span class="nf">test_inequality_negative</span><span class="p">():</span>
+ <span class="n">assert_false</span><span class="p">(</span><span class="n">Schema</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="n">Schema</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">))</span>
+
+ <span class="n">assert_false</span><span class="p">(</span><span class="n">Schema</span><span class="p">([</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">])</span> <span class="o">!=</span>
+ <span class="n">Schema</span><span class="p">([</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">]))</span>
+
+ <span class="c1"># Ensure two Schemas w/ two equivalent dicts initialized in a different</span>
+ <span class="c1"># order are considered equal.</span>
+ <span class="n">dict_a</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">dict_a</span><span class="p">[</span><span class="s1">&#39;foo&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="n">dict_a</span><span class="p">[</span><span class="s1">&#39;bar&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span>
+ <span class="n">dict_a</span><span class="p">[</span><span class="s1">&#39;baz&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span>
+
+ <span class="n">dict_b</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">dict_b</span><span class="p">[</span><span class="s1">&#39;baz&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span>
+ <span class="n">dict_b</span><span class="p">[</span><span class="s1">&#39;bar&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span>
+ <span class="n">dict_b</span><span class="p">[</span><span class="s1">&#39;foo&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="n">assert_false</span><span class="p">(</span><span class="n">Schema</span><span class="p">(</span><span class="n">dict_a</span><span class="p">)</span> <span class="o">!=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">dict_b</span><span class="p">))</span></div>
+
+
<div class="viewcode-block" id="test_repr"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_repr">[docs]</a><span class="k">def</span> <span class="nf">test_repr</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;Verify that __repr__ returns valid Python expressions&quot;&quot;&quot;</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">Match</span><span class="p">(</span><span class="s1">&#39;a pattern&#39;</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="s1">&#39;message&#39;</span><span class="p">)</span>
@@ -414,6 +525,7 @@
<span class="n">max_included</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="s1">&#39;number not in range&#39;</span><span class="p">)</span>
<span class="n">coerce_</span> <span class="o">=</span> <span class="n">Coerce</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="s2">&quot;moo&quot;</span><span class="p">)</span>
<span class="n">all_</span> <span class="o">=</span> <span class="n">All</span><span class="p">(</span><span class="s1">&#39;10&#39;</span><span class="p">,</span> <span class="n">Coerce</span><span class="p">(</span><span class="nb">int</span><span class="p">),</span> <span class="n">msg</span><span class="o">=</span><span class="s1">&#39;all msg&#39;</span><span class="p">)</span>
+ <span class="n">maybe_int</span> <span class="o">=</span> <span class="n">Maybe</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
<span class="n">assert_equal</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">match</span><span class="p">),</span> <span class="s2">&quot;Match(&#39;a pattern&#39;, msg=&#39;message&#39;)&quot;</span><span class="p">)</span>
<span class="n">assert_equal</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">replace</span><span class="p">),</span> <span class="s2">&quot;Replace(&#39;you&#39;, &#39;I&#39;, msg=&#39;you and I&#39;)&quot;</span><span class="p">)</span>
@@ -422,7 +534,8 @@
<span class="s2">&quot;Range(min=0, max=42, min_included=False, max_included=False, msg=&#39;number not in range&#39;)&quot;</span>
<span class="p">)</span>
<span class="n">assert_equal</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">coerce_</span><span class="p">),</span> <span class="s2">&quot;Coerce(int, msg=&#39;moo&#39;)&quot;</span><span class="p">)</span>
- <span class="n">assert_equal</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">all_</span><span class="p">),</span> <span class="s2">&quot;All(&#39;10&#39;, Coerce(int, msg=None), msg=&#39;all msg&#39;)&quot;</span><span class="p">)</span></div>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">all_</span><span class="p">),</span> <span class="s2">&quot;All(&#39;10&#39;, Coerce(int, msg=None), msg=&#39;all msg&#39;)&quot;</span><span class="p">)</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">maybe_int</span><span class="p">),</span> <span class="s2">&quot;Any(None, </span><span class="si">%s</span><span class="s2">, msg=None)&quot;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">))</span></div>
<div class="viewcode-block" id="test_list_validation_messages"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_list_validation_messages">[docs]</a><span class="k">def</span> <span class="nf">test_list_validation_messages</span><span class="p">():</span>
@@ -542,46 +655,24 @@
<span class="n">s</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span></div>
+<div class="viewcode-block" id="test_maybe"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_maybe">[docs]</a><span class="k">def</span> <span class="nf">test_maybe</span><span class="p">():</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">Maybe</span><span class="p">(</span><span class="nb">int</span><span class="p">))</span>
+ <span class="k">assert</span> <span class="n">s</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
+ <span class="k">assert</span> <span class="n">s</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span> <span class="ow">is</span> <span class="bp">None</span>
+ <span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">)</span>
+
+ <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">Maybe</span><span class="p">({</span><span class="nb">str</span><span class="p">:</span> <span class="n">Coerce</span><span class="p">(</span><span class="nb">int</span><span class="p">)}))</span>
+ <span class="k">assert</span> <span class="n">s</span><span class="p">({</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="s1">&#39;100&#39;</span><span class="p">})</span> <span class="o">==</span> <span class="p">{</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="mi">100</span><span class="p">}</span>
+ <span class="k">assert</span> <span class="n">s</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span> <span class="ow">is</span> <span class="bp">None</span>
+ <span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="s1">&#39;bar&#39;</span><span class="p">})</span></div>
+
+
<div class="viewcode-block" id="test_empty_list_as_exact"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_empty_list_as_exact">[docs]</a><span class="k">def</span> <span class="nf">test_empty_list_as_exact</span><span class="p">():</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">([])</span>
<span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">s</span><span class="p">([])</span></div>
-<div class="viewcode-block" id="test_empty_dict_as_exact"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_empty_dict_as_exact">[docs]</a><span class="k">def</span> <span class="nf">test_empty_dict_as_exact</span><span class="p">():</span>
- <span class="c1"># {} always evaluates as {}</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({})</span>
- <span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;extra&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">})</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({},</span> <span class="n">extra</span><span class="o">=</span><span class="n">ALLOW_EXTRA</span><span class="p">)</span> <span class="c1"># this should not be used</span>
- <span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;extra&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">})</span>
-
- <span class="c1"># {...} evaluates as Schema({...})</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="nb">int</span><span class="p">})</span>
- <span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;extra&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">})</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="nb">int</span><span class="p">},</span> <span class="n">extra</span><span class="o">=</span><span class="n">ALLOW_EXTRA</span><span class="p">)</span>
- <span class="n">s</span><span class="p">({</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;extra&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">})</span>
-
- <span class="c1"># dict matches {} or {...}</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">dict</span><span class="p">)</span>
- <span class="n">s</span><span class="p">({</span><span class="s1">&#39;extra&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">})</span>
- <span class="n">s</span><span class="p">({})</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="n">PREVENT_EXTRA</span><span class="p">)</span>
- <span class="n">s</span><span class="p">({</span><span class="s1">&#39;extra&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">})</span>
- <span class="n">s</span><span class="p">({})</span>
-
- <span class="c1"># nested {} evaluate as {}</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span>
- <span class="s1">&#39;inner&#39;</span><span class="p">:</span> <span class="p">{}</span>
- <span class="p">},</span> <span class="n">extra</span><span class="o">=</span><span class="n">ALLOW_EXTRA</span><span class="p">)</span>
- <span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;inner&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;extra&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}})</span>
- <span class="n">s</span><span class="p">({})</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span>
- <span class="s1">&#39;inner&#39;</span><span class="p">:</span> <span class="n">Schema</span><span class="p">({},</span> <span class="n">extra</span><span class="o">=</span><span class="n">ALLOW_EXTRA</span><span class="p">)</span>
- <span class="p">})</span>
- <span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;inner&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;extra&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}})</span>
- <span class="n">s</span><span class="p">({})</span></div>
-
-
<div class="viewcode-block" id="test_schema_decorator_match_with_args"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_match_with_args">[docs]</a><span class="k">def</span> <span class="nf">test_schema_decorator_match_with_args</span><span class="p">():</span>
<span class="nd">@validate</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">fn</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
@@ -662,20 +753,50 @@
<span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">fn</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
-<div class="viewcode-block" id="test_unicode_key_is_converted_to_utf8_when_in_marker"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_unicode_key_is_converted_to_utf8_when_in_marker">[docs]</a><span class="k">def</span> <span class="nf">test_unicode_key_is_converted_to_utf8_when_in_marker</span><span class="p">():</span>
- <span class="sd">&quot;&quot;&quot;Verify that when using unicode key the &#39;u&#39; prefix is not thrown in the exception&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="n">Required</span><span class="p">(</span><span class="n">u</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)):</span> <span class="mi">1</span><span class="p">})</span>
- <span class="c1"># Can&#39;t use nose&#39;s raises (because we need to access the raised</span>
- <span class="c1"># exception, nor assert_raises which fails with Python 2.6.9.</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">schema</span><span class="p">({})</span>
- <span class="k">except</span> <span class="n">Invalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">assert_equal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="s2">&quot;required key not provided @ data[&#39;q&#39;]&quot;</span><span class="p">)</span></div>
+<div class="viewcode-block" id="test_schema_decorator_partial_match_called_with_args"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_partial_match_called_with_args">[docs]</a><span class="k">def</span> <span class="nf">test_schema_decorator_partial_match_called_with_args</span><span class="p">():</span>
+ <span class="nd">@validate</span><span class="p">(</span><span class="n">arg1</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">fn</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">arg1</span>
+
+ <span class="n">fn</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;foo&quot;</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="test_schema_decorator_partial_unmatch_called_with_args"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_partial_unmatch_called_with_args">[docs]</a><span class="k">def</span> <span class="nf">test_schema_decorator_partial_unmatch_called_with_args</span><span class="p">():</span>
+ <span class="nd">@validate</span><span class="p">(</span><span class="n">arg1</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">fn</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">arg1</span>
+
+ <span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">fn</span><span class="p">,</span> <span class="s2">&quot;bar&quot;</span><span class="p">,</span> <span class="s2">&quot;foo&quot;</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="test_schema_decorator_partial_match_called_with_kwargs"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_partial_match_called_with_kwargs">[docs]</a><span class="k">def</span> <span class="nf">test_schema_decorator_partial_match_called_with_kwargs</span><span class="p">():</span>
+ <span class="nd">@validate</span><span class="p">(</span><span class="n">arg2</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">fn</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">arg1</span>
+
+ <span class="n">fn</span><span class="p">(</span><span class="n">arg1</span><span class="o">=</span><span class="s2">&quot;foo&quot;</span><span class="p">,</span> <span class="n">arg2</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="test_schema_decorator_partial_unmatch_called_with_kwargs"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_partial_unmatch_called_with_kwargs">[docs]</a><span class="k">def</span> <span class="nf">test_schema_decorator_partial_unmatch_called_with_kwargs</span><span class="p">():</span>
+ <span class="nd">@validate</span><span class="p">(</span><span class="n">arg2</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">fn</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">arg1</span>
+
+ <span class="n">assert_raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="n">fn</span><span class="p">,</span> <span class="n">arg1</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">arg2</span><span class="o">=</span><span class="s2">&quot;foo&quot;</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="test_unicode_as_key"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_unicode_as_key">[docs]</a><span class="k">def</span> <span class="nf">test_unicode_as_key</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,):</span>
+ <span class="n">text_type</span> <span class="o">=</span> <span class="nb">str</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">text_type</span> <span class="o">=</span> <span class="nb">unicode</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="n">text_type</span><span class="p">:</span> <span class="nb">int</span><span class="p">})</span>
+ <span class="n">schema</span><span class="p">({</span><span class="n">u</span><span class="p">(</span><span class="s2">&quot;foobar&quot;</span><span class="p">):</span> <span class="mi">1</span><span class="p">})</span></div>
<div class="viewcode-block" id="test_number_validation_with_string"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_validation_with_string">[docs]</a><span class="k">def</span> <span class="nf">test_number_validation_with_string</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with string&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">)})</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;teststr&#39;</span><span class="p">})</span>
<span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
@@ -685,20 +806,9 @@
<span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid for String&quot;</span></div>
-<div class="viewcode-block" id="test_unicode_key_is_converted_to_utf8_when_plain_text"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_unicode_key_is_converted_to_utf8_when_plain_text">[docs]</a><span class="k">def</span> <span class="nf">test_unicode_key_is_converted_to_utf8_when_plain_text</span><span class="p">():</span>
- <span class="n">key</span> <span class="o">=</span> <span class="n">u</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">})</span>
- <span class="c1"># Can&#39;t use nose&#39;s raises (because we need to access the raised</span>
- <span class="c1"># exception, nor assert_raises which fails with Python 2.6.9.</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">schema</span><span class="p">({</span><span class="n">key</span><span class="p">:</span> <span class="s1">&#39;will fail&#39;</span><span class="p">})</span>
- <span class="k">except</span> <span class="n">Invalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">assert_equal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="s2">&quot;expected int for dictionary value @ data[&#39;q&#39;]&quot;</span><span class="p">)</span></div>
-
-
<div class="viewcode-block" id="test_number_validation_with_invalid_precision_invalid_scale"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_validation_with_invalid_precision_invalid_scale">[docs]</a><span class="k">def</span> <span class="nf">test_number_validation_with_invalid_precision_invalid_scale</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with invalid precision and scale&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">)})</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;123456.712&#39;</span><span class="p">})</span>
<span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
@@ -710,40 +820,35 @@
<div class="viewcode-block" id="test_number_validation_with_valid_precision_scale_yield_decimal_true"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_validation_with_valid_precision_scale_yield_decimal_true">[docs]</a><span class="k">def</span> <span class="nf">test_number_validation_with_valid_precision_scale_yield_decimal_true</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with valid precision and scale&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
<span class="n">out_</span> <span class="o">=</span> <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;1234.00&#39;</span><span class="p">})</span>
<span class="n">assert_equal</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">out_</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">)),</span> <span class="mf">1234.00</span><span class="p">)</span></div>
<div class="viewcode-block" id="test_number_when_precision_scale_none_yield_decimal_true"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_when_precision_scale_none_yield_decimal_true">[docs]</a><span class="k">def</span> <span class="nf">test_number_when_precision_scale_none_yield_decimal_true</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with no precision and scale&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
<span class="n">out_</span> <span class="o">=</span> <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;12345678901234&#39;</span><span class="p">})</span>
<span class="n">assert_equal</span><span class="p">(</span><span class="n">out_</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">),</span> <span class="mi">12345678901234</span><span class="p">)</span></div>
<div class="viewcode-block" id="test_number_when_precision_none_n_valid_scale_case1_yield_decimal_true"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_when_precision_none_n_valid_scale_case1_yield_decimal_true">[docs]</a><span class="k">def</span> <span class="nf">test_number_when_precision_none_n_valid_scale_case1_yield_decimal_true</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with no precision and valid scale case 1&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
<span class="n">out_</span> <span class="o">=</span> <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;123456789.34&#39;</span><span class="p">})</span>
<span class="n">assert_equal</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">out_</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">)),</span> <span class="mf">123456789.34</span><span class="p">)</span></div>
<div class="viewcode-block" id="test_number_when_precision_none_n_valid_scale_case2_yield_decimal_true"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_when_precision_none_n_valid_scale_case2_yield_decimal_true">[docs]</a><span class="k">def</span> <span class="nf">test_number_when_precision_none_n_valid_scale_case2_yield_decimal_true</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with no precision and valid scale case 2 with zero in decimal part&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
<span class="n">out_</span> <span class="o">=</span> <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;123456789012.00&#39;</span><span class="p">})</span>
<span class="n">assert_equal</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">out_</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">)),</span> <span class="mf">123456789012.00</span><span class="p">)</span></div>
-<div class="viewcode-block" id="test_to_utf8"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_to_utf8">[docs]</a><span class="k">def</span> <span class="nf">test_to_utf8</span><span class="p">():</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">u</span><span class="p">(</span><span class="s1">&#39;hello&#39;</span><span class="p">)</span>
- <span class="n">assert_true</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">to_utf8_py2</span><span class="p">(</span><span class="n">s</span><span class="p">),</span> <span class="nb">str</span><span class="p">))</span></div>
-
-
<div class="viewcode-block" id="test_number_when_precision_none_n_invalid_scale_yield_decimal_true"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_when_precision_none_n_invalid_scale_yield_decimal_true">[docs]</a><span class="k">def</span> <span class="nf">test_number_when_precision_none_n_invalid_scale_yield_decimal_true</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with no precision and invalid scale&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;12345678901.234&#39;</span><span class="p">})</span>
<span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
@@ -755,14 +860,14 @@
<div class="viewcode-block" id="test_number_when_valid_precision_n_scale_none_yield_decimal_true"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_when_valid_precision_n_scale_none_yield_decimal_true">[docs]</a><span class="k">def</span> <span class="nf">test_number_when_valid_precision_n_scale_none_yield_decimal_true</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with no precision and valid scale&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
<span class="n">out_</span> <span class="o">=</span> <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;1234567.8901234&#39;</span><span class="p">})</span>
<span class="n">assert_equal</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">out_</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">)),</span> <span class="mf">1234567.8901234</span><span class="p">)</span></div>
<div class="viewcode-block" id="test_number_when_invalid_precision_n_scale_none_yield_decimal_true"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_when_invalid_precision_n_scale_none_yield_decimal_true">[docs]</a><span class="k">def</span> <span class="nf">test_number_when_invalid_precision_n_scale_none_yield_decimal_true</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with no precision and invalid scale&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">True</span><span class="p">)})</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;12345674.8901234&#39;</span><span class="p">})</span>
<span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
@@ -774,7 +879,7 @@
<div class="viewcode-block" id="test_number_validation_with_valid_precision_scale_yield_decimal_false"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_number_validation_with_valid_precision_scale_yield_decimal_false">[docs]</a><span class="k">def</span> <span class="nf">test_number_validation_with_valid_precision_scale_yield_decimal_false</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot; test with Number with valid precision, scale and no yield_decimal&quot;&quot;&quot;</span>
- <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span> <span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">False</span><span class="p">)})</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">Number</span><span class="p">(</span><span class="n">precision</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">yield_decimal</span><span class="o">=</span><span class="bp">False</span><span class="p">)})</span>
<span class="n">out_</span> <span class="o">=</span> <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;1234.00&#39;</span><span class="p">})</span>
<span class="n">assert_equal</span><span class="p">(</span><span class="n">out_</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;number&quot;</span><span class="p">),</span> <span class="s1">&#39;1234.00&#39;</span><span class="p">)</span></div>
@@ -799,8 +904,408 @@
<div class="viewcode-block" id="test_date"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_date">[docs]</a><span class="k">def</span> <span class="nf">test_date</span><span class="p">():</span>
<span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;date&quot;</span><span class="p">:</span> <span class="n">Date</span><span class="p">()})</span>
<span class="n">schema</span><span class="p">({</span><span class="s2">&quot;date&quot;</span><span class="p">:</span> <span class="s2">&quot;2016-10-24&quot;</span><span class="p">})</span>
- <span class="n">assert_raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;date&quot;</span><span class="p">:</span> <span class="s2">&quot;2016-10-2&quot;</span><span class="p">})</span>
<span class="n">assert_raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;date&quot;</span><span class="p">:</span> <span class="s2">&quot;2016-10-24Z&quot;</span><span class="p">})</span></div>
+
+
+<div class="viewcode-block" id="test_date_custom_format"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_date_custom_format">[docs]</a><span class="k">def</span> <span class="nf">test_date_custom_format</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;date&quot;</span><span class="p">:</span> <span class="n">Date</span><span class="p">(</span><span class="s2">&quot;%Y%m</span><span class="si">%d</span><span class="s2">&quot;</span><span class="p">)})</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;date&quot;</span><span class="p">:</span> <span class="s2">&quot;20161024&quot;</span><span class="p">})</span>
+ <span class="n">assert_raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;date&quot;</span><span class="p">:</span> <span class="s2">&quot;2016-10-24&quot;</span><span class="p">})</span></div>
+
+
+<div class="viewcode-block" id="test_ordered_dict"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_ordered_dict">[docs]</a><span class="k">def</span> <span class="nf">test_ordered_dict</span><span class="p">():</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">collections</span><span class="p">,</span> <span class="s1">&#39;OrderedDict&#39;</span><span class="p">):</span>
+ <span class="c1"># collections.OrderedDict was added in Python2.7; only run if present</span>
+ <span class="k">return</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="n">Number</span><span class="p">():</span> <span class="n">Number</span><span class="p">()})</span> <span class="c1"># x, y pairs (for interpolation or something)</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">([(</span><span class="mf">5.0</span><span class="p">,</span> <span class="mf">3.7</span><span class="p">),</span> <span class="p">(</span><span class="mf">24.0</span><span class="p">,</span> <span class="mf">8.7</span><span class="p">),</span> <span class="p">(</span><span class="mf">43.0</span><span class="p">,</span> <span class="mf">1.5</span><span class="p">),</span>
+ <span class="p">(</span><span class="mf">62.0</span><span class="p">,</span> <span class="mf">2.1</span><span class="p">),</span> <span class="p">(</span><span class="mf">71.5</span><span class="p">,</span> <span class="mf">6.7</span><span class="p">),</span> <span class="p">(</span><span class="mf">90.5</span><span class="p">,</span> <span class="mf">4.1</span><span class="p">),</span>
+ <span class="p">(</span><span class="mf">109.0</span><span class="p">,</span> <span class="mf">3.9</span><span class="p">)])</span>
+ <span class="n">out</span> <span class="o">=</span> <span class="n">schema</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">),</span> <span class="s1">&#39;Collection is no longer ordered&#39;</span>
+ <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="o">==</span> <span class="n">out</span><span class="o">.</span><span class="n">keys</span><span class="p">(),</span> <span class="s1">&#39;Order is not consistent&#39;</span></div>
+
+
+<div class="viewcode-block" id="test_marker_hashable"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_marker_hashable">[docs]</a><span class="k">def</span> <span class="nf">test_marker_hashable</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Verify that you can get schema keys, even if markers were used&quot;&quot;&quot;</span>
+ <span class="n">definition</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">):</span> <span class="nb">int</span><span class="p">,</span> <span class="n">Optional</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">):</span> <span class="nb">float</span><span class="p">,</span>
+ <span class="n">Remove</span><span class="p">(</span><span class="s1">&#39;j&#39;</span><span class="p">):</span> <span class="nb">int</span><span class="p">,</span> <span class="n">Remove</span><span class="p">(</span><span class="nb">int</span><span class="p">):</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">:</span> <span class="nb">int</span>
+ <span class="p">}</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">definition</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">),</span> <span class="nb">int</span><span class="p">)</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">definition</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">),</span> <span class="nb">float</span><span class="p">)</span>
+ <span class="n">assert_true</span><span class="p">(</span><span class="n">Required</span><span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">))</span>
+ <span class="n">assert_true</span><span class="p">(</span><span class="n">Required</span><span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">))</span>
+ <span class="c1"># Remove markers are not hashable</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">definition</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;j&#39;</span><span class="p">),</span> <span class="bp">None</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="test_schema_infer"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer">[docs]</a><span class="k">def</span> <span class="nf">test_schema_infer</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">({</span>
+ <span class="s1">&#39;str&#39;</span><span class="p">:</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;bool&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
+ <span class="s1">&#39;int&#39;</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>
+ <span class="s1">&#39;float&#39;</span><span class="p">:</span> <span class="mf">3.14</span>
+ <span class="p">})</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">Schema</span><span class="p">({</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;str&#39;</span><span class="p">):</span> <span class="nb">str</span><span class="p">,</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;bool&#39;</span><span class="p">):</span> <span class="nb">bool</span><span class="p">,</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;int&#39;</span><span class="p">):</span> <span class="nb">int</span><span class="p">,</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;float&#39;</span><span class="p">):</span> <span class="nb">float</span>
+ <span class="p">}))</span></div>
+
+
+<div class="viewcode-block" id="test_schema_infer_dict"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer_dict">[docs]</a><span class="k">def</span> <span class="nf">test_schema_infer_dict</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">({</span>
+ <span class="s1">&#39;a&#39;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="s1">&#39;b&#39;</span><span class="p">:</span> <span class="p">{</span>
+ <span class="s1">&#39;c&#39;</span><span class="p">:</span> <span class="s1">&#39;foo&#39;</span>
+ <span class="p">}</span>
+ <span class="p">}</span>
+ <span class="p">})</span>
+
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">Schema</span><span class="p">({</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">):</span> <span class="p">{</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;b&#39;</span><span class="p">):</span> <span class="p">{</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;c&#39;</span><span class="p">):</span> <span class="nb">str</span>
+ <span class="p">}</span>
+ <span class="p">}</span>
+ <span class="p">}))</span></div>
+
+
+<div class="viewcode-block" id="test_schema_infer_list"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer_list">[docs]</a><span class="k">def</span> <span class="nf">test_schema_infer_list</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">({</span>
+ <span class="s1">&#39;list&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="mf">3.14</span><span class="p">]</span>
+ <span class="p">})</span>
+
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">Schema</span><span class="p">({</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;list&#39;</span><span class="p">):</span> <span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bool</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">]</span>
+ <span class="p">}))</span></div>
+
+
+<div class="viewcode-block" id="test_schema_infer_scalar"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer_scalar">[docs]</a><span class="k">def</span> <span class="nf">test_schema_infer_scalar</span><span class="p">():</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">),</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">str</span><span class="p">))</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">(</span><span class="bp">True</span><span class="p">),</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">bool</span><span class="p">))</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">(</span><span class="mi">42</span><span class="p">),</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">int</span><span class="p">))</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">(</span><span class="mf">3.14</span><span class="p">),</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">float</span><span class="p">))</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">({}),</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">dict</span><span class="p">))</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">([]),</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">list</span><span class="p">))</span></div>
+
+
+<div class="viewcode-block" id="test_schema_infer_accepts_kwargs"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer_accepts_kwargs">[docs]</a><span class="k">def</span> <span class="nf">test_schema_infer_accepts_kwargs</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="o">.</span><span class="n">infer</span><span class="p">({</span>
+ <span class="s1">&#39;str&#39;</span><span class="p">:</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;bool&#39;</span><span class="p">:</span> <span class="bp">True</span>
+ <span class="p">},</span> <span class="n">required</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
+
+ <span class="c1"># Subset of schema should be acceptable thanks to required=False.</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s1">&#39;bool&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">})</span>
+
+ <span class="c1"># Keys that are in schema should still match required types.</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s1">&#39;str&#39;</span><span class="p">:</span> <span class="mi">42</span><span class="p">})</span>
+ <span class="k">except</span> <span class="n">Invalid</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s1">&#39;Did not raise Invalid for Number&#39;</span>
+
+ <span class="c1"># Extra fields should be acceptable thanks to extra=True.</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s1">&#39;str&#39;</span><span class="p">:</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">:</span> <span class="mi">42</span><span class="p">})</span></div>
+
+
+<div class="viewcode-block" id="test_validation_performance"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_validation_performance">[docs]</a><span class="k">def</span> <span class="nf">test_validation_performance</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> This test comes to make sure the validation complexity of dictionaries is done in a linear time.</span>
+<span class="sd"> to achieve this a custom marker is used in the scheme that counts each time it is evaluated.</span>
+<span class="sd"> By doing so we can determine if the validation is done in linear complexity.</span>
+<span class="sd"> Prior to issue https://github.com/alecthomas/voluptuous/issues/259 this was exponential</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">num_of_keys</span> <span class="o">=</span> <span class="mi">1000</span>
+
+ <span class="n">schema_dict</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">data_extra_keys</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="n">counter</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+
+ <span class="k">class</span> <span class="nc">CounterMarker</span><span class="p">(</span><span class="n">Marker</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="n">counter</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">CounterMarker</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__call__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num_of_keys</span><span class="p">):</span>
+ <span class="n">schema_dict</span><span class="p">[</span><span class="n">CounterMarker</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))]</span> <span class="o">=</span> <span class="nb">str</span>
+ <span class="n">data</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
+ <span class="n">data_extra_keys</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="c1"># half of the keys are present, and half aren&#39;t</span>
+
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">schema_dict</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="n">ALLOW_EXTRA</span><span class="p">)</span>
+
+ <span class="n">schema</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+ <span class="k">assert</span> <span class="n">counter</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">num_of_keys</span><span class="p">,</span> <span class="s2">&quot;Validation complexity is not linear! </span><span class="si">%s</span><span class="s2"> &gt; </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">counter</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">num_of_keys</span><span class="p">)</span>
+
+ <span class="n">counter</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># reset counter</span>
+ <span class="n">schema</span><span class="p">(</span><span class="n">data_extra_keys</span><span class="p">)</span>
+
+ <span class="k">assert</span> <span class="n">counter</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">num_of_keys</span><span class="p">,</span> <span class="s2">&quot;Validation complexity is not linear! </span><span class="si">%s</span><span class="s2"> &gt; </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">counter</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">num_of_keys</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="test_IsDir"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_IsDir">[docs]</a><span class="k">def</span> <span class="nf">test_IsDir</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">IsDir</span><span class="p">())</span>
+ <span class="n">assert_raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
+ <span class="n">schema</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">__file__</span><span class="p">)))</span></div>
+
+
+<div class="viewcode-block" id="test_IsFile"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_IsFile">[docs]</a><span class="k">def</span> <span class="nf">test_IsFile</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">IsFile</span><span class="p">())</span>
+ <span class="n">assert_raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
+ <span class="n">schema</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">__file__</span><span class="p">))</span></div>
+
+
+<div class="viewcode-block" id="test_PathExists"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_PathExists">[docs]</a><span class="k">def</span> <span class="nf">test_PathExists</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">PathExists</span><span class="p">())</span>
+ <span class="n">assert_raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
+ <span class="n">schema</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">__file__</span><span class="p">))</span></div>
+
+
+<div class="viewcode-block" id="test_description"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_description">[docs]</a><span class="k">def</span> <span class="nf">test_description</span><span class="p">():</span>
+ <span class="n">marker</span> <span class="o">=</span> <span class="n">Marker</span><span class="p">(</span><span class="n">Schema</span><span class="p">(</span><span class="nb">str</span><span class="p">),</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;Hello&#39;</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="n">marker</span><span class="o">.</span><span class="n">description</span> <span class="o">==</span> <span class="s1">&#39;Hello&#39;</span>
+
+ <span class="n">optional</span> <span class="o">=</span> <span class="n">Optional</span><span class="p">(</span><span class="s1">&#39;key&#39;</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;Hello&#39;</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="n">optional</span><span class="o">.</span><span class="n">description</span> <span class="o">==</span> <span class="s1">&#39;Hello&#39;</span>
+
+ <span class="n">exclusive</span> <span class="o">=</span> <span class="n">Exclusive</span><span class="p">(</span><span class="s1">&#39;alpha&#39;</span><span class="p">,</span> <span class="s1">&#39;angles&#39;</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;Hello&#39;</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="n">exclusive</span><span class="o">.</span><span class="n">description</span> <span class="o">==</span> <span class="s1">&#39;Hello&#39;</span>
+
+ <span class="n">required</span> <span class="o">=</span> <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;key&#39;</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s1">&#39;Hello&#39;</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="n">required</span><span class="o">.</span><span class="n">description</span> <span class="o">==</span> <span class="s1">&#39;Hello&#39;</span></div>
+
+
+<div class="viewcode-block" id="test_SomeOf_min_validation"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_SomeOf_min_validation">[docs]</a><span class="k">def</span> <span class="nf">test_SomeOf_min_validation</span><span class="p">():</span>
+ <span class="n">validator</span> <span class="o">=</span> <span class="n">All</span><span class="p">(</span><span class="n">Length</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="mi">8</span><span class="p">),</span> <span class="n">SomeOf</span><span class="p">(</span>
+ <span class="n">min_valid</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
+ <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">Match</span><span class="p">(</span><span class="s1">r&#39;.*[A-Z]&#39;</span><span class="p">,</span> <span class="s1">&#39;no uppercase letters&#39;</span><span class="p">),</span>
+ <span class="n">Match</span><span class="p">(</span><span class="s1">r&#39;.*[a-z]&#39;</span><span class="p">,</span> <span class="s1">&#39;no lowercase letters&#39;</span><span class="p">),</span>
+ <span class="n">Match</span><span class="p">(</span><span class="s1">r&#39;.*[0-9]&#39;</span><span class="p">,</span> <span class="s1">&#39;no numbers&#39;</span><span class="p">),</span>
+ <span class="n">Match</span><span class="p">(</span><span class="s1">r&#39;.*[$@$!%*#?&amp;^:;/&lt;,&gt;|{}()\-</span><span class="se">\&#39;</span><span class="s1">._+=]&#39;</span><span class="p">,</span> <span class="s1">&#39;no symbols&#39;</span><span class="p">)]))</span>
+
+ <span class="n">validator</span><span class="p">(</span><span class="s1">&#39;ffe532A1!&#39;</span><span class="p">)</span>
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="s1">&#39;length of value must be at least 8&#39;</span><span class="p">):</span>
+ <span class="n">validator</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
+
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="s1">&#39;no uppercase letters, no lowercase letters&#39;</span><span class="p">):</span>
+ <span class="n">validator</span><span class="p">(</span><span class="s1">&#39;wqs2!#s111&#39;</span><span class="p">)</span>
+
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="s1">&#39;no lowercase letters, no symbols&#39;</span><span class="p">):</span>
+ <span class="n">validator</span><span class="p">(</span><span class="s1">&#39;3A34SDEF5&#39;</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="test_SomeOf_max_validation"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_SomeOf_max_validation">[docs]</a><span class="k">def</span> <span class="nf">test_SomeOf_max_validation</span><span class="p">():</span>
+ <span class="n">validator</span> <span class="o">=</span> <span class="n">SomeOf</span><span class="p">(</span>
+ <span class="n">max_valid</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
+ <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">Match</span><span class="p">(</span><span class="s1">r&#39;.*[A-Z]&#39;</span><span class="p">,</span> <span class="s1">&#39;no uppercase letters&#39;</span><span class="p">),</span>
+ <span class="n">Match</span><span class="p">(</span><span class="s1">r&#39;.*[a-z]&#39;</span><span class="p">,</span> <span class="s1">&#39;no lowercase letters&#39;</span><span class="p">),</span>
+ <span class="n">Match</span><span class="p">(</span><span class="s1">r&#39;.*[0-9]&#39;</span><span class="p">,</span> <span class="s1">&#39;no numbers&#39;</span><span class="p">)],</span>
+ <span class="n">msg</span><span class="o">=</span><span class="s1">&#39;max validation test failed&#39;</span><span class="p">)</span>
+
+ <span class="n">validator</span><span class="p">(</span><span class="s1">&#39;Aa&#39;</span><span class="p">)</span>
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">TooManyValid</span><span class="p">,</span> <span class="s1">&#39;max validation test failed&#39;</span><span class="p">):</span>
+ <span class="n">validator</span><span class="p">(</span><span class="s1">&#39;Aa1&#39;</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="test_self_validation"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_self_validation">[docs]</a><span class="k">def</span> <span class="nf">test_self_validation</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
+ <span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="n">Self</span><span class="p">})</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s2">&quot;abc&quot;</span><span class="p">})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;123456.712&#39;</span><span class="p">}})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="mi">123456</span><span class="p">}})</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="mi">123456</span><span class="p">}}})</span></div>
+
+
+<div class="viewcode-block" id="test_any_error_has_path"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_any_error_has_path">[docs]</a><span class="k">def</span> <span class="nf">test_any_error_has_path</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;https://github.com/alecthomas/voluptuous/issues/347&quot;&quot;&quot;</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span>
+ <span class="n">Optional</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">):</span> <span class="nb">int</span><span class="p">,</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;q2&#39;</span><span class="p">):</span> <span class="n">Any</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="s1">&#39;toto&#39;</span><span class="p">)</span>
+ <span class="p">})</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">s</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="s1">&#39;str&#39;</span><span class="p">,</span> <span class="s1">&#39;q2&#39;</span><span class="p">:</span> <span class="s1">&#39;tata&#39;</span><span class="p">})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="p">(</span>
+ <span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;q&#39;</span><span class="p">]</span> <span class="ow">and</span> <span class="n">exc</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;q2&#39;</span><span class="p">])</span> <span class="ow">or</span>
+ <span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;q&#39;</span><span class="p">]</span> <span class="ow">and</span> <span class="n">exc</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;q2&#39;</span><span class="p">])</span>
+ <span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise AnyInvalid&quot;</span></div>
+
+
+<div class="viewcode-block" id="test_all_error_has_path"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_all_error_has_path">[docs]</a><span class="k">def</span> <span class="nf">test_all_error_has_path</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;https://github.com/alecthomas/voluptuous/issues/347&quot;&quot;&quot;</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span>
+ <span class="n">Optional</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">):</span> <span class="nb">int</span><span class="p">,</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;q2&#39;</span><span class="p">):</span> <span class="n">All</span><span class="p">([</span><span class="nb">str</span><span class="p">,</span> <span class="n">Length</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="mi">10</span><span class="p">)],</span> <span class="n">msg</span><span class="o">=</span><span class="s1">&#39;toto&#39;</span><span class="p">),</span>
+ <span class="p">})</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">s</span><span class="p">({</span><span class="s1">&#39;q&#39;</span><span class="p">:</span> <span class="s1">&#39;str&#39;</span><span class="p">,</span> <span class="s1">&#39;q2&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="p">(</span>
+ <span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;q&#39;</span><span class="p">]</span> <span class="ow">and</span> <span class="n">exc</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;q2&#39;</span><span class="p">])</span> <span class="ow">or</span>
+ <span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;q&#39;</span><span class="p">]</span> <span class="ow">and</span> <span class="n">exc</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;q2&#39;</span><span class="p">])</span>
+ <span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise AllInvalid&quot;</span></div>
+
+
+<div class="viewcode-block" id="test_match_error_has_path"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_match_error_has_path">[docs]</a><span class="k">def</span> <span class="nf">test_match_error_has_path</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;https://github.com/alecthomas/voluptuous/issues/347&quot;&quot;&quot;</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span>
+ <span class="n">Required</span><span class="p">(</span><span class="s1">&#39;q2&#39;</span><span class="p">):</span> <span class="n">Match</span><span class="p">(</span><span class="s2">&quot;a&quot;</span><span class="p">),</span>
+ <span class="p">})</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">s</span><span class="p">({</span><span class="s1">&#39;q2&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">exc</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;q2&#39;</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise MatchInvalid&quot;</span></div>
+
+
+<div class="viewcode-block" id="test_self_any"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_self_any">[docs]</a><span class="k">def</span> <span class="nf">test_self_any</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
+ <span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="n">Any</span><span class="p">(</span><span class="n">Self</span><span class="p">,</span> <span class="s2">&quot;stop&quot;</span><span class="p">)})</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s2">&quot;abc&quot;</span><span class="p">})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;123456.712&#39;</span><span class="p">}})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="mi">123456</span><span class="p">}})</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="mi">123456</span><span class="p">}}})</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="mi">123456</span><span class="p">,</span> <span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="s2">&quot;stop&quot;</span><span class="p">}}})</span></div>
+
+
+<div class="viewcode-block" id="test_self_all"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_self_all">[docs]</a><span class="k">def</span> <span class="nf">test_self_all</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
+ <span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="n">All</span><span class="p">(</span><span class="n">Self</span><span class="p">,</span>
+ <span class="n">Schema</span><span class="p">({</span><span class="s2">&quot;extra_number&quot;</span><span class="p">:</span> <span class="nb">int</span><span class="p">},</span>
+ <span class="n">extra</span><span class="o">=</span><span class="n">ALLOW_EXTRA</span><span class="p">))},</span>
+ <span class="n">extra</span><span class="o">=</span><span class="n">ALLOW_EXTRA</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s2">&quot;abc&quot;</span><span class="p">})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="s1">&#39;123456.712&#39;</span><span class="p">}})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="mi">123456</span><span class="p">}})</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="mi">123456</span><span class="p">}}})</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="mi">123456</span><span class="p">,</span> <span class="s2">&quot;extra_number&quot;</span><span class="p">:</span> <span class="mi">123</span><span class="p">}})</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">({</span><span class="s2">&quot;follow&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="mi">123456</span><span class="p">,</span> <span class="s2">&quot;extra_number&quot;</span><span class="p">:</span> <span class="s2">&quot;123&quot;</span><span class="p">}})</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span></div>
+
+
+<div class="viewcode-block" id="test_SomeOf_on_bounds_assertion"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_SomeOf_on_bounds_assertion">[docs]</a><span class="k">def</span> <span class="nf">test_SomeOf_on_bounds_assertion</span><span class="p">():</span>
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="ne">AssertionError</span><span class="p">,</span> <span class="s1">&#39;when using &quot;SomeOf&quot; you should specify at least one of min_valid and max_valid&#39;</span><span class="p">):</span>
+ <span class="n">SomeOf</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[])</span></div>
+
+
+<div class="viewcode-block" id="test_comparing_voluptuous_object_to_str"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_comparing_voluptuous_object_to_str">[docs]</a><span class="k">def</span> <span class="nf">test_comparing_voluptuous_object_to_str</span><span class="p">():</span>
+ <span class="n">assert_true</span><span class="p">(</span><span class="n">Optional</span><span class="p">(</span><span class="s1">&#39;Classification&#39;</span><span class="p">)</span> <span class="o">&lt;</span> <span class="s1">&#39;Name&#39;</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="test_set_of_integers"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_set_of_integers">[docs]</a><span class="k">def</span> <span class="nf">test_set_of_integers</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="nb">int</span><span class="p">})</span>
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="s1">&#39;expected a set&#39;</span><span class="p">):</span>
+ <span class="n">schema</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="s1">&#39;expected a set&#39;</span><span class="p">):</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="mi">42</span><span class="p">]))</span>
+
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">())</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="mi">42</span><span class="p">]))</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="mi">42</span><span class="p">,</span> <span class="mi">43</span><span class="p">,</span> <span class="mi">44</span><span class="p">]))</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="s1">&#39;abc&#39;</span><span class="p">]))</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="s2">&quot;invalid value in set&quot;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span></div>
+
+
+<div class="viewcode-block" id="test_frozenset_of_integers"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_frozenset_of_integers">[docs]</a><span class="k">def</span> <span class="nf">test_frozenset_of_integers</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="nb">int</span><span class="p">]))</span>
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="s1">&#39;expected a frozenset&#39;</span><span class="p">):</span>
+ <span class="n">schema</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="s1">&#39;expected a frozenset&#39;</span><span class="p">):</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="mi">42</span><span class="p">]))</span>
+
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">())</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="mi">42</span><span class="p">]))</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="mi">42</span><span class="p">,</span> <span class="mi">43</span><span class="p">,</span> <span class="mi">44</span><span class="p">]))</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="s1">&#39;abc&#39;</span><span class="p">]))</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="s2">&quot;invalid value in frozenset&quot;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span></div>
+
+
+<div class="viewcode-block" id="test_set_of_integers_and_strings"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_set_of_integers_and_strings">[docs]</a><span class="k">def</span> <span class="nf">test_set_of_integers_and_strings</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">})</span>
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="s1">&#39;expected a set&#39;</span><span class="p">):</span>
+ <span class="n">schema</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
+
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">())</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="mi">42</span><span class="p">]))</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="s1">&#39;abc&#39;</span><span class="p">]))</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="mi">42</span><span class="p">,</span> <span class="s1">&#39;abc&#39;</span><span class="p">]))</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="bp">None</span><span class="p">]))</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="s2">&quot;invalid value in set&quot;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span></div>
+
+
+<div class="viewcode-block" id="test_frozenset_of_integers_and_strings"><a class="viewcode-back" href="../../../voluptuous.tests.html#voluptuous.tests.tests.test_frozenset_of_integers_and_strings">[docs]</a><span class="k">def</span> <span class="nf">test_frozenset_of_integers_and_strings</span><span class="p">():</span>
+ <span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">]))</span>
+ <span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">,</span> <span class="s1">&#39;expected a frozenset&#39;</span><span class="p">):</span>
+ <span class="n">schema</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
+
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">())</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="mi">42</span><span class="p">]))</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="s1">&#39;abc&#39;</span><span class="p">]))</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="mi">42</span><span class="p">,</span> <span class="s1">&#39;abc&#39;</span><span class="p">]))</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">schema</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">([</span><span class="bp">None</span><span class="p">]))</span>
+ <span class="k">except</span> <span class="n">MultipleInvalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">assert_equal</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="s2">&quot;invalid value in frozenset&quot;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">False</span><span class="p">,</span> <span class="s2">&quot;Did not raise Invalid&quot;</span></div>
</pre></div>
</div>
diff --git a/docs/_build/html/_modules/voluptuous/util.html b/docs/_build/html/_modules/voluptuous/util.html
index a86c506..587d01e 100644
--- a/docs/_build/html/_modules/voluptuous/util.html
+++ b/docs/_build/html/_modules/voluptuous/util.html
@@ -43,14 +43,9 @@
<h1>Source code for voluptuous.util</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">sys</span>
-<span class="k">try</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">error</span> <span class="kn">import</span> <span class="n">LiteralInvalid</span><span class="p">,</span> <span class="n">TypeInvalid</span><span class="p">,</span> <span class="n">Invalid</span>
- <span class="kn">from</span> <span class="nn">schema_builder</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">default_factory</span><span class="p">,</span> <span class="n">raises</span>
- <span class="kn">import</span> <span class="nn">validators</span>
-<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">.error</span> <span class="kn">import</span> <span class="n">LiteralInvalid</span><span class="p">,</span> <span class="n">TypeInvalid</span><span class="p">,</span> <span class="n">Invalid</span>
- <span class="kn">from</span> <span class="nn">.schema_builder</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">default_factory</span><span class="p">,</span> <span class="n">raises</span>
- <span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">validators</span>
+<span class="kn">from</span> <span class="nn">voluptuous.error</span> <span class="kn">import</span> <span class="n">LiteralInvalid</span><span class="p">,</span> <span class="n">TypeInvalid</span><span class="p">,</span> <span class="n">Invalid</span>
+<span class="kn">from</span> <span class="nn">voluptuous.schema_builder</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">default_factory</span><span class="p">,</span> <span class="n">raises</span>
+<span class="kn">from</span> <span class="nn">voluptuous</span> <span class="kn">import</span> <span class="n">validators</span>
<span class="n">__author__</span> <span class="o">=</span> <span class="s1">&#39;tusharmakkar08&#39;</span>
@@ -195,12 +190,6 @@
<span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lit</span><span class="p">)</span></div>
-<div class="viewcode-block" id="to_utf8_py2"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.util.to_utf8_py2">[docs]</a><span class="k">def</span> <span class="nf">to_utf8_py2</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">3</span><span class="p">,)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">data</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">data</span></div>
-
-
<div class="viewcode-block" id="u"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.util.u">[docs]</a><span class="k">def</span> <span class="nf">u</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">3</span><span class="p">,):</span>
<span class="k">return</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
diff --git a/docs/_build/html/_modules/voluptuous/validators.html b/docs/_build/html/_modules/voluptuous/validators.html
index 79fa4dd..dffa9e9 100644
--- a/docs/_build/html/_modules/voluptuous/validators.html
+++ b/docs/_build/html/_modules/voluptuous/validators.html
@@ -48,22 +48,16 @@
<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">wraps</span>
<span class="kn">from</span> <span class="nn">decimal</span> <span class="kn">import</span> <span class="n">Decimal</span><span class="p">,</span> <span class="n">InvalidOperation</span>
-<span class="k">try</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">schema_builder</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">raises</span><span class="p">,</span> <span class="n">message</span>
- <span class="kn">from</span> <span class="nn">error</span> <span class="kn">import</span> <span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">CoerceInvalid</span><span class="p">,</span> <span class="n">TrueInvalid</span><span class="p">,</span> <span class="n">FalseInvalid</span><span class="p">,</span> <span class="n">BooleanInvalid</span><span class="p">,</span> <span class="n">Invalid</span><span class="p">,</span> <span class="n">AnyInvalid</span><span class="p">,</span>
- <span class="n">AllInvalid</span><span class="p">,</span> <span class="n">MatchInvalid</span><span class="p">,</span> <span class="n">UrlInvalid</span><span class="p">,</span> <span class="n">EmailInvalid</span><span class="p">,</span> <span class="n">FileInvalid</span><span class="p">,</span> <span class="n">DirInvalid</span><span class="p">,</span> <span class="n">RangeInvalid</span><span class="p">,</span>
- <span class="n">PathInvalid</span><span class="p">,</span> <span class="n">ExactSequenceInvalid</span><span class="p">,</span> <span class="n">LengthInvalid</span><span class="p">,</span> <span class="n">DatetimeInvalid</span><span class="p">,</span> <span class="n">DateInvalid</span><span class="p">,</span> <span class="n">InInvalid</span><span class="p">,</span>
- <span class="n">TypeInvalid</span><span class="p">,</span> <span class="n">NotInInvalid</span><span class="p">)</span>
-<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">.schema_builder</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">raises</span><span class="p">,</span> <span class="n">message</span>
- <span class="kn">from</span> <span class="nn">.error</span> <span class="kn">import</span> <span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">CoerceInvalid</span><span class="p">,</span> <span class="n">TrueInvalid</span><span class="p">,</span> <span class="n">FalseInvalid</span><span class="p">,</span> <span class="n">BooleanInvalid</span><span class="p">,</span> <span class="n">Invalid</span><span class="p">,</span> <span class="n">AnyInvalid</span><span class="p">,</span>
- <span class="n">AllInvalid</span><span class="p">,</span> <span class="n">MatchInvalid</span><span class="p">,</span> <span class="n">UrlInvalid</span><span class="p">,</span> <span class="n">EmailInvalid</span><span class="p">,</span> <span class="n">FileInvalid</span><span class="p">,</span> <span class="n">DirInvalid</span><span class="p">,</span> <span class="n">RangeInvalid</span><span class="p">,</span>
- <span class="n">PathInvalid</span><span class="p">,</span> <span class="n">ExactSequenceInvalid</span><span class="p">,</span> <span class="n">LengthInvalid</span><span class="p">,</span> <span class="n">DatetimeInvalid</span><span class="p">,</span> <span class="n">DateInvalid</span><span class="p">,</span> <span class="n">InInvalid</span><span class="p">,</span>
- <span class="n">TypeInvalid</span><span class="p">,</span> <span class="n">NotInInvalid</span><span class="p">)</span>
-
+<span class="kn">from</span> <span class="nn">voluptuous.schema_builder</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">raises</span><span class="p">,</span> <span class="n">message</span>
+<span class="kn">from</span> <span class="nn">voluptuous.error</span> <span class="kn">import</span> <span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="n">CoerceInvalid</span><span class="p">,</span> <span class="n">TrueInvalid</span><span class="p">,</span> <span class="n">FalseInvalid</span><span class="p">,</span> <span class="n">BooleanInvalid</span><span class="p">,</span> <span class="n">Invalid</span><span class="p">,</span>
+ <span class="n">AnyInvalid</span><span class="p">,</span> <span class="n">AllInvalid</span><span class="p">,</span> <span class="n">MatchInvalid</span><span class="p">,</span> <span class="n">UrlInvalid</span><span class="p">,</span> <span class="n">EmailInvalid</span><span class="p">,</span> <span class="n">FileInvalid</span><span class="p">,</span> <span class="n">DirInvalid</span><span class="p">,</span>
+ <span class="n">RangeInvalid</span><span class="p">,</span> <span class="n">PathInvalid</span><span class="p">,</span> <span class="n">ExactSequenceInvalid</span><span class="p">,</span> <span class="n">LengthInvalid</span><span class="p">,</span> <span class="n">DatetimeInvalid</span><span class="p">,</span>
+ <span class="n">DateInvalid</span><span class="p">,</span> <span class="n">InInvalid</span><span class="p">,</span> <span class="n">TypeInvalid</span><span class="p">,</span> <span class="n">NotInInvalid</span><span class="p">,</span> <span class="n">ContainsInvalid</span><span class="p">,</span> <span class="n">NotEnoughValid</span><span class="p">,</span>
+ <span class="n">TooManyValid</span><span class="p">)</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,):</span>
<span class="kn">import</span> <span class="nn">urllib.parse</span> <span class="kn">as</span> <span class="nn">urlparse</span>
+
<span class="nb">basestring</span> <span class="o">=</span> <span class="nb">str</span>
<span class="k">else</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">urlparse</span>
@@ -142,7 +136,7 @@
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
- <span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span>
+ <span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="n">InvalidOperation</span><span class="p">):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="p">(</span><span class="s1">&#39;expected </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">type_name</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">CoerceInvalid</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
@@ -230,7 +224,40 @@
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">v</span><span class="p">)</span></div>
-<div class="viewcode-block" id="Any"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.validators.Any">[docs]</a><span class="k">class</span> <span class="nc">Any</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+<span class="k">class</span> <span class="nc">_WithSubValidators</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Base class for validators that use sub-validators.</span>
+
+<span class="sd"> Special class to use as a parent class for validators using sub-validators.</span>
+<span class="sd"> This class provides the `__voluptuous_compile__` method so the</span>
+<span class="sd"> sub-validators are compiled by the parent `Schema`.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">validators</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">validators</span> <span class="o">=</span> <span class="n">validators</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;msg&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__voluptuous_compile__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_compiled</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="n">schema</span><span class="o">.</span><span class="n">_compile</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">validators</span>
+ <span class="p">]</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run</span>
+
+ <span class="k">def</span> <span class="nf">_run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exec</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_compiled</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exec</span><span class="p">((</span><span class="n">Schema</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">validators</span><span class="p">),</span> <span class="n">v</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%s</span><span class="s1">, msg=</span><span class="si">%r</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
+ <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">validators</span><span class="p">),</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">msg</span>
+ <span class="p">)</span>
+
+
+<div class="viewcode-block" id="Any"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.validators.Any">[docs]</a><span class="k">class</span> <span class="nc">Any</span><span class="p">(</span><span class="n">_WithSubValidators</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Use the first validated value.</span>
<span class="sd"> :param msg: Message to deliver to user if validation fails.</span>
@@ -255,33 +282,30 @@
<span class="sd"> ... validate(4)</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">validators</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">validators</span> <span class="o">=</span> <span class="n">validators</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;msg&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_schemas</span> <span class="o">=</span> <span class="p">[</span><span class="n">Schema</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">validators</span><span class="p">]</span>
-
- <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">_exec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">funcs</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="n">error</span> <span class="o">=</span> <span class="bp">None</span>
- <span class="k">for</span> <span class="n">schema</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schemas</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">schema</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="k">except</span> <span class="n">Invalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">error</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">error</span><span class="o">.</span><span class="n">path</span><span class="p">):</span>
<span class="n">error</span> <span class="o">=</span> <span class="n">e</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">error</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">error</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">is</span> <span class="bp">None</span> <span class="k">else</span> <span class="n">AnyInvalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">raise</span> <span class="n">AnyInvalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s1">&#39;no valid value found&#39;</span><span class="p">)</span>
-
- <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="s1">&#39;Any([</span><span class="si">%s</span><span class="s1">])&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">validators</span><span class="p">))</span></div>
+ <span class="k">raise</span> <span class="n">error</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">is</span> <span class="bp">None</span> <span class="k">else</span> <span class="n">AnyInvalid</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="n">AnyInvalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s1">&#39;no valid value found&#39;</span><span class="p">,</span>
+ <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span></div>
<span class="c1"># Convenience alias</span>
<span class="n">Or</span> <span class="o">=</span> <span class="n">Any</span>
-<div class="viewcode-block" id="All"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.validators.All">[docs]</a><span class="k">class</span> <span class="nc">All</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+<div class="viewcode-block" id="All"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.validators.All">[docs]</a><span class="k">class</span> <span class="nc">All</span><span class="p">(</span><span class="n">_WithSubValidators</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Value must pass all validators.</span>
<span class="sd"> The output of each validator is passed as input to the next.</span>
@@ -294,24 +318,16 @@
<span class="sd"> 10</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">validators</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">validators</span> <span class="o">=</span> <span class="n">validators</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;msg&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_schemas</span> <span class="o">=</span> <span class="p">[</span><span class="n">Schema</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">validators</span><span class="p">]</span>
-
- <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">_exec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">funcs</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
- <span class="k">for</span> <span class="n">schema</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schemas</span><span class="p">:</span>
- <span class="n">v</span> <span class="o">=</span> <span class="n">schema</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="k">except</span> <span class="n">Invalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">e</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">is</span> <span class="bp">None</span> <span class="k">else</span> <span class="n">AllInvalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">v</span>
-
- <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="s1">&#39;All(</span><span class="si">%s</span><span class="s1">, msg=</span><span class="si">%r</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span>
- <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">validators</span><span class="p">),</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">msg</span>
- <span class="p">)</span></div>
+ <span class="k">raise</span> <span class="n">e</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">is</span> <span class="bp">None</span> <span class="k">else</span> <span class="n">AllInvalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">path</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">v</span></div>
<span class="c1"># Convenience alias</span>
@@ -462,9 +478,13 @@
<span class="sd"> &gt;&gt;&gt; with raises(FileInvalid, &#39;Not a file&#39;):</span>
<span class="sd"> ... IsFile()(None)</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">if</span> <span class="n">v</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">v</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">FileInvalid</span><span class="p">(</span><span class="s1">&#39;Not a file&#39;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">FileInvalid</span><span class="p">(</span><span class="s1">&#39;Not a file&#39;</span><span class="p">)</span></div>
@@ -478,9 +498,13 @@
<span class="sd"> &gt;&gt;&gt; with raises(DirInvalid, &#39;Not a directory&#39;):</span>
<span class="sd"> ... IsDir()(None)</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">if</span> <span class="n">v</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">v</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">DirInvalid</span><span class="p">(</span><span class="s2">&quot;Not a directory&quot;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">DirInvalid</span><span class="p">(</span><span class="s2">&quot;Not a directory&quot;</span><span class="p">)</span></div>
@@ -496,12 +520,32 @@
<span class="sd"> &gt;&gt;&gt; with raises(PathInvalid, &#39;Not a Path&#39;):</span>
<span class="sd"> ... PathExists()(None)</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">if</span> <span class="n">v</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">v</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">PathInvalid</span><span class="p">(</span><span class="s2">&quot;Not a Path&quot;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">PathInvalid</span><span class="p">(</span><span class="s2">&quot;Not a Path&quot;</span><span class="p">)</span></div>
+<div class="viewcode-block" id="Maybe"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.validators.Maybe">[docs]</a><span class="k">def</span> <span class="nf">Maybe</span><span class="p">(</span><span class="n">validator</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Validate that the object matches given validator or is None.</span>
+
+<span class="sd"> :raises Invalid: if the value does not match the given validator and is not</span>
+<span class="sd"> None</span>
+
+<span class="sd"> &gt;&gt;&gt; s = Schema(Maybe(int))</span>
+<span class="sd"> &gt;&gt;&gt; s(10)</span>
+<span class="sd"> 10</span>
+<span class="sd"> &gt;&gt;&gt; with raises(Invalid):</span>
+<span class="sd"> ... s(&quot;string&quot;)</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">Any</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">validator</span><span class="p">)</span></div>
+
+
<div class="viewcode-block" id="Range"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.validators.Range">[docs]</a><span class="k">class</span> <span class="nc">Range</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Limit a value to a range.</span>
@@ -635,15 +679,10 @@
<span class="sd">&quot;&quot;&quot;Validate that the value matches the date format.&quot;&quot;&quot;</span>
<span class="n">DEFAULT_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;%Y-%m-</span><span class="si">%d</span><span class="s1">&#39;</span>
- <span class="n">FORMAT_DESCRIPTION</span> <span class="o">=</span> <span class="s1">&#39;yyyy-mm-dd&#39;</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">format</span><span class="p">)</span>
- <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">FORMAT_DESCRIPTION</span><span class="p">):</span>
- <span class="k">raise</span> <span class="n">DateInvalid</span><span class="p">(</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s1">&#39;value has invalid length&#39;</span>
- <span class="s1">&#39; expected length </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">FORMAT_DESCRIPTION</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">FORMAT_DESCRIPTION</span><span class="p">))</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">DateInvalid</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s1">&#39;value does not match&#39;</span>
@@ -694,6 +733,33 @@
<span class="k">return</span> <span class="s1">&#39;NotIn(</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">container</span><span class="p">,)</span></div>
+<div class="viewcode-block" id="Contains"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.validators.Contains">[docs]</a><span class="k">class</span> <span class="nc">Contains</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Validate that the given schema element is in the sequence being validated.</span>
+
+<span class="sd"> &gt;&gt;&gt; s = Contains(1)</span>
+<span class="sd"> &gt;&gt;&gt; s([3, 2, 1])</span>
+<span class="sd"> [3, 2, 1]</span>
+<span class="sd"> &gt;&gt;&gt; with raises(ContainsInvalid, &#39;value is not allowed&#39;):</span>
+<span class="sd"> ... s([3, 2])</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">item</span> <span class="o">=</span> <span class="n">item</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span>
+
+ <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">check</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">item</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">v</span>
+ <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
+ <span class="n">check</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="k">if</span> <span class="n">check</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">ContainsInvalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s1">&#39;value is not allowed&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">v</span>
+
+ <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;Contains(</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">item</span><span class="p">,)</span></div>
+
+
<div class="viewcode-block" id="ExactSequence"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.validators.ExactSequence">[docs]</a><span class="k">class</span> <span class="nc">ExactSequence</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Matches each element in a sequence against the corresponding element in</span>
<span class="sd"> the validators.</span>
@@ -853,10 +919,8 @@
<span class="n">el</span> <span class="o">=</span> <span class="n">missing</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">raise</span> <span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s1">&#39;Element #{} ({}) is not valid against any validator&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">el</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">el</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
<span class="k">elif</span> <span class="n">missing</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">MultipleInvalid</span><span class="p">([</span>
- <span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s1">&#39;Element #{} ({}) is not valid against any validator&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">el</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">el</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
- <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">missing</span>
- <span class="p">])</span>
+ <span class="k">raise</span> <span class="n">MultipleInvalid</span><span class="p">([</span><span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s1">&#39;Element #{} ({}) is not valid against any validator&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
+ <span class="n">el</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">el</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">missing</span><span class="p">])</span>
<span class="k">return</span> <span class="n">v</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -891,15 +955,16 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">precision</span><span class="p">,</span> <span class="n">scale</span><span class="p">,</span> <span class="n">decimal_num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_precision_scale</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">precision</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span>\
- <span class="n">precision</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">precision</span> <span class="ow">and</span> <span class="n">scale</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s2">&quot;Precision must be equal to </span><span class="si">%s</span><span class="s2">, and Scale must be equal to </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">precision</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span><span class="p">))</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">precision</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">precision</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">precision</span>\
+ <span class="ow">and</span> <span class="n">scale</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s2">&quot;Precision must be equal to </span><span class="si">%s</span><span class="s2">, and Scale must be equal to </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">precision</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">scale</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">precision</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">precision</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">precision</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s2">&quot;Precision must be equal to </span><span class="si">%s</span><span class="s2">&quot;</span><span class="o">%</span><span class="bp">self</span><span class="o">.</span><span class="n">precision</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s2">&quot;Precision must be equal to </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">precision</span><span class="p">)</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">scale</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span> <span class="p">:</span>
- <span class="k">raise</span> <span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s2">&quot;Scale must be equal to </span><span class="si">%s</span><span class="s2">&quot;</span><span class="o">%</span><span class="bp">self</span><span class="o">.</span><span class="n">scale</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">scale</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s2">&quot;Scale must be equal to </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">yield_decimal</span><span class="p">:</span>
<span class="k">return</span> <span class="n">decimal_num</span>
@@ -920,6 +985,66 @@
<span class="k">raise</span> <span class="n">Invalid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s1">&#39;Value must be a number enclosed with string&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">decimal_num</span><span class="o">.</span><span class="n">as_tuple</span><span class="p">()</span><span class="o">.</span><span class="n">digits</span><span class="p">),</span> <span class="o">-</span><span class="p">(</span><span class="n">decimal_num</span><span class="o">.</span><span class="n">as_tuple</span><span class="p">()</span><span class="o">.</span><span class="n">exponent</span><span class="p">),</span> <span class="n">decimal_num</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="SomeOf"><a class="viewcode-back" href="../../voluptuous.html#voluptuous.validators.SomeOf">[docs]</a><span class="k">class</span> <span class="nc">SomeOf</span><span class="p">(</span><span class="n">_WithSubValidators</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Value must pass at least some validations, determined by the given parameter.</span>
+<span class="sd"> Optionally, number of passed validations can be capped.</span>
+
+<span class="sd"> The output of each validator is passed as input to the next.</span>
+
+<span class="sd"> :param min_valid: Minimum number of valid schemas.</span>
+<span class="sd"> :param validators: a list of schemas or validators to match input against</span>
+<span class="sd"> :param max_valid: Maximum number of valid schemas.</span>
+<span class="sd"> :param msg: Message to deliver to user if validation fails.</span>
+<span class="sd"> :param kwargs: All other keyword arguments are passed to the sub-Schema constructors.</span>
+
+<span class="sd"> :raises NotEnoughValid: if the minimum number of validations isn&#39;t met</span>
+<span class="sd"> :raises TooManyValid: if the more validations than the given amount is met</span>
+
+<span class="sd"> &gt;&gt;&gt; validate = Schema(SomeOf(min_valid=2, validators=[Range(1, 5), Any(float, int), 6.6]))</span>
+<span class="sd"> &gt;&gt;&gt; validate(6.6)</span>
+<span class="sd"> 6.6</span>
+<span class="sd"> &gt;&gt;&gt; validate(3)</span>
+<span class="sd"> 3</span>
+<span class="sd"> &gt;&gt;&gt; with raises(MultipleInvalid, &#39;value must be at most 5, not a valid value&#39;):</span>
+<span class="sd"> ... validate(6.2)</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">validators</span><span class="p">,</span> <span class="n">min_valid</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">max_valid</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="n">min_valid</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">max_valid</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">,</span> \
+ <span class="s1">&#39;when using &quot;</span><span class="si">%s</span><span class="s1">&quot; you should specify at least one of min_valid and max_valid&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">,)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">min_valid</span> <span class="o">=</span> <span class="n">min_valid</span> <span class="ow">or</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">max_valid</span> <span class="o">=</span> <span class="n">max_valid</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">validators</span><span class="p">)</span>
+ <span class="nb">super</span><span class="p">(</span><span class="n">SomeOf</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">validators</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_exec</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">funcs</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">funcs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">funcs</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">path</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">Invalid</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
+
+ <span class="n">passed_count</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">funcs</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">min_valid</span> <span class="o">&lt;=</span> <span class="n">passed_count</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_valid</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">v</span>
+
+ <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">msg</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">errors</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="n">passed_count</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_valid</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">TooManyValid</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="n">NotEnoughValid</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s1">&#39;SomeOf(min_valid=</span><span class="si">%s</span><span class="s1">, validators=[</span><span class="si">%s</span><span class="s1">], max_valid=</span><span class="si">%s</span><span class="s1">, msg=</span><span class="si">%r</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">min_valid</span><span class="p">,</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">validators</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_valid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">)</span></div>
</pre></div>
</div>
diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html
index e3030a6..4afb78d 100644
--- a/docs/_build/html/genindex.html
+++ b/docs/_build/html/genindex.html
@@ -123,16 +123,24 @@
<dt><a href="voluptuous.html#voluptuous.validators.Clamp">Clamp (class in voluptuous.validators)</a>
</dt>
- </dl></td>
- <td style="width: 33%" valign="top"><dl>
<dt><a href="voluptuous.html#voluptuous.validators.Coerce">Coerce (class in voluptuous.validators)</a>
</dt>
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
<dt><a href="voluptuous.html#voluptuous.error.CoerceInvalid">CoerceInvalid</a>
</dt>
+
+ <dt><a href="voluptuous.html#voluptuous.validators.Contains">Contains (class in voluptuous.validators)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.html#voluptuous.error.ContainsInvalid">ContainsInvalid</a>
+ </dt>
+
</dl></td>
</tr></table>
@@ -256,10 +264,6 @@
</dl></td>
<td style="width: 33%" valign="top"><dl>
- <dt><a href="voluptuous.html#voluptuous.validators.Date.FORMAT_DESCRIPTION">FORMAT_DESCRIPTION (voluptuous.validators.Date attribute)</a>
- </dt>
-
-
<dt><a href="voluptuous.html#voluptuous.validators.FqdnUrl">FqdnUrl() (in module voluptuous.validators)</a>
</dt>
@@ -292,6 +296,10 @@
</dt>
+ <dt><a href="voluptuous.html#voluptuous.schema_builder.Schema.infer">infer() (voluptuous.schema_builder.Schema class method)</a>
+ </dt>
+
+
<dt><a href="voluptuous.html#voluptuous.error.InInvalid">InInvalid</a>
</dt>
@@ -368,12 +376,16 @@
</dt>
- <dt><a href="voluptuous.html#voluptuous.schema_builder.message">message() (in module voluptuous.schema_builder)</a>
+ <dt><a href="voluptuous.html#voluptuous.validators.Maybe">Maybe() (in module voluptuous.validators)</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
+ <dt><a href="voluptuous.html#voluptuous.schema_builder.message">message() (in module voluptuous.schema_builder)</a>
+ </dt>
+
+
<dt><a href="voluptuous.html#voluptuous.schema_builder.Msg">Msg (class in voluptuous.schema_builder)</a>
</dt>
@@ -398,16 +410,20 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
- <dt><a href="voluptuous.html#voluptuous.validators.NotIn">NotIn (class in voluptuous.validators)</a>
+ <dt><a href="voluptuous.html#voluptuous.error.NotEnoughValid">NotEnoughValid</a>
</dt>
- <dt><a href="voluptuous.html#voluptuous.error.NotInInvalid">NotInInvalid</a>
+ <dt><a href="voluptuous.html#voluptuous.validators.NotIn">NotIn (class in voluptuous.validators)</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
+ <dt><a href="voluptuous.html#voluptuous.error.NotInInvalid">NotInInvalid</a>
+ </dt>
+
+
<dt><a href="voluptuous.html#voluptuous.validators.Number">Number (class in voluptuous.validators)</a>
</dt>
@@ -520,6 +536,10 @@
</dt>
+ <dt><a href="voluptuous.html#voluptuous.schema_builder.Self">Self() (in module voluptuous.schema_builder)</a>
+ </dt>
+
+
<dt><a href="voluptuous.html#voluptuous.error.SequenceTypeInvalid">SequenceTypeInvalid</a>
</dt>
@@ -534,6 +554,10 @@
</dt>
+ <dt><a href="voluptuous.html#voluptuous.validators.SomeOf">SomeOf (class in voluptuous.validators)</a>
+ </dt>
+
+
<dt><a href="voluptuous.html#voluptuous.util.Strip">Strip() (in module voluptuous.util)</a>
</dt>
@@ -544,6 +568,26 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_all_error_has_path">test_all_error_has_path() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_any_error_has_path">test_any_error_has_path() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_class">test_class() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_comparing_voluptuous_object_to_str">test_comparing_voluptuous_object_to_str() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_contains">test_contains() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
<dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_copy_dict_undefined">test_copy_dict_undefined() (in module voluptuous.tests.tests)</a>
</dt>
@@ -552,10 +596,18 @@
</dt>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_date_custom_format">test_date_custom_format() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
<dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_datetime">test_datetime() (in module voluptuous.tests.tests)</a>
</dt>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_description">test_description() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
<dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_email_validation">test_email_validation() (in module voluptuous.tests.tests)</a>
</dt>
@@ -572,15 +624,19 @@
</dt>
- <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_empty_dict_as_exact">test_empty_dict_as_exact() (in module voluptuous.tests.tests)</a>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_empty_list_as_exact">test_empty_list_as_exact() (in module voluptuous.tests.tests)</a>
</dt>
- <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_empty_list_as_exact">test_empty_list_as_exact() (in module voluptuous.tests.tests)</a>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_equal">test_equal() (in module voluptuous.tests.tests)</a>
</dt>
- <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_equal">test_equal() (in module voluptuous.tests.tests)</a>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_equality">test_equality() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_equality_negative">test_equality_negative() (in module voluptuous.tests.tests)</a>
</dt>
@@ -620,6 +676,14 @@
</dt>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_frozenset_of_integers">test_frozenset_of_integers() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_frozenset_of_integers_and_strings">test_frozenset_of_integers_and_strings() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
<dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_humanize_error">test_humanize_error() (in module voluptuous.tests.tests)</a>
</dt>
@@ -628,6 +692,22 @@
</dt>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_inequality">test_inequality() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_inequality_negative">test_inequality_negative() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_IsDir">test_IsDir() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_IsFile">test_IsFile() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
<dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_iterate_candidates">test_iterate_candidates() (in module voluptuous.tests.tests)</a>
</dt>
@@ -640,6 +720,18 @@
</dt>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_marker_hashable">test_marker_hashable() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_match_error_has_path">test_match_error_has_path() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_maybe">test_maybe() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
<dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_named_tuples_validate_as_tuples">test_named_tuples_validate_as_tuples() (in module voluptuous.tests.tests)</a>
</dt>
@@ -694,6 +786,14 @@
</dt>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_ordered_dict">test_ordered_dict() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_PathExists">test_PathExists() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
<dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_range_exlcudes_nan">test_range_exlcudes_nan() (in module voluptuous.tests.tests)</a>
</dt>
@@ -726,6 +826,22 @@
</dt>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_partial_match_called_with_args">test_schema_decorator_partial_match_called_with_args() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_partial_match_called_with_kwargs">test_schema_decorator_partial_match_called_with_kwargs() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_partial_unmatch_called_with_args">test_schema_decorator_partial_unmatch_called_with_args() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_partial_unmatch_called_with_kwargs">test_schema_decorator_partial_unmatch_called_with_kwargs() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
<dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_decorator_return_only_match">test_schema_decorator_return_only_match() (in module voluptuous.tests.tests)</a>
</dt>
@@ -762,23 +878,67 @@
</dt>
- <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_sorting">test_sorting() (in module voluptuous.tests.tests)</a>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer">test_schema_infer() (in module voluptuous.tests.tests)</a>
</dt>
- <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_subschema_extension">test_subschema_extension() (in module voluptuous.tests.tests)</a>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer_accepts_kwargs">test_schema_infer_accepts_kwargs() (in module voluptuous.tests.tests)</a>
</dt>
- <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_to_utf8">test_to_utf8() (in module voluptuous.tests.tests)</a>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer_dict">test_schema_infer_dict() (in module voluptuous.tests.tests)</a>
</dt>
- <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_unicode_key_is_converted_to_utf8_when_in_marker">test_unicode_key_is_converted_to_utf8_when_in_marker() (in module voluptuous.tests.tests)</a>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer_list">test_schema_infer_list() (in module voluptuous.tests.tests)</a>
</dt>
- <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_unicode_key_is_converted_to_utf8_when_plain_text">test_unicode_key_is_converted_to_utf8_when_plain_text() (in module voluptuous.tests.tests)</a>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_schema_infer_scalar">test_schema_infer_scalar() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_self_all">test_self_all() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_self_any">test_self_any() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_self_validation">test_self_validation() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_set_of_integers">test_set_of_integers() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_set_of_integers_and_strings">test_set_of_integers_and_strings() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_SomeOf_max_validation">test_SomeOf_max_validation() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_SomeOf_min_validation">test_SomeOf_min_validation() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_SomeOf_on_bounds_assertion">test_SomeOf_on_bounds_assertion() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_sorting">test_sorting() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_subschema_extension">test_subschema_extension() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_unicode_as_key">test_unicode_as_key() (in module voluptuous.tests.tests)</a>
</dt>
@@ -802,11 +962,15 @@
</dt>
+ <dt><a href="voluptuous.tests.html#voluptuous.tests.tests.test_validation_performance">test_validation_performance() (in module voluptuous.tests.tests)</a>
+ </dt>
+
+
<dt><a href="voluptuous.html#voluptuous.util.Title">Title() (in module voluptuous.util)</a>
</dt>
- <dt><a href="voluptuous.html#voluptuous.util.to_utf8_py2">to_utf8_py2() (in module voluptuous.util)</a>
+ <dt><a href="voluptuous.html#voluptuous.error.TooManyValid">TooManyValid</a>
</dt>
diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv
index ceb8677..ab7d219 100644
--- a/docs/_build/html/objects.inv
+++ b/docs/_build/html/objects.inv
Binary files differ
diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js
index 8e554f7..4124b25 100644
--- a/docs/_build/html/searchindex.js
+++ b/docs/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({envversion:50,filenames:["index","modules","voluptuous","voluptuous.tests"],objects:{"":{voluptuous:[2,0,0,"-"]},"voluptuous.error":{AllInvalid:[2,1,1,""],AnyInvalid:[2,1,1,""],BooleanInvalid:[2,1,1,""],CoerceInvalid:[2,1,1,""],DateInvalid:[2,1,1,""],DatetimeInvalid:[2,1,1,""],DictInvalid:[2,1,1,""],DirInvalid:[2,1,1,""],EmailInvalid:[2,1,1,""],Error:[2,1,1,""],ExactSequenceInvalid:[2,1,1,""],ExclusiveInvalid:[2,1,1,""],FalseInvalid:[2,1,1,""],FileInvalid:[2,1,1,""],InInvalid:[2,1,1,""],InclusiveInvalid:[2,1,1,""],Invalid:[2,1,1,""],LengthInvalid:[2,1,1,""],LiteralInvalid:[2,1,1,""],MatchInvalid:[2,1,1,""],MultipleInvalid:[2,1,1,""],NotInInvalid:[2,1,1,""],ObjectInvalid:[2,1,1,""],PathInvalid:[2,1,1,""],RangeInvalid:[2,1,1,""],RequiredFieldInvalid:[2,1,1,""],ScalarInvalid:[2,1,1,""],SchemaError:[2,1,1,""],SequenceTypeInvalid:[2,1,1,""],TrueInvalid:[2,1,1,""],TypeInvalid:[2,1,1,""],UrlInvalid:[2,1,1,""],ValueInvalid:[2,1,1,""]},"voluptuous.error.Invalid":{msg:[2,2,1,""],prepend:[2,3,1,""]},"voluptuous.error.MultipleInvalid":{add:[2,3,1,""],error_message:[2,2,1,""],msg:[2,2,1,""],path:[2,2,1,""],prepend:[2,3,1,""]},"voluptuous.humanize":{humanize_error:[2,4,1,""],validate_with_humanized_errors:[2,4,1,""]},"voluptuous.schema_builder":{Exclusive:[2,5,1,""],Extra:[2,4,1,""],Inclusive:[2,5,1,""],Marker:[2,5,1,""],Msg:[2,5,1,""],Object:[2,5,1,""],Optional:[2,5,1,""],Remove:[2,5,1,""],Required:[2,5,1,""],Schema:[2,5,1,""],Undefined:[2,5,1,""],VirtualPathComponent:[2,5,1,""],default_factory:[2,4,1,""],extra:[2,4,1,""],iteritems:[2,4,1,""],message:[2,4,1,""],raises:[2,4,1,""],validate:[2,4,1,""]},"voluptuous.schema_builder.Schema":{extend:[2,3,1,""]},"voluptuous.tests":{tests:[3,0,0,"-"]},"voluptuous.tests.tests":{test_copy_dict_undefined:[3,4,1,""],test_date:[3,4,1,""],test_datetime:[3,4,1,""],test_email_validation:[3,4,1,""],test_email_validation_with_empty_string:[3,4,1,""],test_email_validation_with_none:[3,4,1,""],test_email_validation_without_host:[3,4,1,""],test_empty_dict_as_exact:[3,4,1,""],test_empty_list_as_exact:[3,4,1,""],test_equal:[3,4,1,""],test_exact_sequence:[3,4,1,""],test_extra_empty_errors:[3,4,1,""],test_extra_with_required:[3,4,1,""],test_fix_157:[3,4,1,""],test_fqdn_url_validation:[3,4,1,""],test_fqdn_url_without_domain_name:[3,4,1,""],test_fqdnurl_validation_with_empty_string:[3,4,1,""],test_fqdnurl_validation_with_none:[3,4,1,""],test_fqdnurl_validation_without_host:[3,4,1,""],test_humanize_error:[3,4,1,""],test_in:[3,4,1,""],test_iterate_candidates:[3,4,1,""],test_list_validation_messages:[3,4,1,""],test_literal:[3,4,1,""],test_named_tuples_validate_as_tuples:[3,4,1,""],test_nested_multiple_validation_errors:[3,4,1,""],test_not_in:[3,4,1,""],test_number_validation_with_invalid_precision_invalid_scale:[3,4,1,""],test_number_validation_with_string:[3,4,1,""],test_number_validation_with_valid_precision_scale_yield_decimal_false:[3,4,1,""],test_number_validation_with_valid_precision_scale_yield_decimal_true:[3,4,1,""],test_number_when_invalid_precision_n_scale_none_yield_decimal_true:[3,4,1,""],test_number_when_precision_none_n_invalid_scale_yield_decimal_true:[3,4,1,""],test_number_when_precision_none_n_valid_scale_case1_yield_decimal_true:[3,4,1,""],test_number_when_precision_none_n_valid_scale_case2_yield_decimal_true:[3,4,1,""],test_number_when_precision_scale_none_yield_decimal_true:[3,4,1,""],test_number_when_valid_precision_n_scale_none_yield_decimal_true:[3,4,1,""],test_range_exlcudes_nan:[3,4,1,""],test_remove:[3,4,1,""],test_repr:[3,4,1,""],test_required:[3,4,1,""],test_schema_decorator_match_return_with_args:[3,4,1,""],test_schema_decorator_match_return_with_kwargs:[3,4,1,""],test_schema_decorator_match_with_args:[3,4,1,""],test_schema_decorator_match_with_kwargs:[3,4,1,""],test_schema_decorator_return_only_match:[3,4,1,""],test_schema_decorator_return_only_unmatch:[3,4,1,""],test_schema_decorator_unmatch_return_with_args:[3,4,1,""],test_schema_decorator_unmatch_return_with_kwargs:[3,4,1,""],test_schema_decorator_unmatch_with_args:[3,4,1,""],test_schema_decorator_unmatch_with_kwargs:[3,4,1,""],test_schema_extend:[3,4,1,""],test_schema_extend_key_swap:[3,4,1,""],test_schema_extend_overrides:[3,4,1,""],test_sorting:[3,4,1,""],test_subschema_extension:[3,4,1,""],test_to_utf8:[3,4,1,""],test_unicode_key_is_converted_to_utf8_when_in_marker:[3,4,1,""],test_unicode_key_is_converted_to_utf8_when_plain_text:[3,4,1,""],test_unordered:[3,4,1,""],test_url_validation:[3,4,1,""],test_url_validation_with_empty_string:[3,4,1,""],test_url_validation_with_none:[3,4,1,""],test_url_validation_without_host:[3,4,1,""]},"voluptuous.util":{Capitalize:[2,4,1,""],DefaultTo:[2,5,1,""],Literal:[2,5,1,""],Lower:[2,4,1,""],Set:[2,5,1,""],SetTo:[2,5,1,""],Strip:[2,4,1,""],Title:[2,4,1,""],Upper:[2,4,1,""],to_utf8_py2:[2,4,1,""],u:[2,4,1,""]},"voluptuous.validators":{All:[2,5,1,""],And:[2,2,1,""],Any:[2,5,1,""],Boolean:[2,4,1,""],Clamp:[2,5,1,""],Coerce:[2,5,1,""],Date:[2,5,1,""],Datetime:[2,5,1,""],Email:[2,4,1,""],Equal:[2,5,1,""],ExactSequence:[2,5,1,""],FqdnUrl:[2,4,1,""],In:[2,5,1,""],IsDir:[2,4,1,""],IsFalse:[2,4,1,""],IsFile:[2,4,1,""],IsTrue:[2,4,1,""],Length:[2,5,1,""],Match:[2,5,1,""],NotIn:[2,5,1,""],Number:[2,5,1,""],Or:[2,2,1,""],PathExists:[2,4,1,""],Range:[2,5,1,""],Replace:[2,5,1,""],Unique:[2,5,1,""],Unordered:[2,5,1,""],Url:[2,4,1,""],truth:[2,4,1,""]},"voluptuous.validators.Date":{DEFAULT_FORMAT:[2,2,1,""],FORMAT_DESCRIPTION:[2,2,1,""]},"voluptuous.validators.Datetime":{DEFAULT_FORMAT:[2,2,1,""]},voluptuous:{error:[2,0,0,"-"],humanize:[2,0,0,"-"],schema_builder:[2,0,0,"-"],tests:[3,0,0,"-"],util:[2,0,0,"-"],validators:[2,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","exception","Python exception"],"2":["py","attribute","Python attribute"],"3":["py","method","Python method"],"4":["py","function","Python function"],"5":["py","class","Python class"]},objtypes:{"0":"py:module","1":"py:exception","2":"py:attribute","3":"py:method","4":"py:function","5":"py:class"},terms:{"0x123ef4":2,"123ef4":2,"__eq__":2,"__file__":2,"__repr__":3,"__return__":2,"__str__":2,"_compil":2,"boolean":2,"break":3,"case":[2,3],"class":2,"default":2,"float":2,"function":2,"import":2,"int":2,"new":2,"return":[2,3],"throw":2,"true":2,"try":2,aabbc:2,abc:2,accept:2,actual:2,add:[2,3],against:2,alia:2,all:2,allinvalid:2,allow:2,alpha:2,alphabet:3,also:2,angl:2,ani:2,any:2,anyinvalid:2,api:2,appli:2,aren:2,arg1:2,arg2:2,arg:2,argument:2,arrai:2,assert:2,attr:2,attribut:2,auth:2,authent:2,automat:2,avail:3,bad:2,bar:2,barfoo:2,base:2,basenam:2,basestr:2,basi:2,behavior:2,beta:2,bool:2,booleaninvalid:2,both:[2,3],buffer:2,callabl:2,can:[2,3],candid:3,cannot:2,capit:2,capitalis:2,cast:2,certain:2,check:2,clamp:2,classic:2,clsoverrid:2,coerc:2,coerceinvalid:2,collect:2,com:2,comparison:2,compil:2,complet:2,constructor:2,contain:2,content:[],conveni:2,convert:2,copi:3,correct:2,correspond:2,creat:2,custom:2,data:2,date:2,dateinvalid:2,datetim:2,datetimeinvalid:2,decim:[2,3],decor:2,def:2,default_factori:2,default_format:2,default_valu:2,defaultto:2,deliv:2,descend:2,detail:2,dict:2,dictinvalid:2,dictionari:[2,3],did:2,differ:3,digit:2,direct:2,directori:2,dirinvalid:2,doe:[2,3],dog:2,domain:[2,3],dupe:2,duplic:2,each:2,either:2,element:2,email:[2,3],emailinvalid:2,empti:[2,3],enabl:2,encount:2,ensur:2,ensure:2,entir:2,equal:2,equat:2,error:[],error_messag:2,error_typ:2,etc:2,evalu:2,even:3,exact:2,exactsequ:2,exactsequenceinvalid:2,exampl:2,exc:2,except:[2,3],exception:2,exclud:2,exclus:2,exclusiv:2,exclusiveinvalid:2,exist:2,expect:[2,3],express:[2,3],extend:[2,3],extra:[2,3],fail:2,fals:2,falseinvalid:2,field:2,file:2,fileinvalid:2,filenam:2,first:2,flag:2,foo:2,format:2,format_description:2,found:2,fqdn:3,fqdnurl:2,friendli:2,from:[2,3],fulli:[2,3],given:2,goodby:2,green:2,group:2,group_of_exclus:2,group_of_inclus:2,height:2,hello:2,help:2,higher:2,host:3,hourly_report:2,http:2,human:[],humanize_error:2,ignor:2,imag:2,implicitli:2,impossibl:2,includ:2,inclus:2,inclusiv:2,inclusiveinvalid:2,index:0,indicat:2,inherit:2,ininvalid:2,input:2,insid:2,instead:2,integ:2,integerinvalid:2,intern:2,invalid:[2,3],isdir:2,isfals:2,isfile:2,isinst:2,isint:2,istrue:2,item:2,iter:[2,3],iteritem:2,jpeg:2,jpg:2,json:2,keep:2,kei:[2,3],key2:2,keyerror:2,keyword:2,kwarg:2,length:2,lengthinvalid:2,like:2,limit:2,list:2,lit:2,liter:[2,3],literalinvalid:2,localhost:2,lower:2,mai:2,make:[2,3],map:3,mark:2,marker:[2,3],match:2,matchinvalid:2,max:2,max_includ:2,max_sub_error_length:2,mean:2,merg:2,messag:[2,3],mimetyp:2,min:2,min_includ:2,miss:2,modifi:2,modul:[],moo:2,more:2,most:2,msg:2,multipl:2,multipleinvalid:2,must:2,name:[2,3],nativ:2,need:2,neg:2,neither:2,next:2,node:2,non:2,none:[2,3],nor:2,notavaliddir:2,notin:[2,3],notininvalid:2,number:[2,3],object:2,objectinvalid:2,offend:2,okai:2,omit:2,onli:2,only:2,option:2,optional:2,order:[2,3],org:2,other:2,output:2,outsid:2,over:3,overrid:[2,3],overridden:2,packag:[],page:0,paramet:[2,3],part:3,pass:2,password:2,path:2,pathexist:2,pathinvalid:2,pattern:2,per:2,perform:2,place:2,pleas:2,precis:[2,3],prefix:3,prepend:2,present:2,previou:2,provid:2,python:[2,3],qualifi:[2,3],rais:2,random_filename_goes_her:2,rang:2,rangeinvalid:2,readabl:2,red:2,regardless:2,regex:2,regular:2,remov:[2,3],replac:[2,3],report:2,requir:[2,3],requiredfieldinvalid:2,restrict:2,result:2,right:3,sai:2,same:2,scalar:2,scalarinvalid:2,scale:[2,3],schema:[2,3],schema_:2,schema_build:[],schemaerror:2,search:0,secret_kei:2,see:2,sens:2,separ:2,sequenc:2,sequencetypeinvalid:2,set:2,setto:2,should:2,size:2,social:2,social_network:2,some:2,sort:3,sourc:[2,3],special:2,startswith:2,str:2,string:[2,3],strip:2,structur:2,sub:2,subclas:2,subclass:2,submodul:[],subpackag:[],subschema:3,substitut:2,support:2,sure:3,target:2,temp:2,test:[],test_copy_dict_undefin:3,test_dat:3,test_datetim:3,test_email_valid:3,test_email_validation_with_empty_str:3,test_email_validation_with_non:3,test_email_validation_without_host:3,test_empty_dict_as_exact:3,test_empty_list_as_exact:3,test_equ:3,test_exact_sequ:3,test_extra_empty_error:3,test_extra_with_requir:3,test_fix_157:3,test_fqdn_url_valid:3,test_fqdn_url_without_domain_nam:3,test_fqdnurl_validation_with_empty_str:3,test_fqdnurl_validation_with_non:3,test_fqdnurl_validation_without_host:3,test_humanize_error:3,test_in:3,test_iterate_candid:3,test_list_validation_messag:3,test_liter:3,test_named_tuples_validate_as_tupl:3,test_nested_multiple_validation_error:3,test_not_in:3,test_number_validation_with_invalid_precision_invalid_scal:3,test_number_validation_with_str:3,test_number_validation_with_valid_precision_scale_yield_decimal_fals:3,test_number_validation_with_valid_precision_scale_yield_decimal_tru:3,test_number_when_invalid_precision_n_scale_none_yield_decimal_tru:3,test_number_when_precision_none_n_invalid_scale_yield_decimal_tru:3,test_number_when_precision_none_n_valid_scale_case1_yield_decimal_tru:3,test_number_when_precision_none_n_valid_scale_case2_yield_decimal_tru:3,test_number_when_precision_scale_none_yield_decimal_tru:3,test_number_when_valid_precision_n_scale_none_yield_decimal_tru:3,test_range_exlcudes_nan:3,test_remov:3,test_repr:3,test_requir:3,test_schema_decorator_match_return_with_arg:3,test_schema_decorator_match_return_with_kwarg:3,test_schema_decorator_match_with_arg:3,test_schema_decorator_match_with_kwarg:3,test_schema_decorator_return_only_match:3,test_schema_decorator_return_only_unmatch:3,test_schema_decorator_unmatch_return_with_arg:3,test_schema_decorator_unmatch_return_with_kwarg:3,test_schema_decorator_unmatch_with_arg:3,test_schema_decorator_unmatch_with_kwarg:3,test_schema_extend:3,test_schema_extend_key_swap:3,test_schema_extend_overrid:3,test_sort:3,test_subschema_extens:3,test_to_utf8:3,test_unicode_key_is_converted_to_utf8_when_in_mark:3,test_unicode_key_is_converted_to_utf8_when_plain_text:3,test_unord:3,test_url_valid:3,test_url_validation_with_empty_str:3,test_url_validation_with_non:3,test_url_validation_without_host:3,than:2,thei:2,thi:2,three:2,thrown:[2,3],time:2,titl:2,to_utf8_py2:2,togeth:2,token:2,too:2,transform:2,treat:2,treatment:2,tree:2,trueinvalid:2,truth:2,two:2,type:2,typeerror:2,typeinvalid:2,undefin:2,unhash:2,unicod:[2,3],uniqu:2,unless:2,unorder:2,unspecifi:2,upper:2,url:[2,3],urlinvalid:2,use:2,user:2,util:[],valid:[],validate_with_humanized_error:2,validation_error:2,valu:2,valueerror:2,valueinvalid:2,verifi:[2,3],virtualpathcompon:2,when:3,where:2,which:2,whitespac:2,width:2,work:[2,3],world:2,wrap:2,yield_decim:[2,3],you:2,yyyi:2,zero:3},titles:["Welcome to Voluptuous&#8217;s documentation!","voluptuous","voluptuous package","voluptuous.tests package"],titleterms:{content:[2,3],document:0,error:2,human:2,indice:0,modul:[2,3],packag:[2,3],schema_build:2,submodul:[2,3],subpackag:2,tabl:0,test:3,util:2,valid:2,voluptu:[0,1,2,3],welcom:0}}) \ No newline at end of file
+Search.setIndex({envversion:50,filenames:["index","modules","voluptuous","voluptuous.tests"],objects:{"":{voluptuous:[2,0,0,"-"]},"voluptuous.error":{AllInvalid:[2,1,1,""],AnyInvalid:[2,1,1,""],BooleanInvalid:[2,1,1,""],CoerceInvalid:[2,1,1,""],ContainsInvalid:[2,1,1,""],DateInvalid:[2,1,1,""],DatetimeInvalid:[2,1,1,""],DictInvalid:[2,1,1,""],DirInvalid:[2,1,1,""],EmailInvalid:[2,1,1,""],Error:[2,1,1,""],ExactSequenceInvalid:[2,1,1,""],ExclusiveInvalid:[2,1,1,""],FalseInvalid:[2,1,1,""],FileInvalid:[2,1,1,""],InInvalid:[2,1,1,""],InclusiveInvalid:[2,1,1,""],Invalid:[2,1,1,""],LengthInvalid:[2,1,1,""],LiteralInvalid:[2,1,1,""],MatchInvalid:[2,1,1,""],MultipleInvalid:[2,1,1,""],NotEnoughValid:[2,1,1,""],NotInInvalid:[2,1,1,""],ObjectInvalid:[2,1,1,""],PathInvalid:[2,1,1,""],RangeInvalid:[2,1,1,""],RequiredFieldInvalid:[2,1,1,""],ScalarInvalid:[2,1,1,""],SchemaError:[2,1,1,""],SequenceTypeInvalid:[2,1,1,""],TooManyValid:[2,1,1,""],TrueInvalid:[2,1,1,""],TypeInvalid:[2,1,1,""],UrlInvalid:[2,1,1,""],ValueInvalid:[2,1,1,""]},"voluptuous.error.Invalid":{msg:[2,2,1,""],prepend:[2,3,1,""]},"voluptuous.error.MultipleInvalid":{add:[2,3,1,""],error_message:[2,2,1,""],msg:[2,2,1,""],path:[2,2,1,""],prepend:[2,3,1,""]},"voluptuous.humanize":{humanize_error:[2,4,1,""],validate_with_humanized_errors:[2,4,1,""]},"voluptuous.schema_builder":{Exclusive:[2,5,1,""],Extra:[2,4,1,""],Inclusive:[2,5,1,""],Marker:[2,5,1,""],Msg:[2,5,1,""],Object:[2,5,1,""],Optional:[2,5,1,""],Remove:[2,5,1,""],Required:[2,5,1,""],Schema:[2,5,1,""],Self:[2,4,1,""],Undefined:[2,5,1,""],VirtualPathComponent:[2,5,1,""],default_factory:[2,4,1,""],extra:[2,4,1,""],iteritems:[2,4,1,""],message:[2,4,1,""],raises:[2,4,1,""],validate:[2,4,1,""]},"voluptuous.schema_builder.Schema":{extend:[2,3,1,""],infer:[2,6,1,""]},"voluptuous.tests":{tests:[3,0,0,"-"]},"voluptuous.tests.tests":{test_IsDir:[3,4,1,""],test_IsFile:[3,4,1,""],test_PathExists:[3,4,1,""],test_SomeOf_max_validation:[3,4,1,""],test_SomeOf_min_validation:[3,4,1,""],test_SomeOf_on_bounds_assertion:[3,4,1,""],test_all_error_has_path:[3,4,1,""],test_any_error_has_path:[3,4,1,""],test_class:[3,4,1,""],test_comparing_voluptuous_object_to_str:[3,4,1,""],test_contains:[3,4,1,""],test_copy_dict_undefined:[3,4,1,""],test_date:[3,4,1,""],test_date_custom_format:[3,4,1,""],test_datetime:[3,4,1,""],test_description:[3,4,1,""],test_email_validation:[3,4,1,""],test_email_validation_with_empty_string:[3,4,1,""],test_email_validation_with_none:[3,4,1,""],test_email_validation_without_host:[3,4,1,""],test_empty_list_as_exact:[3,4,1,""],test_equal:[3,4,1,""],test_equality:[3,4,1,""],test_equality_negative:[3,4,1,""],test_exact_sequence:[3,4,1,""],test_extra_empty_errors:[3,4,1,""],test_extra_with_required:[3,4,1,""],test_fix_157:[3,4,1,""],test_fqdn_url_validation:[3,4,1,""],test_fqdn_url_without_domain_name:[3,4,1,""],test_fqdnurl_validation_with_empty_string:[3,4,1,""],test_fqdnurl_validation_with_none:[3,4,1,""],test_fqdnurl_validation_without_host:[3,4,1,""],test_frozenset_of_integers:[3,4,1,""],test_frozenset_of_integers_and_strings:[3,4,1,""],test_humanize_error:[3,4,1,""],test_in:[3,4,1,""],test_inequality:[3,4,1,""],test_inequality_negative:[3,4,1,""],test_iterate_candidates:[3,4,1,""],test_list_validation_messages:[3,4,1,""],test_literal:[3,4,1,""],test_marker_hashable:[3,4,1,""],test_match_error_has_path:[3,4,1,""],test_maybe:[3,4,1,""],test_named_tuples_validate_as_tuples:[3,4,1,""],test_nested_multiple_validation_errors:[3,4,1,""],test_not_in:[3,4,1,""],test_number_validation_with_invalid_precision_invalid_scale:[3,4,1,""],test_number_validation_with_string:[3,4,1,""],test_number_validation_with_valid_precision_scale_yield_decimal_false:[3,4,1,""],test_number_validation_with_valid_precision_scale_yield_decimal_true:[3,4,1,""],test_number_when_invalid_precision_n_scale_none_yield_decimal_true:[3,4,1,""],test_number_when_precision_none_n_invalid_scale_yield_decimal_true:[3,4,1,""],test_number_when_precision_none_n_valid_scale_case1_yield_decimal_true:[3,4,1,""],test_number_when_precision_none_n_valid_scale_case2_yield_decimal_true:[3,4,1,""],test_number_when_precision_scale_none_yield_decimal_true:[3,4,1,""],test_number_when_valid_precision_n_scale_none_yield_decimal_true:[3,4,1,""],test_ordered_dict:[3,4,1,""],test_range_exlcudes_nan:[3,4,1,""],test_remove:[3,4,1,""],test_repr:[3,4,1,""],test_required:[3,4,1,""],test_schema_decorator_match_return_with_args:[3,4,1,""],test_schema_decorator_match_return_with_kwargs:[3,4,1,""],test_schema_decorator_match_with_args:[3,4,1,""],test_schema_decorator_match_with_kwargs:[3,4,1,""],test_schema_decorator_partial_match_called_with_args:[3,4,1,""],test_schema_decorator_partial_match_called_with_kwargs:[3,4,1,""],test_schema_decorator_partial_unmatch_called_with_args:[3,4,1,""],test_schema_decorator_partial_unmatch_called_with_kwargs:[3,4,1,""],test_schema_decorator_return_only_match:[3,4,1,""],test_schema_decorator_return_only_unmatch:[3,4,1,""],test_schema_decorator_unmatch_return_with_args:[3,4,1,""],test_schema_decorator_unmatch_return_with_kwargs:[3,4,1,""],test_schema_decorator_unmatch_with_args:[3,4,1,""],test_schema_decorator_unmatch_with_kwargs:[3,4,1,""],test_schema_extend:[3,4,1,""],test_schema_extend_key_swap:[3,4,1,""],test_schema_extend_overrides:[3,4,1,""],test_schema_infer:[3,4,1,""],test_schema_infer_accepts_kwargs:[3,4,1,""],test_schema_infer_dict:[3,4,1,""],test_schema_infer_list:[3,4,1,""],test_schema_infer_scalar:[3,4,1,""],test_self_all:[3,4,1,""],test_self_any:[3,4,1,""],test_self_validation:[3,4,1,""],test_set_of_integers:[3,4,1,""],test_set_of_integers_and_strings:[3,4,1,""],test_sorting:[3,4,1,""],test_subschema_extension:[3,4,1,""],test_unicode_as_key:[3,4,1,""],test_unordered:[3,4,1,""],test_url_validation:[3,4,1,""],test_url_validation_with_empty_string:[3,4,1,""],test_url_validation_with_none:[3,4,1,""],test_url_validation_without_host:[3,4,1,""],test_validation_performance:[3,4,1,""]},"voluptuous.util":{Capitalize:[2,4,1,""],DefaultTo:[2,5,1,""],Literal:[2,5,1,""],Lower:[2,4,1,""],Set:[2,5,1,""],SetTo:[2,5,1,""],Strip:[2,4,1,""],Title:[2,4,1,""],Upper:[2,4,1,""],u:[2,4,1,""]},"voluptuous.validators":{All:[2,5,1,""],And:[2,2,1,""],Any:[2,5,1,""],Boolean:[2,4,1,""],Clamp:[2,5,1,""],Coerce:[2,5,1,""],Contains:[2,5,1,""],Date:[2,5,1,""],Datetime:[2,5,1,""],Email:[2,4,1,""],Equal:[2,5,1,""],ExactSequence:[2,5,1,""],FqdnUrl:[2,4,1,""],In:[2,5,1,""],IsDir:[2,4,1,""],IsFalse:[2,4,1,""],IsFile:[2,4,1,""],IsTrue:[2,4,1,""],Length:[2,5,1,""],Match:[2,5,1,""],Maybe:[2,4,1,""],NotIn:[2,5,1,""],Number:[2,5,1,""],Or:[2,2,1,""],PathExists:[2,4,1,""],Range:[2,5,1,""],Replace:[2,5,1,""],SomeOf:[2,5,1,""],Unique:[2,5,1,""],Unordered:[2,5,1,""],Url:[2,4,1,""],truth:[2,4,1,""]},"voluptuous.validators.Date":{DEFAULT_FORMAT:[2,2,1,""]},"voluptuous.validators.Datetime":{DEFAULT_FORMAT:[2,2,1,""]},voluptuous:{error:[2,0,0,"-"],humanize:[2,0,0,"-"],schema_builder:[2,0,0,"-"],tests:[3,0,0,"-"],util:[2,0,0,"-"],validators:[2,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","exception","Python exception"],"2":["py","attribute","Python attribute"],"3":["py","method","Python method"],"4":["py","function","Python function"],"5":["py","class","Python class"],"6":["py","classmethod","Python class method"]},objtypes:{"0":"py:module","1":"py:exception","2":"py:attribute","3":"py:method","4":"py:function","5":"py:class","6":"py:classmethod"},terms:{"0x123ef4":2,"123ef4":2,"__eq__":2,"__file__":2,"__repr__":3,"__return__":2,"__str__":2,"_compil":2,"_withsubvalid":2,"boolean":2,"break":3,"case":[2,3],"class":2,"default":2,"float":2,"function":2,"import":2,"int":2,"new":2,"return":[2,3],"throw":2,"true":2,"try":2,aabbc:2,abc:2,accept:2,achiev:3,actual:2,add:[2,3],against:2,alecthoma:3,alia:2,all:2,allinvalid:2,allow:2,alpha:2,alphabet:3,also:2,amount:2,angl:2,ani:2,any:2,anyinvalid:2,api:2,appli:2,aren:2,arg1:2,arg2:2,arg:2,argument:2,arrai:2,assert:2,attr:2,attribut:2,auth:2,authent:2,automat:2,avail:3,bad:2,bar:2,barfoo:2,base:2,basenam:2,basestr:2,basi:2,basic:2,baz:2,behavior:2,beta:2,bool:2,booleaninvalid:2,both:[2,3],buffer:2,callabl:2,can:[2,3],candid:3,cannot:2,cap:2,capit:2,capitalis:2,cast:2,certain:2,check:2,clamp:2,classic:2,classmethod:2,clsoverrid:2,coerc:2,coerceinvalid:2,collect:2,com:[2,3],come:3,comparison:2,compil:2,complet:2,complex:3,concret:2,constructor:2,contain:[2,3],containsinvalid:2,content:[],conveni:2,convert:2,copi:3,correct:2,correspond:2,count:3,creat:2,custom:[2,3],data:2,date:2,dateinvalid:2,datetim:2,datetimeinvalid:2,decim:[2,3],decor:2,def:2,default_factori:2,default_format:2,default_valu:2,defaultto:2,deliv:2,descend:2,descript:2,detail:2,determin:[2,3],dict:2,dictinvalid:2,dictionari:[2,3],did:2,differ:3,digit:2,direct:2,directori:2,dirinvalid:2,dishwash:2,doe:[2,3],dog:2,domain:[2,3],done:3,dupe:2,duplic:2,each:[2,3],either:2,element:2,email:[2,3],emailinvalid:2,empti:[2,3],enabl:2,encount:2,enough:2,ensur:2,ensure:2,entir:2,equal:[2,3],equat:2,error:[],error_messag:2,error_typ:2,etc:2,evalu:[2,3],even:3,exact:2,exactsequ:2,exactsequenceinvalid:2,exampl:2,exc:2,except:2,exception:2,exclud:2,exclus:2,exclusiv:2,exclusiveinvalid:2,exist:2,expect:[2,3],exponenti:3,express:[2,3],extend:[2,3],extra:[2,3],fail:2,fals:2,falseinvalid:2,field:2,file:2,fileinvalid:2,filenam:2,first:2,flag:2,foo:2,format:2,format_description:[],found:2,fqdn:3,fqdnurl:2,friendli:2,from:[2,3],fulli:[2,3],get:3,github:3,given:2,goodby:2,green:2,group:2,group_of_exclus:2,group_of_inclus:2,height:2,hello:2,help:2,higher:2,host:3,hourly_report:2,http:[2,3],human:[],humanize_error:2,ignor:2,imag:2,implicitli:2,impossibl:2,includ:2,inclus:2,inclusiv:2,inclusiveinvalid:2,index:0,indicat:2,infer:2,inherit:2,ininvalid:2,input:2,insid:2,instead:2,integ:2,integerinvalid:2,intern:2,invalid:[2,3],isdir:2,isfals:2,isfile:2,isinst:2,isint:2,isn:2,issu:3,istrue:2,item:2,iter:[2,3],iteritem:2,jpeg:2,jpg:2,json:2,keep:2,kei:[2,3],key2:2,keyerror:2,keyword:2,kwarg:2,least:2,length:2,lengthinvalid:2,like:2,limit:2,linear:3,list:2,lit:2,liter:[2,3],literalinvalid:2,localhost:2,lower:2,mai:2,make:[2,3],map:3,mark:2,marker:[2,3],match:2,matchinvalid:2,max:2,max_includ:2,max_sub_error_length:2,max_valid:2,maximum:2,mayb:2,mean:2,merg:2,messag:[2,3],met:2,method:3,mimetyp:2,min:2,min_includ:2,min_valid:2,minimum:2,miss:2,modifi:2,modul:[],monkei:2,moo:2,more:2,most:2,msg:2,multipl:2,multipleinvalid:2,must:2,name:[2,3],nativ:2,need:2,neg:2,neither:2,next:2,node:2,non:2,none:[2,3],nor:2,notavaliddir:2,note:2,notenoughvalid:2,notin:[2,3],notininvalid:2,number:[2,3],object:[2,3],objectinvalid:2,offend:2,okai:2,omit:2,onli:2,only:2,option:2,optional:2,order:[2,3],org:2,other:2,output:2,outsid:2,over:3,overrid:[2,3],overridden:2,packag:[],page:0,paramet:[2,3],part:3,pass:2,password:2,path:2,pathexist:2,pathinvalid:2,pattern:2,per:2,perform:2,place:2,pleas:2,precis:[2,3],prefix:[],prepend:2,present:2,previou:2,prior:3,provid:2,purpl:2,python:[2,3],qualifi:[2,3],rais:2,random_filename_goes_her:2,rang:2,rangeinvalid:2,readabl:2,red:2,regardless:2,regex:2,regular:2,remov:[2,3],replac:[2,3],report:2,represent:3,requir:[2,3],requiredfieldinvalid:2,respons:2,restrict:2,result:2,right:3,sai:2,same:2,scalar:2,scalarinvalid:2,scale:[2,3],schema:[2,3],schema_:2,schema_build:[],schemaerror:2,scheme:3,search:0,secret_kei:2,see:2,self:2,sens:2,separ:2,sequenc:2,sequencetypeinvalid:2,set:2,setto:2,should:2,size:2,social:2,social_network:2,some:2,someof:2,sort:3,sourc:[2,3],special:2,startswith:2,str:2,string:[2,3],strip:2,structur:2,sub:2,subclas:2,subclass:2,submodul:[],subpackag:[],subschema:3,substitut:2,support:2,sure:3,take:2,target:2,temp:2,test:[],test_all_error_has_path:3,test_any_error_has_path:3,test_class:3,test_comparing_voluptuous_object_to_str:3,test_contain:3,test_copy_dict_undefin:3,test_dat:3,test_date_custom_format:3,test_datetim:3,test_descript:3,test_email_valid:3,test_email_validation_with_empty_str:3,test_email_validation_with_non:3,test_email_validation_without_host:3,test_empty_dict_as_exact:[],test_empty_list_as_exact:3,test_equ:3,test_equality_neg:3,test_exact_sequ:3,test_extra_empty_error:3,test_extra_with_requir:3,test_fix_157:3,test_fqdn_url_valid:3,test_fqdn_url_without_domain_nam:3,test_fqdnurl_validation_with_empty_str:3,test_fqdnurl_validation_with_non:3,test_fqdnurl_validation_without_host:3,test_frozenset_of_integ:3,test_frozenset_of_integers_and_str:3,test_humanize_error:3,test_in:3,test_inequ:3,test_inequality_neg:3,test_isdir:3,test_isfil:3,test_iterate_candid:3,test_list_validation_messag:3,test_liter:3,test_marker_hash:3,test_match_error_has_path:3,test_mayb:3,test_named_tuples_validate_as_tupl:3,test_nested_multiple_validation_error:3,test_not_in:3,test_number_validation_with_invalid_precision_invalid_scal:3,test_number_validation_with_str:3,test_number_validation_with_valid_precision_scale_yield_decimal_fals:3,test_number_validation_with_valid_precision_scale_yield_decimal_tru:3,test_number_when_invalid_precision_n_scale_none_yield_decimal_tru:3,test_number_when_precision_none_n_invalid_scale_yield_decimal_tru:3,test_number_when_precision_none_n_valid_scale_case1_yield_decimal_tru:3,test_number_when_precision_none_n_valid_scale_case2_yield_decimal_tru:3,test_number_when_precision_scale_none_yield_decimal_tru:3,test_number_when_valid_precision_n_scale_none_yield_decimal_tru:3,test_ordered_dict:3,test_pathexist:3,test_range_exlcudes_nan:3,test_remov:3,test_repr:3,test_requir:3,test_schema_decorator_match_return_with_arg:3,test_schema_decorator_match_return_with_kwarg:3,test_schema_decorator_match_with_arg:3,test_schema_decorator_match_with_kwarg:3,test_schema_decorator_partial_match_called_with_arg:3,test_schema_decorator_partial_match_called_with_kwarg:3,test_schema_decorator_partial_unmatch_called_with_arg:3,test_schema_decorator_partial_unmatch_called_with_kwarg:3,test_schema_decorator_return_only_match:3,test_schema_decorator_return_only_unmatch:3,test_schema_decorator_unmatch_return_with_arg:3,test_schema_decorator_unmatch_return_with_kwarg:3,test_schema_decorator_unmatch_with_arg:3,test_schema_decorator_unmatch_with_kwarg:3,test_schema_extend:3,test_schema_extend_key_swap:3,test_schema_extend_overrid:3,test_schema_inf:3,test_schema_infer_accepts_kwarg:3,test_schema_infer_dict:3,test_schema_infer_list:3,test_schema_infer_scalar:3,test_self_al:3,test_self_ani:3,test_self_valid:3,test_set_of_integ:3,test_set_of_integers_and_str:3,test_someof_max_valid:3,test_someof_min_valid:3,test_someof_on_bounds_assert:3,test_sort:3,test_subschema_extens:3,test_to_utf8:[],test_unicode_as_kei:3,test_unicode_key_is_converted_to_utf8_when_in_mark:[],test_unicode_key_is_converted_to_utf8_when_plain_text:[],test_unord:3,test_url_valid:3,test_url_validation_with_empty_str:3,test_url_validation_with_non:3,test_url_validation_without_host:3,test_validation_perform:3,than:2,thei:2,thi:[2,3],three:2,thrown:2,time:[2,3],titl:2,to_utf8_py2:[],togeth:2,token:2,too:2,toomanyvalid:2,transform:2,treat:2,treatment:2,tree:2,trueinvalid:2,truth:2,two:2,type:2,typeerror:2,typeinvalid:2,undefin:2,unhash:2,unicod:2,uniqu:2,unless:2,unorder:2,unspecifi:2,upper:2,url:[2,3],urlinvalid:2,use:2,user:2,util:[],valid:[],validate_with_humanized_error:2,validation_error:2,valu:2,valueerror:2,valueinvalid:2,veri:2,verifi:[2,3],virtualpathcompon:2,were:3,when:3,where:2,which:2,whitespac:2,width:2,work:[2,3],world:2,wrap:2,yield_decim:[2,3],you:[2,3],yyyi:[],zero:3},titles:["Welcome to Voluptuous&#8217;s documentation!","voluptuous","voluptuous package","voluptuous.tests package"],titleterms:{content:[2,3],document:0,error:2,human:2,indice:0,modul:[2,3],packag:[2,3],schema_build:2,submodul:[2,3],subpackag:2,tabl:0,test:3,util:2,valid:2,voluptu:[0,1,2,3],welcom:0}}) \ No newline at end of file
diff --git a/docs/_build/html/voluptuous.html b/docs/_build/html/voluptuous.html
index e71f915..d19ded6 100644
--- a/docs/_build/html/voluptuous.html
+++ b/docs/_build/html/voluptuous.html
@@ -90,6 +90,13 @@
</dd></dl>
<dl class="exception">
+<dt id="voluptuous.error.ContainsInvalid">
+<em class="property">exception </em><code class="descclassname">voluptuous.error.</code><code class="descname">ContainsInvalid</code><span class="sig-paren">(</span><em>message</em>, <em>path=None</em>, <em>error_message=None</em>, <em>error_type=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/error.html#ContainsInvalid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.error.ContainsInvalid" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#voluptuous.error.Invalid" title="voluptuous.error.Invalid"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.error.Invalid</span></code></a></p>
+<p>List does not contain item</p>
+</dd></dl>
+
+<dl class="exception">
<dt id="voluptuous.error.DateInvalid">
<em class="property">exception </em><code class="descclassname">voluptuous.error.</code><code class="descname">DateInvalid</code><span class="sig-paren">(</span><em>message</em>, <em>path=None</em>, <em>error_message=None</em>, <em>error_type=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/error.html#DateInvalid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.error.DateInvalid" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <a class="reference internal" href="#voluptuous.error.Invalid" title="voluptuous.error.Invalid"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.error.Invalid</span></code></a></p>
@@ -254,6 +261,13 @@ string.</td>
</dd></dl>
<dl class="exception">
+<dt id="voluptuous.error.NotEnoughValid">
+<em class="property">exception </em><code class="descclassname">voluptuous.error.</code><code class="descname">NotEnoughValid</code><span class="sig-paren">(</span><em>message</em>, <em>path=None</em>, <em>error_message=None</em>, <em>error_type=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/error.html#NotEnoughValid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.error.NotEnoughValid" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#voluptuous.error.Invalid" title="voluptuous.error.Invalid"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.error.Invalid</span></code></a></p>
+<p>The value did not pass enough validations.</p>
+</dd></dl>
+
+<dl class="exception">
<dt id="voluptuous.error.NotInInvalid">
<em class="property">exception </em><code class="descclassname">voluptuous.error.</code><code class="descname">NotInInvalid</code><span class="sig-paren">(</span><em>message</em>, <em>path=None</em>, <em>error_message=None</em>, <em>error_type=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/error.html#NotInInvalid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.error.NotInInvalid" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <a class="reference internal" href="#voluptuous.error.Invalid" title="voluptuous.error.Invalid"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.error.Invalid</span></code></a></p>
@@ -309,6 +323,13 @@ string.</td>
</dd></dl>
<dl class="exception">
+<dt id="voluptuous.error.TooManyValid">
+<em class="property">exception </em><code class="descclassname">voluptuous.error.</code><code class="descname">TooManyValid</code><span class="sig-paren">(</span><em>message</em>, <em>path=None</em>, <em>error_message=None</em>, <em>error_type=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/error.html#TooManyValid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.error.TooManyValid" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#voluptuous.error.Invalid" title="voluptuous.error.Invalid"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.error.Invalid</span></code></a></p>
+<p>The value passed more than expected validations.</p>
+</dd></dl>
+
+<dl class="exception">
<dt id="voluptuous.error.TrueInvalid">
<em class="property">exception </em><code class="descclassname">voluptuous.error.</code><code class="descname">TrueInvalid</code><span class="sig-paren">(</span><em>message</em>, <em>path=None</em>, <em>error_message=None</em>, <em>error_type=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/error.html#TrueInvalid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.error.TrueInvalid" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <a class="reference internal" href="#voluptuous.error.Invalid" title="voluptuous.error.Invalid"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.error.Invalid</span></code></a></p>
@@ -357,7 +378,7 @@ and MultipleInvalid.__str__ only provides the first error.</p>
<span id="voluptuous-schema-builder-module"></span><h2>voluptuous.schema_builder module<a class="headerlink" href="#module-voluptuous.schema_builder" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="voluptuous.schema_builder.Exclusive">
-<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Exclusive</code><span class="sig-paren">(</span><em>schema</em>, <em>group_of_exclusion</em>, <em>msg=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Exclusive"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Exclusive" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Exclusive</code><span class="sig-paren">(</span><em>schema</em>, <em>group_of_exclusion</em>, <em>msg=None</em>, <em>description=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Exclusive"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Exclusive" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <a class="reference internal" href="#voluptuous.schema_builder.Optional" title="voluptuous.schema_builder.Optional"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.schema_builder.Optional</span></code></a></p>
<p>Mark a node in the schema as exclusive.</p>
<p>Exclusive keys inherited from Optional:</p>
@@ -406,7 +427,7 @@ and MultipleInvalid.__str__ only provides the first error.</p>
<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Inclusive</code><span class="sig-paren">(</span><em>schema</em>, <em>group_of_inclusion</em>, <em>msg=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Inclusive"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Inclusive" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <a class="reference internal" href="#voluptuous.schema_builder.Optional" title="voluptuous.schema_builder.Optional"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.schema_builder.Optional</span></code></a></p>
<p>Mark a node in the schema as inclusive.</p>
-<p>Exclusive keys inherited from Optional:</p>
+<p>Inclusive keys inherited from Optional:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span>
<span class="gp">... </span> <span class="n">Inclusive</span><span class="p">(</span><span class="s1">&#39;filename&#39;</span><span class="p">,</span> <span class="s1">&#39;file&#39;</span><span class="p">):</span> <span class="nb">str</span><span class="p">,</span>
<span class="gp">... </span> <span class="n">Inclusive</span><span class="p">(</span><span class="s1">&#39;mimetype&#39;</span><span class="p">,</span> <span class="s1">&#39;file&#39;</span><span class="p">):</span> <span class="nb">str</span>
@@ -451,7 +472,7 @@ and MultipleInvalid.__str__ only provides the first error.</p>
<dl class="class">
<dt id="voluptuous.schema_builder.Marker">
-<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Marker</code><span class="sig-paren">(</span><em>schema_</em>, <em>msg=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Marker"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Marker" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Marker</code><span class="sig-paren">(</span><em>schema_</em>, <em>msg=None</em>, <em>description=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Marker"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Marker" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">object</span></code></p>
<p>Mark nodes for special treatment.</p>
</dd></dl>
@@ -498,7 +519,7 @@ and MultipleInvalid.__str__ only provides the first error.</p>
<dl class="class">
<dt id="voluptuous.schema_builder.Optional">
-<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Optional</code><span class="sig-paren">(</span><em>schema</em>, <em>msg=None</em>, <em>default=...</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Optional"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Optional" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Optional</code><span class="sig-paren">(</span><em>schema</em>, <em>msg=None</em>, <em>default=...</em>, <em>description=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Optional"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Optional" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <a class="reference internal" href="#voluptuous.schema_builder.Marker" title="voluptuous.schema_builder.Marker"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.schema_builder.Marker</span></code></a></p>
<p>Mark a node in the schema as optional, and optionally provide a default</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="n">Optional</span><span class="p">(</span><span class="s1">&#39;key&#39;</span><span class="p">):</span> <span class="nb">str</span><span class="p">})</span>
@@ -525,7 +546,7 @@ and MultipleInvalid.__str__ only provides the first error.</p>
<dl class="class">
<dt id="voluptuous.schema_builder.Remove">
-<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Remove</code><span class="sig-paren">(</span><em>schema_</em>, <em>msg=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Remove"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Remove" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Remove</code><span class="sig-paren">(</span><em>schema_</em>, <em>msg=None</em>, <em>description=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Remove"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Remove" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <a class="reference internal" href="#voluptuous.schema_builder.Marker" title="voluptuous.schema_builder.Marker"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.schema_builder.Marker</span></code></a></p>
<p>Mark a node in the schema to be removed and excluded from the validated
output. Keys that fail validation will not raise <code class="docutils literal"><span class="pre">Invalid</span></code>. Instead, these
@@ -544,7 +565,7 @@ keys will be treated as extras.</p>
<dl class="class">
<dt id="voluptuous.schema_builder.Required">
-<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Required</code><span class="sig-paren">(</span><em>schema</em>, <em>msg=None</em>, <em>default=...</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Required"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Required" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Required</code><span class="sig-paren">(</span><em>schema</em>, <em>msg=None</em>, <em>default=...</em>, <em>description=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Required"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Required" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <a class="reference internal" href="#voluptuous.schema_builder.Marker" title="voluptuous.schema_builder.Marker"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.schema_builder.Marker</span></code></a></p>
<p>Mark a node in the schema as being required, and optionally provide a default value.</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">schema</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">({</span><span class="n">Required</span><span class="p">(</span><span class="s1">&#39;key&#39;</span><span class="p">):</span> <span class="nb">str</span><span class="p">})</span>
@@ -604,8 +625,46 @@ this, unless overridden.</p>
</table>
</dd></dl>
+<dl class="classmethod">
+<dt id="voluptuous.schema_builder.Schema.infer">
+<em class="property">classmethod </em><code class="descname">infer</code><span class="sig-paren">(</span><em>data</em>, <em>**kwargs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Schema.infer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Schema.infer" title="Permalink to this definition">¶</a></dt>
+<dd><p>Create a Schema from concrete data (e.g. an API response).</p>
+<p>For example, this will take a dict like:</p>
+<dl class="docutils">
+<dt>{</dt>
+<dd><p class="first">&#8216;foo&#8217;: 1,
+&#8216;bar&#8217;: {</p>
+<blockquote>
+<div>&#8216;a&#8217;: True,
+&#8216;b&#8217;: False</div></blockquote>
+<p class="last">},
+&#8216;baz&#8217;: [&#8216;purple&#8217;, &#8216;monkey&#8217;, &#8216;dishwasher&#8217;]</p>
+</dd>
+</dl>
+<p>}</p>
+<p>And return a Schema:</p>
+<dl class="docutils">
+<dt>{</dt>
+<dd><p class="first">&#8216;foo&#8217;: int,
+&#8216;bar&#8217;: {</p>
+<blockquote>
+<div>&#8216;a&#8217;: bool,
+&#8216;b&#8217;: bool</div></blockquote>
+<p class="last">},
+&#8216;baz&#8217;: [str]</p>
+</dd>
+</dl>
+<p>}</p>
+<p>Note: only very basic inference is supported.</p>
</dd></dl>
+</dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.schema_builder.Self">
+<code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Self</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Self"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Self" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
<dl class="class">
<dt id="voluptuous.schema_builder.Undefined">
<em class="property">class </em><code class="descclassname">voluptuous.schema_builder.</code><code class="descname">Undefined</code><a class="reference internal" href="_modules/voluptuous/schema_builder.html#Undefined"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.schema_builder.Undefined" title="Permalink to this definition">¶</a></dt>
@@ -799,11 +858,6 @@ this, unless overridden.</p>
</dd></dl>
<dl class="function">
-<dt id="voluptuous.util.to_utf8_py2">
-<code class="descclassname">voluptuous.util.</code><code class="descname">to_utf8_py2</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/util.html#to_utf8_py2"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.util.to_utf8_py2" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
-
-<dl class="function">
<dt id="voluptuous.util.u">
<code class="descclassname">voluptuous.util.</code><code class="descname">u</code><span class="sig-paren">(</span><em>x</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/util.html#u"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.util.u" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -814,7 +868,7 @@ this, unless overridden.</p>
<dl class="class">
<dt id="voluptuous.validators.All">
<em class="property">class </em><code class="descclassname">voluptuous.validators.</code><code class="descname">All</code><span class="sig-paren">(</span><em>*validators</em>, <em>**kwargs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/validators.html#All"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.validators.All" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">object</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">voluptuous.validators._WithSubValidators</span></code></p>
<p>Value must pass all validators.</p>
<p>The output of each validator is passed as input to the next.</p>
<table class="docutils field-list" frame="void" rules="none">
@@ -845,7 +899,7 @@ this, unless overridden.</p>
<dl class="class">
<dt id="voluptuous.validators.Any">
<em class="property">class </em><code class="descclassname">voluptuous.validators.</code><code class="descname">Any</code><span class="sig-paren">(</span><em>*validators</em>, <em>**kwargs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/validators.html#Any"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.validators.Any" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">object</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">voluptuous.validators._WithSubValidators</span></code></p>
<p>Use the first validated value.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
@@ -946,6 +1000,20 @@ will be marked as Invalid.</p>
</dd></dl>
<dl class="class">
+<dt id="voluptuous.validators.Contains">
+<em class="property">class </em><code class="descclassname">voluptuous.validators.</code><code class="descname">Contains</code><span class="sig-paren">(</span><em>item</em>, <em>msg=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/validators.html#Contains"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.validators.Contains" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">object</span></code></p>
+<p>Validate that the given schema element is in the sequence being validated.</p>
+<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="n">Contains</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">s</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
+<span class="go">[3, 2, 1]</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">ContainsInvalid</span><span class="p">,</span> <span class="s1">&#39;value is not allowed&#39;</span><span class="p">):</span>
+<span class="gp">... </span> <span class="n">s</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="class">
<dt id="voluptuous.validators.Date">
<em class="property">class </em><code class="descclassname">voluptuous.validators.</code><code class="descname">Date</code><span class="sig-paren">(</span><em>format=None</em>, <em>msg=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/validators.html#Date"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.validators.Date" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <a class="reference internal" href="#voluptuous.validators.Datetime" title="voluptuous.validators.Datetime"><code class="xref py py-class docutils literal"><span class="pre">voluptuous.validators.Datetime</span></code></a></p>
@@ -955,11 +1023,6 @@ will be marked as Invalid.</p>
<code class="descname">DEFAULT_FORMAT</code><em class="property"> = '%Y-%m-%d'</em><a class="headerlink" href="#voluptuous.validators.Date.DEFAULT_FORMAT" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
-<dl class="attribute">
-<dt id="voluptuous.validators.Date.FORMAT_DESCRIPTION">
-<code class="descname">FORMAT_DESCRIPTION</code><em class="property"> = 'yyyy-mm-dd'</em><a class="headerlink" href="#voluptuous.validators.Date.FORMAT_DESCRIPTION" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
-
</dd></dl>
<dl class="class">
@@ -1163,6 +1226,28 @@ lists, dictionaries, etc. are treated as &#8220;false&#8221;:</p>
</div>
</dd></dl>
+<dl class="function">
+<dt id="voluptuous.validators.Maybe">
+<code class="descclassname">voluptuous.validators.</code><code class="descname">Maybe</code><span class="sig-paren">(</span><em>validator</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/validators.html#Maybe"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.validators.Maybe" title="Permalink to this definition">¶</a></dt>
+<dd><p>Validate that the object matches given validator or is None.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Raises:</th><td class="field-body"><strong>Invalid</strong> &#8211; if the value does not match the given validator and is not
+None</td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">Maybe</span><span class="p">(</span><span class="nb">int</span><span class="p">))</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">s</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
+<span class="go">10</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">Invalid</span><span class="p">):</span>
+<span class="gp">... </span> <span class="n">s</span><span class="p">(</span><span class="s2">&quot;string&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</dd></dl>
+
<dl class="class">
<dt id="voluptuous.validators.NotIn">
<em class="property">class </em><code class="descclassname">voluptuous.validators.</code><code class="descname">NotIn</code><span class="sig-paren">(</span><em>container</em>, <em>msg=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/validators.html#NotIn"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.validators.NotIn" title="Permalink to this definition">¶</a></dt>
@@ -1258,6 +1343,45 @@ Either min or max can be excluded from the range of accepted values.</p>
</dd></dl>
<dl class="class">
+<dt id="voluptuous.validators.SomeOf">
+<em class="property">class </em><code class="descclassname">voluptuous.validators.</code><code class="descname">SomeOf</code><span class="sig-paren">(</span><em>validators</em>, <em>min_valid=None</em>, <em>max_valid=None</em>, <em>**kwargs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/validators.html#SomeOf"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.validators.SomeOf" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">voluptuous.validators._WithSubValidators</span></code></p>
+<p>Value must pass at least some validations, determined by the given parameter.
+Optionally, number of passed validations can be capped.</p>
+<p>The output of each validator is passed as input to the next.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>min_valid</strong> &#8211; Minimum number of valid schemas.</li>
+<li><strong>validators</strong> &#8211; a list of schemas or validators to match input against</li>
+<li><strong>max_valid</strong> &#8211; Maximum number of valid schemas.</li>
+<li><strong>msg</strong> &#8211; Message to deliver to user if validation fails.</li>
+<li><strong>kwargs</strong> &#8211; All other keyword arguments are passed to the sub-Schema constructors.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Raises:</th><td class="field-body"><ul class="first last simple">
+<li><strong>NotEnoughValid</strong> &#8211; if the minimum number of validations isn&#8217;t met</li>
+<li><strong>TooManyValid</strong> &#8211; if the more validations than the given amount is met</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">validate</span> <span class="o">=</span> <span class="n">Schema</span><span class="p">(</span><span class="n">SomeOf</span><span class="p">(</span><span class="n">min_valid</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">Range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="n">Any</span><span class="p">(</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</span><span class="p">),</span> <span class="mf">6.6</span><span class="p">]))</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">validate</span><span class="p">(</span><span class="mf">6.6</span><span class="p">)</span>
+<span class="go">6.6</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">validate</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="go">3</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">raises</span><span class="p">(</span><span class="n">MultipleInvalid</span><span class="p">,</span> <span class="s1">&#39;value must be at most 5, not a valid value&#39;</span><span class="p">):</span>
+<span class="gp">... </span> <span class="n">validate</span><span class="p">(</span><span class="mf">6.2</span><span class="p">)</span>
+</pre></div>
+</div>
+</dd></dl>
+
+<dl class="class">
<dt id="voluptuous.validators.Unique">
<em class="property">class </em><code class="descclassname">voluptuous.validators.</code><code class="descname">Unique</code><span class="sig-paren">(</span><em>msg=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/validators.html#Unique"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.validators.Unique" title="Permalink to this definition">¶</a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">object</span></code></p>
diff --git a/docs/_build/html/voluptuous.tests.html b/docs/_build/html/voluptuous.tests.html
index 325862a..7567576 100644
--- a/docs/_build/html/voluptuous.tests.html
+++ b/docs/_build/html/voluptuous.tests.html
@@ -49,6 +49,64 @@
<div class="section" id="module-voluptuous.tests.tests">
<span id="voluptuous-tests-tests-module"></span><h2>voluptuous.tests.tests module<a class="headerlink" href="#module-voluptuous.tests.tests" title="Permalink to this headline">¶</a></h2>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_IsDir">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_IsDir</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_IsDir"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_IsDir" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_IsFile">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_IsFile</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_IsFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_IsFile" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_PathExists">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_PathExists</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_PathExists"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_PathExists" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_SomeOf_max_validation">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_SomeOf_max_validation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_SomeOf_max_validation"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_SomeOf_max_validation" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_SomeOf_min_validation">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_SomeOf_min_validation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_SomeOf_min_validation"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_SomeOf_min_validation" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_SomeOf_on_bounds_assertion">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_SomeOf_on_bounds_assertion</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_SomeOf_on_bounds_assertion"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_SomeOf_on_bounds_assertion" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_all_error_has_path">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_all_error_has_path</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_all_error_has_path"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_all_error_has_path" title="Permalink to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://github.com/alecthomas/voluptuous/issues/347">https://github.com/alecthomas/voluptuous/issues/347</a></p>
+</dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_any_error_has_path">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_any_error_has_path</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_any_error_has_path"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_any_error_has_path" title="Permalink to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://github.com/alecthomas/voluptuous/issues/347">https://github.com/alecthomas/voluptuous/issues/347</a></p>
+</dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_class">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_class</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_class"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_class" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_comparing_voluptuous_object_to_str">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_comparing_voluptuous_object_to_str</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_comparing_voluptuous_object_to_str"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_comparing_voluptuous_object_to_str" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_contains">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_contains</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_contains"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_contains" title="Permalink to this definition">¶</a></dt>
+<dd><p>Verify contains validation method.</p>
+</dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_copy_dict_undefined">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_copy_dict_undefined</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_copy_dict_undefined"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_copy_dict_undefined" title="Permalink to this definition">¶</a></dt>
<dd><p>test with a copied dictionary</p>
@@ -60,11 +118,21 @@
<dd></dd></dl>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_date_custom_format">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_date_custom_format</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_date_custom_format"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_date_custom_format" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_datetime">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_datetime</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_datetime"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_datetime" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_description">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_description</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_description"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_description" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_email_validation">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_email_validation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_email_validation"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_email_validation" title="Permalink to this definition">¶</a></dt>
<dd><p>test with valid email</p>
@@ -89,11 +157,6 @@
</dd></dl>
<dl class="function">
-<dt id="voluptuous.tests.tests.test_empty_dict_as_exact">
-<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_empty_dict_as_exact</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_empty_dict_as_exact"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_empty_dict_as_exact" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
-
-<dl class="function">
<dt id="voluptuous.tests.tests.test_empty_list_as_exact">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_empty_list_as_exact</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_empty_list_as_exact"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_empty_list_as_exact" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -104,6 +167,17 @@
<dd></dd></dl>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_equality">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_equality</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_equality"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_equality" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_equality_negative">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_equality_negative</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_equality_negative"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_equality_negative" title="Permalink to this definition">¶</a></dt>
+<dd><p>Verify that Schema objects are not equal to string representations</p>
+</dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_exact_sequence">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_exact_sequence</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_exact_sequence"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_exact_sequence" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -155,6 +229,16 @@
</dd></dl>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_frozenset_of_integers">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_frozenset_of_integers</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_frozenset_of_integers"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_frozenset_of_integers" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_frozenset_of_integers_and_strings">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_frozenset_of_integers_and_strings</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_frozenset_of_integers_and_strings"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_frozenset_of_integers_and_strings" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_humanize_error">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_humanize_error</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_humanize_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_humanize_error" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -166,6 +250,16 @@
</dd></dl>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_inequality">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_inequality</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_inequality"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_inequality" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_inequality_negative">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_inequality_negative</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_inequality_negative"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_inequality_negative" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_iterate_candidates">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_iterate_candidates</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_iterate_candidates"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_iterate_candidates" title="Permalink to this definition">¶</a></dt>
<dd><p>Verify that the order for iterating over mapping candidates is right.</p>
@@ -184,6 +278,23 @@
</dd></dl>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_marker_hashable">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_marker_hashable</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_marker_hashable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_marker_hashable" title="Permalink to this definition">¶</a></dt>
+<dd><p>Verify that you can get schema keys, even if markers were used</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_match_error_has_path">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_match_error_has_path</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_match_error_has_path"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_match_error_has_path" title="Permalink to this definition">¶</a></dt>
+<dd><p><a class="reference external" href="https://github.com/alecthomas/voluptuous/issues/347">https://github.com/alecthomas/voluptuous/issues/347</a></p>
+</dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_maybe">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_maybe</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_maybe"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_maybe" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_named_tuples_validate_as_tuples">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_named_tuples_validate_as_tuples</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_named_tuples_validate_as_tuples"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_named_tuples_validate_as_tuples" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -261,6 +372,11 @@
</dd></dl>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_ordered_dict">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_ordered_dict</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_ordered_dict"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_ordered_dict" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_range_exlcudes_nan">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_range_exlcudes_nan</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_range_exlcudes_nan"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_range_exlcudes_nan" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -304,6 +420,26 @@
<dd></dd></dl>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_schema_decorator_partial_match_called_with_args">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_decorator_partial_match_called_with_args</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_decorator_partial_match_called_with_args"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_decorator_partial_match_called_with_args" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_schema_decorator_partial_match_called_with_kwargs">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_decorator_partial_match_called_with_kwargs</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_decorator_partial_match_called_with_kwargs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_decorator_partial_match_called_with_kwargs" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_schema_decorator_partial_unmatch_called_with_args">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_decorator_partial_unmatch_called_with_args</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_decorator_partial_unmatch_called_with_args"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_decorator_partial_unmatch_called_with_args" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_schema_decorator_partial_unmatch_called_with_kwargs">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_decorator_partial_unmatch_called_with_kwargs</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_decorator_partial_unmatch_called_with_kwargs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_decorator_partial_unmatch_called_with_kwargs" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_schema_decorator_return_only_match">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_decorator_return_only_match</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_decorator_return_only_match"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_decorator_return_only_match" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -352,6 +488,56 @@
</dd></dl>
<dl class="function">
+<dt id="voluptuous.tests.tests.test_schema_infer">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_infer</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_infer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_infer" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_schema_infer_accepts_kwargs">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_infer_accepts_kwargs</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_infer_accepts_kwargs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_infer_accepts_kwargs" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_schema_infer_dict">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_infer_dict</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_infer_dict"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_infer_dict" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_schema_infer_list">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_infer_list</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_infer_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_infer_list" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_schema_infer_scalar">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_schema_infer_scalar</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_schema_infer_scalar"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_schema_infer_scalar" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_self_all">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_self_all</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_self_all"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_self_all" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_self_any">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_self_any</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_self_any"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_self_any" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_self_validation">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_self_validation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_self_validation"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_self_validation" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_set_of_integers">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_set_of_integers</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_set_of_integers"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_set_of_integers" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_set_of_integers_and_strings">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_set_of_integers_and_strings</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_set_of_integers_and_strings"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_set_of_integers_and_strings" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
<dt id="voluptuous.tests.tests.test_sorting">
<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_sorting</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_sorting"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_sorting" title="Permalink to this definition">¶</a></dt>
<dd><p>Expect alphabetic sorting</p>
@@ -364,19 +550,8 @@
</dd></dl>
<dl class="function">
-<dt id="voluptuous.tests.tests.test_to_utf8">
-<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_to_utf8</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_to_utf8"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_to_utf8" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
-
-<dl class="function">
-<dt id="voluptuous.tests.tests.test_unicode_key_is_converted_to_utf8_when_in_marker">
-<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_unicode_key_is_converted_to_utf8_when_in_marker</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_unicode_key_is_converted_to_utf8_when_in_marker"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_unicode_key_is_converted_to_utf8_when_in_marker" title="Permalink to this definition">¶</a></dt>
-<dd><p>Verify that when using unicode key the &#8216;u&#8217; prefix is not thrown in the exception</p>
-</dd></dl>
-
-<dl class="function">
-<dt id="voluptuous.tests.tests.test_unicode_key_is_converted_to_utf8_when_plain_text">
-<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_unicode_key_is_converted_to_utf8_when_plain_text</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_unicode_key_is_converted_to_utf8_when_plain_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_unicode_key_is_converted_to_utf8_when_plain_text" title="Permalink to this definition">¶</a></dt>
+<dt id="voluptuous.tests.tests.test_unicode_as_key">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_unicode_as_key</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_unicode_as_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_unicode_as_key" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="function">
@@ -408,6 +583,15 @@
<dd><p>test with empty host URL</p>
</dd></dl>
+<dl class="function">
+<dt id="voluptuous.tests.tests.test_validation_performance">
+<code class="descclassname">voluptuous.tests.tests.</code><code class="descname">test_validation_performance</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/voluptuous/tests/tests.html#test_validation_performance"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#voluptuous.tests.tests.test_validation_performance" title="Permalink to this definition">¶</a></dt>
+<dd><p>This test comes to make sure the validation complexity of dictionaries is done in a linear time.
+to achieve this a custom marker is used in the scheme that counts each time it is evaluated.
+By doing so we can determine if the validation is done in linear complexity.
+Prior to issue <a class="reference external" href="https://github.com/alecthomas/voluptuous/issues/259">https://github.com/alecthomas/voluptuous/issues/259</a> this was exponential</p>
+</dd></dl>
+
</div>
<div class="section" id="module-voluptuous.tests">
<span id="module-contents"></span><h2>Module contents<a class="headerlink" href="#module-voluptuous.tests" title="Permalink to this headline">¶</a></h2>