commit e94d05b0ed089fca24528900594473fd417ffac8 Author: Michael Stangl Date: Tue Apr 28 17:26:15 2026 +0200 Erste Fassung eines einfache Projektwerkzeugs diff --git a/README.md b/README.md new file mode 100644 index 0000000..4568282 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +- Sammlung einiger nützlicher Werkzeuge für die Entwicklung diff --git a/bin/mkpyproject.bat b/bin/mkpyproject.bat new file mode 100644 index 0000000..82bc41d --- /dev/null +++ b/bin/mkpyproject.bat @@ -0,0 +1,38 @@ +@echo off +REM ================================================================ +REM mkpyproject.bat - Standard Python Projekt Template erstellen +REM ================================================================ +REM Verwendung: mkpyproject.bat [zielverzeichnis] +REM ================================================================ + +REM Pfad zum Python-Skript (relativ zu diesem Skript) +set "TOOLS_LIB=%~dp0..\lib" + +REM Pruefen ob Python verfuegbar ist +py --version >nul 2>&1 +if errorlevel 1 ( + python --version >nul 2>&1 + if errorlevel 1 ( + echo. + echo ================================================================ + echo FEHLER: Kein Python-Interpreter gefunden! + echo ================================================================ + echo. + echo Weder 'py' noch 'python' konnten ausgefuehrt werden. + echo. + echo Bitte sicherstellen, dass Python installiert ist und der + echo Pfad zur python.exe in der PATH-Umgebungsvariable enthalten ist. + echo. + echo 1. Python installieren: https://www.python.org/downloads/ + echo 2. Bei der Installation "Add Python to PATH" aktivieren + echo 3. Oder manuell den Pfad hinzufuegen: + echo set PATH=%%PATH%%;C:\Python312 + echo. + echo ================================================================ + exit /b 1 + ) + python "%TOOLS_LIB%\mkpyproject.py" %* + goto :eof +) + +py "%TOOLS_LIB%\mkpyproject.py" %* diff --git a/bin/mkpyproject.sh b/bin/mkpyproject.sh new file mode 100644 index 0000000..433ab28 --- /dev/null +++ b/bin/mkpyproject.sh @@ -0,0 +1,517 @@ +#!/usr/bin/env bash +# ================================================================ +# mkpyproject.sh - Standard Python Projekt Template erstellen +# ================================================================ +# Verwendung: mkpyproject.sh [zielverzeichnis] +# +# Beispiel: +# mkpyproject.sh myapp +# mkpyproject.sh myapp /c/10-Develop/gitrepos +# ================================================================ + +set -e + +# --- Argumente ------------------------------------------------------- +PROJECT_NAME="${1:-}" +TARGET_BASE="${2:-.}" + +if [ -z "$PROJECT_NAME" ]; then + echo "FEHLER: Kein Projektname angegeben." + echo "Verwendung: mkpyproject.sh [zielverzeichnis]" + exit 1 +fi + +PROJECT_UPPER="${PROJECT_NAME^^}" +TARGET_DIR="$TARGET_BASE/$PROJECT_NAME" + +if [ -d "$TARGET_DIR" ]; then + echo "FEHLER: Verzeichnis '$TARGET_DIR' existiert bereits." + exit 1 +fi + +echo "================================================================" +echo "Erstelle Python-Projekt: $PROJECT_NAME" +echo "Zielverzeichnis: $TARGET_DIR" +echo "================================================================" + +# --- Verzeichnisse --------------------------------------------------- +mkdir -p "$TARGET_DIR/bin" +mkdir -p "$TARGET_DIR/cfg" +mkdir -p "$TARGET_DIR/data" +mkdir -p "$TARGET_DIR/doc" +mkdir -p "$TARGET_DIR/examples" +mkdir -p "$TARGET_DIR/lib" +mkdir -p "$TARGET_DIR/log" +mkdir -p "$TARGET_DIR/results" +mkdir -p "$TARGET_DIR/tests" + +echo "[OK] Verzeichnisse angelegt" + +# --- bin/setenv.bat -------------------------------------------------- +cat > "$TARGET_DIR/bin/setenv.bat" << ENDOFFILE +@echo off + +REM ================================================================ +REM ${PROJECT_UPPER} - Umgebungsvariablen Setup +REM ================================================================ + +echo Setting up environment variables for ${PROJECT_UPPER} ... + +REM Basis-Projektpfad (aktueller Ordner) +set "PROJECT=%~dp0.." +if "%PROJECT:~-6%"=="bin\.." set "PROJECT=%PROJECT:~0,-6%" +if "%PROJECT:~-1%"=="\" set "PROJECT=%PROJECT:~0,-1%" + +REM Pfade für verschiedene Komponenten +set "PV_BIN=%PROJECT%\bin" +set "PV_LIB=%PROJECT%\lib" +set "PV_DATA=%PROJECT%\data" +set "PV_CFG=%PROJECT%\cfg" +set "PV_LOG=%PROJECT%\log" +set "PV_TESTS=%PROJECT%\tests" +set "PV_RESULTS=%PROJECT%\results" +set "PV_EXAMPLES=%PROJECT%\examples" + +REM Python-Pfad erweitern (nur wenn noch nicht vorhanden) +echo %PYTHONPATH% | find /i "%PV_LIB%" >nul +if errorlevel 1 ( + set "PYTHONPATH=%PV_LIB%;%PYTHONPATH%" +) + +REM Ordner erstellen falls sie nicht existieren +if not exist "%PV_BIN%" mkdir "%PV_BIN%" +if not exist "%PV_CFG%" mkdir "%PV_CFG%" +if not exist "%PV_LIB%" mkdir "%PV_LIB%" +if not exist "%PV_DATA%" mkdir "%PV_DATA%" +if not exist "%PV_LOG%" mkdir "%PV_LOG%" +if not exist "%PV_RESULTS%" mkdir "%PV_RESULTS%" +if not exist "%PV_EXAMPLES%" mkdir "%PV_EXAMPLES%" + +REM Umgebungsvariablen anzeigen +echo. +echo ================================================================ +echo ${PROJECT_UPPER} ENVIRONMENT SETUP COMPLETE +echo ================================================================ +echo PROJECT = %PROJECT% +echo PV_BIN = %PV_BIN% +echo PV_CFG = %PV_CFG% +echo PV_LIB = %PV_LIB% +echo PV_DATA = %PV_DATA% +echo PV_RESULTS = %PV_RESULTS% +echo PV_LOG = %PV_LOG% +echo PV_EXAMPLES = %PV_EXAMPLES% +echo PYTHONPATH = %PYTHONPATH% +echo ================================================================ +echo. + +REM Optionally keep window open +if "%1"=="--keep-open" pause +ENDOFFILE + +# --- bin/setenv.sh --------------------------------------------------- +cat > "$TARGET_DIR/bin/setenv.sh" << ENDOFFILE +#!/usr/bin/env bash +# ================================================================ +# ${PROJECT_UPPER} - Umgebungsvariablen Setup +# ================================================================ +# Dieses Skript muss gesourct werden: source bin/setenv.sh +# ================================================================ + +echo "Setting up environment variables for ${PROJECT_UPPER} ..." + +# Basis-Projektpfad (übergeordnetes Verzeichnis von bin/) +SCRIPT_DIR="\$(cd "\$(dirname "\${BASH_SOURCE[0]}")" && pwd)" +export PROJECT="\$(cd "\$SCRIPT_DIR/.." && pwd)" + +# Pfade für verschiedene Komponenten +export PV_BIN="\$PROJECT/bin" +export PV_LIB="\$PROJECT/lib" +export PV_DATA="\$PROJECT/data" +export PV_CFG="\$PROJECT/cfg" +export PV_LOG="\$PROJECT/log" +export PV_TESTS="\$PROJECT/tests" +export PV_RESULTS="\$PROJECT/results" +export PV_EXAMPLES="\$PROJECT/examples" + +# Python-Pfad erweitern (nur wenn noch nicht vorhanden) +if [[ ":\$PYTHONPATH:" != *":\$PV_LIB:"* ]]; then + export PYTHONPATH="\$PV_LIB:\$PYTHONPATH" +fi + +# Ordner erstellen falls sie nicht existieren +mkdir -p "\$PV_BIN" "\$PV_CFG" "\$PV_LIB" "\$PV_DATA" "\$PV_LOG" "\$PV_RESULTS" "\$PV_EXAMPLES" + +echo "" +echo "================================================================" +echo "${PROJECT_UPPER} ENVIRONMENT SETUP COMPLETE" +echo "================================================================" +echo "PROJECT = \$PROJECT" +echo "PV_BIN = \$PV_BIN" +echo "PV_CFG = \$PV_CFG" +echo "PV_LIB = \$PV_LIB" +echo "PV_DATA = \$PV_DATA" +echo "PV_RESULTS = \$PV_RESULTS" +echo "PV_LOG = \$PV_LOG" +echo "PV_EXAMPLES = \$PV_EXAMPLES" +echo "PYTHONPATH = \$PYTHONPATH" +echo "================================================================" +echo "" +ENDOFFILE + +# --- bin/install_py.bat ---------------------------------------------- +cat > "$TARGET_DIR/bin/install_py.bat" << ENDOFFILE +@echo off +REM ================================================================ +REM ${PROJECT_UPPER} - Python Virtual Environment einrichten +REM ================================================================ + +call "%~dp0setenv.bat" + +if not exist "%PROJECT%\.venv" ( + echo Initialisiere Python virtual environment... + py -m venv "%PROJECT%\.venv" --upgrade-deps + echo Erfolgreich. + + call "%PROJECT%\.venv\Scripts\activate.bat" + echo Installiere erforderliche Python Packages... + pip install -r "%PROJECT%\requirements.txt" -q + echo Erfolgreich. + deactivate +) else ( + echo Erforderliche Python Packages bereits installiert! +) +ENDOFFILE + +# --- bin/install_py.sh ----------------------------------------------- +cat > "$TARGET_DIR/bin/install_py.sh" << ENDOFFILE +#!/usr/bin/env bash +# ================================================================ +# ${PROJECT_UPPER} - Python Virtual Environment einrichten +# ================================================================ + +SCRIPT_DIR="\$(cd "\$(dirname "\${BASH_SOURCE[0]}")" && pwd)" +source "\$SCRIPT_DIR/setenv.sh" + +if [ ! -d "\$PROJECT/.venv" ]; then + echo "Initialisiere Python virtual environment..." + python3 -m venv "\$PROJECT/.venv" --upgrade-deps + echo "Erfolgreich." + + source "\$PROJECT/.venv/bin/activate" + echo "Installiere erforderliche Python Packages..." + pip install -r "\$PROJECT/requirements.txt" -q + echo "Erfolgreich." + deactivate +else + echo "Erforderliche Python Packages bereits installiert!" +fi +ENDOFFILE + +# --- bin/activate_venv.bat ------------------------------------------- +cat > "$TARGET_DIR/bin/activate_venv.bat" << ENDOFFILE +@echo off +REM ================================================================ +REM ${PROJECT_UPPER} - Python Virtual Environment aktivieren +REM ================================================================ + +call "%~dp0setenv.bat" + +if not exist "%PROJECT%\.venv" ( + echo FEHLER: Virtual environment nicht gefunden. + echo Bitte zuerst bin\install_py.bat ausfuehren. + exit /b 1 +) + +call "%PROJECT%\.venv\Scripts\activate.bat" +echo Virtuelle Umgebung aktiviert. +echo Python-Version: +python --version +echo. +echo Installierte Pakete: +pip list +ENDOFFILE + +# --- bin/activate_venv.sh -------------------------------------------- +cat > "$TARGET_DIR/bin/activate_venv.sh" << ENDOFFILE +#!/usr/bin/env bash +# ================================================================ +# ${PROJECT_UPPER} - Python Virtual Environment aktivieren +# ================================================================ +# Dieses Skript muss gesourct werden: source bin/activate_venv.sh +# ================================================================ + +SCRIPT_DIR="\$(cd "\$(dirname "\${BASH_SOURCE[0]}")" && pwd)" +source "\$SCRIPT_DIR/setenv.sh" + +if [ ! -d "\$PROJECT/.venv" ]; then + echo "FEHLER: Virtual environment nicht gefunden." + echo "Bitte zuerst bin/install_py.sh ausfuehren." + return 1 +fi + +source "\$PROJECT/.venv/bin/activate" +echo "Virtuelle Umgebung aktiviert." +echo "Python-Version:" +python --version +echo "" +echo "Installierte Pakete:" +pip list +ENDOFFILE + +# --- bin/get_cmd.bat ------------------------------------------------- +cat > "$TARGET_DIR/bin/get_cmd.bat" << ENDOFFILE +@echo off +REM ================================================================ +REM ${PROJECT_UPPER} - Shell mit gesetzten Umgebungsvariablen öffnen +REM ================================================================ + +call "%~dp0setenv.bat" +start cmd /k "echo ${PROJECT_UPPER} Umgebung aktiv. && echo PROJECT=%PROJECT%" +ENDOFFILE + +# --- bin/get_cmd.sh -------------------------------------------------- +cat > "$TARGET_DIR/bin/get_cmd.sh" << ENDOFFILE +#!/usr/bin/env bash +# ================================================================ +# ${PROJECT_UPPER} - Shell mit gesetzten Umgebungsvariablen öffnen +# ================================================================ +# Verwendung: source bin/get_cmd.sh +# ================================================================ + +SCRIPT_DIR="\$(cd "\$(dirname "\${BASH_SOURCE[0]}")" && pwd)" +source "\$SCRIPT_DIR/setenv.sh" + +exec "\$SHELL" +ENDOFFILE + +echo "[OK] bin/ Skripte erstellt" + +# --- .gitignore ------------------------------------------------------ +cat > "$TARGET_DIR/.gitignore" << 'ENDOFFILE' +# ---> Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +*.manifest +*.spec +pip-log.txt +pip-delete-this-directory.txt +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ +*.mo +*.pot +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +.spyderproject +.spyproject +.ropeproject +.mypy_cache/ +.dmypy.json +dmypy.json +.pyre/ +.pytype/ +cython_debug/ +.pdm.toml +__pypackages__/ +/site-packages +/site +.ipynb_checkpoints +profile_default/ +ipython_config.py + +# Benutzerdefiniert +/data +/work +/log +/results +ENDOFFILE + +echo "[OK] .gitignore erstellt" + +# --- LICENSE --------------------------------------------------------- +YEAR=$(date +%Y) +cat > "$TARGET_DIR/LICENSE" << ENDOFFILE +MIT License + +Copyright (c) $YEAR Michael Stangl, on GitHub mistamichael + +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. +ENDOFFILE + +echo "[OK] LICENSE erstellt" + +# --- README.md ------------------------------------------------------- +cat > "$TARGET_DIR/README.md" << ENDOFFILE +# ${PROJECT_NAME} + +> Kurze Projektbeschreibung hier eintragen. + +## Projektstruktur + +\`\`\` +${PROJECT_NAME}/ +├── bin/ # Skripte zur Umgebungsverwaltung +│ ├── setenv.bat/.sh # Umgebungsvariablen setzen +│ ├── install_py.bat/.sh # venv erstellen + pip install +│ ├── activate_venv.bat/.sh # venv aktivieren +│ └── get_cmd.bat/.sh # Shell mit Umgebung öffnen +├── cfg/ # Konfigurationsdateien (INI/JSON) +├── data/ # Eingabedaten (nicht im Git) +├── doc/ # Dokumentation +├── examples/ # Beispieldateien +├── lib/ # Python-Quellcode / Bibliothek +├── log/ # Log-Dateien (nicht im Git) +├── results/ # Ergebnisse / Ausgaben (nicht im Git) +├── tests/ # Unit Tests +├── .gitignore +├── LICENSE +├── README.md +└── requirements.txt +\`\`\` + +## Umgebungsvariablen + +| Variable | Beschreibung | +|----------------|---------------------------| +| \`PROJECT\` | Wurzelverzeichnis | +| \`PV_BIN\` | Skriptverzeichnis | +| \`PV_LIB\` | Python-Quellcode | +| \`PV_CFG\` | Konfigurationsdateien | +| \`PV_DATA\` | Eingabedaten | +| \`PV_LOG\` | Log-Dateien | +| \`PV_RESULTS\` | Ergebnisse | +| \`PV_EXAMPLES\` | Beispieldateien | +| \`PYTHONPATH\` | Erweitert um \`PV_LIB\` | + +## Installation + +### Voraussetzungen + +- Python 3.10 oder höher + +### Setup (Windows) + +\`\`\`bat +bin\install_py.bat +\`\`\` + +### Setup (Linux / macOS) + +\`\`\`bash +bash bin/install_py.sh +\`\`\` + +## Nutzung + +### Umgebung setzen + +\`\`\`bat +bin\setenv.bat # Windows +\`\`\` +\`\`\`bash +source bin/setenv.sh # Linux / macOS +\`\`\` + +### Shell mit gesetzten Variablen öffnen + +\`\`\`bat +bin\get_cmd.bat # Windows +\`\`\` +\`\`\`bash +source bin/get_cmd.sh # Linux / macOS +\`\`\` + +### venv aktivieren + +\`\`\`bat +bin\activate_venv.bat # Windows +\`\`\` +\`\`\`bash +source bin/activate_venv.sh # Linux / macOS +\`\`\` + +## Lizenz + +MIT License — siehe [LICENSE](LICENSE) + +## Autor + +Michael Stangl (GitHub: mistamichael) +ENDOFFILE + +echo "[OK] README.md erstellt" + +# --- requirements.txt ------------------------------------------------ +cat > "$TARGET_DIR/requirements.txt" << 'ENDOFFILE' +# Python-Abhängigkeiten +# Installieren mit: pip install -r requirements.txt + +# Beispiel-Abhängigkeiten – anpassen nach Bedarf: +# pydantic >= 2.0.0 +# pytest >= 9.0.0 +ENDOFFILE + +echo "[OK] requirements.txt erstellt" + +# --- Berechtigungen für .sh-Dateien ---------------------------------- +chmod +x "$TARGET_DIR/bin/"*.sh + +echo "" +echo "================================================================" +echo "FERTIG! Projekt '${PROJECT_NAME}' wurde erstellt." +echo "================================================================" +echo "" +echo "Nächste Schritte:" +echo " Windows: bin\install_py.bat" +echo " Linux: bash bin/install_py.sh" +echo "" diff --git a/lib/mkpyproject.py b/lib/mkpyproject.py new file mode 100644 index 0000000..9d8d107 --- /dev/null +++ b/lib/mkpyproject.py @@ -0,0 +1,557 @@ +#!/usr/bin/env python3 +""" +mkpyproject.py - Standard Python Projekt Template erstellen + +Verwendung: + python mkpyproject.py [zielverzeichnis] + +Beispiel: + python mkpyproject.py myapp + python mkpyproject.py myapp C:\\10-Develop\\gitrepos +""" + +import os +import sys +import stat +import argparse +from datetime import datetime +from pathlib import Path + + +# ===================================================================== +# Datei-Templates +# ===================================================================== + +def tpl_setenv_bat(name_upper: str) -> str: + return f"""@echo off + +REM ================================================================ +REM {name_upper} - Umgebungsvariablen Setup +REM ================================================================ + +echo Setting up environment variables for {name_upper} ... + +REM Basis-Projektpfad (aktueller Ordner) +set "PROJECT=%~dp0.." +if "%PROJECT:~-6%"=="bin\\.." set "PROJECT=%PROJECT:~0,-6%" +if "%PROJECT:~-1%"=="\\" set "PROJECT=%PROJECT:~0,-1%" + +REM Pfade fuer verschiedene Komponenten +set "PV_BIN=%PROJECT%\\bin" +set "PV_LIB=%PROJECT%\\lib" +set "PV_DATA=%PROJECT%\\data" +set "PV_CFG=%PROJECT%\\cfg" +set "PV_LOG=%PROJECT%\\log" +set "PV_TESTS=%PROJECT%\\tests" +set "PV_RESULTS=%PROJECT%\\results" +set "PV_EXAMPLES=%PROJECT%\\examples" + +REM Python-Pfad erweitern (nur wenn noch nicht vorhanden) +echo %PYTHONPATH% | find /i "%PV_LIB%" >nul +if errorlevel 1 ( + set "PYTHONPATH=%PV_LIB%;%PYTHONPATH%" +) + +REM Ordner erstellen falls sie nicht existieren +if not exist "%PV_BIN%" mkdir "%PV_BIN%" +if not exist "%PV_CFG%" mkdir "%PV_CFG%" +if not exist "%PV_LIB%" mkdir "%PV_LIB%" +if not exist "%PV_DATA%" mkdir "%PV_DATA%" +if not exist "%PV_LOG%" mkdir "%PV_LOG%" +if not exist "%PV_RESULTS%" mkdir "%PV_RESULTS%" +if not exist "%PV_EXAMPLES%" mkdir "%PV_EXAMPLES%" + +REM Umgebungsvariablen anzeigen +echo. +echo ================================================================ +echo {name_upper} ENVIRONMENT SETUP COMPLETE +echo ================================================================ +echo PROJECT = %PROJECT% +echo PV_BIN = %PV_BIN% +echo PV_CFG = %PV_CFG% +echo PV_LIB = %PV_LIB% +echo PV_DATA = %PV_DATA% +echo PV_RESULTS = %PV_RESULTS% +echo PV_LOG = %PV_LOG% +echo PV_EXAMPLES = %PV_EXAMPLES% +echo PYTHONPATH = %PYTHONPATH% +echo ================================================================ +echo. + +REM Optionally keep window open +if "%1"=="--keep-open" pause +""" + + +def tpl_setenv_sh(name_upper: str) -> str: + return f"""#!/usr/bin/env bash +# ================================================================ +# {name_upper} - Umgebungsvariablen Setup +# ================================================================ +# Dieses Skript muss gesourct werden: source bin/setenv.sh +# ================================================================ + +echo "Setting up environment variables for {name_upper} ..." + +# Basis-Projektpfad (uebergeordnetes Verzeichnis von bin/) +SCRIPT_DIR="$(cd "$(dirname "${{BASH_SOURCE[0]}}")" && pwd)" +export PROJECT="$(cd "$SCRIPT_DIR/.." && pwd)" + +# Pfade fuer verschiedene Komponenten +export PV_BIN="$PROJECT/bin" +export PV_LIB="$PROJECT/lib" +export PV_DATA="$PROJECT/data" +export PV_CFG="$PROJECT/cfg" +export PV_LOG="$PROJECT/log" +export PV_TESTS="$PROJECT/tests" +export PV_RESULTS="$PROJECT/results" +export PV_EXAMPLES="$PROJECT/examples" + +# Python-Pfad erweitern (nur wenn noch nicht vorhanden) +if [[ ":$PYTHONPATH:" != *":$PV_LIB:"* ]]; then + export PYTHONPATH="$PV_LIB:$PYTHONPATH" +fi + +# Ordner erstellen falls sie nicht existieren +mkdir -p "$PV_BIN" "$PV_CFG" "$PV_LIB" "$PV_DATA" "$PV_LOG" "$PV_RESULTS" "$PV_EXAMPLES" + +echo "" +echo "================================================================" +echo "{name_upper} ENVIRONMENT SETUP COMPLETE" +echo "================================================================" +echo "PROJECT = $PROJECT" +echo "PV_BIN = $PV_BIN" +echo "PV_CFG = $PV_CFG" +echo "PV_LIB = $PV_LIB" +echo "PV_DATA = $PV_DATA" +echo "PV_RESULTS = $PV_RESULTS" +echo "PV_LOG = $PV_LOG" +echo "PV_EXAMPLES = $PV_EXAMPLES" +echo "PYTHONPATH = $PYTHONPATH" +echo "================================================================" +echo "" +""" + + +def tpl_install_py_bat(name_upper: str) -> str: + return f"""@echo off +REM ================================================================ +REM {name_upper} - Python Virtual Environment einrichten +REM ================================================================ + +call "%~dp0setenv.bat" + +if not exist "%PROJECT%\\.venv" ( + echo Initialisiere Python virtual environment... + py -m venv "%PROJECT%\\.venv" --upgrade-deps + echo Erfolgreich. + + call "%PROJECT%\\.venv\\Scripts\\activate.bat" + echo Installiere erforderliche Python Packages... + pip install -r "%PROJECT%\\requirements.txt" -q + echo Erfolgreich. + deactivate +) else ( + echo Erforderliche Python Packages bereits installiert! +) +""" + + +def tpl_install_py_sh(name_upper: str) -> str: + return f"""#!/usr/bin/env bash +# ================================================================ +# {name_upper} - Python Virtual Environment einrichten +# ================================================================ + +SCRIPT_DIR="$(cd "$(dirname "${{BASH_SOURCE[0]}}")" && pwd)" +source "$SCRIPT_DIR/setenv.sh" + +if [ ! -d "$PROJECT/.venv" ]; then + echo "Initialisiere Python virtual environment..." + python3 -m venv "$PROJECT/.venv" --upgrade-deps + echo "Erfolgreich." + + source "$PROJECT/.venv/bin/activate" + echo "Installiere erforderliche Python Packages..." + pip install -r "$PROJECT/requirements.txt" -q + echo "Erfolgreich." + deactivate +else + echo "Erforderliche Python Packages bereits installiert!" +fi +""" + + +def tpl_activate_venv_bat(name_upper: str) -> str: + return f"""@echo off +REM ================================================================ +REM {name_upper} - Python Virtual Environment aktivieren +REM ================================================================ + +call "%~dp0setenv.bat" + +if not exist "%PROJECT%\\.venv" ( + echo FEHLER: Virtual environment nicht gefunden. + echo Bitte zuerst bin\\install_py.bat ausfuehren. + exit /b 1 +) + +call "%PROJECT%\\.venv\\Scripts\\activate.bat" +echo Virtuelle Umgebung aktiviert. +echo Python-Version: +python --version +echo. +echo Installierte Pakete: +pip list +""" + + +def tpl_activate_venv_sh(name_upper: str) -> str: + return f"""#!/usr/bin/env bash +# ================================================================ +# {name_upper} - Python Virtual Environment aktivieren +# ================================================================ +# Dieses Skript muss gesourct werden: source bin/activate_venv.sh +# ================================================================ + +SCRIPT_DIR="$(cd "$(dirname "${{BASH_SOURCE[0]}}")" && pwd)" +source "$SCRIPT_DIR/setenv.sh" + +if [ ! -d "$PROJECT/.venv" ]; then + echo "FEHLER: Virtual environment nicht gefunden." + echo "Bitte zuerst bin/install_py.sh ausfuehren." + return 1 +fi + +source "$PROJECT/.venv/bin/activate" +echo "Virtuelle Umgebung aktiviert." +echo "Python-Version:" +python --version +echo "" +echo "Installierte Pakete:" +pip list +""" + + +def tpl_get_cmd_bat(name_upper: str) -> str: + return f"""@echo off +REM ================================================================ +REM {name_upper} - Shell mit gesetzten Umgebungsvariablen oeffnen +REM ================================================================ + +call "%~dp0setenv.bat" +start cmd /k "echo {name_upper} Umgebung aktiv. && echo PROJECT=%PROJECT%" +""" + + +def tpl_get_cmd_sh(name_upper: str) -> str: + return f"""#!/usr/bin/env bash +# ================================================================ +# {name_upper} - Shell mit gesetzten Umgebungsvariablen oeffnen +# ================================================================ +# Verwendung: source bin/get_cmd.sh +# ================================================================ + +SCRIPT_DIR="$(cd "$(dirname "${{BASH_SOURCE[0]}}")" && pwd)" +source "$SCRIPT_DIR/setenv.sh" + +exec "$SHELL" +""" + + +GITIGNORE = """\ +# ---> Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +*.manifest +*.spec +pip-log.txt +pip-delete-this-directory.txt +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ +*.mo +*.pot +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +.spyderproject +.spyproject +.ropeproject +.mypy_cache/ +.dmypy.json +dmypy.json +.pyre/ +.pytype/ +cython_debug/ +.pdm.toml +__pypackages__/ +/site-packages +/site +.ipynb_checkpoints +profile_default/ +ipython_config.py + +# Benutzerdefiniert +/data +/work +/log +/results +""" + + +def tpl_license(year: int) -> str: + return f"""MIT License + +Copyright (c) {year} Michael Stangl, on GitHub mistamichael + +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. +""" + + +def tpl_readme(project_name: str) -> str: + return f"""# {project_name} + +> Kurze Projektbeschreibung hier eintragen. + +## Projektstruktur + +``` +{project_name}/ +├── bin/ # Skripte zur Umgebungsverwaltung +│ ├── setenv.bat/.sh # Umgebungsvariablen setzen +│ ├── install_py.bat/.sh # venv erstellen + pip install +│ ├── activate_venv.bat/.sh # venv aktivieren +│ └── get_cmd.bat/.sh # Shell mit Umgebung oeffnen +├── cfg/ # Konfigurationsdateien (INI/JSON) +├── data/ # Eingabedaten (nicht im Git) +├── doc/ # Dokumentation +├── examples/ # Beispieldateien +├── lib/ # Python-Quellcode / Bibliothek +├── log/ # Log-Dateien (nicht im Git) +├── results/ # Ergebnisse / Ausgaben (nicht im Git) +├── tests/ # Unit Tests +├── .gitignore +├── LICENSE +├── README.md +└── requirements.txt +``` + +## Umgebungsvariablen + +| Variable | Beschreibung | +|----------------|---------------------------| +| `PROJECT` | Wurzelverzeichnis | +| `PV_BIN` | Skriptverzeichnis | +| `PV_LIB` | Python-Quellcode | +| `PV_CFG` | Konfigurationsdateien | +| `PV_DATA` | Eingabedaten | +| `PV_LOG` | Log-Dateien | +| `PV_RESULTS` | Ergebnisse | +| `PV_EXAMPLES` | Beispieldateien | +| `PYTHONPATH` | Erweitert um `PV_LIB` | + +## Installation + +### Voraussetzungen + +- Python 3.10 oder hoeher + +### Setup (Windows) + +```bat +bin\\install_py.bat +``` + +### Setup (Linux / macOS) + +```bash +bash bin/install_py.sh +``` + +## Nutzung + +### Umgebung setzen + +```bat +bin\\setenv.bat # Windows +``` +```bash +source bin/setenv.sh # Linux / macOS +``` + +### Shell mit gesetzten Variablen oeffnen + +```bat +bin\\get_cmd.bat # Windows +``` +```bash +source bin/get_cmd.sh # Linux / macOS +``` + +### venv aktivieren + +```bat +bin\\activate_venv.bat # Windows +``` +```bash +source bin/activate_venv.sh # Linux / macOS +``` + +## Lizenz + +MIT License — siehe [LICENSE](LICENSE) + +## Autor + +Michael Stangl (GitHub: mistamichael) +""" + + +REQUIREMENTS = """\ +# Python-Abhaengigkeiten +# Installieren mit: pip install -r requirements.txt + +# Beispiel-Abhaengigkeiten – anpassen nach Bedarf: +# pydantic >= 2.0.0 +# pytest >= 9.0.0 +""" + + +# ===================================================================== +# Hauptlogik +# ===================================================================== + +DIRECTORIES = ["bin", "cfg", "data", "doc", "examples", "lib", "log", "results", "tests"] + + +def create_project(project_name: str, target_base: str) -> None: + name_upper = project_name.upper() + year = datetime.now().year + target = Path(target_base) / project_name + + if target.exists(): + print(f"FEHLER: Verzeichnis '{target}' existiert bereits.") + sys.exit(1) + + print("=" * 64) + print(f"Erstelle Python-Projekt: {project_name}") + print(f"Zielverzeichnis: {target}") + print("=" * 64) + + # Verzeichnisse + for d in DIRECTORIES: + (target / d).mkdir(parents=True, exist_ok=True) + print("[OK] Verzeichnisse angelegt") + + # bin/ Skripte + files = { + "bin/setenv.bat": tpl_setenv_bat(name_upper), + "bin/setenv.sh": tpl_setenv_sh(name_upper), + "bin/install_py.bat": tpl_install_py_bat(name_upper), + "bin/install_py.sh": tpl_install_py_sh(name_upper), + "bin/activate_venv.bat": tpl_activate_venv_bat(name_upper), + "bin/activate_venv.sh": tpl_activate_venv_sh(name_upper), + "bin/get_cmd.bat": tpl_get_cmd_bat(name_upper), + "bin/get_cmd.sh": tpl_get_cmd_sh(name_upper), + } + for rel_path, content in files.items(): + p = target / rel_path + p.write_text(content, encoding="utf-8") + if rel_path.endswith(".sh"): + p.chmod(p.stat().st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) + print("[OK] bin/ Skripte erstellt") + + # .gitignore + (target / ".gitignore").write_text(GITIGNORE, encoding="utf-8") + print("[OK] .gitignore erstellt") + + # LICENSE + (target / "LICENSE").write_text(tpl_license(year), encoding="utf-8") + print("[OK] LICENSE erstellt") + + # README.md + (target / "README.md").write_text(tpl_readme(project_name), encoding="utf-8") + print("[OK] README.md erstellt") + + # requirements.txt + (target / "requirements.txt").write_text(REQUIREMENTS, encoding="utf-8") + print("[OK] requirements.txt erstellt") + + print() + print("=" * 64) + print(f"FERTIG! Projekt '{project_name}' wurde erstellt.") + print("=" * 64) + print() + print("Naechste Schritte:") + print(" Windows: bin\\install_py.bat") + print(" Linux: bash bin/install_py.sh") + print() + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Standard Python Projekt Template erstellen" + ) + parser.add_argument("projektname", help="Name des neuen Projekts") + parser.add_argument( + "zielverzeichnis", + nargs="?", + default=".", + help="Zielverzeichnis (Standard: aktuelles Verzeichnis)", + ) + args = parser.parse_args() + create_project(args.projektname, args.zielverzeichnis) + + +if __name__ == "__main__": + main()