def test_constructor():
    a = Address('street', '3')
    assert a.street == 'street'
    assert a.housenumber == Housenumber('3')

    housenumber = Housenumber('42')
    a = Address('street', housenumber)
    assert a.street == 'street'
    assert a.housenumber == housenumber
 def __init__(self, street: str, housenumber):
     """
     :param street: street name of the address
     :param housenumber: housenumber of the address, if a string is here, it will be parsed into a Housenumber
     """
     assert isinstance(street, str)
     self.street = street
     if isinstance(housenumber, Housenumber):
         self.housenumber = housenumber
     else:
         self.housenumber = Housenumber(housenumber)
    def expand(input_string: str) -> List[Housenumber]:
        normalized = input_string.replace(' ', '').lower()
        m: re.Match = housenumber_range_regexp.match(normalized)
        if not m:
            return []

        first_number = int(
            m.group(1))  # must be an integer, as the regexp matches
        second_number = int(
            m.group(2))  # must be an integer, as the regexp matches
        if first_number % 2 != second_number % 2:
            raise InvalidHousenumber(
                input_string,
                'In housenumber range, one number odd, the other even')

        if first_number > second_number:
            raise InvalidHousenumber(
                input_string,
                'In housenumber range, first number larger than second number')

        result = [
            Housenumber(str(n))
            for n in range(first_number, second_number + 2, 2)
        ]
        return result
class Address:
    """
    An address, i.e. what this tool is all about.
    Two addresses are equals iff the street and the housenumber are equal.
    """
    street: str
    housenumber: Housenumber

    def __init__(self, street: str, housenumber):
        """
        :param street: street name of the address
        :param housenumber: housenumber of the address, if a string is here, it will be parsed into a Housenumber
        """
        assert isinstance(street, str)
        self.street = street
        if isinstance(housenumber, Housenumber):
            self.housenumber = housenumber
        else:
            self.housenumber = Housenumber(housenumber)

    def __key(self):
        return self.street, self.housenumber.equality_key()

    def __hash__(self):
        return hash(self.__key())

    def __eq__(self, other):
        """Two addresses are equals iff the street and the housenumber are equal."""
        if isinstance(other, Address):
            return self.__key() == other.__key()
        return NotImplemented

    def __str__(self):
        return f'{self.street} {self.housenumber}'
def test_equality_key():
    assert Housenumber('1').equality_key() == '1'
    assert Housenumber('2/13').equality_key() == '2/13'
    assert Housenumber('50/3a').equality_key() == '50/3a'
    assert Housenumber('3 a').equality_key() == '3a'
    assert Housenumber('3A').equality_key() == '3a'
    assert Housenumber('3A') == Housenumber('3 a')
    def get_addresses(row) -> list:
        street = row.get('addr:street')
        if not isinstance(street, str):
            street = row.get('addr:place', "")
        housenumber_string = str(row['addr:housenumber'])
        try:
            housenumber = Housenumber(housenumber_string)
            return [Address(street, housenumber)]

        except InvalidHousenumber as i:
            housenumbers = HousenumberRangeExpander.expand(housenumber_string)
            if len(housenumbers) == 0:
                raise i
            return [Address(street, h) for h in housenumbers]
def test_invalid():
    with pytest.raises(InvalidHousenumber):
        Housenumber("")
    with pytest.raises(InvalidHousenumber):
        Housenumber("0")
    with pytest.raises(InvalidHousenumber):
        Housenumber("-1")
    with pytest.raises(InvalidHousenumber):
        Housenumber("42/0")
    with pytest.raises(InvalidHousenumber):
        Housenumber("13abc")
    with pytest.raises(InvalidHousenumber):
        Housenumber("1/2/3")
    with pytest.raises(InvalidHousenumber):
        Housenumber("3a5")
Example #8
0
def test_expand():
    assert HousenumberRangeExpander.expand('26-28') == [
        Housenumber('26'), Housenumber('28')
    ]
    assert HousenumberRangeExpander.expand('3-5') == [
        Housenumber('3'), Housenumber('5')
    ]
    assert HousenumberRangeExpander.expand('98- 102') == [
        Housenumber('98'),
        Housenumber('100'),
        Housenumber('102')
    ]
    assert HousenumberRangeExpander.expand('3a-5b') == []
    assert HousenumberRangeExpander.expand('123') == []
    assert HousenumberRangeExpander.expand('') == []
    with pytest.raises(InvalidHousenumber):
        HousenumberRangeExpander.expand('5-3')
    with pytest.raises(InvalidHousenumber):
        HousenumberRangeExpander.expand('3-6')
def test_str():
    assert str(Housenumber('1')) == '1'
    assert str(Housenumber('2/13')) == '2/13'
    assert str(Housenumber('3 a')) == '3a'
    assert str(Housenumber('3A')) == '3a'
    assert str(Housenumber('50/3c')) == '50/3c'
def test_sort_key():
    assert Housenumber('1').sort_key() == (1, 0, '')
    assert Housenumber('2/13').sort_key() == (2, 13, '')
    assert Housenumber('50/3a').sort_key() == (50, 3, 'a')
    assert Housenumber('3 a').sort_key() == (3, 0, 'a')
    assert Housenumber('3A').sort_key() == (3, 0, 'a')
def test_eq():
    assert Address('street', '3') != Housenumber('42')
Example #12
0
def test_eq():
    assert OsmPrimitive('node', 3) == OsmPrimitive('node', 3)
    assert OsmPrimitive('node', 3) != OsmPrimitive('way', 3)
    assert OsmPrimitive('node', 3) != OsmPrimitive('node', 4)
    assert OsmPrimitive('node', 3) != Housenumber('42')