Skip to content

Commit 9e311a6

Browse files
pjkundertmatejcik
authored andcommitted
Detect language unambiguously, or raise explanatory exception
1 parent 6b7ebdb commit 9e311a6

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

src/mnemonic/mnemonic.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,16 @@ def normalize_string(txt: AnyStr) -> str:
101101

102102
@classmethod
103103
def detect_language(cls, code: str) -> str:
104+
"""Scan the Mnemonic until the language becomes unambiguous."""
104105
code = cls.normalize_string(code)
105-
first = code.split(" ")[0]
106-
languages = cls.list_languages()
107-
108-
for lang in languages:
109-
mnemo = cls(lang)
110-
if first in mnemo.wordlist:
111-
return lang
112-
113-
raise ConfigurationError("Language not detected")
106+
possible = set(cls(lang) for lang in cls.list_languages())
107+
for word in code.split():
108+
possible = set(p for p in possible if word in p.wordlist)
109+
if not possible:
110+
raise ConfigurationError(f"Language unrecognized: {word!r}")
111+
if len( possible ) == 1:
112+
return possible.pop().language
113+
raise ConfigurationError(f"Language ambiguous: {', '.join( p.language for p in possible)}")
114114

115115
def generate(self, strength: int = 128) -> str:
116116
"""

tests/test_mnemonic.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,13 @@ def test_detection(self) -> None:
5858
self.assertEqual("english", Mnemonic.detect_language("security"))
5959

6060
with self.assertRaises(Exception):
61-
Mnemonic.detect_language("xxxxxxx")
61+
Mnemonic.detect_language("jaguar xxxxxxx") # Unrecognized in any known language
62+
63+
with self.assertRaises(Exception):
64+
Mnemonic.detect_language("jaguar jaguar") # Ambiguous after examining all words
65+
66+
self.assertEqual("english", Mnemonic.detect_language("jaguar security"))
67+
self.assertEqual("french", Mnemonic.detect_language("jaguar aboyer"))
6268

6369
def test_utf8_nfkd(self) -> None:
6470
# The same sentence in various UTF-8 forms

0 commit comments

Comments
 (0)