Skip to content

Commit

Permalink
fix initials for prefixes on first names
Browse files Browse the repository at this point in the history
Also make is_suffix, is_prefix and is_conjunction support lists
  • Loading branch information
derek73 committed Jan 4, 2022
1 parent c240265 commit 9101de0
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 13 deletions.
43 changes: 30 additions & 13 deletions nameparser/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,17 +189,19 @@ def as_dict(self, include_empty=True):
d[m] = val
return d

def __process_initial__(self, name_part):
def __process_initial__(self, name_part, firstname=False):
"""
Name parts may include prefixes or conjuctions. This function filters these from the name unless it is
a first name, since first names cannot be conjunctions or prefixes.
"""
parts = name_part.split(" ")
parsed = ""
if len(parts) and not (name_part == 'first' and (self.is_prefix(parts) or self.is_conjunction(parts))):
parsed = " ".join(parts)
if len(parsed) > 0:
return parsed[0]
initials = []
if len(parts) and isinstance(parts, list):
for part in parts:
if not (self.is_prefix(part) or self.is_conjunction(part)) or firstname == True:
initials.append(part[0])
if len(initials) > 0:
return " ".join(initials)
else:
return self.C.empty_attribute_default

Expand All @@ -216,7 +218,7 @@ def initials_list(self):
>>> name.initials_list()
["J", "D"]
"""
first_initials_list = [self.__process_initial__(name) for name in self.first_list if name]
first_initials_list = [self.__process_initial__(name, True) for name in self.first_list if name]
middle_initials_list = [self.__process_initial__(name) for name in self.middle_list if name]
last_initials_list = [self.__process_initial__(name) for name in self.last_list if name]
return first_initials_list + middle_initials_list + last_initials_list
Expand All @@ -238,7 +240,7 @@ def initials(self):
"B. A."
"""

first_initials_list = [self.__process_initial__(name) for name in self.first_list if name]
first_initials_list = [self.__process_initial__(name, True) for name in self.first_list if name]
middle_initials_list = [self.__process_initial__(name) for name in self.middle_list if name]
last_initials_list = [self.__process_initial__(name) for name in self.last_list if name]

Expand Down Expand Up @@ -378,14 +380,24 @@ def is_title(self, value):

def is_conjunction(self, piece):
"""Is in the conjunctions set and not :py:func:`is_an_initial()`."""
return piece.lower() in self.C.conjunctions and not self.is_an_initial(piece)
if isinstance(piece, list):
for item in piece:
if self.is_conjunction(item):
return True
else:
return piece.lower() in self.C.conjunctions and not self.is_an_initial(piece)

def is_prefix(self, piece):
"""
Lowercase and no periods version of piece is in the
:py:data:`~nameparser.config.prefixes.PREFIXES` set.
"""
return lc(piece) in self.C.prefixes
if isinstance(piece, list):
for item in piece:
if self.is_prefix(item):
return True
else:
return lc(piece) in self.C.prefixes

def is_roman_numeral(self, value):
"""
Expand All @@ -403,9 +415,14 @@ def is_suffix(self, piece):
`C.suffix_acronyms`.
"""
# suffixes may have periods inside them like "M.D."
return ((lc(piece).replace('.', '') in self.C.suffix_acronyms)
or (lc(piece) in self.C.suffix_not_acronyms)) \
and not self.is_an_initial(piece)
if isinstance(piece, list):
for piece in pieces:
if self.is_suffix(piece):
return True
else:
return ((lc(piece).replace('.', '') in self.C.suffix_acronyms)
or (lc(piece) in self.C.suffix_not_acronyms)) \
and not self.is_an_initial(piece)

def are_suffixes(self, pieces):
"""Return True if all pieces are suffixes."""
Expand Down
16 changes: 16 additions & 0 deletions tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,18 @@ def test_surnames_attribute(self):
hn = HumanName("John Edgar Casey Williams III")
self.m(hn.surnames, "Edgar Casey Williams", hn)

def test_is_prefix_with_list(self):
hn = HumanName()
items = ['firstname', 'lastname', 'del']
self.assertTrue(hn.is_prefix(items))
self.assertTrue(hn.is_prefix(items[1:]))

def test_is_conjunction_with_list(self):
hn = HumanName()
items = ['firstname', 'lastname', 'and']
self.assertTrue(hn.is_conjunction(items))
self.assertTrue(hn.is_conjunction(items[1:]))

def test_override_constants(self):
C = Constants()
hn = HumanName(constants=C)
Expand Down Expand Up @@ -2328,6 +2340,10 @@ def test_initials_with_prefix_firstname(self):
hn = HumanName("Van Jeremy Johnson")
self.m(hn.initials_list(), ["V", "J", "J"], hn)

def test_initials_with_prefix(self):
hn = HumanName("Alex van Johnson")
self.m(hn.initials_list(), ["A", "J"], hn)


TEST_NAMES = (
"John Doe",
Expand Down

0 comments on commit 9101de0

Please sign in to comment.