Skip to content

Commit 9101de0

Browse files
committed
fix initials for prefixes on first names
Also make is_suffix, is_prefix and is_conjunction support lists
1 parent c240265 commit 9101de0

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

nameparser/parser.py

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -189,17 +189,19 @@ def as_dict(self, include_empty=True):
189189
d[m] = val
190190
return d
191191

192-
def __process_initial__(self, name_part):
192+
def __process_initial__(self, name_part, firstname=False):
193193
"""
194194
Name parts may include prefixes or conjuctions. This function filters these from the name unless it is
195195
a first name, since first names cannot be conjunctions or prefixes.
196196
"""
197197
parts = name_part.split(" ")
198-
parsed = ""
199-
if len(parts) and not (name_part == 'first' and (self.is_prefix(parts) or self.is_conjunction(parts))):
200-
parsed = " ".join(parts)
201-
if len(parsed) > 0:
202-
return parsed[0]
198+
initials = []
199+
if len(parts) and isinstance(parts, list):
200+
for part in parts:
201+
if not (self.is_prefix(part) or self.is_conjunction(part)) or firstname == True:
202+
initials.append(part[0])
203+
if len(initials) > 0:
204+
return " ".join(initials)
203205
else:
204206
return self.C.empty_attribute_default
205207

@@ -216,7 +218,7 @@ def initials_list(self):
216218
>>> name.initials_list()
217219
["J", "D"]
218220
"""
219-
first_initials_list = [self.__process_initial__(name) for name in self.first_list if name]
221+
first_initials_list = [self.__process_initial__(name, True) for name in self.first_list if name]
220222
middle_initials_list = [self.__process_initial__(name) for name in self.middle_list if name]
221223
last_initials_list = [self.__process_initial__(name) for name in self.last_list if name]
222224
return first_initials_list + middle_initials_list + last_initials_list
@@ -238,7 +240,7 @@ def initials(self):
238240
"B. A."
239241
"""
240242

241-
first_initials_list = [self.__process_initial__(name) for name in self.first_list if name]
243+
first_initials_list = [self.__process_initial__(name, True) for name in self.first_list if name]
242244
middle_initials_list = [self.__process_initial__(name) for name in self.middle_list if name]
243245
last_initials_list = [self.__process_initial__(name) for name in self.last_list if name]
244246

@@ -378,14 +380,24 @@ def is_title(self, value):
378380

379381
def is_conjunction(self, piece):
380382
"""Is in the conjunctions set and not :py:func:`is_an_initial()`."""
381-
return piece.lower() in self.C.conjunctions and not self.is_an_initial(piece)
383+
if isinstance(piece, list):
384+
for item in piece:
385+
if self.is_conjunction(item):
386+
return True
387+
else:
388+
return piece.lower() in self.C.conjunctions and not self.is_an_initial(piece)
382389

383390
def is_prefix(self, piece):
384391
"""
385392
Lowercase and no periods version of piece is in the
386393
:py:data:`~nameparser.config.prefixes.PREFIXES` set.
387394
"""
388-
return lc(piece) in self.C.prefixes
395+
if isinstance(piece, list):
396+
for item in piece:
397+
if self.is_prefix(item):
398+
return True
399+
else:
400+
return lc(piece) in self.C.prefixes
389401

390402
def is_roman_numeral(self, value):
391403
"""
@@ -403,9 +415,14 @@ def is_suffix(self, piece):
403415
`C.suffix_acronyms`.
404416
"""
405417
# suffixes may have periods inside them like "M.D."
406-
return ((lc(piece).replace('.', '') in self.C.suffix_acronyms)
407-
or (lc(piece) in self.C.suffix_not_acronyms)) \
408-
and not self.is_an_initial(piece)
418+
if isinstance(piece, list):
419+
for piece in pieces:
420+
if self.is_suffix(piece):
421+
return True
422+
else:
423+
return ((lc(piece).replace('.', '') in self.C.suffix_acronyms)
424+
or (lc(piece) in self.C.suffix_not_acronyms)) \
425+
and not self.is_an_initial(piece)
409426

410427
def are_suffixes(self, pieces):
411428
"""Return True if all pieces are suffixes."""

tests.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,18 @@ def test_surnames_attribute(self):
200200
hn = HumanName("John Edgar Casey Williams III")
201201
self.m(hn.surnames, "Edgar Casey Williams", hn)
202202

203+
def test_is_prefix_with_list(self):
204+
hn = HumanName()
205+
items = ['firstname', 'lastname', 'del']
206+
self.assertTrue(hn.is_prefix(items))
207+
self.assertTrue(hn.is_prefix(items[1:]))
208+
209+
def test_is_conjunction_with_list(self):
210+
hn = HumanName()
211+
items = ['firstname', 'lastname', 'and']
212+
self.assertTrue(hn.is_conjunction(items))
213+
self.assertTrue(hn.is_conjunction(items[1:]))
214+
203215
def test_override_constants(self):
204216
C = Constants()
205217
hn = HumanName(constants=C)
@@ -2328,6 +2340,10 @@ def test_initials_with_prefix_firstname(self):
23282340
hn = HumanName("Van Jeremy Johnson")
23292341
self.m(hn.initials_list(), ["V", "J", "J"], hn)
23302342

2343+
def test_initials_with_prefix(self):
2344+
hn = HumanName("Alex van Johnson")
2345+
self.m(hn.initials_list(), ["A", "J"], hn)
2346+
23312347

23322348
TEST_NAMES = (
23332349
"John Doe",

0 commit comments

Comments
 (0)