diff --git a/DocuMentor.spec b/DocuMentor.spec index ae216c3..b05638b 100644 --- a/DocuMentor.spec +++ b/DocuMentor.spec @@ -4,7 +4,10 @@ PyInstaller Konfiguration für DocuMentor Erstellt eine eigenständige Windows-Executable ohne Python-Installation """ +import json import sys +from importlib.metadata import PackageNotFoundError +from importlib.metadata import version as pkg_version from pathlib import Path from PyInstaller.utils.hooks import collect_all @@ -14,6 +17,22 @@ block_cipher = None project_root = Path(SPECPATH) src_path = project_root / 'src' +# Versions-Snapshot erzeugen und ins Bundle einbetten +_packages_to_snapshot = [ + "PySide6", "pydantic", "pydantic-settings", "pydantic-yaml", + "polars", "connectorx", "pyarrow", "psutil", "lxml", + "ruff", "pyinstaller", "pillow", +] +_versions_snapshot: dict[str, str] = {} +for _pkg in _packages_to_snapshot: + try: + _versions_snapshot[_pkg.lower()] = pkg_version(_pkg) + except PackageNotFoundError: + _versions_snapshot[_pkg.lower()] = "" + +_versions_file = project_root / "versions.json" +_versions_file.write_text(json.dumps(_versions_snapshot), encoding="utf-8") + # connectorx komplett sammeln (Python-Code, native .pyd und Metadaten) # PyInstaller erkennt connectorx nicht automatisch, da es zur Laufzeit # von polars per importlib.import_module() geladen wird @@ -36,6 +55,7 @@ a = Analysis( datas=ui_files + res_files + cx_datas + [ (str(project_root / 'pyproject.toml'), '.'), (str(project_root / 'THIRD_PARTY_LICENSES.txt'), '.'), + (str(_versions_file), '.'), (str(project_root / 'resources' / 'icon.ico'), 'resources'), ], hiddenimports=[ diff --git a/DocuMentor.wxs b/DocuMentor.wxs index 7559b66..4533845 100644 --- a/DocuMentor.wxs +++ b/DocuMentor.wxs @@ -4,7 +4,7 @@ str: return display_name.lower().split("(")[0].strip() +_bundled_versions: dict[str, str] | None = None + + +def _load_bundled_versions() -> dict[str, str]: + """Lädt den Versions-Snapshot aus der mitgebündelten versions.json (nur im PyInstaller-Bundle).""" + global _bundled_versions + if _bundled_versions is None: + if hasattr(sys, "_MEIPASS"): + versions_file = Path(sys._MEIPASS) / "versions.json" # type: ignore[attr-defined] + if versions_file.exists(): + _bundled_versions = json.loads(versions_file.read_text(encoding="utf-8")) + else: + _bundled_versions = {} + else: + _bundled_versions = {} + return _bundled_versions + + def _get_installed_version(package_name: str) -> str: """Ermittelt die installierte Version eines Pakets.""" + bundled = _load_bundled_versions() + if bundled: + return bundled.get(package_name.lower(), "") try: return version(package_name) except PackageNotFoundError: diff --git a/uv.lock b/uv.lock index 39420d2..27ea208 100644 --- a/uv.lock +++ b/uv.lock @@ -39,7 +39,7 @@ wheels = [ [[package]] name = "documentor" -version = "1.6.5" +version = "1.6.6" source = { virtual = "." } dependencies = [ { name = "connectorx" },