Skip to content

Commit 0a703c9

Browse files
committed
Mise au point des SPECs
1 parent ddfe314 commit 0a703c9

3 files changed

Lines changed: 768 additions & 0 deletions

File tree

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
Voici la SPEC BuildContext 1.0 mise à jour avec la précision cruciale sur la source des données.
2+
3+
---
4+
5+
SPEC BuildContext 1.0
6+
7+
---
8+
9+
1. Définition
10+
11+
Le BuildContext est la structure de données qu'ARK transmet à la méthode build_command de l'engine.
12+
13+
L'engine ne lit aucun fichier source (ark.yml, lock.yml, etc.). Il reçoit uniquement ce contexte.
14+
15+
L'engine ne sait pas si le contexte vient d'un ark.yml ou d'un lock.yml.
16+
17+
---
18+
19+
2. Deux modes de construction
20+
21+
Commande Source du BuildContext
22+
ark build Construit depuis ark.yml + environnement
23+
ark build --lock Construit depuis lock.yml uniquement
24+
25+
Le BuildContext final est identique dans les deux cas.
26+
27+
---
28+
29+
3. Rappel : ark.yml (ce que l'utilisateur écrit)
30+
31+
```yaml
32+
project:
33+
  name: MonApp
34+
  version: 1.0.0
35+
  entry: src/main.py
36+
37+
workspace:
38+
  exclude:
39+
    - tests/**/*
40+
    - __pycache__/**/*
41+
42+
build:
43+
  engine: nuitka
44+
  output: dist/
45+
  data:
46+
    - source: plugins/
47+
      destination: plugins/
48+
  icon: assets/icon.ico
49+
```
50+
51+
---
52+
53+
4. Structure du BuildContext
54+
55+
```yaml
56+
project_name: MonApp
57+
entry_point: src/main.py
58+
output_dir: dist/
59+
60+
exclude_patterns:
61+
  - tests/**/*
62+
  - __pycache__/**/*
63+
64+
data_mappings:
65+
  - source: plugins/
66+
    destination: plugins/
67+
68+
icon: assets/icon.ico   # optionnel
69+
```
70+
71+
---
72+
73+
5. Correspondance selon le mode
74+
75+
BuildContext Source en ark build Source en ark build --lock
76+
project_name ark.yml → project.name lock.yml → project.name
77+
entry_point ark.yml → project.entry lock.yml → project.entry
78+
output_dir ark.yml → build.output lock.yml → build.output
79+
exclude_patterns ark.yml → workspace.exclude lock.yml → workspace.exclude_patterns
80+
data_mappings ark.yml → build.data lock.yml → build.data
81+
icon ark.yml → build.icon lock.yml → build.icon
82+
83+
---
84+
85+
6. Description des champs
86+
87+
Champ Type Description
88+
project_name string Nom du projet (sert à nommer l'exécutable)
89+
entry_point string Fichier principal à exécuter (chemin relatif)
90+
output_dir string Répertoire où déposer l'artefact final
91+
exclude_patterns list[string] Motifs (glob) des fichiers à ne PAS compiler
92+
data_mappings list[{source, destination}] Fichiers/dossiers à copier en brut (non compilés)
93+
icon string (optionnel) Chemin vers le fichier icône
94+
95+
---
96+
97+
7. Contrat pour l'engine
98+
99+
L'engine doit :
100+
101+
1. Compiler tous les fichiers du projet sauf ceux qui matchent exclude_patterns
102+
2. Copier les fichiers/dossiers de data_mappings (source → destination) dans output_dir
103+
3. Appliquer l'icône à l'exécutable si icon est présent
104+
4. Nommer l'exécutable avec project_name (MonApp.exe sur Windows, MonApp sur Unix)
105+
5. Placer tous les artefacts dans output_dir
106+
107+
---
108+
109+
8. Conversion interne
110+
111+
L'engine est responsable de convertir ces données génériques en ses propres options.
112+
113+
Contexte Converti en (exemple Nuitka)
114+
exclude_patterns: ["tests/**/*"] --nofollow-import-to=tests
115+
data_mappings: [{source: "plugins/", destination: "plugins/"}] --include-data-dir=plugins/=plugins/
116+
icon: "assets/icon.ico" --windows-icon-from-ico=assets/icon.ico
117+
118+
Contexte Converti en (exemple PyInstaller)
119+
exclude_patterns: ["tests/**/*"] --exclude-module tests
120+
data_mappings: [{source: "plugins/", destination: "plugins/"}] --add-data "plugins/;plugins/"
121+
icon: "assets/icon.ico" --icon assets/icon.ico
122+
123+
---
124+
125+
9. Ce que l'engine ne doit PAS faire
126+
127+
Interdiction Pourquoi
128+
Scanner le projet pour ajouter des fichiers L'engine ne décide pas
129+
Ignorer exclude_patterns Rupture de reproductibilité
130+
Ignorer data_mappings Rupture du contrat
131+
Ignorer icon Rupture du contrat
132+
Tenter de savoir si le contexte vient d'un lock ou non Inutile, cela ne change rien
133+
134+
---
135+
136+
10. Exemple d'implémentation
137+
138+
```python
139+
from engine_sdk import CompilerEngine, engine_register, BuildContext
140+
141+
@engine_register
142+
class NuitkaEngine(CompilerEngine):
143+
    id = "nuitka"
144+
    name = "Nuitka"
145+
    version = "2.4.1"
146+
147+
    def build_command(self, context: BuildContext) -> list:
148+
        cmd = ["nuitka", context.entry_point]
149+
       
150+
        for pattern in context.exclude_patterns:
151+
            module = pattern.replace("/**/*", "").replace("**/*", "")
152+
            cmd.append(f"--nofollow-import-to={module}")
153+
       
154+
        for mapping in context.data_mappings:
155+
            cmd.append(f"--include-data-dir={mapping.source}={mapping.destination}")
156+
       
157+
        if context.icon:
158+
            cmd.append(f"--windows-icon-from-ico={context.icon}")
159+
       
160+
        cmd.append(f"--output-dir={context.output_dir}")
161+
        cmd.append(f"--output-filename={context.project_name}")
162+
       
163+
        return cmd
164+
```
165+
166+
---
167+
168+
11. Règles
169+
170+
Règle Explication
171+
B1 L'engine ne lit ni ark.yml ni lock.yml
172+
B2 L'engine reçoit uniquement le BuildContext dans build_command
173+
B3 Le BuildContext est construit soit depuis ark.yml, soit depuis lock.yml
174+
B4 L'engine ne peut pas savoir (et n'a pas besoin de savoir) la source
175+
B5 L'engine convertit le contexte en ses propres options
176+
B6 L'engine compile tout sauf exclude_patterns
177+
B7 L'engine copie tous les data_mappings
178+
B8 L'engine applique l'icône si présente
179+
180+
---
181+
182+
Fin de la SPEC BuildContext 1.0
183+

0 commit comments

Comments
 (0)