def test_alpha(self) -> None: """Tests just suffixes.""" ascending = util.sort_numerically([ util.HouseNumber('a', ''), util.HouseNumber('c', ''), util.HouseNumber('b', '') ]) self.assertEqual([i.get_number() for i in ascending], ['a', 'b', 'c'])
def test_numbers(self) -> None: """Tests numbers.""" ascending = util.sort_numerically([ util.HouseNumber('1', ''), util.HouseNumber('20', ''), util.HouseNumber('3', '') ]) self.assertEqual([i.get_number() for i in ascending], ['1', '3', '20'])
def test_alpha_suffix(self) -> None: """Tests numbers with suffixes.""" ascending = util.sort_numerically([ util.HouseNumber('1a', ''), util.HouseNumber('20a', ''), util.HouseNumber('3a', '') ]) self.assertEqual([i.get_number() for i in ascending], ['1a', '3a', '20a'])
def normalize(relation: Relation, house_numbers: str, street_name: str, normalizers: Dict[str, ranges.Ranges]) -> List[util.HouseNumber]: """Strips down string input to bare minimum that can be interpreted as an actual number. Think about a/b, a-b, and so on.""" if ';' in house_numbers: separator = ';' else: separator = '-' # Determine suffix which is not normalized away. suffix = "" if house_numbers.endswith("*"): suffix = house_numbers[-1] normalizer = util.get_normalizer(street_name, normalizers) ret_numbers, ret_numbers_nofilter = util.split_house_number_by_separator( house_numbers, separator, normalizer) street_is_even_odd = relation.get_config().get_street_is_even_odd( street_name) if separator == "-" and util.should_expand_range(ret_numbers_nofilter, street_is_even_odd): start = ret_numbers_nofilter[0] stop = ret_numbers_nofilter[1] if stop == 0: ret_numbers = [ number for number in [start] if number in normalizer ] elif street_is_even_odd: # Assume that e.g. 2-6 actually means 2, 4 and 6, not only 2 and 4. # Closed interval, even only or odd only case. ret_numbers = [ number for number in range(start, stop + 2, 2) if number in normalizer ] else: # Closed interval, but mixed even and odd. ret_numbers = [ number for number in range(start, stop + 1, 1) if number in normalizer ] check_housenumber_letters = len(ret_numbers) == 1 and relation.get_config( ).should_check_housenumber_letters() if check_housenumber_letters and util.HouseNumber.has_letter_suffix( house_numbers, suffix): style = relation.get_config().get_letter_suffix_style() normalized = util.HouseNumber.normalize_letter_suffix( house_numbers, suffix, style) return [util.HouseNumber(normalized, normalized)] return [ util.HouseNumber(str(number) + suffix, house_numbers) for number in ret_numbers ]
def normalize_housenumber_letters(relation: Relation, house_numbers: str, suffix: str, comment: str) -> List[util.HouseNumber]: """Handles the part of normalize() that deals with housenumber letters.""" style = relation.get_config().get_letter_suffix_style() normalized = util.HouseNumber.normalize_letter_suffix( house_numbers, suffix, style) return [util.HouseNumber(normalized, normalized, comment)]
def test_happy(self) -> None: """Tests the happy path.""" house_numbers = [ util.HouseNumber("25", "25"), util.HouseNumber("27", "27-37"), util.HouseNumber("29", "27-37"), util.HouseNumber("31", "27-37"), util.HouseNumber("33", "27-37"), util.HouseNumber("35", "27-37"), util.HouseNumber("37", "27-37"), util.HouseNumber("31*", "31*"), ] ranges = util.get_housenumber_ranges(house_numbers) self.assertEqual(ranges, ["25", "27-37", "31*"])
def test_happy(self) -> None: """Tests the happy path.""" house_number = util.HouseNumber("1", "1-2") self.assertEqual(house_number.get_number(), "1") self.assertEqual(house_number.get_source(), "1-2") self.assertTrue(util.HouseNumber("1", "1-2") != util.HouseNumber("2", "1-2")) self.assertEqual(len(set([util.HouseNumber("1", "1-2"), util.HouseNumber("2", "1-2"), util.HouseNumber("2", "1-2")])), 2)
def normalize(relation: Relation, house_numbers: str, street_name: str, normalizers: Dict[str, ranges.Ranges]) -> List[util.HouseNumber]: """Strips down string input to bare minimum that can be interpreted as an actual number. Think about a/b, a-b, and so on.""" ret_numbers = [] # Same as ret_numbers, but if the range is 2-6 and we filter for 2-4, then 6 would be lost, so # in-range 4 would not be detected, so this one does not drop 6. ret_numbers_nofilter = [] if ';' in house_numbers: separator = ';' else: separator = '-' # Determine suffix which is not normalized away. suffix = "" if house_numbers.endswith("*"): suffix = house_numbers[-1] if street_name in normalizers.keys(): # Have a custom filter. normalizer = normalizers[street_name] else: # Default sanity checks. default = [ranges.Range(1, 999), ranges.Range(2, 998)] normalizer = ranges.Ranges(default) for house_number in house_numbers.split(separator): try: number = int(re.sub(r"([0-9]+).*", r"\1", house_number)) except ValueError: continue ret_numbers_nofilter.append(number) if number not in normalizer: continue ret_numbers.append(number) street_is_even_odd = relation.get_config().get_street_is_even_odd( street_name) if separator == "-" and util.should_expand_range(ret_numbers_nofilter, street_is_even_odd): start = ret_numbers_nofilter[0] stop = ret_numbers_nofilter[1] if stop == 0: ret_numbers = [ number for number in [start] if number in normalizer ] elif street_is_even_odd: # Assume that e.g. 2-6 actually means 2, 4 and 6, not only 2 and 4. # Closed interval, even only or odd only case. ret_numbers = [ number for number in range(start, stop + 2, 2) if number in normalizer ] else: # Closed interval, but mixed even and odd. ret_numbers = [ number for number in range(start, stop + 1, 1) if number in normalizer ] return [ util.HouseNumber(str(number) + suffix, house_numbers) for number in ret_numbers ]