diff --git a/INSTALL.md b/INSTALL.md index 7fe8071..fabe6e5 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -114,7 +114,7 @@ source ~/.bashrc ```bat py -3 -m venv .venv --upgrade-deps -.\.venv\Scripts\python.exe -m pip install -q pdfplumber icalendar pypdf2 pytz +.\.venv\Scripts\python.exe -m pip install -q pdfplumber icalendar pypdf2 pytz packaging .\.venv\Scripts\pythonw.exe gui.py ``` diff --git a/README.md b/README.md index af64e1e..b917025 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Die erforderlichen Dependencies sind bereits installiert. Falls Sie das Projekt ```bash python3 -m venv .venv source .venv/bin/activate -pip install pdfplumber icalendar pypdf2 pytz +pip install pdfplumber icalendar pypdf2 pytz packaging ``` ## Verwendung @@ -243,7 +243,7 @@ ICS-Import/ ### Technische Spezifikationen -- **Abhängigkeiten**: pdfplumber, icalendar, pytz, pypdf2 +- **Abhängigkeiten**: pdfplumber, icalendar, pytz, pypdf2, packaging - **Optional für GUI**: tkinter (Python-Standard), tkinterdnd2 (Drag & Drop) - **Python-Version**: 3.6+ - **Format**: iCalendar 2.0 (RFC 5545) diff --git a/ZUSAMMENFASSUNG.md b/ZUSAMMENFASSUNG.md index b764c3e..c0897b4 100644 --- a/ZUSAMMENFASSUNG.md +++ b/ZUSAMMENFASSUNG.md @@ -98,7 +98,7 @@ Doppelklick auf start.cmd ## 🔧 Technische Details - **Sprache:** Python 3.6+ -- **Abhängigkeiten:** pdfplumber, icalendar, pytz, pypdf2 +- **Abhängigkeiten:** pdfplumber, icalendar, pytz, pypdf2, packaging - **Format:** iCalendar 2.0 (RFC 5545) - **Umgebung:** Python virtual environment (.venv) @@ -108,6 +108,7 @@ pdfplumber==0.10.0+ - PDF-Datenextraktion icalendar==5.0.0+ - ICS-Datei-Erstellung pytz - Zeitzonenverwaltung pypdf2 - PDF-Parsing +packaging - Versionsvergleich ``` --- diff --git a/start.cmd b/start.cmd index 8a89e5a..2e5e572 100644 --- a/start.cmd +++ b/start.cmd @@ -10,7 +10,7 @@ REM Überprüfe, ob venv existiert if not exist ".venv" ( echo Python-Umgebung wird eingerichtet... python3 -m venv .venv - call .venv\Scripts\pip.exe install -q pdfplumber icalendar pypdf2 pytz + call .venv\Scripts\pip.exe install -q pdfplumber icalendar pypdf2 pytz packaging ) REM Starte das Menü diff --git a/start.sh b/start.sh index 7018844..d16e7dd 100755 --- a/start.sh +++ b/start.sh @@ -36,7 +36,7 @@ if ! $PYTHON_VENV -c "import pdfplumber" 2>/dev/null; then echo "📚 Installiere Abhängigkeiten..." # Nutze python -m pip statt pip direkt - if $PYTHON_VENV -m pip install -q pdfplumber icalendar pypdf2 pytz 2>/dev/null; then + if $PYTHON_VENV -m pip install -q pdfplumber icalendar pypdf2 pytz packaging 2>/dev/null; then echo "✓ Abhängigkeiten installiert" else echo "❌ Installation fehlgeschlagen" @@ -46,7 +46,7 @@ if ! $PYTHON_VENV -c "import pdfplumber" 2>/dev/null; then echo "❌ venv konnte nicht neu erstellt werden" exit 1 } - $PYTHON_VENV -m pip install -q pdfplumber icalendar pypdf2 pytz || { + $PYTHON_VENV -m pip install -q pdfplumber icalendar pypdf2 pytz packaging || { echo "❌ Abhängigkeiten konnten nicht installiert werden" exit 1 } diff --git a/start_gui.cmd b/start_gui.cmd index fb89220..45f8f39 100644 --- a/start_gui.cmd +++ b/start_gui.cmd @@ -19,7 +19,7 @@ REM Überprüfe, ob Abhängigkeiten installiert sind .venv\Scripts\python.exe -c "import pdfplumber" 2>nul if errorlevel 1 ( echo 📚 Installiere Abhängigkeiten... - call .venv\Scripts\python.exe -m pip install -q pdfplumber icalendar pypdf2 pytz + call .venv\Scripts\python.exe -m pip install -q pdfplumber icalendar pypdf2 pytz packaging echo ✓ Abhängigkeiten installiert ) diff --git a/start_gui.sh b/start_gui.sh index 3757096..5183e15 100755 --- a/start_gui.sh +++ b/start_gui.sh @@ -35,7 +35,7 @@ PYTHON_VENV=".venv/bin/python" if ! $PYTHON_VENV -c "import pdfplumber" 2>/dev/null; then echo "📚 Installiere Abhängigkeiten..." - if $PYTHON_VENV -m pip install -q pdfplumber icalendar pypdf2 pytz 2>/dev/null; then + if $PYTHON_VENV -m pip install -q pdfplumber icalendar pypdf2 pytz packaging 2>/dev/null; then echo "✓ Abhängigkeiten installiert" else echo "❌ Installation fehlgeschlagen" @@ -45,7 +45,7 @@ if ! $PYTHON_VENV -c "import pdfplumber" 2>/dev/null; then echo "❌ venv konnte nicht neu erstellt werden" exit 1 } - $PYTHON_VENV -m pip install -q pdfplumber icalendar pypdf2 pytz || { + $PYTHON_VENV -m pip install -q pdfplumber icalendar pypdf2 pytz packaging || { echo "❌ Abhängigkeiten konnten nicht installiert werden" exit 1 } diff --git a/update_checker.py b/update_checker.py index df4f468..6719cad 100644 --- a/update_checker.py +++ b/update_checker.py @@ -7,7 +7,11 @@ Prüft auf Updates über Gitea API import urllib.request import json from pathlib import Path -from packaging import version as pkg_version + +try: + from packaging import version as pkg_version +except Exception: # pragma: no cover - packaging may be missing in user envs + pkg_version = None # Gitea-Konfiguration GITEA_URL = "https://git.file-archive.de" @@ -81,14 +85,53 @@ def check_for_updates(): try: # Vergleiche Versionen - if pkg_version.parse(latest) > pkg_version.parse(current): - return True, latest, url + if pkg_version is not None: + if pkg_version.parse(latest) > pkg_version.parse(current): + return True, latest, url + else: + if _simple_version_compare(latest, current) > 0: + return True, latest, url except Exception as e: print(f"Warnung: Versionenvergleich fehlgeschlagen: {e}") return False, None, None +def _simple_version_compare(left, right): + """ + Fallback-Versionsvergleich ohne externe Abhaengigkeiten. + Gibt 1 zurueck wenn left > right, -1 wenn left < right, sonst 0. + """ + def to_parts(value): + parts = [] + for item in value.replace("v", "").split("."): + try: + parts.append(int(item)) + except ValueError: + parts.append(item) + return parts + + left_parts = to_parts(left) + right_parts = to_parts(right) + max_len = max(len(left_parts), len(right_parts)) + + for i in range(max_len): + l_val = left_parts[i] if i < len(left_parts) else 0 + r_val = right_parts[i] if i < len(right_parts) else 0 + if l_val == r_val: + continue + try: + return 1 if l_val > r_val else -1 + except TypeError: + l_str = str(l_val) + r_str = str(r_val) + if l_str == r_str: + continue + return 1 if l_str > r_str else -1 + + return 0 + + if __name__ == "__main__": # Test current = get_current_version()