Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new parse_fraction function for simple fractions added with test data #60

Merged
merged 11 commits into from
Mar 24, 2021
2 changes: 1 addition & 1 deletion number_parser/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from number_parser.parser import parse, parse_number, parse_ordinal
from number_parser.parser import parse, parse_number, parse_ordinal, parse_fraction
32 changes: 32 additions & 0 deletions number_parser/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,38 @@ def parse_number(input_string, language=None):
return int(number_built[0])
return None

Gallaecio marked this conversation as resolved.
Show resolved Hide resolved
def parse_fraction(input_string, language=None):
"""Converts a single number written in fraction to a numeric type"""
if not input_string.strip():
return None

if language is None:
language = _valid_tokens_by_language(input_string)

if language != 'en':
raise ValueError(f'"{language}" is not a supported language for parsing fraction')

fraction_separators = ["divided by", "over", "by", "/"]
Gallaecio marked this conversation as resolved.
Show resolved Hide resolved

for separator in fraction_separators:
position_of_separator = input_string.find(separator)

if position_of_separator == -1:
continue

string_before_separator = input_string[:position_of_separator]
string_after_separator = input_string[position_of_separator + len(separator):]

number_before_separator = parse_number(string_before_separator, language)
number_after_separator = parse_number(string_after_separator, language)

if number_before_separator == None or number_after_separator == None:
Gallaecio marked this conversation as resolved.
Show resolved Hide resolved
return None

return str(number_before_separator) + '/' + str(number_after_separator)
Gallaecio marked this conversation as resolved.
Show resolved Hide resolved

return None


def parse(input_string, language=None):
"""
Expand Down
29 changes: 28 additions & 1 deletion tests/test_number_parsing.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import pytest
from number_parser import parse, parse_number
from number_parser import parse, parse_number, parse_fraction
from number_parser.parser import LanguageData, parse_ordinal


Expand Down Expand Up @@ -121,6 +121,33 @@ def test_parse_sentences_ordinal(expected, test_input, lang):
assert parse(test_input, lang) == expected



@pytest.mark.parametrize(
"test_input,expected,lang",
[
# empty / not-a-number
('', None, None),
('example of sentence', None, None),
# numeric
('32', None, None),
(' 3 ', None, None),
# en
('eleven', None, 'en'),
('one hundred and forty two by a sentence', None, 'en'),
('sentence / eleven', None, 'en'),
('one hundred and forty two by eleven', '142/11', 'en'),
('one hundred and forty two divided by eleven', '142/11', 'en'),
('one hundred and forty two / eleven', '142/11', 'en'),
('one hundred and forty two over eleven', '142/11', 'en'),
('two million three thousand and nineteen/two thousand and nineteen', '2003019/2019', 'en'),
('billion over nineteen billion and nineteen', '1000000000/19000000019', 'en'),

]
)
def test_parse_fraction(expected, test_input, lang):
assert parse_fraction(test_input, language=lang) == expected


def test_LanguageData_unsupported_language():
with pytest.raises(ValueError):
LanguageData('xxxx')