Application du stash@{0} resté en WIP depuis le 27/04 :
"On main: wip-gui-profils-masque-manuel-build-windows-2026-04-27"
## Apport
- Pseudonymisation_Gui_V5.py (+1208 lignes) : profils, panneau paramètres
avancés, éditeur de masques intégré, gestion whitelist/blacklist
- launcher.py (+315) : splash natif PyInstaller, single-instance,
téléchargement modèles
- anonymisation_onefile.spec : config PyInstaller mise à jour
- pdf_mask_designer.py (+114) : éditeur de masques amélioré
- config_defaults.py (+23) : constantes nouvelles
- tests/unit/test_config_externalization.py (+12) : tests config
- .gitignore (+5)
## Pourquoi
La version courante de la GUI sur la branche feature manquait :
- L'éditeur de masques
- Les profils
- Le panneau paramètres avancés
- Le splash natif au démarrage
Aucun conflit avec mes 10 commits Q-1 (pas de chevauchement de fichiers).
## Validation
75 passed, 10 xfailed sur pytest tests/unit/.
## Note
Le stash reste disponible dans `git stash list` jusqu'à drop explicite.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
129 lines
2.7 KiB
Python
129 lines
2.7 KiB
Python
import os
|
|
from pathlib import Path
|
|
|
|
|
|
block_cipher = None
|
|
|
|
project_dir = Path(globals().get("SPECPATH", os.getcwd())).resolve()
|
|
|
|
|
|
def _data_entry(relative_path: str, target_dir: str | None = None):
|
|
src = project_dir / relative_path
|
|
if not src.exists():
|
|
return None
|
|
return (str(src), target_dir or relative_path)
|
|
|
|
|
|
datas = []
|
|
for relative_path, target_dir in [
|
|
("config", "config"),
|
|
("data/bdpm", "data/bdpm"),
|
|
("data/finess", "data/finess"),
|
|
("data/insee", "data/insee"),
|
|
("models/camembert-bio-deid/onnx", "models/camembert-bio-deid/onnx"),
|
|
("detectors", "detectors"),
|
|
("scripts", "scripts"),
|
|
("assets", "assets"),
|
|
]:
|
|
entry = _data_entry(relative_path, target_dir)
|
|
if entry is not None:
|
|
datas.append(entry)
|
|
|
|
# Fichiers directs sous data/ requis par le core.
|
|
for relative_path in [
|
|
"data/stopwords_manuels.txt",
|
|
"data/villes_blacklist.txt",
|
|
"data/dpi_labels_blacklist.txt",
|
|
"data/companion_blacklist.txt",
|
|
]:
|
|
entry = _data_entry(relative_path, "data")
|
|
if entry is not None:
|
|
datas.append(entry)
|
|
|
|
|
|
hiddenimports = [
|
|
"Pseudonymisation_Gui_V5",
|
|
"anonymizer_core_refactored_onnx",
|
|
"admin_rules",
|
|
"config_defaults",
|
|
"profile_defaults",
|
|
"gui_batch_paths",
|
|
"manual_masking",
|
|
"pdf_mask_designer",
|
|
"format_converter",
|
|
"ner_manager_onnx",
|
|
"camembert_ner_manager",
|
|
"eds_pseudo_manager",
|
|
"gliner_manager",
|
|
"vlm_manager",
|
|
"build_info",
|
|
"doctr",
|
|
"doctr.io",
|
|
"doctr.models",
|
|
"doctr.models.detection",
|
|
"doctr.models.recognition",
|
|
"cv2",
|
|
"torchvision",
|
|
"edsnlp",
|
|
"edsnlp.pipes",
|
|
"edsnlp.pipes.ner",
|
|
"edsnlp.pipes.ner.pseudo",
|
|
"spacy",
|
|
"spacy.lang.fr",
|
|
"gliner",
|
|
"onnxruntime",
|
|
"transformers",
|
|
"tokenizers",
|
|
"torch",
|
|
"pdfplumber",
|
|
"fitz",
|
|
"PIL",
|
|
"yaml",
|
|
"loguru",
|
|
"regex",
|
|
"optimum",
|
|
"optimum.onnxruntime",
|
|
"optimum.pipelines",
|
|
"optimum.modeling_base",
|
|
"optimum.exporters.onnx",
|
|
]
|
|
|
|
|
|
a = Analysis(
|
|
[str(project_dir / "launcher.py")],
|
|
pathex=[str(project_dir)],
|
|
datas=datas,
|
|
hiddenimports=hiddenimports,
|
|
cipher=block_cipher,
|
|
noarchive=False,
|
|
)
|
|
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
|
|
|
splash = Splash(
|
|
str(project_dir / "assets" / "splash.png"),
|
|
binaries=a.binaries,
|
|
datas=a.datas,
|
|
text_pos=(60, 195),
|
|
text_size=10,
|
|
text_color="white",
|
|
minify_script=True,
|
|
always_on_top=False,
|
|
)
|
|
|
|
exe = EXE(
|
|
pyz,
|
|
a.scripts,
|
|
splash,
|
|
splash.binaries,
|
|
a.binaries,
|
|
a.zipfiles,
|
|
a.datas,
|
|
[],
|
|
name="Anonymisation",
|
|
debug=False,
|
|
strip=False,
|
|
upx=False,
|
|
console=False,
|
|
icon=str(project_dir / "assets" / "icons" / "app.ico"),
|
|
)
|