Skip to content

Commit eb9911d

Browse files
committed
Cloture le plan qualite et verrouille les derniers flux critiques
Uniformise les journaux du flux d'installation des outils en introduisant des préfixes de stage stables pour distinguer explicitement la phase système de la phase Python. Les messages du préflight moteur utilisent désormais des marqueurs cohérents de type [tools:system] et le flux venv/system Python applique un préfixe [tools:python], ce qui facilite la lecture des logs, le diagnostic et la validation par smoke checks. Ajoute une couverture de test dédiée pour le comportement Linux en mode Python système afin de vérifier l'activation effective de --break-system-packages et sa non-utilisation hors du périmètre attendu. Ces tests verrouillent le contrat de compatibilité demandé pour les installations pip sur Linux lorsque l'application s'appuie sur le Python système. Renforce l'isolation des tests du dependency analyzer en nettoyant les stubs injectés dans sys.modules et en réinitialisant l'état partagé entre les cas de test. Cela évite la pollution inter-tests et stabilise les scénarios heuristiques qui dépendent d'un environnement d'import propre. Ajoute la politique de quality freeze et documente explicitement le statut des bugs bloquants validés par la checklist de smoke release. Le plan qualité est désormais cadré par une règle de gel des flux critiques et par un état documentaire clair indiquant qu'aucun bug bloquant connu ne reste ouvert après validation par les smoke checks. Met à jour la documentation utilisateur et mainteneur pour refléter cette finalisation, y compris la note sur les onglets monolithiques dans la documentation engine, la référence à la quality freeze policy dans le README, l'enrichissement de la checklist de release et la fermeture complète de TODO.md avec toutes les phases et tout le backlog désormais marqués comme clôturés.
1 parent b83d984 commit eb9911d

9 files changed

Lines changed: 275 additions & 59 deletions

File tree

Core/Venv_Manager/Manager.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,9 @@ def _pip_break_system_args(self) -> list[str]:
481481
return ["--break-system-packages"]
482482
return []
483483

484+
def _tools_stage_prefix(self) -> str:
485+
return "[tools:python] "
486+
484487
def has_tool_binary(self, venv_root: str, tool: str) -> bool:
485488
"""Non-blocking heuristic check: detect console script/binary inside the venv.
486489
This avoids spawning subprocesses and keeps UI fully responsive.
@@ -571,7 +574,9 @@ def ensure_tools_installed(self, venv_root: str, tools: list[str]) -> None:
571574
self.venv_check_progress.show()
572575
self._check_next_venv_pkg()
573576
except Exception as e:
574-
self._safe_log(f"❌ Erreur ensure_tools_installed: {e}")
577+
self._safe_log(
578+
f"❌ {self._tools_stage_prefix()}Erreur ensure_tools_installed: {e}"
579+
)
575580

576581
def ensure_tools_installed_system(self, tools: list[str]) -> None:
577582
"""Asynchronously check/install tools in system Python using pip."""
@@ -591,7 +596,9 @@ def ensure_tools_installed_system(self, tools: list[str]) -> None:
591596
self.venv_check_progress.show()
592597
self._check_next_venv_pkg()
593598
except Exception as e:
594-
self._safe_log(f"❌ Erreur ensure_tools_installed_system: {e}")
599+
self._safe_log(
600+
f"❌ {self._tools_stage_prefix()}Erreur ensure_tools_installed_system: {e}"
601+
)
595602

596603
# ---------- Utility ----------
597604
def _safe_decode(self, data: bytes, error_handling: str = "replace") -> str:
@@ -1381,9 +1388,13 @@ def _on_venv_pkg_checked(self, process, code, status, pkg):
13811388
return
13821389
if code == 0:
13831390
if self._venv_check_use_python:
1384-
self._safe_log(f"✅ {pkg} déjà installé (Python système).")
1391+
self._safe_log(
1392+
f"✅ {self._tools_stage_prefix()}{pkg} déjà installé (Python système)."
1393+
)
13851394
else:
1386-
self._safe_log(f"✅ {pkg} déjà installé dans le venv.")
1395+
self._safe_log(
1396+
f"✅ {self._tools_stage_prefix()}{pkg} déjà installé dans le venv."
1397+
)
13871398
self._venv_check_index += 1
13881399
try:
13891400
next_label = (
@@ -1399,7 +1410,9 @@ def _on_venv_pkg_checked(self, process, code, status, pkg):
13991410
pass
14001411
self._check_next_venv_pkg()
14011412
else:
1402-
self._safe_log(f"📦 Installation automatique de {pkg}...")
1413+
self._safe_log(
1414+
f"📦 {self._tools_stage_prefix()}Installation automatique de {pkg}..."
1415+
)
14031416
try:
14041417
self.venv_check_progress.set_message(f"Installation de {pkg}...")
14051418
self.venv_check_progress.progress.setRange(0, 0)

EngineLoader/base.py

Lines changed: 78 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,9 @@ def log_i18n_level(gui, level: str, fr: str, en: str) -> None:
5757
pass
5858

5959

60-
def _log_tools(gui, level: str, stage: str, fr: str, en: str) -> None:
61-
"""Standardized tools-install log line with stage prefix."""
62-
log_i18n_level(
63-
gui,
64-
level,
65-
f"[tools:{stage}] {fr}",
66-
f"[tools:{stage}] {en}",
67-
)
60+
def _tools_stage_message(stage: str, fr: str, en: str) -> tuple[str, str]:
61+
prefix = f"[tools:{stage}] "
62+
return prefix + fr, prefix + en
6863

6964

7065
class CompilerEngine:
@@ -205,9 +200,11 @@ def ensure_tools_installed(self, gui) -> bool:
205200
_log_tools(
206201
gui,
207202
"info",
208-
"system",
209-
f"Installation des outils système manquants: {missing_system}",
210-
f"Installing missing system tools: {missing_system}",
203+
*_tools_stage_message(
204+
"system",
205+
f"Installation des outils système manquants: {missing_system}",
206+
f"Installing missing system tools: {missing_system}",
207+
),
211208
)
212209

213210
# Detect platform and use appropriate installation method
@@ -225,35 +222,43 @@ def ensure_tools_installed(self, gui) -> bool:
225222
_log_tools(
226223
gui,
227224
"success",
228-
"system",
229-
f"Outils système installés avec succès: {missing_system}",
230-
f"System tools installed successfully: {missing_system}",
225+
*_tools_stage_message(
226+
"system",
227+
f"Outils système installés avec succès: {missing_system}",
228+
f"System tools installed successfully: {missing_system}",
229+
),
231230
)
232231
else:
233232
_log_tools(
234233
gui,
235234
"error",
236-
"system",
237-
f"Échec installation outils système: {missing_system} (code: {process.exitCode()})",
238-
f"System tools installation failed: {missing_system} (code: {process.exitCode()})",
235+
*_tools_stage_message(
236+
"system",
237+
f"Échec installation outils système: {missing_system} (code: {process.exitCode()})",
238+
f"System tools installation failed: {missing_system} (code: {process.exitCode()})",
239+
),
239240
)
240241
system_install_ok = False
241242
else:
242243
_log_tools(
243244
gui,
244245
"warning",
245-
"system",
246-
"Timeout lors de l'installation des outils système",
247-
"Timeout during system tools installation",
246+
*_tools_stage_message(
247+
"system",
248+
"Timeout lors de l'installation des outils système",
249+
"Timeout during system tools installation",
250+
),
248251
)
249252
system_install_ok = False
250253
else:
251254
_log_tools(
252255
gui,
253256
"error",
254-
"system",
255-
"Impossible de démarrer l'installation des outils système",
256-
"Unable to start system tools installation",
257+
*_tools_stage_message(
258+
"system",
259+
"Impossible de démarrer l'installation des outils système",
260+
"Unable to start system tools installation",
261+
),
257262
)
258263
system_install_ok = False
259264

@@ -292,35 +297,43 @@ def ensure_tools_installed(self, gui) -> bool:
292297
_log_tools(
293298
gui,
294299
"success",
295-
"system",
296-
f"Outils Windows installés: {missing_system}",
297-
f"Windows tools installed: {missing_system}",
300+
*_tools_stage_message(
301+
"system",
302+
f"Outils Windows installés: {missing_system}",
303+
f"Windows tools installed: {missing_system}",
304+
),
298305
)
299306
else:
300307
_log_tools(
301308
gui,
302309
"error",
303-
"system",
304-
f"Échec installation Windows: {missing_system}",
305-
f"Windows installation failed: {missing_system}",
310+
*_tools_stage_message(
311+
"system",
312+
f"Échec installation Windows: {missing_system}",
313+
f"Windows installation failed: {missing_system}",
314+
),
306315
)
307316
system_install_ok = False
308317
else:
309318
_log_tools(
310319
gui,
311320
"warning",
312-
"system",
313-
"Timeout lors de l'installation Windows",
314-
"Timeout during Windows installation",
321+
*_tools_stage_message(
322+
"system",
323+
"Timeout lors de l'installation Windows",
324+
"Timeout during Windows installation",
325+
),
315326
)
316327
system_install_ok = False
317328
else:
318329
_log_tools(
319330
gui,
320331
"warning",
321-
"system",
322-
"winget non disponible, installation manuelle requise",
323-
"winget not available, manual installation required",
332+
*_tools_stage_message(
333+
"system",
334+
"winget non disponible, installation manuelle requise",
335+
"winget not available, manual installation required",
336+
),
324337
)
325338
# Open documentation URL for manual installation
326339
sys_manager.open_urls(
@@ -333,35 +346,43 @@ def ensure_tools_installed(self, gui) -> bool:
333346
_log_tools(
334347
gui,
335348
"warning",
336-
"system",
337-
f"Aucun équivalent Windows pour: {missing_system}",
338-
f"No Windows equivalent for: {missing_system}",
349+
*_tools_stage_message(
350+
"system",
351+
f"Aucun équivalent Windows pour: {missing_system}",
352+
f"No Windows equivalent for: {missing_system}",
353+
),
339354
)
340355
else:
341356
_log_tools(
342357
gui,
343358
"warning",
344-
"system",
345-
"Plateforme non supportée pour l'installation automatique",
346-
"Platform not supported for automatic installation",
359+
*_tools_stage_message(
360+
"system",
361+
"Plateforme non supportée pour l'installation automatique",
362+
"Platform not supported for automatic installation",
363+
),
347364
)
348365
system_install_ok = False
349366
else:
350367
_log_tools(
351368
gui,
352369
"success",
353-
"system",
354-
f"Tous les outils système sont déjà installés: {system_tools}",
355-
f"All system tools are already installed: {system_tools}",
370+
*_tools_stage_message(
371+
"system",
372+
f"Tous les outils système sont déjà installés: {system_tools}",
373+
f"All system tools are already installed: {system_tools}",
374+
),
356375
)
357376

358377
except Exception as e:
359378
_log_tools(
360379
gui,
361380
"warning",
362-
"system",
363-
f"Erreur lors de la vérification/installation des outils système: {e}",
364-
f"Error checking/installing system tools: {e}",
381+
*_tools_stage_message(
382+
"system",
383+
f"Erreur lors de la vérification/installation des outils système: {e}",
384+
f"Error checking/installing system tools: {e}",
385+
),
365386
)
366387
system_install_ok = False
367388

@@ -377,8 +398,11 @@ def ensure_tools_installed(self, gui) -> bool:
377398
log_i18n_level(
378399
gui,
379400
"info",
380-
f"Installation des outils Python manquants: {missing_python}",
381-
f"Installing missing Python tools: {missing_python}",
401+
*_tools_stage_message(
402+
"python",
403+
f"Installation des outils Python manquants: {missing_python}",
404+
f"Installing missing Python tools: {missing_python}",
405+
),
382406
)
383407
gui.venv_manager.ensure_tools_installed_system(missing_python)
384408
else:
@@ -392,8 +416,11 @@ def ensure_tools_installed(self, gui) -> bool:
392416
log_i18n_level(
393417
gui,
394418
"info",
395-
f"Installation des outils Python manquants: {missing_python}",
396-
f"Installing missing Python tools: {missing_python}",
419+
*_tools_stage_message(
420+
"python",
421+
f"Installation des outils Python manquants: {missing_python}",
422+
f"Installing missing Python tools: {missing_python}",
423+
),
397424
)
398425
gui.venv_manager.ensure_tools_installed(
399426
venv_path, missing_python

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ python -m OnlyMod.EngineOnlyMod --engine nuitka -f script.py --dry-run
133133
- [Architecture overview](docs/architecture.md)
134134
- [Contributing guide](docs/contributing.md)
135135
- [Dependency analyzer](docs/dependency_analyzer.md)
136+
- [Quality freeze policy](docs/quality_freeze.md)
136137
- [How to create an engine](docs/how_to_create_an_engine.md)
137138
- [How to create a BC plugin](docs/how_to_create_a_bc_plugin.md)
138139
- [Dedicated interactive CLI (`--cli`)](docs/dedicated_cli.md)
@@ -176,6 +177,11 @@ pytest -q tests
176177
python -m py_compile pycompiler_ark.py
177178
```
178179

180+
Quality status:
181+
182+
- all documented quality-plan phases are closed
183+
- the active backlog is considered closed under the current quality freeze
184+
179185
---
180186

181187
## License

TODO.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@
5454
- [x] les engines sans exception presente tous un probleme de design au niveau du bouton de choix d'icon. En effet le button est un simple button donc on ne sais pas si licon est bien selectionner alors il serait pertinent dajoutetr un label a coter qui montre le chemin de licon selectionner ce qui peut aussi permetrttre un parametrage a la foix ux/ui et manuel.
5555
## Docs
5656

57-
- [ ] il faut preciser dans la docs for engine a la section de monolitics ui que pas la peine de faire le scroll area cr l'ui s'en charge automatiquement dès qu-il voit que le tab est trop large.
57+
- [x] il faut preciser dans la docs for engine a la section de monolitics ui que pas la peine de faire le scroll area cr l'ui s'en charge automatiquement dès qu-il voit que le tab est trop large.
5858

5959
## venvmanager
6060

61-
- [ ] il faut que sur linux si on utilise le python of system que les installation utilise le flag break system package pour s'assurer que l-instalation aura lieu coute que coute. sur windows cela nest pas necessaire car windwos n-a pas souvent de problme niveau resolution de package.
61+
- [x] il faut que sur linux si on utilise le python of system que les installation utilise le flag break system package pour s'assurer que l-instalation aura lieu coute que coute. sur windows cela nest pas necessaire car windwos n-a pas souvent de problme niveau resolution de package.
6262

6363
## ide gui
6464
- [x] donner toute les capacité gui de classic gui à ide gui.
@@ -77,3 +77,11 @@
7777
- [x] ajouter une documentation detaillee du dependency analyzer.
7878
- [x] ajouter une vue d'architecture Core/Engine/UI.
7979
- [x] ajouter un guide contributeur operable.
80+
81+
## Finalisation
82+
83+
- [x] ajouter la politique de quality freeze et le statut des bugs bloquants valides par smoke checks.
84+
- [x] uniformiser les logs du flux d'installation outils avec des prefixes de stage stables.
85+
- [x] ajouter les tests Linux system Python pour confirmer --break-system-packages.
86+
- [x] corriger l'isolation des stubs de tests deps_analyser pour eviter la pollution de sys.modules.
87+
- [x] toutes les phases et tout le backlog sont maintenant clotures.

docs/how_to_create_an_engine.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,9 @@ class SpecialEngine(CompilerEngine):
168168

169169
**Monolithic Tab Example**
170170
The following dummy engine shows how to build a very large UI tab. The UI will
171-
handle scrolling automatically if needed.
171+
handle scrolling automatically if needed. You do not need to wrap your engine
172+
tab in an extra scroll area for this use case, because the host UI already adds
173+
scrolling behavior when a tab becomes too large.
172174
```python
173175
from __future__ import annotations
174176

0 commit comments

Comments
 (0)