Skip to content

Commit d77f285

Browse files
committed
Updated EngineLoader registry to include create function and fixed engine creation errors in Compiler
1 parent 49029ac commit d77f285

3 files changed

Lines changed: 66 additions & 527 deletions

File tree

CORRECTION_PLAN.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Plan de Correction - Erreur TypeError: CompilerEngine.ensure_tools_installed()
2+
3+
## Problème Identifié
4+
5+
Dans `Core/Compiler/__init__.py`, la fonction `get_engine(engine_id)` retourne la **classe** de l'engine, mais le code appelle des méthodes d'instance (`ensure_tools_installed`, `build_command`, `on_success`) sur cette classe au lieu d'une instance.
6+
7+
### Lieux du problème (ligne 221 et suivantes):
8+
1. `compile_all()` - ligne ~221: `engine = get_engine(engine_id)` puis `engine.ensure_tools_installed(self)`
9+
2. `_start_compilation_queue()` - ligne ~249: `if not engine.ensure_tools_installed(self)`
10+
3. `start_compilation_process()` - ligne ~308: `engine = get_engine(engine_id)` puis `engine.ensure_tools_installed(self)`
11+
4. `handle_finished()` - ligne ~400: `engine.on_success(self, file_path)`
12+
13+
## Solution
14+
15+
Remplacer `get_engine(engine_id)` par `create(engine_id)` dans `Core/Compiler/__init__.py` là où des méthodes d'instance sont appelées sur l'engine.
16+
17+
La fonction `create()` dans `EngineLoader/registry.py` instancie correctement l'engine:
18+
```python
19+
def create(eid: str) -> CompilerEngine:
20+
cls = get_engine(eid)
21+
if not cls:
22+
raise KeyError(f"Engine '{eid}' is not registered")
23+
try:
24+
return cls() # Crée une instance!
25+
except Exception as e:
26+
raise RuntimeError(f"Failed to instantiate engine '{eid}': {e}")
27+
```
28+
29+
## Fichiers à Modifier
30+
31+
| Fichier | Modification |
32+
|---------|--------------|
33+
| `Core/Compiler/__init__.py` | Remplacer `get_engine()` par `create()` pour les appels aux méthodes d'instance |
34+
35+
## Étapes de Correction
36+
37+
1. Importer `create` depuis EngineLoader.registry
38+
2. Remplacer `get_engine(engine_id)` par `create(engine_id)` dans:
39+
- `compile_all()` - pour l'appel à `ensure_tools_installed()`
40+
- `_start_compilation_queue()` - pour les appels à `ensure_tools_installed()`, `build_command()`, et `environment()`
41+
- `start_compilation_process()` - pour les appels à `ensure_tools_installed()`, `build_command()`, et `on_success()`
42+
- `handle_finished()` - pour l'appel à `on_success()`
43+
44+
## Note Importante
45+
46+
Ne pas modifier les imports de `get_engine` car il est toujours utilisé ailleurs dans le code (par exemple pour obtenir la classe sans l'instancier).
47+

Core/Compiler/__init__.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
)
9090

9191
# Importations de EngineLoader
92-
from EngineLoader.registry import get_engine
92+
from EngineLoader.registry import get_engine, create
9393

9494
__all__ = [
9595
# compiler.py
@@ -187,12 +187,13 @@ def compile_all(self) -> None:
187187
if not engine_id:
188188
engine_id = "pyinstaller" # Moteur par défaut
189189

190-
# Obtenir le moteur
191-
engine = get_engine(engine_id)
192-
if not engine:
190+
# Obtenir le moteur (instance)
191+
try:
192+
engine = create(engine_id)
193+
except Exception as e:
193194
self.log_i18n(
194-
f"❌ Moteur de compilation '{engine_id}' non trouvé.",
195-
f"❌ Compilation engine '{engine_id}' not found.",
195+
f"❌ Erreur création moteur '{engine_id}': {e}",
196+
f"❌ Engine creation error '{engine_id}': {e}",
196197
)
197198
return
198199

@@ -376,19 +377,19 @@ def start_compilation_process(self, engine_id: str, file_path: str) -> bool:
376377
Returns:
377378
True if compilation started, False otherwise
378379
"""
379-
# Obtenir le moteur
380-
engine = get_engine(engine_id)
381-
if not engine:
380+
# Obtenir le moteur (instance)
381+
try:
382+
engine = create(engine_id)
383+
except Exception as e:
382384
self.log_i18n(
383-
f"❌ Moteur '{engine_id}' non trouvé.",
384-
f"❌ Engine '{engine_id}' not found.",
385+
f"❌ Erreur création moteur '{engine_id}': {e}",
386+
f"❌ Engine creation error '{engine_id}': {e}",
385387
)
386388
return False
387389

388390
# Vérifier les prérequis
389-
if hasattr(engine, "ensure_tools_installed"):
390-
if not engine.ensure_tools_installed(self):
391-
return False
391+
if not engine.ensure_tools_installed(self):
392+
return False
392393

393394
# Construire la commande
394395
cmd = engine.build_command(self, file_path)
@@ -530,7 +531,10 @@ def handle_finished(self, return_code: int, info: dict) -> None:
530531
# Appeler on_success du moteur si disponible
531532
engine_id = info.get("engine")
532533
if engine_id:
533-
engine = get_engine(engine_id)
534+
try:
535+
engine = create(engine_id)
536+
except Exception:
537+
engine = None
534538
if engine and hasattr(engine, "on_success"):
535539
file_path = info.get("file")
536540
if file_path:

0 commit comments

Comments
 (0)