From acbcb89aa7c170926548bbad3ce520765a895dfa Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Wed, 10 Jun 2026 10:25:02 +0200 Subject: [PATCH] mkpyproject.sh verwendet jetzt auch die templates aus dem Ordner --- bin/mkpyproject.sh | 493 +++------------------------------------------ 1 file changed, 33 insertions(+), 460 deletions(-) diff --git a/bin/mkpyproject.sh b/bin/mkpyproject.sh index 433ab28..44360ee 100644 --- a/bin/mkpyproject.sh +++ b/bin/mkpyproject.sh @@ -11,6 +11,10 @@ set -e +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/setenv.sh" + +TMPL_DIR="$TOOLS_TEMPLATES/mkpyproject" + # --- Argumente ------------------------------------------------------- PROJECT_NAME="${1:-}" TARGET_BASE="${2:-.}" @@ -23,6 +27,7 @@ fi PROJECT_UPPER="${PROJECT_NAME^^}" TARGET_DIR="$TARGET_BASE/$PROJECT_NAME" +YEAR="$(date +%Y)" if [ -d "$TARGET_DIR" ]; then echo "FEHLER: Verzeichnis '$TARGET_DIR' existiert bereits." @@ -35,483 +40,51 @@ 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" - +for d in bin cfg data doc examples lib log results tests; do + mkdir -p "$TARGET_DIR/$d" +done 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 +# --- Hilfsfunktion: Template kopieren mit Ersetzung ------------------ +copy_tmpl() { + local rel="$1" + sed -e "s/__PROJECT_NAME__/$PROJECT_NAME/g" \ + -e "s/__PROJECT_UPPER__/$PROJECT_UPPER/g" \ + -e "s/__YEAR__/$YEAR/g" \ + "$TMPL_DIR/$rel" > "$TARGET_DIR/$rel" +} +# --- bin/ Skripte ---------------------------------------------------- +copy_tmpl "bin/setenv.bat" +copy_tmpl "bin/setenv.sh" +copy_tmpl "bin/install_py.bat" +copy_tmpl "bin/install_py.sh" +copy_tmpl "bin/activate_venv.bat" +copy_tmpl "bin/activate_venv.sh" +copy_tmpl "bin/get_cmd.bat" +copy_tmpl "bin/get_cmd.sh" +chmod +x "$TARGET_DIR/bin/"*.sh 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 - +# --- Weitere Dateien ------------------------------------------------- +copy_tmpl ".gitignore" 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 - +copy_tmpl "LICENSE" 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 - +copy_tmpl "README.md" 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 - +copy_tmpl "requirements.txt" 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 "FERTIG! Projekt '$PROJECT_NAME' wurde erstellt." echo "================================================================" echo "" -echo "Nächste Schritte:" +echo "Naechste Schritte:" echo " Windows: bin\install_py.bat" echo " Linux: bash bin/install_py.sh" echo ""