overpass/TASK.md

2.2 KiB

Task 14 — pipeline.py: fetch_and_store()

Rückblick Task 13: Storage-Factory

Ihr habt eine Factory-Funktion build_storage() eingeführt. Die wichtigsten Punkte:

  • Factory-Pattern: build_storage() zentralisiert die Entscheidung, welches Backend instanziiert wird. main.py muss weder JsonStorage noch PostgresStorage kennen — es übergibt nur die Config und bekommt ein fertiges Storage-Objekt zurück.
  • match-Statement: Klarer und erweiterbarer als eine if/elif-Kette, besonders wenn neue Storage-Typen dazukommen. Der case _-Zweig fängt ungültige Werte ab.
  • StorageType-Enum: Verhindert Magic Strings in der Factory — ein ungültiger type-Wert in der Config wirft sofort einen ValueError.
  • **params: Die Parameter aus der Config werden direkt als Keyword-Argumente an den Konstruktor übergeben. Das macht build_storage() generisch — sie muss nicht wissen, welche Parameter JsonStorage oder PostgresStorage konkret erwarten.
  • root-Parameter: Die Pfadauflösung bleibt in main.py verankert — storage.py weiss nichts von der Projektstruktur, was die Wiederverwendbarkeit erhöht.

Aufgabe

In main.py ist die Fetch-Schleife über Bboxen direkt in main() eingebettet. Das hat einen Nachteil: Die Logik ist schwer isoliert testbar, und main() wird mit jedem Feature länger und unübersichtlicher.

Ziel ist es, die gesamte Fetch-und-Store-Logik für einen POI-Typ in eine eigene Funktion auszulagern.

Konkret:

  1. Lege eine neue Datei pipeline.py an.
  2. Schreibe darin eine Funktion fetch_and_store() mit folgender Signatur:
   def fetch_and_store(
       poi_type: PoiType,
       bboxen:   dict,
       timeout:  int,
       maxsize:  int,
       storage:  Storage,
   ) -> None:

Sie soll die bisherige Schleife aus main.py übernehmen: über alle Bboxen iterieren, POIs fetchen, sammeln und am Ende speichern. 3. Vereinfache main() so, dass sie nur noch Config liest, Storage baut und fetch_and_store() pro POI-Typ aufruft.

Fragen zum Nachdenken:

  • Welche konkreten Vorteile hat eine schlanke main()-Funktion?
  • Warum bekommt fetch_and_store() ein fertiges Storage-Objekt übergeben — statt es selbst zu instanziieren?