Tests für Dateipruefer._ist_leer (None/Whitespace), Dateipruefer._handle_leere_eingabe (Priorität bei mehreren Flags), Datenschreiber._store_style_in_gpkg (nachgezogen aus #63, siehe #67) und Pruefmanager._handle_verfahrensgebiet_layer_existiert (entfernen/ersetzen) ergänzt. Linkpruefer._ist_url/_pruefe_url/_pruefe_dateipfad und Pruefmanager._handle_datei_existiert sind bereits über pruefe()/verarbeite() vollständig abgedeckt und bekommen den Vermerk "von Test abgesehen". Pruefmanager._ask_use_or_replace_pufferlayer ist toter Code (Bug #60) und bleibt bis zur Behebung unmarkiert getestet, nur vermerkt. sn_basis steht damit laut Prüfstand bei 0 ungeklärten Funktionen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
145 lines
4.4 KiB
Python
145 lines
4.4 KiB
Python
"""
|
||
sn_basis/modules/linkpruefer.py – Prüfung von URLs und lokalen Links.
|
||
Verwendet Wrapper und gibt pruef_ergebnis an den Pruefmanager zurück.
|
||
"""
|
||
|
||
from pathlib import Path
|
||
|
||
from sn_basis.functions import (
|
||
file_exists,
|
||
join_path,
|
||
network_head,
|
||
)
|
||
|
||
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis, PruefAktion
|
||
|
||
|
||
class Linkpruefer:
|
||
"""
|
||
Prüft URLs und lokale Pfade.
|
||
Die eigentliche Nutzerinteraktion übernimmt der Pruefmanager.
|
||
"""
|
||
|
||
def __init__(self, basis_pfad: str | None = None):
|
||
"""
|
||
basis_pfad: optionaler Basisordner für relative Pfade.
|
||
"""
|
||
self.basis = basis_pfad
|
||
|
||
# ---------------------------------------------------------
|
||
# Hilfsfunktionen
|
||
# ---------------------------------------------------------
|
||
|
||
def _pfad(self, relativer_pfad: str) -> Path:
|
||
"""
|
||
Erzeugt einen OS-unabhängigen Pfad relativ zum Basisverzeichnis.
|
||
"""
|
||
if not self.basis:
|
||
return Path(relativer_pfad)
|
||
return join_path(self.basis, relativer_pfad)
|
||
|
||
def _ist_url(self, text: str) -> bool:
|
||
"""
|
||
Einfache URL-Erkennung.
|
||
|
||
von Test abgesehen, weil bereits über pruefe() in test_linkpruefer.py indirekt
|
||
abgedeckt (http-URL vs. lokaler Pfad); HD 21.09.2026
|
||
"""
|
||
return text.startswith("http://") or text.startswith("https://")
|
||
|
||
# ---------------------------------------------------------
|
||
# Hauptfunktion
|
||
# ---------------------------------------------------------
|
||
|
||
def pruefe(self, eingabe: str) -> pruef_ergebnis:
|
||
"""
|
||
Prüft einen Link (URL oder lokalen Pfad).
|
||
Rückgabe: pruef_ergebnis
|
||
"""
|
||
|
||
if not eingabe:
|
||
return pruef_ergebnis(
|
||
ok=False,
|
||
meldung="Es wurde kein Link angegeben.",
|
||
aktion="leer",
|
||
kontext=None,
|
||
)
|
||
#evtl. Pfad-Objekte in string umwandeln
|
||
eingabe = str(eingabe)
|
||
# -----------------------------------------------------
|
||
# 1. Fall: URL
|
||
# -----------------------------------------------------
|
||
if self._ist_url(eingabe):
|
||
return self._pruefe_url(eingabe)
|
||
|
||
# -----------------------------------------------------
|
||
# 2. Fall: lokaler Pfad
|
||
# -----------------------------------------------------
|
||
return self._pruefe_dateipfad(eingabe)
|
||
|
||
# ---------------------------------------------------------
|
||
# URL‑Prüfung
|
||
# ---------------------------------------------------------
|
||
|
||
def _pruefe_url(self, url: str) -> pruef_ergebnis:
|
||
"""
|
||
Prüft eine URL über einen HEAD-Request.
|
||
|
||
von Test abgesehen, weil bereits über pruefe() in test_linkpruefer.py vollständig
|
||
abgedeckt (ok/Fehlerantwort/kein Netz); HD 21.09.2026
|
||
"""
|
||
|
||
reply = network_head(url)
|
||
|
||
if reply is None:
|
||
return pruef_ergebnis(
|
||
ok=False,
|
||
meldung=f"Die URL '{url}' konnte nicht geprüft werden.",
|
||
aktion="netzwerkfehler",
|
||
kontext=url,
|
||
)
|
||
|
||
if reply.error != 0:
|
||
return pruef_ergebnis(
|
||
ok=False,
|
||
meldung=f"Die URL '{url}' ist nicht erreichbar.",
|
||
aktion="url_nicht_erreichbar",
|
||
kontext=url,
|
||
)
|
||
|
||
return pruef_ergebnis(
|
||
ok=True,
|
||
meldung="URL ist erreichbar.",
|
||
aktion="ok",
|
||
kontext=url,
|
||
)
|
||
|
||
# ---------------------------------------------------------
|
||
# Lokale Datei‑/Pfadprüfung
|
||
# ---------------------------------------------------------
|
||
|
||
def _pruefe_dateipfad(self, eingabe: str) -> pruef_ergebnis:
|
||
"""
|
||
Prüft einen lokalen Pfad.
|
||
|
||
von Test abgesehen, weil bereits über pruefe() in test_linkpruefer.py vollständig
|
||
abgedeckt (gefunden/nicht gefunden); HD 21.09.2026
|
||
"""
|
||
|
||
pfad = self._pfad(eingabe)
|
||
|
||
if not file_exists(pfad):
|
||
return pruef_ergebnis(
|
||
ok=False,
|
||
meldung=f"Der Pfad '{eingabe}' wurde nicht gefunden.",
|
||
aktion="pfad_nicht_gefunden",
|
||
kontext=pfad,
|
||
)
|
||
|
||
return pruef_ergebnis(
|
||
ok=True,
|
||
meldung="Dateipfad ist gültig.",
|
||
aktion="ok",
|
||
kontext=pfad,
|
||
)
|