feat(gui): add GUI V6 G1 foundation (license client/store, shell, About tab)
Socle de la refonte GUI V6 (couche présentation uniquement, aucune logique de détection) : - license_store: stockage licence hors dépôt (%LOCALAPPDATA%/Aivanov | XDG), read/write atomique/delete, ne journalise aucun token - license_client: LicenseStatus + activate/check/local_status, session HTTP injectable, serveur indisponible géré sans crash, aucune clé privée - theme: 4 thèmes + couleurs de statut licence - app + tab_about: shell customtkinter minimal (header, bandeau licence, 3 onglets), onglet À propos étoffé - Pseudonymisation_Gui_V6.py: point d'entrée + --self-test (exit 0 sans fenêtre) - requirements.txt: customtkinter==5.2.2 Tests: 20 nouveaux (store sur vrais fichiers, client sur session injectée). Suite tests/unit: 167 passed, 0 régression. V5/moteur/managers/specs intacts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
45
Pseudonymisation_Gui_V6.py
Normal file
45
Pseudonymisation_Gui_V6.py
Normal file
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Point d'entrée de la GUI V6 de Pseudonymisation.
|
||||
|
||||
Usage :
|
||||
python Pseudonymisation_Gui_V6.py # lance la fenêtre
|
||||
python Pseudonymisation_Gui_V6.py --self-test # importe l'app, sort 0, sans fenêtre
|
||||
|
||||
Le mode ``--self-test`` vérifie que tout le socle GUI V6 s'importe correctement
|
||||
(utile en CI / build sans display). Il n'ouvre aucune fenêtre.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
def _self_test() -> int:
|
||||
"""Importe les modules du socle GUI V6 sans créer de fenêtre."""
|
||||
from gui_v6 import app, license_client, license_store, theme # noqa: F401
|
||||
from gui_v6.tabs import tab_about # noqa: F401
|
||||
|
||||
# Sanity check des contrats publics du socle.
|
||||
assert hasattr(app, "AnonymisationApp")
|
||||
assert hasattr(license_client, "LicenseClient")
|
||||
assert hasattr(license_client, "LicenseStatus")
|
||||
assert hasattr(license_store, "LicenseStore")
|
||||
assert hasattr(tab_about, "AboutTab")
|
||||
print("GUI V6 self-test OK")
|
||||
return 0
|
||||
|
||||
|
||||
def main(argv=None) -> int:
|
||||
argv = list(sys.argv[1:] if argv is None else argv)
|
||||
if "--self-test" in argv:
|
||||
return _self_test()
|
||||
|
||||
from gui_v6.app import AnonymisationApp
|
||||
|
||||
application = AnonymisationApp()
|
||||
application.mainloop()
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user