From 048935b0506c37a65d6fce9ef0e5f427d0c76992 Mon Sep 17 00:00:00 2001 From: Derek Gulbranson Date: Wed, 26 Aug 2026 19:59:41 -0700 Subject: [PATCH] fix(_types): ParsedName repr names the token behind each ambiguity Two distinct suffix-or-name ambiguities about different words rendered as identical ['suffix-or-name', 'suffix-or-name'] entries, reading as a double-emit bug rather than two separate calls. Follow Ambiguity.__repr__'s own token-join convention so each entry names its token(s), e.g. ['suffix-or-name: MA', 'suffix-or-name: V']. Fixes #431 Co-Authored-By: Claude Sonnet 5 --- nameparser/_types.py | 8 ++++++-- tests/v2/test_reprs.py | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/nameparser/_types.py b/nameparser/_types.py index 9f3655b0..83de8091 100644 --- a/nameparser/_types.py +++ b/nameparser/_types.py @@ -603,8 +603,12 @@ def __repr__(self) -> str: if text: lines.append(f" {role.value}: {text!r}") if self.ambiguities: - kinds = [a.kind.value for a in self.ambiguities] - lines.append(f" ambiguities: {kinds!r}") + items = [ + f"{a.kind.value}: {'/'.join(t.text for t in a.tokens)}" + if a.tokens else a.kind.value + for a in self.ambiguities + ] + lines.append(f" ambiguities: {items!r}") body = "\n".join(lines) return f"" if lines else "" diff --git a/tests/v2/test_reprs.py b/tests/v2/test_reprs.py index b1c028b3..c016079e 100644 --- a/tests/v2/test_reprs.py +++ b/tests/v2/test_reprs.py @@ -44,7 +44,21 @@ def test_parsedname_repr_includes_ambiguities_line_when_present() -> None: pn = ParsedName("Van Johnson", (van, Token("Johnson", Span(4, 11), Role.FAMILY)), (Ambiguity(AmbiguityKind.PARTICLE_OR_GIVEN, "d", (van,)),)) - assert "ambiguities: ['particle-or-given']" in repr(pn) + assert "ambiguities: ['particle-or-given: Van']" in repr(pn) + + +def test_parsedname_repr_distinguishes_same_kind_ambiguities_by_token() -> None: + # #431: two distinct suffix-or-name ambiguities about different + # words must not render as identical list entries. + ma = Token("MA", Span(11, 13), Role.SUFFIX) + v = Token("V", Span(14, 15), Role.SUFFIX) + pn = ParsedName( + "John Smith MA V", + (Token("John", Span(0, 4), Role.GIVEN), + Token("Smith", Span(5, 10), Role.FAMILY), ma, v), + (Ambiguity(AmbiguityKind.SUFFIX_OR_NAME, "d1", (ma,)), + Ambiguity(AmbiguityKind.SUFFIX_OR_NAME, "d2", (v,)))) + assert "ambiguities: ['suffix-or-name: MA', 'suffix-or-name: V']" in repr(pn) def test_empty_parsedname_repr() -> None: