adjustments
This commit is contained in:
parent
23837a6e8b
commit
7ffb1cd50d
67
BUILD.spec
67
BUILD.spec
@ -1,34 +1,38 @@
|
|||||||
# -*- mode: python ; coding: utf-8 -*-
|
# -*- mode: python ; coding: utf-8 -*-
|
||||||
import json
|
import json
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from os import getenv
|
||||||
|
|
||||||
# Load config.json
|
# --- Load config.json ---
|
||||||
config_path = Path("../config.json")
|
config_path = Path("../config.json")
|
||||||
with config_path.open("r", encoding="utf-8") as f:
|
with config_path.open("r", encoding="utf-8") as f:
|
||||||
config = json.load(f)
|
config = json.load(f)
|
||||||
|
|
||||||
# Extract values
|
# --- Extract values ---
|
||||||
version = config.get("app_version", "0.0.0")
|
version = config.get("app_version", "0.0.0")
|
||||||
arch = config.get("architecture", "x64")
|
arch = config.get("architecture", "x64")
|
||||||
python_version = config.get("python_version", "3.x")
|
python_version = config.get("python_version", "3.x")
|
||||||
os = config.get("app_os", "Windows")
|
os_name = config.get("app_os", sys.platform)
|
||||||
name = config.get("app_name", "Application")
|
app_name = config.get("app_name", "Application")
|
||||||
|
|
||||||
# Construct dynamic name
|
# --- Construct dynamic name ---
|
||||||
name = f"{name}-{os}-{arch}-v{version}"
|
name = f"{app_name}-{os_name}-{arch}-v{version}"
|
||||||
|
|
||||||
# Optional icon path (can still be overridden via environment if needed)
|
# --- Optional icon path ---
|
||||||
from os import getenv
|
|
||||||
icon = getenv("ICON_PATH", "")
|
icon = getenv("ICON_PATH", "")
|
||||||
|
|
||||||
# Data files to bundle
|
# --- Data files to bundle ---
|
||||||
datas = [
|
datas = [
|
||||||
("data/assets/*", "data/assets/"),
|
("data/assets/*", "data/assets/"),
|
||||||
("data/", "data/"),
|
("data/", "data/"),
|
||||||
("config.json", ".")
|
("config.json", "."),
|
||||||
|
(".env", "."),
|
||||||
]
|
]
|
||||||
binaries = []
|
binaries = []
|
||||||
|
|
||||||
|
# --- Analysis ---
|
||||||
a = Analysis(
|
a = Analysis(
|
||||||
["main.py"],
|
["main.py"],
|
||||||
pathex=[],
|
pathex=[],
|
||||||
@ -45,6 +49,7 @@ a = Analysis(
|
|||||||
|
|
||||||
pyz = PYZ(a.pure)
|
pyz = PYZ(a.pure)
|
||||||
|
|
||||||
|
# --- EXE common to all platforms ---
|
||||||
exe = EXE(
|
exe = EXE(
|
||||||
pyz,
|
pyz,
|
||||||
a.scripts,
|
a.scripts,
|
||||||
@ -59,10 +64,48 @@ exe = EXE(
|
|||||||
upx=True,
|
upx=True,
|
||||||
upx_exclude=[],
|
upx_exclude=[],
|
||||||
runtime_tmpdir=None,
|
runtime_tmpdir=None,
|
||||||
console=False,
|
console=False, # pas de terminal par défaut
|
||||||
disable_windowed_traceback=False,
|
disable_windowed_traceback=False,
|
||||||
argv_emulation=False,
|
argv_emulation=(sys.platform == "darwin"), # utile sur macOS GUI
|
||||||
target_arch=None,
|
target_arch=None,
|
||||||
codesign_identity=None,
|
codesign_identity=None,
|
||||||
entitlements_file=None,
|
entitlements_file=None,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# --- Platform-specific targets ---
|
||||||
|
if sys.platform == "darwin":
|
||||||
|
# macOS: wrap EXE in a .app bundle
|
||||||
|
app = BUNDLE(
|
||||||
|
exe,
|
||||||
|
name=f"{name}.app",
|
||||||
|
icon=icon if icon else None,
|
||||||
|
bundle_identifier=f"com.example.{app_name.lower()}"
|
||||||
|
)
|
||||||
|
# La dernière variable = objet final PyInstaller doit construire
|
||||||
|
coll = app
|
||||||
|
|
||||||
|
elif sys.platform.startswith("linux"):
|
||||||
|
# Linux: keep binary + generate .desktop file
|
||||||
|
coll = exe
|
||||||
|
|
||||||
|
dist_dir = Path("build")
|
||||||
|
dist_bin = dist_dir / name
|
||||||
|
desktop_file = dist_dir / f"{app_name}.desktop"
|
||||||
|
|
||||||
|
desktop_content = f"""[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Name={app_name}
|
||||||
|
Exec={dist_bin}
|
||||||
|
Icon={icon if icon else "application-default-icon"}
|
||||||
|
Terminal=false
|
||||||
|
Categories=Utility;
|
||||||
|
"""
|
||||||
|
# Création post-build
|
||||||
|
os.makedirs(dist_dir, exist_ok=True)
|
||||||
|
with open(desktop_file, "w", encoding="utf-8") as f:
|
||||||
|
f.write(desktop_content)
|
||||||
|
os.chmod(desktop_file, 0o755)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Windows: just the exe
|
||||||
|
coll = exe
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextEdit, QPushButton, QLabel, QMessageBox, QHBoxLayout
|
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextEdit, QPushButton, QLabel, QHBoxLayout
|
||||||
from PyQt6.QtCore import Qt, QThread, pyqtSignal
|
from PyQt6.QtCore import Qt, QThread, pyqtSignal
|
||||||
import smtplib, os
|
import smtplib, os
|
||||||
from email.mime.text import MIMEText
|
from email.mime.text import MIMEText
|
||||||
@ -6,9 +6,9 @@ from email.mime.multipart import MIMEMultipart
|
|||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from app.core.main_manager import MainManager, NotificationType
|
from app.core.main_manager import MainManager, NotificationType
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
import app.utils.paths as path
|
||||||
# Load environment variables from .env file
|
# Load environment variables from .env file
|
||||||
load_dotenv()
|
load_dotenv(path.resource_path(".env"))
|
||||||
|
|
||||||
class EmailSender(QThread):
|
class EmailSender(QThread):
|
||||||
success = pyqtSignal()
|
success = pyqtSignal()
|
||||||
|
59
tools/build.command
Normal file
59
tools/build.command
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# === PATH SETUP ===
|
||||||
|
PARENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
CONFIG_FILE="$PARENT_DIR/config.json"
|
||||||
|
ENV_FILE="$PARENT_DIR/.env"
|
||||||
|
|
||||||
|
# --- Check .env file ---
|
||||||
|
if [[ ! -f "$ENV_FILE" ]]; then
|
||||||
|
echo "[ERROR] .env file not found. Please copy .env.example to .env and configure it."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Check jq availability ---
|
||||||
|
if ! command -v jq &>/dev/null; then
|
||||||
|
echo "[ERROR] 'jq' is required. Install it with: brew install jq"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Extract values from config.json ---
|
||||||
|
ICON_PATH=$(jq -r '.icon_path' "$CONFIG_FILE")
|
||||||
|
APP_NAME=$(jq -r '.app_name' "$CONFIG_FILE")
|
||||||
|
ARCHITECTURE=$(jq -r '.architecture' "$CONFIG_FILE")
|
||||||
|
|
||||||
|
# --- Extract PYTHON_PATH from .env ---
|
||||||
|
SYSTEM_PYTHON=$(grep -E "^PYTHON_PATH=" "$ENV_FILE" | cut -d '=' -f2)
|
||||||
|
|
||||||
|
VENV_PATH="$PARENT_DIR/MACenv_$ARCHITECTURE"
|
||||||
|
EXE_NAME="${APP_NAME}-MacOS-${ARCHITECTURE}"
|
||||||
|
PYTHON_IN_VENV="$VENV_PATH/bin/python"
|
||||||
|
|
||||||
|
# --- Verify Python existence ---
|
||||||
|
if [[ ! -x "$SYSTEM_PYTHON" ]]; then
|
||||||
|
echo "[ERROR] Python not found at: $SYSTEM_PYTHON"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Check if virtual environment exists ---
|
||||||
|
if [[ ! -f "$VENV_PATH/bin/activate" ]]; then
|
||||||
|
echo "[INFO] Virtual environment not found. Creating..."
|
||||||
|
"$SYSTEM_PYTHON" -m venv "$VENV_PATH"
|
||||||
|
"$PYTHON_IN_VENV" -m pip install --upgrade pip
|
||||||
|
"$PYTHON_IN_VENV" -m pip install -r "$PARENT_DIR/requirements.txt"
|
||||||
|
else
|
||||||
|
echo "[INFO] Virtual environment found."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Run PyInstaller ---
|
||||||
|
"$PYTHON_IN_VENV" -m PyInstaller \
|
||||||
|
--distpath "$PARENT_DIR/build" \
|
||||||
|
--workpath "$PARENT_DIR/build/dist" \
|
||||||
|
--clean \
|
||||||
|
"$PARENT_DIR/BUILD.spec"
|
||||||
|
|
||||||
|
# --- Clean build cache ---
|
||||||
|
rm -rf "$PARENT_DIR/build/dist"
|
||||||
|
|
||||||
|
echo "[INFO] Build complete: $EXE_NAME"
|
59
tools/open.command
Normal file
59
tools/open.command
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Root paths
|
||||||
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
CONFIG_FILE="$ROOT_DIR/config.json"
|
||||||
|
REQUIREMENTS="$ROOT_DIR/requirements.txt"
|
||||||
|
ENV_FILE="$ROOT_DIR/.env"
|
||||||
|
|
||||||
|
# Check if .env exists
|
||||||
|
if [[ ! -f "$ENV_FILE" ]]; then
|
||||||
|
echo "[ERROR] .env file not found. Please copy .env.example to .env and configure it."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract architecture from config.json (requires jq)
|
||||||
|
if ! command -v jq &>/dev/null; then
|
||||||
|
echo "[ERROR] 'jq' is required. Install it with: brew install jq"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
ARCHITECTURE=$(jq -r '.architecture' "$CONFIG_FILE")
|
||||||
|
|
||||||
|
# Extract python path from .env
|
||||||
|
PYTHON_EXEC=$(grep -E "^PYTHON_PATH=" "$ENV_FILE" | cut -d '=' -f2)
|
||||||
|
|
||||||
|
# Construct venv path
|
||||||
|
ENV_NAME="MACenv_$ARCHITECTURE"
|
||||||
|
ENV_PATH="$ROOT_DIR/$ENV_NAME"
|
||||||
|
|
||||||
|
# Check python executable
|
||||||
|
if [[ ! -x "$PYTHON_EXEC" ]]; then
|
||||||
|
echo "[ERROR] Python not found at: $PYTHON_EXEC"
|
||||||
|
echo "Please check your .env or installation path."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show info
|
||||||
|
echo "[INFO] Configuration:"
|
||||||
|
echo " Python: $PYTHON_EXEC"
|
||||||
|
echo " Env: $ENV_NAME"
|
||||||
|
|
||||||
|
# Create virtual env if missing
|
||||||
|
if [[ ! -d "$ENV_PATH/bin" ]]; then
|
||||||
|
echo "[INFO] Virtual environment not found, creating..."
|
||||||
|
"$PYTHON_EXEC" -m venv "$ENV_PATH"
|
||||||
|
echo "[INFO] Installing dependencies..."
|
||||||
|
"$ENV_PATH/bin/python" -m pip install --upgrade pip
|
||||||
|
"$ENV_PATH/bin/pip" install -r "$REQUIREMENTS"
|
||||||
|
else
|
||||||
|
echo "[INFO] Virtual environment found."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Activate and launch VS Code
|
||||||
|
echo "[INFO] Launching VS Code..."
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
source "$ENV_PATH/bin/activate"
|
||||||
|
open -a "Visual Studio Code" "$ROOT_DIR"
|
||||||
|
|
||||||
|
exit 0
|
Loading…
x
Reference in New Issue
Block a user