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")
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')
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')