Skip to content

Commit

Permalink
Optionally fallback to parsing last word of addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
b0d0nne11 committed May 10, 2017
1 parent 89b911d commit 5f93874
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
24 changes: 22 additions & 2 deletions flanker/addresslib/address.py
Expand Up @@ -56,7 +56,7 @@


@metrics_wrapper()
def parse(address, addr_spec_only=False, metrics=False):
def parse(address, addr_spec_only=False, metrics=False, fallback_last_word=False):
"""
Given a string, returns a scalar object representing a single full
mailbox (display name and addr-spec), addr-spec, or a url.
Expand Down Expand Up @@ -102,9 +102,29 @@ def parse(address, addr_spec_only=False, metrics=False):
retval = _lift_parser_result(parser.parse(address.strip(), lexer=lexer.clone()))
mtimes['parsing'] = time() - bstart
except (LexError, YaccError, SyntaxError):
retval = None

if retval is None and fallback_last_word:
try:
bstart = time()

addr_parts = address.split(' ')
addr_spec = addr_parts[-1]
display_name = ' '.join(addr_parts[0:-1])

retval = _lift_parser_result(addr_spec_parser.parse(addr_spec, lexer=lexer.clone()))
retval._display_name = display_name

mtimes['parsing'] += time() - bstart

log.warning('Fallback to last word used for address: %s',
address.decode('utf-8', 'replace'))
except (LexError, YaccError, SyntaxError):
pass

if retval is None:
log.warning('Failed to parse address: %s',
address.decode('utf-8', 'replace'))
return None, mtimes

return retval, mtimes

Expand Down
7 changes: 7 additions & 0 deletions tests/addresslib/address_test.py
Expand Up @@ -258,3 +258,10 @@ def test_requires_non_ascii():
def test_contains_domain_literal():
eq_(EmailAddress(None, 'foo@bar.com').contains_domain_literal(), False)
eq_(EmailAddress(None, 'foo@[1.2.3.4]').contains_domain_literal(), True)


def test_parse_fallback_last_word():
eq_('foo <foo@bar.com>', parse('foo <foo@bar.com>', fallback_last_word=True).full_spec())
eq_('foo <foo@bar.com>', parse('foo foo@bar.com', fallback_last_word=True).full_spec())
eq_('"foo (comment)" <foo@bar.com>', parse('foo (comment) foo@bar.com', fallback_last_word=True).full_spec())
eq_('"not@valid" <foo@bar.com>', parse('not@valid foo@bar.com', fallback_last_word=True).full_spec())

0 comments on commit 5f93874

Please sign in to comment.