From 73cc0e3ca93b936dc29ffe5f0ed8c5b4deef1078 Mon Sep 17 00:00:00 2001 From: Louis Mazin Date: Thu, 10 Jul 2025 17:25:21 +0200 Subject: [PATCH] first commit --- .gitignore | 88 +++++++++++++++++++++++++++++++++++++++++++ BUILD.spec | 66 ++++++++++++++++++++++++++++++++ LICENSE | 9 +++++ build.bat | 51 +++++++++++++++++++++++++ config.json | 7 ++++ data/assets/icon.ico | Bin 0 -> 24757 bytes data/assets/icon.png | Bin 0 -> 27647 bytes main.py | 53 ++++++++++++++++++++++++++ open.bat | 48 +++++++++++++++++++++++ requirements.txt | 2 + utils/paths.py | 16 ++++++++ 11 files changed, 340 insertions(+) create mode 100644 .gitignore create mode 100644 BUILD.spec create mode 100644 LICENSE create mode 100644 build.bat create mode 100644 config.json create mode 100644 data/assets/icon.ico create mode 100644 data/assets/icon.png create mode 100644 main.py create mode 100644 open.bat create mode 100644 requirements.txt create mode 100644 utils/paths.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a6f7071 --- /dev/null +++ b/.gitignore @@ -0,0 +1,88 @@ +# Fichiers système +.DS_Store +Thumbs.db +desktop.ini + +# Dossiers de build et distributions +/build/ +/dist/ +/out/ +/release/ +*.exe +*.msi +*.dmg +*.pkg +*.app + +# Fichiers d'environnement et de configuration +.env +.env.local +.env.development +.env.test +.env.production +LINenv/ +WINenv/ +MACenv/ + +# Fichiers de dépendances +/node_modules/ +/.pnp/ +.pnp.js +/vendor/ +/packages/ +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python + +# Logs et bases de données +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +*.sqlite +*.db + +# Fichiers d'IDE et d'éditeurs +.idea/ +.vscode/ +*.swp +*.swo +*.sublime-workspace +*.sublime-project +.vs/ +*.user +*.userosscache +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Fichiers temporaires +/tmp/ +/temp/ +*.tmp +*.bak +*~ + +# Fichiers spécifiques à l'application +# Ne pas ignorer le fichier options.json +!options.json + +# Dossier de cache +.cache/ +.parcel-cache/ + +# Fichiers de couverture de test +coverage/ +.nyc_output/ +.coverage +htmlcov/ + +# Autres +.vercel +.next +.nuxt +.serverless/ \ No newline at end of file diff --git a/BUILD.spec b/BUILD.spec new file mode 100644 index 0000000..cba65dd --- /dev/null +++ b/BUILD.spec @@ -0,0 +1,66 @@ +# -*- mode: python ; coding: utf-8 -*- +import json +from pathlib import Path + +# Load config.json +config_path = Path("config.json") +with config_path.open("r", encoding="utf-8") as f: + config = json.load(f) + +# Extract values +version = config.get("app_version", "0.0.0") +arch = config.get("architecture", "x64") +python_version = config.get("python_version", "3.x") +os = config.get("app_os", "Windows") +name = config.get("app_name", "HoDA") + +# Construct dynamic name +name = f"{name}-{os}-{arch}-v{version}" + +# Optional icon path (can still be overridden via environment if needed) +from os import getenv +icon = getenv("ICON_PATH", "data/assets/icon.ico") + +# Data files to bundle +datas = [ + ("data/assets/*", "data/assets/"), +] +binaries = [] + +a = Analysis( + ["main.py"], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) + +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name=name, + icon=icon, + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c205385 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2025 LouisMazin + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..f92a097 --- /dev/null +++ b/build.bat @@ -0,0 +1,51 @@ +@echo off +setlocal enabledelayedexpansion + +REM === PATH SETUP === +set PARENT_DIR=%~dp0 +set BUILD_DIR=%~dp0.. +set VENV_PATH=%PARENT_DIR%\WINenv +set PYTHON_IN_VENV=%VENV_PATH%\Scripts\python.exe +set ICON_PATH=data/assets/icon.ico +set CONFIG_FILE=%PARENT_DIR%\config.json + +REM === Extract values from config.json === +for /f "delims=" %%i in ('powershell -NoProfile -Command ^ + "Get-Content '%CONFIG_FILE%' | ConvertFrom-Json | Select-Object -ExpandProperty python_version"') do set PYTHON_VERSION=%%i +for /f "delims=" %%i in ('powershell -NoProfile -Command ^ + "Get-Content '%CONFIG_FILE%' | ConvertFrom-Json | Select-Object -ExpandProperty app_name"') do set APP_NAME=%%i +for /f "delims=" %%i in ('powershell -NoProfile -Command ^ + "Get-Content '%CONFIG_FILE%' | ConvertFrom-Json | Select-Object -ExpandProperty architecture"') do set ARCHITECTURE=%%i + +set EXE_NAME=%APP_NAME%-Windows-%ARCHITECTURE% + +REM === Construct full python path from config.json === +set SYSTEM_PYTHON=C:\Logiciels\Python\%ARCHITECTURE%\%PYTHON_VERSION%\python.exe + +REM === Verify Python existence === +if not exist "%SYSTEM_PYTHON%" ( + echo [ERROR] Python not found at: %SYSTEM_PYTHON% + exit /b 1 +) + +REM === Check if virtual environment exists === +if not exist "%VENV_PATH%\Scripts\activate.bat" ( + 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. +) + +REM === Run PyInstaller === +"%PYTHON_IN_VENV%" -m PyInstaller ^ + --distpath "%BUILD_DIR%\Build" ^ + --workpath "%BUILD_DIR%\Building" ^ + --clean ^ + "%PARENT_DIR%\BUILD.spec" + +REM === Clean build cache === +rmdir /s /q "%BUILD_DIR%\Building" + +endlocal diff --git a/config.json b/config.json new file mode 100644 index 0000000..2149b6c --- /dev/null +++ b/config.json @@ -0,0 +1,7 @@ +{ + "app_name": "HoDA_Verifier", + "python_version": "3.11.7", + "app_os": "Windows", + "app_version": "1.0.0", + "architecture": "x64" +} \ No newline at end of file diff --git a/data/assets/icon.ico b/data/assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9a4dcbe55fe3304865ea1f03a4698d175b36a961 GIT binary patch literal 24757 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 S-gF)SFKcsqv$rOGcmEII0fScn literal 0 HcmV?d00001 diff --git a/data/assets/icon.png b/data/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..192f796ab819bd8cea50b712fe640d2d46289bb4 GIT binary patch literal 27647 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..77dce1e --- /dev/null +++ b/main.py @@ -0,0 +1,53 @@ +## Interface with only a path widget (combo of QLineEdit and QPushButton to explore the file system) +## and a button : verify (call a temp verify function) +from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit, QFileDialog +import sys +import os +import tempfile + +def verify_path(path): + # Temporary verification function + if os.path.exists(path): + print(f"Path '{path}' exists.") + else: + print(f"Path '{path}' does not exist.") + +class PathWidget(QWidget): + def __init__(self): + super().__init__() + self.init_ui() + + def init_ui(self): + self.layout = QVBoxLayout() + + # Create a QLineEdit for the path input + self.path_input = QLineEdit(self) + self.path_input.setPlaceholderText("Enter or select a path") + self.layout.addWidget(self.path_input) + + # Create a QPushButton to open the file dialog + self.browse_button = QPushButton("Browse", self) + self.browse_button.clicked.connect(self.open_file_dialog) + self.layout.addWidget(self.browse_button) + + # Create a QPushButton to verify the path + self.verify_button = QPushButton("Verify", self) + self.verify_button.clicked.connect(self.verify_path) + self.layout.addWidget(self.verify_button) + + self.setLayout(self.layout) + self.setWindowTitle("Path Widget Example") + + def open_file_dialog(self): + path, _ = QFileDialog.getExistingDirectory(self, "Select Directory") + if path: + self.path_input.setText(path) + + def verify_path(self): + verify_path(self.path_input.text()) + +if __name__ == "__main__": + app = QApplication(sys.argv) + widget = PathWidget() + widget.show() + sys.exit(app.exec_()) \ No newline at end of file diff --git a/open.bat b/open.bat new file mode 100644 index 0000000..9ef8c21 --- /dev/null +++ b/open.bat @@ -0,0 +1,48 @@ +@echo off +setlocal enabledelayedexpansion + +REM Set file paths +set CONFIG_FILE=%~dp0config.json +set REQUIREMENTS=requirements.txt +set ENV_NAME=WINenv +set ENV_PATH=%~dp0%ENV_NAME% + +REM Extract config.json fields using PowerShell +for /f "delims=" %%i in ('powershell -NoProfile -Command ^ + "Get-Content '%CONFIG_FILE%' | ConvertFrom-Json | Select-Object -ExpandProperty python_version"') do set PYTHON_VERSION=%%i + +for /f "delims=" %%i in ('powershell -NoProfile -Command ^ + "Get-Content '%CONFIG_FILE%' | ConvertFrom-Json | Select-Object -ExpandProperty architecture"') do set ARCHITECTURE=%%i + +REM Construct python executable path +set PYTHON_EXEC=C:\Logiciels\Python\%ARCHITECTURE%\%PYTHON_VERSION%\python.exe + +if not exist "%PYTHON_EXEC%" ( + echo [ERROR] Python introuvable à: %PYTHON_EXEC% + echo Veuillez vérifier votre config.json ou le dossier d'installation. + exit /b 1 +) + +REM Show config info +echo [INFO] Configuration : +echo Python: %PYTHON_EXEC% +echo Env: %ENV_NAME% + +REM Check if virtual environment exists +if not exist "%ENV_PATH%\Scripts\activate.bat" ( + echo [INFO] Environnement virtuel introuvable, création... + "%PYTHON_EXEC%" -m venv "%ENV_NAME%" + call "%ENV_PATH%\Scripts\activate.bat" + echo [INFO] Installation des dépendances... + pip install --upgrade pip + pip install -r "%REQUIREMENTS%" +) else ( + echo [INFO] Environnement virtuel trouvé. +) + +REM Activate and launch VS Code +call "%ENV_PATH%\Scripts\activate.bat" +echo [INFO] Lancement de VS Code... +start code "%~dp0" + +exit /b 0 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..afb6c8f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +PyQt5 +pyinstaller \ No newline at end of file diff --git a/utils/paths.py b/utils/paths.py new file mode 100644 index 0000000..c8203f1 --- /dev/null +++ b/utils/paths.py @@ -0,0 +1,16 @@ +from os import path +import sys +from pathlib import Path + +def resource_path(relative_path: str) -> Path: + """ + Get absolute path to resource, works for dev and for PyInstaller bundle. + + PyInstaller stores bundled files in _MEIPASS folder. + """ + try: + base_path = Path(sys._MEIPASS) # PyInstaller temp folder + except AttributeError: + base_path = Path(__file__).parent.parent # Dev environment: source/ folder + + return path.join(base_path, relative_path) \ No newline at end of file