Beispiel #1
0
 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'])
Beispiel #2
0
 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'])
Beispiel #3
0
 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'])
Beispiel #4
0
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
    ]
Beispiel #5
0
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)]
Beispiel #6
0
 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*"])
Beispiel #7
0
 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)
Beispiel #8
0
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
    ]