overpass/TASK.md

2.4 KiB

Task 11 — Externe Konfiguration mit config.yaml

Rückblick Task 10: Queries auslagern

Ihr habt die Overpass-Queries in eigene .overpassql-Dateien verschoben und load_query() in fetcher.py eingeführt. Die wichtigsten Punkte:

  • Separation of Concerns: Die Query ist jetzt klar vom Python-Code getrennt. Jemand kann eine neue Query schreiben, ohne fetcher.py anzufassen — und umgekehrt kann fetcher.py verbessert werden, ohne die Queries zu kennen.
  • Path(__file__).parent / "queries" ist robuster als "queries/", weil er immer relativ zur Datei selbst aufgelöst wird — unabhängig davon, aus welchem Verzeichnis das Skript gestartet wird.
  • Fehlender Query-File: load_query() prüft explizit, ob die Datei existiert, und wirft eine sprechende OverpassApiError. Ohne diese Prüfung käme ein generischer FileNotFoundError — schwerer zu debuggen.
  • {timeout} und {maxsize} im Template: Statt Werte im Query-String hardzucoden, werden sie beim Laden eingefüllt. Das macht die Query flexibel und die Werte zentral steuerbar.

Aufgabe

In main.py stehen noch immer Konfigurationswerte direkt im Code:

BBOXEN = {
    "davos":   (46.72, 9.70, 46.92, 10.00),
    "schweiz": (45.8,  5.9,  47.8,  10.5),
}
TIMEOUT  = 25
MAXSIZE  = 5000000
poi_type = PoiType.BERGBAHN

Wer eine neue Bbox hinzufügen oder einen anderen POI-Typ abfragen will, muss Python-Code editieren. Das ist unpraktisch — und fehleranfällig.

Konkret:

  1. Lege eine config.yaml im Package-Ordner an mit folgender Struktur:
overpass:
  timeout: 25
  maxsize: 5000000

bboxen:
  davos:   [46.72, 9.70, 46.92, 10.00]
  schweiz: [45.8,  5.9,  47.8,  10.5]

active_queries:
  - bergbahn
  1. Installiere PyYAML falls noch nicht vorhanden (pip install pyyaml).
  2. Lese die Config in main.py mit yaml.safe_load() ein.
  3. Ersetze alle hardcodierten Konstanten durch die Werte aus der Config.
  4. Erzeuge poi_types als Liste von PoiType-Objekten aus active_queries und iteriere in main() darüber. Damit können wir nachher nicht nur z.B. Restaurants fetchen, sondern zusätzlich auch andere POI-Typen.

Fragen zum Nachdenken:

  • Welche Arten von Konfiguration gehören in eine YAML-Datei, welche eher in Umgebungsvariablen (.env)?
  • Was passiert, wenn jemand in active_queries einen ungültigen Wert einträgt (z.B. "gondelbahn"), der nicht im PoiType-Enum existiert?