Repository: scrapinghub/number-parser

Issue:
Doesn't recognize a million in Ukrainian
```
In [11]: parse_number("мільйон") is None
Out[11]: True

In [12]: parse_number("міліон") is None
Out[12]: True
```

http://sum.in.ua/s/miljjon

These are two versions of the writing of the word million in the Ukrainian language. 

Is it a problem that Ukrainian is not in supported languages? https://github.com/scrapinghub/number-parser/blob/master/number_parser/parser.py#L5
But I see Ukrainian here https://github.com/scrapinghub/number-parser/blob/master/number_parser/data/uk.py#L53

Thank you.


Comments:

Patch:
diff --git a/README.rst b/README.rst
index 1f1f62e..169db0a 100644
--- a/README.rst
+++ b/README.rst
@@ -7,7 +7,7 @@ number-parser
 
 ``number-parser`` is a simple library that allows you to convert numbers written in the natural
 language to it's equivalent numeric forms. It currently supports cardinal numbers in the following
-languages - English, Hindi, Spanish and Russian and ordinal numbers in English.
+languages - English, Hindi, Spanish, Ukrainian and Russian and ordinal numbers in English.
 
 Installation
 ============
@@ -76,7 +76,7 @@ Language Support
 
 The default language is English, you can pass the language parameter with corresponding locale for other languages.
 It currently supports cardinal numbers in the following
-languages - English, Hindi, Spanish and Russian and ordinal numbers in English.
+languages - English, Hindi, Spanish, Ukrainian and Russian and ordinal numbers in English.
 
 >>> from number_parser import parse, parse_number
 >>> parse("Hay tres gallinas y veintitrés patos", language='es')
diff --git a/number_parser/data/uk.py b/number_parser/data/uk.py
index 22be0c8..7198298 100644
--- a/number_parser/data/uk.py
+++ b/number_parser/data/uk.py
@@ -1,18 +1,53 @@
 info = {
     "UNIT_NUMBERS": {
         "нуль": 0,
+        "нулю": 0,
         "один": 1,
         "одна": 1,
         "одне": 1,
+        "одним": 1,
+        "одними": 1,
+        "одного": 1,
+        "одному": 1,
+        "одну": 1,
+        "одні": 1,
+        "одній": 1,
         "два": 2,
+        "двом": 2,
+        "двома": 2,
+        "двох": 2,
+        "двоє": 2,
+        "двум": 2,
         "дві": 2,
         "три": 3,
+        "троє": 3,
+        "трьом": 3,
+        "трьома": 3,
+        "трьох": 3,
+        "четверо": 4,
         "чотири": 4,
+        "чотирьом": 4,
+        "чотирьома": 4,
+        "чотирьох": 4,
+        "пʼятеро": 5,
+        "пʼяти": 5,
+        "пʼятих": 5,
         "пʼять": 5,
+        "пʼятьма": 5,
+        "пять": 5,
+        "шести": 6,
         "шість": 6,
+        "шістьма": 6,
+        "семи": 7,
         "сім": 7,
+        "сімма": 7,
+        "восьми": 8,
+        "восьмима": 8,
         "вісім": 8,
-        "девʼять": 9
+        "девʼяти": 9,
+        "девʼять": 9,
+        "девʼятьма": 9,
+        "девять": 9
     },
     "DIRECT_NUMBERS": {
         "десять": 10,
@@ -21,29 +56,36 @@ info = {
         "тринадцять": 13,
         "чотирнадцять": 14,
         "пʼятнадцять": 15,
+        "пятнадцять": 15,
         "шістнадцять": 16,
         "сімнадцять": 17,
         "вісімнадцять": 18,
-        "девʼятнадцять": 19
+        "девʼятнадцять": 19,
+        "девятнадцять": 19
     },
     "TENS": {
         "двадцять": 20,
         "тридцять": 30,
         "сорок": 40,
         "пʼятдесят": 50,
+        "пятдесят": 50,
         "шістдесят": 60,
         "сімдесят": 70,
         "вісімдесят": 80,
-        "девʼяносто": 90
+        "девʼяносто": 90,
+        "девяносто": 90
     },
     "HUNDREDS": {
+        "сто": 100,
         "двісті": 200,
         "триста": 300,
         "чотириста": 400,
+        "п'ятсот": 500,
         "пʼятсот": 500,
         "шістсот": 600,
         "сімсот": 700,
         "вісімсот": 800,
+        "дев'ятсот": 900,
         "девʼятсот": 900
     },
     "BIG_POWERS_OF_TEN": {
@@ -53,15 +95,79 @@ info = {
         "мільйон": 1000000,
         "мільйони": 1000000,
         "мільйонів": 1000000,
+        "міліон": 1000000,
         "мільярд": 1000000000,
         "мільярди": 1000000000,
         "мільярдів": 1000000000,
+        "міліярд": 1000000000,
         "більйон": 1000000000000,
         "більйони": 1000000000000,
         "більйонів": 1000000000000,
+        "трильйон": 1000000000000,
+        "триліон": 1000000000000,
         "більярд": 1000000000000000,
         "більярди": 1000000000000000,
-        "більярдів": 1000000000000000
+        "більярдів": 1000000000000000,
+        "квадрильйон": 1000000000000000,
+        "квадриліон": 1000000000000000,
+        "квінтильйон": 1000000000000000000,
+        "квінтиліон": 1000000000000000000,
+        "секстильйон": 1000000000000000000000,
+        "секстиліон": 1000000000000000000000,
+        "септильйон": 1000000000000000000000000,
+        "септиліон": 1000000000000000000000000,
+        "октильйон": 1000000000000000000000000000,
+        "октиліон": 1000000000000000000000000000,
+        "нонильйон": 1000000000000000000000000000000,
+        "нонільйон": 1000000000000000000000000000000,
+        "ноніліон": 1000000000000000000000000000000,
+        "децильйон": 1000000000000000000000000000000000,
+        "дециліон": 1000000000000000000000000000000000,
+        "децільйон": 1000000000000000000000000000000000,
+        "ундецильйон": 1000000000000000000000000000000000000,
+        "ундециліон": 1000000000000000000000000000000000000,
+        "ундецільйон": 1000000000000000000000000000000000000,
+        "дуодецильйон": 1000000000000000000000000000000000000000,
+        "дуодециліон": 1000000000000000000000000000000000000000,
+        "дуодецільйон": 1000000000000000000000000000000000000000,
+        "тредецильйон": 1000000000000000000000000000000000000000000,
+        "тредециліон": 1000000000000000000000000000000000000000000,
+        "тредецільйон": 1000000000000000000000000000000000000000000,
+        "кваттуордецильйон": 1000000000000000000000000000000000000000000000,
+        "кваттуордециліон": 1000000000000000000000000000000000000000000000,
+        "квіндецильйон": 1000000000000000000000000000000000000000000000000,
+        "квіндециліон": 1000000000000000000000000000000000000000000000000,
+        "сексдецильйон": 1000000000000000000000000000000000000000000000000000,
+        "сексдециліон": 1000000000000000000000000000000000000000000000000000,
+        "септендецильйон": 1000000000000000000000000000000000000000000000000000000,
+        "септендециліон": 1000000000000000000000000000000000000000000000000000000,
+        "октодецильйон": 1000000000000000000000000000000000000000000000000000000000,
+        "октодециліон": 1000000000000000000000000000000000000000000000000000000000,
+        "новемдецильйон": 1000000000000000000000000000000000000000000000000000000000000,
+        "новемдециліон": 1000000000000000000000000000000000000000000000000000000000000,
+        "вігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000,
+        "унвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000,
+        "дуовігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000,
+        "тревігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000,
+        "кваттуорвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "квінвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "сексвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "септемвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "октовігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "новемвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "тригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "унтригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "дуотригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "третригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "кваттуортригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "квінтригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "секстригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "септентригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "октотригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "новемтригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "квадрагінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "унквадрагінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "дуоквадрагінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
     },
     "SKIP_TOKENS": [],
     "USE_LONG_SCALE": False
diff --git a/number_parser/parser.py b/number_parser/parser.py
index e0d67c2..9bb65a5 100644
--- a/number_parser/parser.py
+++ b/number_parser/parser.py
@@ -2,7 +2,7 @@ import re
 from importlib import import_module
 import unicodedata
 SENTENCE_SEPARATORS = [".", ","]
-SUPPORTED_LANGUAGES = ['en', 'es', 'hi', 'ru']
+SUPPORTED_LANGUAGES = ['en', 'es', 'hi', 'ru', 'uk']
 RE_BUG_LANGUAGES = ['hi']
 
 
diff --git a/number_parser_data/supplementary_translation_data/uk.json b/number_parser_data/supplementary_translation_data/uk.json
index ff8bd15..23eb0e3 100644
--- a/number_parser_data/supplementary_translation_data/uk.json
+++ b/number_parser_data/supplementary_translation_data/uk.json
@@ -1,9 +1,160 @@
 {
-    "UNIT_NUMBERS": {},
-    "DIRECT_NUMBERS": {},
-    "TENS": {},
-    "HUNDREDS": {},
-    "BIG_POWERS_OF_TEN": {},
+    "UNIT_NUMBERS": {
+        "нуль": 0,
+        "нулю": 0,
+        "один": 1,
+        "одному": 1,
+        "одним": 1,
+        "одними": 1,
+        "одну": 1,
+        "одного": 1,
+        "одне": 1,
+        "одні": 1,
+        "одна": 1,
+        "одній": 1,
+        "два": 2,
+        "двом": 2,
+        "двох": 2,
+        "двома": 2,
+        "дві": 2,
+        "двоє": 2,
+        "двум": 2,
+        "три": 3,
+        "трьом": 3,
+        "трьох": 3,
+        "троє": 3,
+        "трьома": 3,
+        "чотири": 4,
+        "четверо": 4,
+        "чотирьом": 4,
+        "чотирьох": 4,
+        "чотирьома": 4,
+        "пять": 5,
+        "пʼять": 5,
+        "пʼятеро": 5,
+        "пʼяти": 5,
+        "пʼятих": 5,
+        "пʼятьма": 5,
+        "шість": 6,
+        "шести": 6,
+        "шістьма": 6,
+        "сім": 7,
+        "семи": 7,
+        "сімма": 7,
+        "вісім": 8,
+        "восьми": 8,
+        "восьмима": 8,
+        "девʼять": 9,
+        "девять": 9,
+        "девʼяти": 9,
+        "девʼятьма": 9
+    },
+    "DIRECT_NUMBERS": {
+        "десять": 10,
+        "одинадцять": 11,
+        "дванадцять": 12,
+        "тринадцять": 13,
+        "чотирнадцять": 14,
+        "пʼятнадцять": 15,
+        "пятнадцять": 15,
+        "шістнадцять": 16,
+        "сімнадцять": 17,
+        "вісімнадцять": 18,
+        "девʼятнадцять": 19,
+        "девятнадцять": 19
+    },
+    "TENS": {
+        "двадцять": 20,
+        "тридцять": 30,
+        "сорок": 40,
+        "пʼятдесят": 50,
+        "пятдесят": 50,
+        "шістдесят": 60,
+        "сімдесят": 70,
+        "вісімдесят": 80,
+        "девʼяносто": 90,
+        "девяносто": 90
+    },
+    "HUNDREDS": {
+        "сто": 100,
+        "двісті": 200,
+        "триста": 300,
+        "чотириста": 400,
+        "п'ятсот": 500,
+        "шістсот": 600,
+        "сімсот": 700,
+        "вісімсот": 800,
+        "дев'ятсот": 900
+    },
+    "BIG_POWERS_OF_TEN": {
+        "тисяча": 1000,
+        "мільйон": 1000000,
+        "міліон": 1000000,
+        "мільярд": 1000000000,
+        "міліярд": 1000000000,
+        "трильйон": 1000000000000,
+        "триліон": 1000000000000,
+        "квадрильйон": 1000000000000000,
+        "квадриліон": 1000000000000000,
+        "квінтильйон": 1000000000000000000,
+        "квінтиліон": 1000000000000000000,
+        "секстильйон": 1000000000000000000000,
+        "секстиліон": 1000000000000000000000,
+        "септильйон": 1000000000000000000000000,
+        "септиліон": 1000000000000000000000000,
+        "октильйон": 1000000000000000000000000000,
+        "октиліон": 1000000000000000000000000000,
+        "нонільйон": 1000000000000000000000000000000,
+        "нонильйон": 1000000000000000000000000000000,
+        "ноніліон": 1000000000000000000000000000000,
+        "децильйон": 1000000000000000000000000000000000,
+        "децільйон": 1000000000000000000000000000000000,
+        "дециліон": 1000000000000000000000000000000000,
+        "ундецільйон": 1000000000000000000000000000000000000,
+        "ундецильйон": 1000000000000000000000000000000000000,
+        "ундециліон": 1000000000000000000000000000000000000,
+        "дуодецильйон": 1000000000000000000000000000000000000000,
+        "дуодецільйон": 1000000000000000000000000000000000000000,
+        "дуодециліон": 1000000000000000000000000000000000000000,
+        "тредецильйон": 1000000000000000000000000000000000000000000,
+        "тредециліон": 1000000000000000000000000000000000000000000,
+        "тредецільйон": 1000000000000000000000000000000000000000000,
+        "кваттуордецильйон": 1000000000000000000000000000000000000000000000,
+        "кваттуордециліон": 1000000000000000000000000000000000000000000000,
+        "квіндецильйон": 1000000000000000000000000000000000000000000000000,
+        "квіндециліон": 1000000000000000000000000000000000000000000000000,
+        "сексдецильйон": 1000000000000000000000000000000000000000000000000000,
+        "сексдециліон": 1000000000000000000000000000000000000000000000000000,
+        "септендецильйон": 1000000000000000000000000000000000000000000000000000000,
+        "септендециліон": 1000000000000000000000000000000000000000000000000000000,
+        "октодецильйон": 1000000000000000000000000000000000000000000000000000000000,
+        "октодециліон": 1000000000000000000000000000000000000000000000000000000000,
+        "новемдецильйон": 1000000000000000000000000000000000000000000000000000000000000,
+        "новемдециліон": 1000000000000000000000000000000000000000000000000000000000000,
+        "вігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000,
+        "унвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000,
+        "дуовігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000,
+        "тревігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000,
+        "кваттуорвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "квінвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "сексвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "септемвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "октовігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "новемвігінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "тригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "унтригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "дуотригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "третригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "кваттуортригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "квінтригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "секстригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "септентригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "октотригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "новемтригінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "квадрагінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "унквадрагінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
+        "дуоквадрагінтільйон": 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+    },
     "SKIP_TOKENS": [],
     "USE_LONG_SCALE": false
 }
\ No newline at end of file


Test patch:
diff --git a/tests/test_language_uk.py b/tests/test_language_uk.py
new file mode 100644
index 0000000..74ae589
--- /dev/null
+++ b/tests/test_language_uk.py
@@ -0,0 +1,121 @@
+import pytest
+from number_parser import parse_number
+from tests import HUNDREDS_DIRECTORY, PERMUTATION_DIRECTORY
+from tests import _test_files
+
+LANG = 'uk'
+
+
+@pytest.mark.parametrize(
+    "test_input,expected",
+    [
+        ("нуль", 0),
+        ("нулю", 0),
+        ("один", 1),
+        ("одному", 1),
+        ("одним", 1),
+        ("одне", 1),
+        ("одна", 1),
+        ("одні", 1),
+        ("два", 2),
+        ("двох", 2),
+        ("двум", 2),
+        ("двоє", 2),
+        ("три", 3),
+        ("трьох", 3),
+        ("троє", 3),
+        ("чотири", 4),
+        ("четверо", 4),
+        ("пʼять", 5),
+        ("пʼяти", 5),
+        ("пʼятеро", 5),
+        ("шість", 6),
+        ("сім", 7),
+        ("вісім", 8),
+        ("девʼять", 9),
+        ("десять", 10),
+        ("одинадцять", 11),
+        ("дванадцять", 12),
+        ("тринадцять", 13),
+        ("чотирнадцять", 14),
+        ("пʼятнадцять", 15),
+        ("шістнадцять", 16),
+        ("сімнадцять", 17),
+        ("вісімнадцять", 18),
+        ("девʼятнадцять", 19),
+        ("двадцять", 20),
+        ("тридцять", 30),
+        ("сорок", 40),
+        ("пʼятдесят", 50),
+        ("шістдесят", 60),
+        ("сімдесят", 70),
+        ("вісімдесят", 80),
+        ("девʼяносто", 90),
+        ("сто", 100),
+        ("двісті", 200),
+        ("триста", 300),
+        ("чотириста", 400),
+        ("пʼятсот", 500),
+        ("шістсот", 600),
+        ("сімсот", 700),
+        ("вісімсот", 800),
+        ("девʼятсот", 900),
+        ("одна тисяча", 1000),
+        ("одна тисяча один", 1001),
+        ("одна тисяча два", 1002),
+        ("одна тисяча три", 1003),
+        ("одна тисяча чотири", 1004),
+        ("одна тисяча пʼять", 1005),
+        ("одна тисяча шість", 1006),
+        ("одна тисяча сім", 1007),
+        ("одна тисяча вісім", 1008),
+        ("одна тисяча девʼять", 1009),
+        ("одна тисяча десять", 1010),
+        ("десять тисяч", 10000),
+        ("сто тисяч", 100000),
+        ("мільйон", 1_000_000),
+        ("міліон", 1_000_000),
+        ("один мільйон", 1000000),
+        ("один мільйон один", 1000001),
+        ("один мільйон два", 1000002),
+        ("один мільйон три", 1000003),
+        ("один мільйон чотири", 1000004),
+        ("один мільйон пʼять", 1000005),
+        ("десять мільйонів", 10000000),
+        ("сто мільйонів", 100000000),
+        ("мільярд", 1_000_000_000),
+        ("один мільярд", 1000000000),
+        ("один мільярд один", 1000000001),
+        ("один мільярд два", 1000000002),
+        ("один мільярд три", 1000000003),
+        ("один мільярд чотири", 1000000004),
+        ("один мільярд пʼять", 1000000005),
+        ("десять мільярдів", 10000000000),
+        ("сто мільярдів", 100000000000),
+        ("трильйон", 1_000_000_000_000),
+        ("один трильйон", 1000000000000),
+        ("один трильйон один", 1000000000001),
+        ("квадрильйон", 1_000_000_000_000_000),
+        ("один квадрильйон", 1000000000000000),
+        ("один квадрильйон один", 1000000000000001),
+        ("квінтильйон", 1_000_000_000_000_000_000),
+        ("секстильйон", 1_000_000_000_000_000_000_000),
+        ("септильйон", 1_000_000_000_000_000_000_000_000),
+        ("октильйон", 1_000_000_000_000_000_000_000_000_000),
+        ("нонільйон", 1_000_000_000_000_000_000_000_000_000_000),
+        ("децільйон", 1_000_000_000_000_000_000_000_000_000_000_000),
+        ("ундецільйон", 1_000_000_000_000_000_000_000_000_000_000_000_000),
+        ("дуодецільйон", 1_000_000_000_000_000_000_000_000_000_000_000_000_000),
+        ("тредецільйон", 1_000_000_000_000_000_000_000_000_000_000_000_000_000_000),
+    ]
+)
+def test_parse_number(expected, test_input):
+    assert parse_number(test_input, LANG) == expected
+
+
+def test_parse_number_till_hundred():
+    _test_files(HUNDREDS_DIRECTORY, LANG)
+
+
+def test_parse_number_permutations():
+    _test_files(PERMUTATION_DIRECTORY, LANG)