From ca8ed5394c285390817caf811c29edcf5c30d7cc Mon Sep 17 00:00:00 2001 From: Marco Schmid Date: Tue, 21 Apr 2026 21:14:30 +0200 Subject: [PATCH] Task 7: adding unittests with pytest --- main.py | 27 ++++++++++++++++----------- utils.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 utils.py diff --git a/main.py b/main.py index a217973..a4a1441 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,6 @@ import logging -import json from pathlib import Path +from utils import store_to_disk from overpass import fetch_overpass from queries.bergbahn import BERGBAHN_QUERY from queries.restaurant import RESTAURANT_QUERY @@ -25,6 +25,8 @@ logger = logging.getLogger(__name__) # Konfiguration # --------------------------------------------------------------------------- +OUTPUT_DIR = Path("results") + BBOXEN = { "SW": (45.8, 5.9, 46.8, 8.2), "SO": (45.8, 8.2, 46.8, 10.5), @@ -85,8 +87,15 @@ def main() -> None: logger.info(f"Fehler in Fragmenten: {errors}") # Ergebnisse speichern - with Path("overpass_results.json ").open("w", encoding="utf -8") as file: - json.dump(overall, file, indent=2, ensure_ascii=False) + try: + saved_path = store_to_disk( + results=overall, + poi_type=query_name, + output_dir=OUTPUT_DIR, + ) + logger.info(f"Ergebnisse gespeichert: {saved_path}") + except OSError as e: + logger.error(f"Fehler beim Speichern: {e}") logger.info("Fertig.") @@ -96,14 +105,10 @@ if __name__ == "__main__": # Was ist passiert? - # * Wir haben die Resultate als .json auf unserer Festplatte gespeichert - # * Wir haben die Schweiz (bbox) verschiedener Grössen aufgesplittet + # * eigenes Modul 'utils' mit Funktion 'store_to_disk()', welche für die Speicherung der Daten zuständig ist. # TASK: - # * Die Speicherung der Ergebnisse liegt nun in unserer Hauptlogik -> wir lagern diese in ein neues Modul 'utils' - # als eigenständige Funktion 'store_to_disk()' aus. - # * Dokumentiert diese Funktion (docstrings) und fügt Typehints dazu. - # * Fangt in der Hauptfunktion einen OSError ab, wenn etwas beim Speichern nicht klappt - # * Optional könnt ihr der Funktion 'store_to_disk()' auch einen beliebigen Pfad mitgeben, wo das File gespeichert - # werden soll (Default wäre im aktuellen Verzeichnis) \ No newline at end of file + # * Bis jetzt haben wir nur Code geschrieben, aber keine Tests... Das holen wir jetzt nach! + # -> Überlegt: Was für Tests könnten geschrieben werden? Was macht Sinn? Schreibt 1-2 euerer Tests. Erstellt + # dazu wie gewöhnlich den Order tests und speichert darin eure Tests (mit pytest) \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..249316f --- /dev/null +++ b/utils.py @@ -0,0 +1,37 @@ +import json +from pathlib import Path + + +def store_to_disk( + results: list[dict], + poi_type: str = "overpass", + output_dir: Path = Path("."), +) -> Path: + """ + Speichert eine Liste von OSM-Elementen als JSON-Datei auf der Festplatte. + + Der Dateiname wird aus dem poi_type-Parameter abgeleitet: + z.B. poi_type="bergbahn" → "bergbahn_results.json" + + Args: + results (list[dict]): Liste von OSM-Elementen, wie sie die + Overpass API unter "elements" zurückgibt. + poi_type (str): Bezeichnung des POI-Typs. Bestimmt den + Dateinamen. Standard: "overpass" + output_dir (Path): Zielverzeichnis. Wird erstellt falls nicht + vorhanden. Standard: aktuelles Verzeichnis. + + Returns: + Path: Absoluter Pfad zur gespeicherten Datei. + + Raises: + OSError: Wenn das Verzeichnis nicht erstellt oder die Datei nicht + geschrieben werden kann (z.B. fehlende Schreibrechte). + """ + output_dir.mkdir(parents=True, exist_ok=True) + output_path = output_dir / f"{poi_type}_results.json" + + with output_path.open("w", encoding="utf-8") as f: + json.dump(results, f, indent=2, ensure_ascii=False) + + return output_path.resolve() \ No newline at end of file