From 07955af5740050803a401ff891d7672c1971a661 Mon Sep 17 00:00:00 2001 From: nicofrand Date: Thu, 18 Jan 2018 13:15:09 +0100 Subject: [PATCH] Fix roman numbers convertion --- flatisfy/tests.py | 32 +++++++++++++++++++++++++++++++- flatisfy/tools.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/flatisfy/tests.py b/flatisfy/tests.py index c81b42d..0c1ca73 100644 --- a/flatisfy/tests.py +++ b/flatisfy/tests.py @@ -22,9 +22,39 @@ class TestTexts(unittest.TestCase): """ Checks roman numbers replacement. """ + tester = tools.RomanNumbers() + self.assertTrue(tester.check_valid("XIV")) + self.assertTrue(not tester.check_valid("ABC")) + self.assertEqual( "14", - tools.normalize_string("XIV") + tester.convert_to_arabic("XIV") + ) + + self.assertEqual( + "1987", + tester.convert_to_arabic("MCMLXXXVII") + ) + + self.assertEqual( + "Dans le 15e arrondissement", + tester.convert_to_arabic_in_text("Dans le XVe arrondissement") + ) + + self.assertEqual( + "20eme arr.", + tester.convert_to_arabic_in_text("XXeme arr.") + ) + + self.assertEqual( + "A AIX EN PROVENCE", + tester.convert_to_arabic_in_text("A AIX EN PROVENCE") + ) + + def test_roman_numbers_in_text(self): + self.assertEqual( + "dans le 15e arrondissement", + tools.normalize_string("Dans le XVe arrondissement") ) def test_multiple_whitespaces(self): diff --git a/flatisfy/tools.py b/flatisfy/tools.py index 0521d17..8e6e164 100644 --- a/flatisfy/tools.py +++ b/flatisfy/tools.py @@ -24,6 +24,36 @@ LOGGER = logging.getLogger(__name__) # Constants NAVITIA_ENDPOINT = "https://api.navitia.io/v1/coverage/fr-idf/journeys" +class RomanNumbers(): + def check_valid(self, roman): + if not re.match('^[MDCLXVI]+$', roman): + return False + + invalid = ['IIII', 'VV', 'XXXX', 'LL', 'CCCC', 'DD', 'MMMM'] + if any(sub in roman for sub in invalid): + return False + + # TODO: check M does not appear after any other, etc. + return True + + def convert_to_arabic(self, roman): + if not self.check_valid(roman): + return roman + + keys = ['IV', 'IX', 'XL', 'XC', 'CD', 'CM', 'I', 'V', 'X', 'L', 'C', 'D', 'M'] + to_arabic = {'IV': '4', 'IX': '9', 'XL': '40', 'XC': '90', 'CD': '400', 'CM': '900', + 'I': '1', 'V': '5', 'X': '10', 'L': '50', 'C': '100', 'D': '500', 'M': '1000'} + for key in keys: + if key in roman: + roman = roman.replace(key, ' {}'.format(to_arabic.get(key))) + return str(sum(int(num) for num in roman.split())) + + def convert_to_arabic_in_text(self, text): + return re.sub( + '(?