Picarones / picarones.spec
Claude
feat(sprint-A9): release pipeline PyPI + ghcr.io + GitHub Release
628d92a unverified
raw
history blame
5.62 kB
# picarones.spec β€” Configuration PyInstaller
#
# Génère un exécutable standalone Picarones pour Linux, macOS et Windows.
# L'exΓ©cutable embarque Python et toutes les dΓ©pendances β€” aucune installation requise.
#
# Usage :
# pip install pyinstaller
# pyinstaller picarones.spec --noconfirm
#
# Sortie :
# dist/picarones/picarones (Linux/macOS)
# dist/picarones/picarones.exe (Windows)
#
# Pour un seul fichier (dΓ©marrage plus lent) :
# pyinstaller picarones.spec --noconfirm --onefile
import sys
from pathlib import Path
# Sprint A9 (m-15) β€” utilitaire PyInstaller pour auto-dΓ©tecter les
# imports d'un package entier. Remplace la liste hiddenimports manuelle
# qui dΓ©rivait silencieusement Γ  chaque refactor.
from PyInstaller.utils.hooks import collect_submodules # noqa: F401
# Chemin racine du projet
ROOT = Path(spec_file).parent # noqa: F821 (spec_file est dΓ©fini par PyInstaller)
# ──────────────────────────────────────────────────────────────────
# Analyse des dΓ©pendances
# ──────────────────────────────────────────────────────────────────
a = Analysis(
# Point d'entrΓ©e : le script CLI principal
scripts=[str(ROOT / "picarones" / "__main__.py")],
# Chemins de recherche des modules
pathex=[str(ROOT)],
# DΓ©pendances binaires supplΓ©mentaires (DLLs, .so)
binaries=[],
# Fichiers de donnΓ©es Γ  embarquer
datas=[
# DonnΓ©es de configuration
(str(ROOT / "picarones"), "picarones"),
# Prompts LLM (si prΓ©sents)
# (str(ROOT / "prompts"), "prompts"),
],
# Sprint A9 (m-15) β€” auto-dΓ©tection des hiddenimports.
#
# Avant Sprint A9, la liste Γ©tait maintenue manuellement et
# dΓ©rivait : elle rΓ©fΓ©renΓ§ait des modules qui ont migrΓ© dans
# ``measurements/`` ou ``extras/`` au moment du refactor des
# Cercles 1/2/3 (Sprint 33). Bug latent : la PyInstaller build
# produisait un exΓ©cutable qui ratait silencieusement Γ 
# l'``import`` de ces modules.
#
# ``collect_submodules`` parcourt tout le sous-arbre du package
# Γ  la construction et inclut tout ce qui s'importe. Plus rien
# Γ  maintenir Γ  la main quand on ajoute un sous-module.
#
# Liste explicite des dΓ©pendances tierces conservΓ©e car certaines
# (PIL.ImageFilter, jiwer) ne sont pas trouvΓ©es par ``collect_submodules``
# de leur propre fait (importΓ©es paresseusement).
hiddenimports=(
collect_submodules("picarones") # noqa: F821 β€” dΓ©fini par PyInstaller
+ [
"click",
"jiwer",
"PIL",
"PIL.Image",
"PIL.ImageFilter",
"PIL.ImageOps",
"yaml",
"tqdm",
"numpy",
"pytesseract",
"defusedxml",
"defusedxml.ElementTree",
"sqlite3",
"unicodedata",
# Sprint A1 β€” type-checking et tests embarquΓ©s au build dev
# uniquement. En build release pur, retirer.
]
),
# Fichiers Γ  exclure pour rΓ©duire la taille
excludes=[
"tkinter",
"matplotlib",
"scipy",
"sklearn",
"pandas",
"IPython",
"jupyter",
"notebook",
],
# Options de collection
win_no_prefer_redirects=False,
win_private_assemblies=False,
noarchive=False,
)
# ──────────────────────────────────────────────────────────────────
# Archive PYZ (modules Python compilΓ©s)
# ──────────────────────────────────────────────────────────────────
pyz = PYZ(a.pure, a.zipped_data) # noqa: F821
# ──────────────────────────────────────────────────────────────────
# ExΓ©cutable principal
# ──────────────────────────────────────────────────────────────────
exe = EXE( # noqa: F821
pyz,
a.scripts,
[],
exclude_binaries=True,
name="picarones",
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True, # Compression UPX si disponible
console=True, # Mode console (pas de fenΓͺtre graphique)
disable_windowed_traceback=False,
argv_emulation=False,
# IcΓ΄ne (optionnelle)
# icon=str(ROOT / "assets" / "picarones.ico"),
)
# ──────────────────────────────────────────────────────────────────
# Collection finale (dossier dist/picarones/)
# ──────────────────────────────────────────────────────────────────
coll = COLLECT( # noqa: F821
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name="picarones",
)