diff --git a/TASK.md b/TASK.md index bad6156..4224880 100644 --- a/TASK.md +++ b/TASK.md @@ -1,5 +1,31 @@ -# TASK 4: +# TASK 5: -* Versucht mal bbox auf die ganze Schweiz (45.8, 5.9, 47.8, 10.5) zu setzen und die Funktion aufzurufen. Klappt das? -* Versucht ein Error-Management mit in die Funktion einzubauen. Benutzt dazu eine eigene `OverpassApiError`-Klasse. - -> Überlegt: Was könnte nicht klappen? Wo könnte es Fehler geben? \ No newline at end of file +Als Nächstes versuchen wir unsere `main.py` von Businesslogik zu befreien und verlagern diese in ein eigenes Modul. + +* verlagert dazu die Logik von 'fetch_bergbahnen' in ein eigenes Modul `overpass.py` aus. +* nennt die Funktion allgemeiner `fetch_overpass` (anstelle `fetch_bergbahnen`) -> somit würde es Sinn + machen, wenn wir den Query der Funktion als Argument mitgeben könnten (ist genereller). +* Erstellt in diesem `main.py` eine eigene 'main-Funktion', welche nur die Hauptlogik beinhalten und somit `fetch_overpass` + importiert und aufruft + +``` +overpass/ +├── src/ +│ └── overpass/ +│ ├── __init__.py +│ ├── main.py +│ ├── overpass.py +├── tests/ +│ └── test_...py +├── .env +├── .gitignore +├── requirements.txt +└── pyproject.toml +``` + +**Anmerkungen:** + +* `requirements.txt` ist nicht falsch, aber `pyproject.toml` ist seit PEP 517/518 der aktuelle + Standard — auch für einfache Projekte +* `.env` beinhaltet später unsere (geschützten) Environment-Variablen. Diese sollen aus sicherheitsgründen + NIE auf git gepushed werden und werden deshalb auch in `.gitignore` vermerkt. \ No newline at end of file diff --git a/main.py b/main.py index a56e495..433793c 100644 --- a/main.py +++ b/main.py @@ -16,6 +16,9 @@ BERGBAHN_QUERY = """ out center body; """ +class OverpassApiError(Exception): + pass + def fetch_bergbahnen(bbox: tuple) -> dict: """ @@ -58,13 +61,19 @@ def fetch_bergbahnen(bbox: tuple) -> dict: bbox_str = ",".join(map(str, bbox)) query = BERGBAHN_QUERY.format(bbox=bbox_str) - resp = requests.post( - OVERPASS_URL, - data={"data": query}, - timeout=5, - headers={"User-Agent": "CDS Exercise"}, - ) - return resp.json() + try: + response = requests.post( + OVERPASS_URL, + data={"data": query}, + timeout=5, + headers={"User-Agent": "CDS Exercise"}, + ) + response.raise_for_status() # prüft den HTTP-Statuscode der Antwort und wirft eine Exception, wenn es ein Fehler war (requests.HTTPError) + except requests.Timeout as exc: + raise OverpassApiError("Overpass-API Timeout") from exc + except requests.RequestException as exc: + raise OverpassApiError("Overpass-API Request fehlgeschlagen") from exc + return response.json() if __name__ == "__main__":