diff --git a/README.md b/README.md index 8cd7f31..e88a2bc 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,19 @@ from email_normalizer import normalize # returns alicetestemail@gmail.com normalize('Alice.Test.Email+2e16f5091e4c9a1fecd712ad1e019569@gmail.com') -``` \ No newline at end of file +``` + +The default normalizer can be overridden if you want to specify your own behavior. + +```python +from email_normalizer import normalize, BaseNormalizer + +class MyNormalizer(BaseNormalizer): + @classmethod + def normalize(cls, local_part, domain): + local_part = local_part.split('--')[0] + return '{0}@{1}'.format(local_part, domain) + +# returns bob@cipher.com +normalize('Bob--Test@cipher.com', default_normalizer=MyNormalizer) +``` diff --git a/email_normalizer/__init__.py b/email_normalizer/__init__.py index 7fbe609..bcb4ed1 100644 --- a/email_normalizer/__init__.py +++ b/email_normalizer/__init__.py @@ -52,7 +52,7 @@ def _get_mx_servers(domain): return [] -def _get_normalizer(domain, resolve): +def _get_normalizer(domain, resolve, default_normalizer): if domain in _domain_normalizers: return _domain_normalizers[domain] @@ -62,13 +62,13 @@ def _get_normalizer(domain, resolve): if mx.endswith(service_domain): return normalizer - return DefaultNormalizer + return default_normalizer or DefaultNormalizer -def normalize(email, resolve=True): +def normalize(email, resolve=True, default_normalizer=None): local_part, domain = email.lower().split('@') - return _get_normalizer(domain, resolve).normalize(local_part, domain) + return _get_normalizer(domain, resolve, default_normalizer).normalize(local_part, domain) _load_domains() diff --git a/tests.py b/tests.py index 7999f5c..684bd8f 100644 --- a/tests.py +++ b/tests.py @@ -3,6 +3,7 @@ import mock from email_normalizer import normalize, _get_mx_servers, _load_domains +from email_normalizer import BaseNormalizer class NormalizerTest(unittest.TestCase): @@ -26,6 +27,14 @@ def test_wrong_domain(self): def test_default(self): self.assertEqual(normalize('test@domain.com', resolve=False), 'test@domain.com') + def test_override_default_normalizer(self): + class MyNormalizer(BaseNormalizer): + @classmethod + def normalize(cls, local_part, domain): + local_part = local_part.split('+')[0] + return '{0}@{1}'.format(local_part, domain) + self.assertEqual(normalize('foo+123@bar.com', resolve=False, default_normalizer=MyNormalizer), 'foo@bar.com') + def test_duplicated_domains(self): with mock.patch('email_normalizer.google.GoogleNormalizer.domains', ['samedomain.com']), \ mock.patch('email_normalizer.yandex.YandexNormalizer.domains', ['samedomain.com']):