Ursache für "QML-Dateien greifen nicht" (Verfahrensgebiet #50): get_plugin_root() nutzte Path(__file__).resolve(), was Junctions zum echten Zielverzeichnis auflöst. link_qgis_profile.py verknüpft die Klone im QGIS-Profil per Junction unter ihrem Paketnamen (sn_verfahrensgebiet, sn_plan41, ...) - .resolve() sprang dabei zurück zum Workspace-Root, wo die Klone unter ihrem Repo-Namen (Plugin_SN_*) liegen. Alle Aufrufer von get_plugin_root() (Stilpruefer, ly_style_wrapper.apply_style, LayerLoader.apply_style, Datenschreiber, sn_plan41 vln_api_logic/tab_a_logic) suchten dadurch am falschen Ort. .absolute() statt .resolve(): __file__ liefert beim Import über die Junction bereits den korrekten, unaufgelösten Pfad - nichts, was aufgelöst werden müsste. Für echte ZIP-/Repository-Installationen (kein Symlink im Plugin- Ordner) ändert sich nichts, da dort nichts aufzulösen ist. Test test_get_plugin_root_folgt_keiner_verzeichnisverknuepfung legt eine echte Verzeichnisverknüpfung an (Symlink, unter Windows via Junction wie link_qgis_profile.py) und zeigt den Fehler vor dem Fix rot, danach grün. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
# sn_basis/test/test_sys_wrapper.py
|
|
"""sn_basis/tests/test_sys_wrapper.py
|
|
|
|
Unit-Tests für sn_basis.functions.sys_wrapper.get_plugin_root().
|
|
"""
|
|
|
|
import os
|
|
import unittest
|
|
from pathlib import Path
|
|
from tempfile import TemporaryDirectory
|
|
from unittest.mock import patch
|
|
|
|
from sn_basis.functions import sys_wrapper
|
|
|
|
|
|
def _verknuepfung_anlegen(ziel: Path, quelle: Path) -> None:
|
|
"""Legt eine Verzeichnisverknüpfung an (Symlink, unter Windows notfalls Junction).
|
|
|
|
Entspricht exakt der Logik in scripts/link_qgis_profile.py, mit der Klone
|
|
ins QGIS-Profil verknüpft werden (dort ohne Admin-Rechte per Junction).
|
|
"""
|
|
try:
|
|
os.symlink(quelle, ziel, target_is_directory=True)
|
|
except (OSError, NotImplementedError):
|
|
if os.name == "nt":
|
|
import _winapi
|
|
|
|
_winapi.CreateJunction(str(quelle), str(ziel))
|
|
else:
|
|
raise
|
|
|
|
|
|
class TestGetPluginRoot(unittest.TestCase):
|
|
|
|
def test_get_plugin_root_folgt_keiner_verzeichnisverknuepfung(self):
|
|
"""Prüft, dass get_plugin_root() bei einem über eine Verzeichnisverknüpfung (wie von link_qgis_profile.py angelegt) erreichten Modul den verlinkten Pfad liefert, statt zum echten Zielverzeichnis aufzulösen (Verfahrensgebiet #50)."""
|
|
with TemporaryDirectory() as tmp:
|
|
tmp_path = Path(tmp)
|
|
echtes_ziel = tmp_path / "echt" / "sn_basis" / "functions"
|
|
echtes_ziel.mkdir(parents=True)
|
|
|
|
verlinkter_ordner = tmp_path / "verlinkt"
|
|
verlinkter_ordner.mkdir()
|
|
verlinkte_sn_basis = verlinkter_ordner / "sn_basis"
|
|
_verknuepfung_anlegen(verlinkte_sn_basis, echtes_ziel.parent)
|
|
|
|
fake_file = verlinkte_sn_basis / "functions" / "sys_wrapper.py"
|
|
|
|
with patch.object(sys_wrapper, "__file__", str(fake_file)):
|
|
ergebnis = sys_wrapper.get_plugin_root()
|
|
|
|
self.assertEqual(ergebnis, verlinkter_ordner)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|