diff --git a/CHANGES.txt b/CHANGES.txt index 75fb68d..b82b655 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,7 @@ Next release ------------ -- .... +- Loosen Email validator regex (permit apostrophes, bang, etc in localpart). 1.0a3 (2013-05-16) ------------------ diff --git a/colander/__init__.py b/colander/__init__.py index 5c81cc0..ae28ea0 100644 --- a/colander/__init__.py +++ b/colander/__init__.py @@ -275,14 +275,16 @@ class Regex(object): if self.match_object.match(value) is None: raise Invalid(node, self.msg) +EMAIL_RE = "(?i)^[A-Z0-9._%!#$%&'*+-/=?^_`{|}~()]+@[A-Z0-9]+([.-][A-Z0-9]+)*\.[A-Z]{2,8}$" + class Email(Regex): """ Email address validator. If ``msg`` is supplied, it will be the error message to be used when raising :exc:`colander.Invalid`; otherwise, defaults to 'Invalid email address'. """ + def __init__(self, msg=None): - email_regex = text_( - '(?i)^[A-Z0-9._%+-]+@[A-Z0-9]+([.-][A-Z0-9]+)*\.[A-Z]{2,4}$') + email_regex = text_(EMAIL_RE) if msg is None: msg = _("Invalid email address") super(Email, self).__init__(email_regex, msg=msg) diff --git a/colander/tests/test_colander.py b/colander/tests/test_colander.py index a76ebef..da9e309 100644 --- a/colander/tests/test_colander.py +++ b/colander/tests/test_colander.py @@ -349,6 +349,7 @@ class TestEmail(unittest.TestCase): self.assertEqual(validator(None, 'name@here1.us'), None) self.assertEqual(validator(None, 'name@here1.info'), None) self.assertEqual(validator(None, 'foo@bar.baz.biz'), None) + self.assertEqual(validator(None, "tip'oneill@house.gov"), None) def test_empty_email(self): validator = self._makeOne() @@ -359,9 +360,8 @@ class TestEmail(unittest.TestCase): validator = self._makeOne() from colander import Invalid self.assertRaises(Invalid, validator, None, 'me@here.') - self.assertRaises(Invalid, validator, None, 'name@here.comcom') + self.assertRaises(Invalid, validator, None, 'name@here.tldiswaytoolong') self.assertRaises(Invalid, validator, None, '@here.us') - self.assertRaises(Invalid, validator, None, '(name)@here.info') self.assertRaises(Invalid, validator, None, 'me@here..com') self.assertRaises(Invalid, validator, None, 'me@we-here-.com')