Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,19 @@ from email_normalizer import normalize

# returns alicetestemail@gmail.com
normalize('Alice.Test.Email+2e16f5091e4c9a1fecd712ad1e019569@gmail.com')
```
```

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)
```
8 changes: 4 additions & 4 deletions email_normalizer/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand All @@ -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()
9 changes: 9 additions & 0 deletions tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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']):
Expand Down