diff --git a/CHANGES.rst b/CHANGES.rst
index c40160b..f3f5d14 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,6 +1,23 @@
 Unreleased
 ==========
 
+- The URL validator regex has been updated to no longer be vulnerable to a
+  catastrophic backtracking that would have led to an infinite loop. See
+  https://github.com/Pylons/colander/pull/323 and
+  https://github.com/Pylons/colander/issues/290. With thanks to Przemek
+  (https://github.com/p-m-k).
+  
+  This does change the behaviour of the URL validator and it no longer supports
+  ``file://`` URI scheme (https://tools.ietf.org/html/rfc8089). Users that
+  wish to validate ``file://`` URI's should change their validator to use
+  ``colander.file_uri`` instead.
+
+  It has also dropped support for alternate schemes outside of http/ftp (and
+  their secure equivelants). Please let us know if we need to relax this
+  requirement.
+
+  CVE-ID: CVE-2017-18361
+
 - The Email validator has been updated to use the same regular expression that
   is used by the WhatWG HTML specification, thereby increasing the email
   addresses that will validate correctly from web forms submitted. See
diff --git a/colander/__init__.py b/colander/__init__.py
index 6f0dff5..6eac447 100644
--- a/colander/__init__.py
+++ b/colander/__init__.py
@@ -607,14 +607,40 @@ def _luhnok(value):
     return checksum
 
 
+# Gingerly lifted from Django 1.3.x:
+# https://github.com/django/django/blob/stable/1.3.x/django/core/validators.py#L45
+# <3 y'all!
 URL_REGEX = (
-    r'(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|'
-    r'[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|'
-    r'(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|'
-    r'[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))'  # "emacs!
+    # {http,ftp}s:// (not required)
+    r'^((?:http|ftp)s?://)?'
+    # Domain
+    r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+'
+    r'(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'
+    # Localhost
+    r'localhost|'
+    # IPv6 address
+    r'\[[a-f0-9:]+\]|'
+    # IPv4 address
+    r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
+    # Optional port
+    r'(?::\d+)?'
+    # Path
+    r'(?:/?|[/?]\S+)$'
 )
 
-url = Regex(URL_REGEX, _('Must be a URL'))
+url = Regex(URL_REGEX, msg=_('Must be a URL'), flags=re.IGNORECASE)
+
+
+URI_REGEX = (
+    # file:// (required)
+    r'^file://'
+    # Path
+    r'(?:/|[/?]\S+)$'
+)
+
+file_uri = Regex(
+    URI_REGEX, msg=_('Must be a file:// URI scheme'), flags=re.IGNORECASE
+)
 
 UUID_REGEX = (
     r'^(?:urn:uuid:)?\{?[a-f0-9]{8}(?:-?[a-f0-9]{4}){3}-?[a-f0-9]{12}\}?$'

diff --git a/colander/tests/test_colander.py b/colander/tests/test_colander.py
index 917a719..5411c2b 100644
--- a/colander/tests/test_colander.py
+++ b/colander/tests/test_colander.py
@@ -646,6 +646,76 @@ class Test_url_validator(unittest.TestCase):
 
         self.assertRaises(Invalid, self._callFUT, val)
 
+    def test_add_sample_dos(self):
+        # In the old regex (colander <=1.6) this would cause a catastrophic
+        # backtracking that would cause the regex engine to go into an infinite
+        # loop.
+        val = "http://www.mysite.com/(tttttttttttttttttttttt.jpg"
+
+        result = self._callFUT(val)
+        self.assertEqual(result, None)
+
+    def test_website_no_scheme(self):
+        val = "www.mysite.com"
+
+        result = self._callFUT(val)
+        self.assertEqual(result, None)
+
+    def test_ipv6(self):
+        val = "http://[2001:db8::0]/"
+
+        result = self._callFUT(val)
+        self.assertEqual(result, None)
+
+    def test_ipv4(self):
+        val = "http://192.0.2.1/"
+
+        result = self._callFUT(val)
+        self.assertEqual(result, None)
+
+    def test_file_raises(self):
+        from colander import Invalid
+
+        val = "file:///this/is/a/file.jpg"
+
+        self.assertRaises(Invalid, self._callFUT, val)
+
+
+class Test_file_uri_validator(unittest.TestCase):
+    def _callFUT(self, val):
+        from colander import file_uri
+
+        return file_uri(None, val)
+
+    def test_it_success(self):
+        val = 'file:///'
+        result = self._callFUT(val)
+        self.assertEqual(result, None)
+
+    def test_it_failure(self):
+        val = 'not-a-uri'
+        from colander import Invalid
+
+        self.assertRaises(Invalid, self._callFUT, val)
+
+    def test_no_path_fails(self):
+        val = 'file://'
+        from colander import Invalid
+
+        self.assertRaises(Invalid, self._callFUT, val)
+
+    def test_file_with_path(self):
+        val = "file:///this/is/a/file.jpg"
+
+        result = self._callFUT(val)
+        self.assertEqual(result, None)
+
+    def test_file_with_path_windows(self):
+        val = "file:///c:/is/a/file.jpg"
+
+        result = self._callFUT(val)
+        self.assertEqual(result, None)
+
 
 class TestUUID(unittest.TestCase):
     def _callFUT(self, val):

Unclosed parenthesis in URL causes infinite loop
When there is an unclosed parenthesis in URL and we use _url_ validator, it causes an infinite loop. What's more interesting is that it only happens when the unclosed parenthesis is followed by many characters (check test case number 3 and 4).
```
from colander import MappingSchema, SchemaNode, Str, url


class MySchema(MappingSchema):
    url = SchemaNode(Str(encoding='utf-8'), validator=url)

print MySchema().deserialize({"url": "http://www.mysite.com/tttttttttttttttttttttt.jpg"})  # it works
print MySchema().deserialize({"url": "http://www.mysite.com/(tttttttttttttttttttttt).jpg"})  # it works
print MySchema().deserialize({"url": "http://www.mysite.com/(ttttttttttt.jpg"})  # it works
print MySchema().deserialize({"url": "http://www.mysite.com/(tttttttttttttttttttttt.jpg"})  # infinite loop
```


In addition, if you check it in an online regex checker (https://regex101.com/) it also fails. Try this regex, it's used for URL validation in colander. It's taken from _colander.\_\_init\_\_.py:438_, I only escaped two slashes here.
```
(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
```
Use this URL: _http://www.mysite.com/(tttttttttttttttttttttt.jpg_ and you'll get _catastrophic backtracking_. You can use debugger on that site to check which group falls in infinite loop.

colander/tests/test_colander.py::Test_url_validator::test_file_raises colander/tests/test_colander.py::Test_file_uri_validator::test_file_with_path colander/tests/test_colander.py::Test_file_uri_validator::test_file_with_path_windows colander/tests/test_colander.py::Test_file_uri_validator::test_it_failure colander/tests/test_colander.py::Test_file_uri_validator::test_it_success colander/tests/test_colander.py::Test_file_uri_validator::test_no_path_fails
colander/tests/test_colander.py::TestInvalid::test___setitem__fails colander/tests/test_colander.py::TestInvalid::test___setitem__succeeds colander/tests/test_colander.py::TestInvalid::test___str__ colander/tests/test_colander.py::TestInvalid::test__keyname_no_parent colander/tests/test_colander.py::TestInvalid::test__keyname_nonpositional_parent colander/tests/test_colander.py::TestInvalid::test__keyname_positional colander/tests/test_colander.py::TestInvalid::test_add colander/tests/test_colander.py::TestInvalid::test_add_positional colander/tests/test_colander.py::TestInvalid::test_asdict colander/tests/test_colander.py::TestInvalid::test_asdict_with_all_validator colander/tests/test_colander.py::TestInvalid::test_asdict_with_all_validator_functional colander/tests/test_colander.py::TestInvalid::test_ctor colander/tests/test_colander.py::TestInvalid::test_messages_msg_None colander/tests/test_colander.py::TestInvalid::test_messages_msg_iterable colander/tests/test_colander.py::TestInvalid::test_messages_msg_not_iterable colander/tests/test_colander.py::TestInvalid::test_paths colander/tests/test_colander.py::TestAll::test_Invalid_children colander/tests/test_colander.py::TestAll::test_failure colander/tests/test_colander.py::TestAll::test_success colander/tests/test_colander.py::TestAny::test_Invalid_children colander/tests/test_colander.py::TestAny::test_failure colander/tests/test_colander.py::TestAny::test_success colander/tests/test_colander.py::TestFunction::test_deprecated_message colander/tests/test_colander.py::TestFunction::test_deprecated_message_warning colander/tests/test_colander.py::TestFunction::test_error_message_adds_mapping_to_configured_message colander/tests/test_colander.py::TestFunction::test_error_message_adds_mapping_to_return_message colander/tests/test_colander.py::TestFunction::test_error_message_does_not_overwrite_configured_domain colander/tests/test_colander.py::TestFunction::test_error_message_does_not_overwrite_returned_domain colander/tests/test_colander.py::TestFunction::test_fail_function_returns_False colander/tests/test_colander.py::TestFunction::test_fail_function_returns_empty_string colander/tests/test_colander.py::TestFunction::test_fail_function_returns_string colander/tests/test_colander.py::TestFunction::test_msg_and_message_error colander/tests/test_colander.py::TestFunction::test_propagation colander/tests/test_colander.py::TestFunction::test_success_function_returns_True colander/tests/test_colander.py::TestRange::test_max_failure colander/tests/test_colander.py::TestRange::test_max_failure_msg_override colander/tests/test_colander.py::TestRange::test_min_failure colander/tests/test_colander.py::TestRange::test_min_failure_msg_override colander/tests/test_colander.py::TestRange::test_success_min_and_max colander/tests/test_colander.py::TestRange::test_success_minimum_bound_only colander/tests/test_colander.py::TestRange::test_success_no_bounds colander/tests/test_colander.py::TestRange::test_success_upper_bound_only colander/tests/test_colander.py::TestRegex::test_invalid_regexs colander/tests/test_colander.py::TestRegex::test_regex_not_string colander/tests/test_colander.py::TestRegex::test_valid_regex colander/tests/test_colander.py::TestEmail::test_empty_email colander/tests/test_colander.py::TestEmail::test_invalid_emails colander/tests/test_colander.py::TestEmail::test_valid_emails colander/tests/test_colander.py::TestLength::test_max_failure colander/tests/test_colander.py::TestLength::test_max_failure_msg_override colander/tests/test_colander.py::TestLength::test_min_failure colander/tests/test_colander.py::TestLength::test_min_failure_msg_override colander/tests/test_colander.py::TestLength::test_success_min_and_max colander/tests/test_colander.py::TestLength::test_success_minimum_bound_only colander/tests/test_colander.py::TestLength::test_success_no_bounds colander/tests/test_colander.py::TestLength::test_success_upper_bound_only colander/tests/test_colander.py::TestOneOf::test_failure colander/tests/test_colander.py::TestOneOf::test_success colander/tests/test_colander.py::TestNoneOf::test_failure colander/tests/test_colander.py::TestNoneOf::test_success colander/tests/test_colander.py::TestContainsOnly::test_failure colander/tests/test_colander.py::TestContainsOnly::test_failure_with_custom_error_template colander/tests/test_colander.py::TestContainsOnly::test_success colander/tests/test_colander.py::Test_luhnok::test_fail colander/tests/test_colander.py::Test_luhnok::test_fail2 colander/tests/test_colander.py::Test_luhnok::test_fail3 colander/tests/test_colander.py::Test_luhnok::test_success colander/tests/test_colander.py::Test_url_validator::test_add_sample_dos colander/tests/test_colander.py::Test_url_validator::test_ipv4 colander/tests/test_colander.py::Test_url_validator::test_ipv6 colander/tests/test_colander.py::Test_url_validator::test_it_failure colander/tests/test_colander.py::Test_url_validator::test_it_success colander/tests/test_colander.py::Test_url_validator::test_website_no_scheme colander/tests/test_colander.py::TestUUID::test_failure_invalid_length colander/tests/test_colander.py::TestUUID::test_failure_not_hexadecimal colander/tests/test_colander.py::TestUUID::test_failure_random_string colander/tests/test_colander.py::TestUUID::test_failure_with_invalid_urn_ns colander/tests/test_colander.py::TestUUID::test_success_hexadecimal colander/tests/test_colander.py::TestUUID::test_success_upper_case colander/tests/test_colander.py::TestUUID::test_success_with_braces colander/tests/test_colander.py::TestUUID::test_success_with_dashes colander/tests/test_colander.py::TestUUID::test_success_with_urn_ns colander/tests/test_colander.py::TestSchemaType::test_cstruct_children colander/tests/test_colander.py::TestSchemaType::test_flatten colander/tests/test_colander.py::TestSchemaType::test_flatten_listitem colander/tests/test_colander.py::TestSchemaType::test_get_value colander/tests/test_colander.py::TestSchemaType::test_set_value colander/tests/test_colander.py::TestSchemaType::test_unflatten colander/tests/test_colander.py::TestMapping::test_cstruct_children colander/tests/test_colander.py::TestMapping::test_cstruct_children_cstruct_is_null colander/tests/test_colander.py::TestMapping::test_ctor_bad_unknown colander/tests/test_colander.py::TestMapping::test_ctor_good_unknown colander/tests/test_colander.py::TestMapping::test_deserialize_no_subnodes colander/tests/test_colander.py::TestMapping::test_deserialize_not_a_mapping colander/tests/test_colander.py::TestMapping::test_deserialize_null colander/tests/test_colander.py::TestMapping::test_deserialize_ok colander/tests/test_colander.py::TestMapping::test_deserialize_subnode_missing_default colander/tests/test_colander.py::TestMapping::test_deserialize_subnodes_raise colander/tests/test_colander.py::TestMapping::test_deserialize_unknown_preserve colander/tests/test_colander.py::TestMapping::test_deserialize_unknown_raise colander/tests/test_colander.py::TestMapping::test_flatten colander/tests/test_colander.py::TestMapping::test_flatten_listitem colander/tests/test_colander.py::TestMapping::test_get_value colander/tests/test_colander.py::TestMapping::test_serialize_no_subnodes colander/tests/test_colander.py::TestMapping::test_serialize_not_a_mapping colander/tests/test_colander.py::TestMapping::test_serialize_null colander/tests/test_colander.py::TestMapping::test_serialize_ok colander/tests/test_colander.py::TestMapping::test_serialize_value_has_drop colander/tests/test_colander.py::TestMapping::test_serialize_value_is_null colander/tests/test_colander.py::TestMapping::test_serialize_with_unknown colander/tests/test_colander.py::TestMapping::test_set_value colander/tests/test_colander.py::TestMapping::test_unflatten colander/tests/test_colander.py::TestMapping::test_unflatten_nested colander/tests/test_colander.py::TestTuple::test_cstruct_children_cstruct_is_null colander/tests/test_colander.py::TestTuple::test_cstruct_children_justright colander/tests/test_colander.py::TestTuple::test_cstruct_children_toofew colander/tests/test_colander.py::TestTuple::test_cstruct_children_toomany colander/tests/test_colander.py::TestTuple::test_deserialize_no_subnodes colander/tests/test_colander.py::TestTuple::test_deserialize_not_iterable colander/tests/test_colander.py::TestTuple::test_deserialize_null colander/tests/test_colander.py::TestTuple::test_deserialize_ok colander/tests/test_colander.py::TestTuple::test_deserialize_subnodes_raise colander/tests/test_colander.py::TestTuple::test_deserialize_toobig colander/tests/test_colander.py::TestTuple::test_deserialize_toosmall colander/tests/test_colander.py::TestTuple::test_flatten colander/tests/test_colander.py::TestTuple::test_flatten_listitem colander/tests/test_colander.py::TestTuple::test_get_value colander/tests/test_colander.py::TestTuple::test_get_value_bad_path colander/tests/test_colander.py::TestTuple::test_serialize_no_subnodes colander/tests/test_colander.py::TestTuple::test_serialize_not_iterable colander/tests/test_colander.py::TestTuple::test_serialize_null colander/tests/test_colander.py::TestTuple::test_serialize_ok colander/tests/test_colander.py::TestTuple::test_serialize_subnodes_raise colander/tests/test_colander.py::TestTuple::test_serialize_toobig colander/tests/test_colander.py::TestTuple::test_serialize_toosmall colander/tests/test_colander.py::TestTuple::test_set_value colander/tests/test_colander.py::TestTuple::test_set_value_bad_path colander/tests/test_colander.py::TestTuple::test_unflatten colander/tests/test_colander.py::TestSet::test_deserialize_empty_set colander/tests/test_colander.py::TestSet::test_deserialize_no_iter colander/tests/test_colander.py::TestSet::test_deserialize_null colander/tests/test_colander.py::TestSet::test_deserialize_str_no_iter colander/tests/test_colander.py::TestSet::test_deserialize_valid colander/tests/test_colander.py::TestSet::test_serialize colander/tests/test_colander.py::TestSet::test_serialize_null colander/tests/test_colander.py::TestList::test_deserialize_empty_set colander/tests/test_colander.py::TestList::test_deserialize_no_iter colander/tests/test_colander.py::TestList::test_deserialize_null colander/tests/test_colander.py::TestList::test_deserialize_str_no_iter colander/tests/test_colander.py::TestList::test_deserialize_valid colander/tests/test_colander.py::TestList::test_serialize colander/tests/test_colander.py::TestList::test_serialize_null colander/tests/test_colander.py::TestSequence::test_alias colander/tests/test_colander.py::TestSequence::test_cstruct_children_cstruct_is_non_null colander/tests/test_colander.py::TestSequence::test_cstruct_children_cstruct_is_null colander/tests/test_colander.py::TestSequence::test_deserialize_no_null colander/tests/test_colander.py::TestSequence::test_deserialize_no_subnodes colander/tests/test_colander.py::TestSequence::test_deserialize_not_iterable colander/tests/test_colander.py::TestSequence::test_deserialize_not_iterable_accept_scalar colander/tests/test_colander.py::TestSequence::test_deserialize_ok colander/tests/test_colander.py::TestSequence::test_deserialize_string_accept_scalar colander/tests/test_colander.py::TestSequence::test_deserialize_subnodes_raise colander/tests/test_colander.py::TestSequence::test_flatten colander/tests/test_colander.py::TestSequence::test_flatten_listitem colander/tests/test_colander.py::TestSequence::test_flatten_with_integer colander/tests/test_colander.py::TestSequence::test_getvalue colander/tests/test_colander.py::TestSequence::test_serialize_drop colander/tests/test_colander.py::TestSequence::test_serialize_no_subnodes colander/tests/test_colander.py::TestSequence::test_serialize_not_iterable colander/tests/test_colander.py::TestSequence::test_serialize_not_iterable_accept_scalar colander/tests/test_colander.py::TestSequence::test_serialize_null colander/tests/test_colander.py::TestSequence::test_serialize_ok colander/tests/test_colander.py::TestSequence::test_serialize_string_accept_scalar colander/tests/test_colander.py::TestSequence::test_serialize_subnodes_raise colander/tests/test_colander.py::TestSequence::test_setvalue colander/tests/test_colander.py::TestSequence::test_unflatten colander/tests/test_colander.py::TestString::test_alias colander/tests/test_colander.py::TestString::test_deserialize_emptystring colander/tests/test_colander.py::TestString::test_deserialize_from_nonstring_obj colander/tests/test_colander.py::TestString::test_deserialize_from_utf16 colander/tests/test_colander.py::TestString::test_deserialize_from_utf8 colander/tests/test_colander.py::TestString::test_deserialize_nonunicode_from_None colander/tests/test_colander.py::TestString::test_deserialize_uncooperative colander/tests/test_colander.py::TestString::test_deserialize_unicode_from_None colander/tests/test_colander.py::TestString::test_serialize_emptystring colander/tests/test_colander.py::TestString::test_serialize_encoding_with_non_string_type colander/tests/test_colander.py::TestString::test_serialize_nonunicode_to_None colander/tests/test_colander.py::TestString::test_serialize_null colander/tests/test_colander.py::TestString::test_serialize_string_with_high_unresolveable_high_order_chars colander/tests/test_colander.py::TestString::test_serialize_to_utf16 colander/tests/test_colander.py::TestString::test_serialize_to_utf8 colander/tests/test_colander.py::TestString::test_serialize_uncooperative colander/tests/test_colander.py::TestString::test_serialize_unicode_to_None colander/tests/test_colander.py::TestInteger::test_alias colander/tests/test_colander.py::TestInteger::test_deserialize_emptystring colander/tests/test_colander.py::TestInteger::test_deserialize_fails colander/tests/test_colander.py::TestInteger::test_deserialize_ok colander/tests/test_colander.py::TestInteger::test_serialize_fails colander/tests/test_colander.py::TestInteger::test_serialize_none colander/tests/test_colander.py::TestInteger::test_serialize_null colander/tests/test_colander.py::TestInteger::test_serialize_ok colander/tests/test_colander.py::TestInteger::test_serialize_zero colander/tests/test_colander.py::TestFloat::test_deserialize_fails colander/tests/test_colander.py::TestFloat::test_deserialize_ok colander/tests/test_colander.py::TestFloat::test_serialize_emptystring colander/tests/test_colander.py::TestFloat::test_serialize_fails colander/tests/test_colander.py::TestFloat::test_serialize_none colander/tests/test_colander.py::TestFloat::test_serialize_null colander/tests/test_colander.py::TestFloat::test_serialize_ok colander/tests/test_colander.py::TestFloat::test_serialize_zero colander/tests/test_colander.py::TestDecimal::test_deserialize_fails colander/tests/test_colander.py::TestDecimal::test_deserialize_ok colander/tests/test_colander.py::TestDecimal::test_deserialize_with_normalize colander/tests/test_colander.py::TestDecimal::test_deserialize_with_quantize colander/tests/test_colander.py::TestDecimal::test_serialize_emptystring colander/tests/test_colander.py::TestDecimal::test_serialize_fails colander/tests/test_colander.py::TestDecimal::test_serialize_none colander/tests/test_colander.py::TestDecimal::test_serialize_normalize colander/tests/test_colander.py::TestDecimal::test_serialize_null colander/tests/test_colander.py::TestDecimal::test_serialize_ok colander/tests/test_colander.py::TestDecimal::test_serialize_quantize_no_rounding colander/tests/test_colander.py::TestDecimal::test_serialize_quantize_with_rounding_up colander/tests/test_colander.py::TestDecimal::test_serialize_zero colander/tests/test_colander.py::TestMoney::test_deserialize_rounds_up colander/tests/test_colander.py::TestMoney::test_serialize_rounds_up colander/tests/test_colander.py::TestBoolean::test_alias colander/tests/test_colander.py::TestBoolean::test_deserialize colander/tests/test_colander.py::TestBoolean::test_deserialize_null colander/tests/test_colander.py::TestBoolean::test_deserialize_unstringable colander/tests/test_colander.py::TestBoolean::test_serialize colander/tests/test_colander.py::TestBoolean::test_serialize_null colander/tests/test_colander.py::TestBooleanCustomFalseReprs::test_deserialize colander/tests/test_colander.py::TestBooleanCustomFalseAndTrueReprs::test_deserialize colander/tests/test_colander.py::TestBooleanCustomSerializations::test_serialize colander/tests/test_colander.py::TestGlobalObject::test__pkg_resources_style_irrresolveable_absolute colander/tests/test_colander.py::TestGlobalObject::test__pkg_resources_style_irrresolveable_relative colander/tests/test_colander.py::TestGlobalObject::test__pkg_resources_style_resolve_absolute colander/tests/test_colander.py::TestGlobalObject::test__pkg_resources_style_resolve_relative_is_dot colander/tests/test_colander.py::TestGlobalObject::test__pkg_resources_style_resolve_relative_nocurrentpackage colander/tests/test_colander.py::TestGlobalObject::test__pkg_resources_style_resolve_relative_startswith_colon colander/tests/test_colander.py::TestGlobalObject::test__pkg_resources_style_resolve_relative_startswith_dot colander/tests/test_colander.py::TestGlobalObject::test__zope_dottedname_style_irresolveable_absolute colander/tests/test_colander.py::TestGlobalObject::test__zope_dottedname_style_irresolveable_relative_is_dot colander/tests/test_colander.py::TestGlobalObject::test__zope_dottedname_style_resolve_relative colander/tests/test_colander.py::TestGlobalObject::test__zope_dottedname_style_resolve_relative_is_dot colander/tests/test_colander.py::TestGlobalObject::test__zope_dottedname_style_resolve_relative_leading_dots colander/tests/test_colander.py::TestGlobalObject::test__zope_dottedname_style_resolveable_absolute colander/tests/test_colander.py::TestGlobalObject::test__zope_dottedname_style_resolveable_relative colander/tests/test_colander.py::TestGlobalObject::test_deserialize_None colander/tests/test_colander.py::TestGlobalObject::test_deserialize_class_fail colander/tests/test_colander.py::TestGlobalObject::test_deserialize_class_ok colander/tests/test_colander.py::TestGlobalObject::test_deserialize_notastring colander/tests/test_colander.py::TestGlobalObject::test_deserialize_null colander/tests/test_colander.py::TestGlobalObject::test_deserialize_style_raises colander/tests/test_colander.py::TestGlobalObject::test_deserialize_using_pkgresources_style colander/tests/test_colander.py::TestGlobalObject::test_deserialize_using_zope_dottedname_style colander/tests/test_colander.py::TestGlobalObject::test_serialize_class colander/tests/test_colander.py::TestGlobalObject::test_serialize_fail colander/tests/test_colander.py::TestGlobalObject::test_serialize_null colander/tests/test_colander.py::TestGlobalObject::test_serialize_ok colander/tests/test_colander.py::TestGlobalObject::test_zope_dottedname_style_irrresolveable_absolute colander/tests/test_colander.py::TestGlobalObject::test_zope_dottedname_style_irrresolveable_relative colander/tests/test_colander.py::TestGlobalObject::test_zope_dottedname_style_resolve_absolute colander/tests/test_colander.py::TestGlobalObject::test_zope_dottedname_style_resolve_relative_nocurrentpackage colander/tests/test_colander.py::TestDateTime::test_ctor_default_tzinfo_None colander/tests/test_colander.py::TestDateTime::test_ctor_default_tzinfo_non_None colander/tests/test_colander.py::TestDateTime::test_ctor_default_tzinfo_not_specified colander/tests/test_colander.py::TestDateTime::test_deserialize_date colander/tests/test_colander.py::TestDateTime::test_deserialize_datetime_with_custom_format colander/tests/test_colander.py::TestDateTime::test_deserialize_empty colander/tests/test_colander.py::TestDateTime::test_deserialize_invalid_ParseError colander/tests/test_colander.py::TestDateTime::test_deserialize_naive_with_default_tzinfo colander/tests/test_colander.py::TestDateTime::test_deserialize_none_tzinfo colander/tests/test_colander.py::TestDateTime::test_deserialize_null colander/tests/test_colander.py::TestDateTime::test_deserialize_slashes_invalid colander/tests/test_colander.py::TestDateTime::test_deserialize_success colander/tests/test_colander.py::TestDateTime::test_serialize_none colander/tests/test_colander.py::TestDateTime::test_serialize_null colander/tests/test_colander.py::TestDateTime::test_serialize_with_date colander/tests/test_colander.py::TestDateTime::test_serialize_with_garbage colander/tests/test_colander.py::TestDateTime::test_serialize_with_naive_datetime colander/tests/test_colander.py::TestDateTime::test_serialize_with_naive_datetime_and_custom_format colander/tests/test_colander.py::TestDateTime::test_serialize_with_none_tzinfo_naive_datetime colander/tests/test_colander.py::TestDateTime::test_serialize_with_none_tzinfo_naive_datetime_custom_format colander/tests/test_colander.py::TestDateTime::test_serialize_with_tzware_datetime colander/tests/test_colander.py::TestDate::test_deserialize_date_with_custom_format colander/tests/test_colander.py::TestDate::test_deserialize_empty colander/tests/test_colander.py::TestDate::test_deserialize_invalid_ParseError colander/tests/test_colander.py::TestDate::test_deserialize_invalid_weird colander/tests/test_colander.py::TestDate::test_deserialize_null colander/tests/test_colander.py::TestDate::test_deserialize_success_date colander/tests/test_colander.py::TestDate::test_deserialize_success_datetime colander/tests/test_colander.py::TestDate::test_serialize_date_with_custom_format colander/tests/test_colander.py::TestDate::test_serialize_none colander/tests/test_colander.py::TestDate::test_serialize_null colander/tests/test_colander.py::TestDate::test_serialize_with_date colander/tests/test_colander.py::TestDate::test_serialize_with_datetime colander/tests/test_colander.py::TestDate::test_serialize_with_garbage colander/tests/test_colander.py::TestTime::test_deserialize_empty colander/tests/test_colander.py::TestTime::test_deserialize_four_digit_string colander/tests/test_colander.py::TestTime::test_deserialize_invalid_ParseError colander/tests/test_colander.py::TestTime::test_deserialize_missing_seconds colander/tests/test_colander.py::TestTime::test_deserialize_null colander/tests/test_colander.py::TestTime::test_deserialize_success_datetime colander/tests/test_colander.py::TestTime::test_deserialize_success_time colander/tests/test_colander.py::TestTime::test_deserialize_three_digit_string colander/tests/test_colander.py::TestTime::test_deserialize_two_digit_string colander/tests/test_colander.py::TestTime::test_serialize_none colander/tests/test_colander.py::TestTime::test_serialize_null colander/tests/test_colander.py::TestTime::test_serialize_with_datetime colander/tests/test_colander.py::TestTime::test_serialize_with_garbage colander/tests/test_colander.py::TestTime::test_serialize_with_time colander/tests/test_colander.py::TestTime::test_serialize_with_zero_time colander/tests/test_colander.py::TestEnum::test_deserialize_failure colander/tests/test_colander.py::TestEnum::test_deserialize_failure_typ colander/tests/test_colander.py::TestEnum::test_deserialize_name colander/tests/test_colander.py::TestEnum::test_deserialize_null colander/tests/test_colander.py::TestEnum::test_deserialize_value_int colander/tests/test_colander.py::TestEnum::test_deserialize_value_str colander/tests/test_colander.py::TestEnum::test_non_unique_failure colander/tests/test_colander.py::TestEnum::test_non_unique_failure2 colander/tests/test_colander.py::TestEnum::test_serialize_failure colander/tests/test_colander.py::TestEnum::test_serialize_name colander/tests/test_colander.py::TestEnum::test_serialize_null colander/tests/test_colander.py::TestEnum::test_serialize_value_int colander/tests/test_colander.py::TestEnum::test_serialize_value_str colander/tests/test_colander.py::TestSchemaNode::test___contains__ colander/tests/test_colander.py::TestSchemaNode::test___delitem__failure colander/tests/test_colander.py::TestSchemaNode::test___delitem__success colander/tests/test_colander.py::TestSchemaNode::test___getitem__failure colander/tests/test_colander.py::TestSchemaNode::test___getitem__success colander/tests/test_colander.py::TestSchemaNode::test___iter__ colander/tests/test_colander.py::TestSchemaNode::test___setitem__no_override colander/tests/test_colander.py::TestSchemaNode::test___setitem__override colander/tests/test_colander.py::TestSchemaNode::test_add colander/tests/test_colander.py::TestSchemaNode::test_bind colander/tests/test_colander.py::TestSchemaNode::test_bind_with_after_bind colander/tests/test_colander.py::TestSchemaNode::test_clone colander/tests/test_colander.py::TestSchemaNode::test_clone_mapping_references colander/tests/test_colander.py::TestSchemaNode::test_clone_with_modified_schema_instance colander/tests/test_colander.py::TestSchemaNode::test_cstruct_children colander/tests/test_colander.py::TestSchemaNode::test_cstruct_children_warning colander/tests/test_colander.py::TestSchemaNode::test_ctor_children_kwarg_typ colander/tests/test_colander.py::TestSchemaNode::test_ctor_no_title colander/tests/test_colander.py::TestSchemaNode::test_ctor_with_description colander/tests/test_colander.py::TestSchemaNode::test_ctor_with_kwarg_typ colander/tests/test_colander.py::TestSchemaNode::test_ctor_with_preparer colander/tests/test_colander.py::TestSchemaNode::test_ctor_with_title colander/tests/test_colander.py::TestSchemaNode::test_ctor_with_unknown_kwarg colander/tests/test_colander.py::TestSchemaNode::test_ctor_with_widget colander/tests/test_colander.py::TestSchemaNode::test_ctor_without_preparer colander/tests/test_colander.py::TestSchemaNode::test_ctor_without_type colander/tests/test_colander.py::TestSchemaNode::test_declarative_name_reassignment colander/tests/test_colander.py::TestSchemaNode::test_deserialize_appstruct_deferred colander/tests/test_colander.py::TestSchemaNode::test_deserialize_no_validator colander/tests/test_colander.py::TestSchemaNode::test_deserialize_noargs_uses_default colander/tests/test_colander.py::TestSchemaNode::test_deserialize_null_can_be_used_as_missing colander/tests/test_colander.py::TestSchemaNode::test_deserialize_preparer_before_missing_check colander/tests/test_colander.py::TestSchemaNode::test_deserialize_value_is_null_no_missing colander/tests/test_colander.py::TestSchemaNode::test_deserialize_value_is_null_with_missing colander/tests/test_colander.py::TestSchemaNode::test_deserialize_value_is_null_with_missing_msg colander/tests/test_colander.py::TestSchemaNode::test_deserialize_value_with_interpolated_missing_msg colander/tests/test_colander.py::TestSchemaNode::test_deserialize_with_multiple_preparers colander/tests/test_colander.py::TestSchemaNode::test_deserialize_with_preparer colander/tests/test_colander.py::TestSchemaNode::test_deserialize_with_unbound_validator colander/tests/test_colander.py::TestSchemaNode::test_deserialize_with_validator colander/tests/test_colander.py::TestSchemaNode::test_insert colander/tests/test_colander.py::TestSchemaNode::test_new_sets_order colander/tests/test_colander.py::TestSchemaNode::test_raise_invalid colander/tests/test_colander.py::TestSchemaNode::test_repr colander/tests/test_colander.py::TestSchemaNode::test_required_deferred colander/tests/test_colander.py::TestSchemaNode::test_required_false colander/tests/test_colander.py::TestSchemaNode::test_required_true colander/tests/test_colander.py::TestSchemaNode::test_serialize colander/tests/test_colander.py::TestSchemaNode::test_serialize_default_deferred colander/tests/test_colander.py::TestSchemaNode::test_serialize_noargs_uses_default colander/tests/test_colander.py::TestSchemaNode::test_serialize_value_is_null_no_default colander/tests/test_colander.py::TestSchemaNode::test_serialize_value_is_null_with_default colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_deferred_methods_dont_quite_work_yet colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_functions_can_be_deferred colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_method_values_can_rely_on_binding colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_nodes_can_be_deffered colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_nonmethod_values_can_be_deferred_though colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_nonmethod_values_can_rely_on_after_bind colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_schema_child_names_conflict_with_value_names_in_subclass colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_schema_child_names_conflict_with_value_names_in_superclass colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_schema_child_names_conflict_with_value_names_notused colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_schema_child_names_conflict_with_value_names_used colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_subclass_title_overwritten_by_constructor colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_subclass_uses_missing colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_subclass_uses_title colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_subclass_uses_validator_method colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_subclass_value_overridden_by_constructor colander/tests/test_colander.py::TestSchemaNodeSubclassing::test_subelement_title_not_overwritten colander/tests/test_colander.py::TestMappingSchemaInheritance::test_insert_before_failure colander/tests/test_colander.py::TestMappingSchemaInheritance::test_multiple_inheritance colander/tests/test_colander.py::TestMappingSchemaInheritance::test_single_inheritance colander/tests/test_colander.py::TestMappingSchemaInheritance::test_single_inheritance2 colander/tests/test_colander.py::TestMappingSchemaInheritance::test_single_inheritance_with_insert_before colander/tests/test_colander.py::TestDeferred::test___call__ colander/tests/test_colander.py::TestDeferred::test_ctor colander/tests/test_colander.py::TestDeferred::test_retain_func_details colander/tests/test_colander.py::TestDeferred::test_w_callable_instance_no_name colander/tests/test_colander.py::TestDeferred::test_w_callable_instance_no_name_or_doc colander/tests/test_colander.py::TestSchema::test_alias colander/tests/test_colander.py::TestSchema::test_deserialize_drop colander/tests/test_colander.py::TestSchema::test_imperative_with_implicit_schema_type colander/tests/test_colander.py::TestSchema::test_it colander/tests/test_colander.py::TestSchema::test_schema_with_cloned_nodes colander/tests/test_colander.py::TestSchema::test_serialize_drop_default colander/tests/test_colander.py::TestSchema::test_title_munging colander/tests/test_colander.py::TestSequenceSchema::test_clone_with_sequence_schema colander/tests/test_colander.py::TestSequenceSchema::test_deserialize_drop colander/tests/test_colander.py::TestSequenceSchema::test_fail_toofew colander/tests/test_colander.py::TestSequenceSchema::test_fail_toomany colander/tests/test_colander.py::TestSequenceSchema::test_imperative_with_implicit_schema_type colander/tests/test_colander.py::TestSequenceSchema::test_serialize_drop_default colander/tests/test_colander.py::TestSequenceSchema::test_succeed colander/tests/test_colander.py::TestTupleSchema::test_imperative_with_implicit_schema_type colander/tests/test_colander.py::TestTupleSchema::test_it colander/tests/test_colander.py::TestImperative::test_deserialize_ok colander/tests/test_colander.py::TestImperative::test_flatten_mapping_has_no_name colander/tests/test_colander.py::TestImperative::test_flatten_ok colander/tests/test_colander.py::TestImperative::test_flatten_unflatten_roundtrip colander/tests/test_colander.py::TestImperative::test_get_value colander/tests/test_colander.py::TestImperative::test_invalid_asdict colander/tests/test_colander.py::TestImperative::test_invalid_asdict_translation_callback colander/tests/test_colander.py::TestImperative::test_set_value colander/tests/test_colander.py::TestImperative::test_unflatten_mapping_no_name colander/tests/test_colander.py::TestImperative::test_unflatten_ok colander/tests/test_colander.py::TestDeclarative::test_deserialize_ok colander/tests/test_colander.py::TestDeclarative::test_flatten_mapping_has_no_name colander/tests/test_colander.py::TestDeclarative::test_flatten_ok colander/tests/test_colander.py::TestDeclarative::test_flatten_unflatten_roundtrip colander/tests/test_colander.py::TestDeclarative::test_get_value colander/tests/test_colander.py::TestDeclarative::test_invalid_asdict colander/tests/test_colander.py::TestDeclarative::test_invalid_asdict_translation_callback colander/tests/test_colander.py::TestDeclarative::test_set_value colander/tests/test_colander.py::TestDeclarative::test_unflatten_mapping_no_name colander/tests/test_colander.py::TestDeclarative::test_unflatten_ok colander/tests/test_colander.py::TestUltraDeclarative::test_deserialize_ok colander/tests/test_colander.py::TestUltraDeclarative::test_flatten_mapping_has_no_name colander/tests/test_colander.py::TestUltraDeclarative::test_flatten_ok colander/tests/test_colander.py::TestUltraDeclarative::test_flatten_unflatten_roundtrip colander/tests/test_colander.py::TestUltraDeclarative::test_get_value colander/tests/test_colander.py::TestUltraDeclarative::test_invalid_asdict colander/tests/test_colander.py::TestUltraDeclarative::test_invalid_asdict_translation_callback colander/tests/test_colander.py::TestUltraDeclarative::test_set_value colander/tests/test_colander.py::TestUltraDeclarative::test_unflatten_mapping_no_name colander/tests/test_colander.py::TestUltraDeclarative::test_unflatten_ok colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_deserialize_ok colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_flatten_mapping_has_no_name colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_flatten_ok colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_flatten_unflatten_roundtrip colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_get_value colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_invalid_asdict colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_invalid_asdict_translation_callback colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_set_value colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_unflatten_mapping_no_name colander/tests/test_colander.py::TestDeclarativeWithInstantiate::test_unflatten_ok colander/tests/test_colander.py::Test_null::test___nonzero__ colander/tests/test_colander.py::Test_null::test___repr__ colander/tests/test_colander.py::Test_null::test_pickling colander/tests/test_colander.py::Test_required::test___repr__ colander/tests/test_colander.py::Test_required::test_pickling colander/tests/test_colander.py::Test_drop::test___repr__ colander/tests/test_colander.py::Test_drop::test_pickling