v1.0.1
This commit is contained in:
parent
0221b2feb4
commit
526995cb24
@ -1,8 +1,10 @@
|
||||
# APP_MODE ungenutzt im Template
|
||||
APP_MODE=
|
||||
# APP_MODE ungenutzt im Template (production/ development)
|
||||
APP_MODE=development
|
||||
|
||||
# LOGLEVEL: "CRITICAL"- "ERROR" - "WARNING" - "INFO" - "DEBUG"
|
||||
LOGLEVEL=INFO
|
||||
|
||||
# Pfad zum log z.B log/template.log
|
||||
# Pfad zum log z.B log/template.log (relativ und absolut beachten!)
|
||||
# Pfad ist ausgehend vom Ort der run.py und Verzeichnisse werden automatisch erstellt.
|
||||
# DEFAULT: log/template.log
|
||||
LOGFILE=log/template.log
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -178,6 +178,7 @@ cython_debug/
|
||||
# Custom:
|
||||
logs/
|
||||
log/
|
||||
media/
|
||||
release/
|
||||
#media/
|
||||
*.zip
|
||||
|
||||
|
12
.vscode/settings.json → .vscode/settings.jsonc
vendored
12
.vscode/settings.json → .vscode/settings.jsonc
vendored
@ -1,4 +1,5 @@
|
||||
{
|
||||
{ // Bitte daran denken das Kommentare eigentlich nicht von json unterstützt werden :-)
|
||||
// Das funktioniert hier nur in Microsofts jsonc im VS-Code!
|
||||
"python.linting.enabled": true,
|
||||
"python.linting.pylintEnabled": true,
|
||||
"python.linting.mypyEnabled": true,
|
||||
@ -15,10 +16,15 @@
|
||||
|
||||
// Markdown für das Entfernen von abschliessenden Leerzeichen rausnehmen:
|
||||
"[markdown]": {
|
||||
"files.trimTrailingWhitespace": false
|
||||
"files.trimTrailingWhitespace": false,
|
||||
"editor.wordWrap": "off"
|
||||
},
|
||||
|
||||
// Für Pythonfiles Tababstand definieren und Tabs durch Leerzeichen ersetzen
|
||||
"[python]": {
|
||||
"editor.tabSize": 4,
|
||||
"editor.insertSpaces": true
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
}
|
18
CHANGELOG.md
Normal file
18
CHANGELOG.md
Normal file
@ -0,0 +1,18 @@
|
||||
# CHANGELOG - Python Template
|
||||
|
||||
- [CHANGELOG - Python Template](#changelog---python-template)
|
||||
- [2025-04-24 - Commit v1.0.1](#2025-04-24---commit-v101)
|
||||
- [2025-04-22 - Release v1.0.0](#2025-04-22---release-v100)
|
||||
|
||||
## 2025-04-24 - Commit v1.0.1
|
||||
|
||||
- **Geändert:**
|
||||
- [X] `README.md` stilistisch überarbeitet.
|
||||
- [x] `.json` in `.jsonc` umbenannt wenn sie Kommentare enthalten. Betrifft nur den .vscode teil und hat mit dem Template nicht direkt etwas zutun.
|
||||
- [x] Im zentralen Logging-Modul `logging_utils.py` wird bei aktiviertem `DEBUG`-Level nun der Pfad zur Logdatei (`LOGFILE`) im Log ausgegeben. Die Ausgabe erfolgt nur, wenn `logger.isEnabledFor(logging.DEBUG)` zutrifft. Fehler bei der Pfadauflösung (`resolve()`) werden dabei abgefangen und blockieren das Logging nicht.
|
||||
- [x] Standardpfad für Logdatei eingeführt: Wird `LOGFILE` nicht über die `.env` gesetzt, wird nun automatisch `"log/app.log"` verwendet. Damit funktioniert das Logging-Modul auch ohne `.env`-Konfiguration direkt nach dem Klonen oder bei lokalen Tests.
|
||||
- [x] `CHANGELOG.md` erstellt.
|
||||
|
||||
## 2025-04-22 - Release v1.0.0
|
||||
|
||||
- **Release 1.0.0** 🚀
|
76
README.md
76
README.md
@ -1,7 +1,9 @@
|
||||
# Python Bootstrap-Template mit `.venv` und `.env` Support
|
||||
# Python Bootstrap-Template mit `.venv`- und `.env` Support
|
||||
|
||||

|
||||
|
||||
Dieses Template nutzt PEP 8, Type Hints, Docstrings und einen vordefinierten Workspace für sauberen Python-Code.
|
||||
Ausserdem bietet es ein portables Start-Template für Python-Anwendungen mit folgenden Features:
|
||||
Außerdem bietet es ein portables Start-Template für Python-Anwendungen mit folgenden Features:
|
||||
|
||||
- Automatische Erstellung einer virtuellen Umgebung (`.venv`)
|
||||
- Automatische Installation von Abhängigkeiten aus `requirements.txt`
|
||||
@ -9,21 +11,31 @@ Ausserdem bietet es ein portables Start-Template für Python-Anwendungen mit fol
|
||||
- Unterstützung von Umgebungsvariablen über eine `.env`-Datei
|
||||
- Sauberer Einstiegspunkt über `run.py`
|
||||
- Keine systemweiten Python-Pakete notwendig
|
||||
- Logging-Utils bereits integriert
|
||||
|
||||
Das Template ist durchdacht, pragmatisch und stark auf Entwicklerkomfort ausgelegt.
|
||||
Es bietet eine sehr gute Grundlage für Projekte aller Art – insbesondere CLI-Tools, kleine Services und lokale Anwendungen.
|
||||
Die automatische Einrichtung der virtuellen Umgebung hebt es funktional deutlich von Standard-Vorlagen ab.
|
||||
Es bietet eine sehr gute Grundlage für Projekte aller Art – insbesondere CLI-Tools, kleine Services und lokale Anwendungen. Die automatische Einrichtung der virtuellen Umgebung hebt es funktional deutlich von Standard-Vorlagen ab.
|
||||
|
||||
**Was dieses template __nicht__ ist:**
|
||||
|
||||
- [ ] [pep-518](https://peps.python.org/pep-0518/)-konform 🚫
|
||||
|
||||
> ⚠️ Dieses Template verfolgt kein komplexes Build-System.
|
||||
Es ist dafür gedacht, dir in Sekunden eine saubere, gekapselte Python-Umgebung bereitzustellen – perfekt zum schnellen Testen, Debuggen oder Projektstart.
|
||||
Einfach deinen Code in main.py werfen, bei Bedarf requirements.txt anpassen, run.py starten – fertig. Kein Setup-Wahnsinn, kein Overhead.
|
||||
|
||||
---
|
||||
|
||||
- [Python Bootstrap-Template mit `.venv` und `.env` Support](#python-bootstrap-template-mit-venv-und-env-support)
|
||||
## 🔜 Inhalt der Readme
|
||||
|
||||
- [Python Bootstrap-Template mit `.venv`- und `.env` Support](#python-bootstrap-template-mit-venv--und-env-support)
|
||||
- [🔜 Inhalt der Readme](#-inhalt-der-readme)
|
||||
- [🔧 Projektstruktur](#-projektstruktur)
|
||||
- [🚀 Erste Schritte](#-erste-schritte)
|
||||
- [Beim ersten Start passiert:](#beim-ersten-start-passiert)
|
||||
- [📦 Abhängigkeiten](#-abhängigkeiten)
|
||||
- [⚙️ .env-Datei (optional)](#️-env-datei-optional)
|
||||
- [📜 Beispielausgabe](#-beispielausgabe)
|
||||
- [🧼 Optional: `.env.example`](#-optional-envexample)
|
||||
- [🪵 Logging](#-logging)
|
||||
- [🔧 Konfiguration (in `.env`)](#-konfiguration-in-env)
|
||||
- [📥 Beispielausgabe](#-beispielausgabe-1)
|
||||
@ -31,7 +43,7 @@ Die automatische Einrichtung der virtuellen Umgebung hebt es funktional deutlich
|
||||
- [📁 Logrotation](#-logrotation)
|
||||
- [🛠 Hinweise](#-hinweise)
|
||||
- [🧪 Getestet mit](#-getestet-mit)
|
||||
- [🛠 Einsatz Linter (`pylint`)](#-einsatz-linter-pylint)
|
||||
- [🛠 Einsatz von `Linter` (`pylint`)](#-einsatz-von-linter-pylint)
|
||||
- [📁 Lizenz](#-lizenz)
|
||||
|
||||
---
|
||||
@ -48,18 +60,32 @@ Die automatische Einrichtung der virtuellen Umgebung hebt es funktional deutlich
|
||||
├── 📄 .env.example # Vorlage der .env
|
||||
├── 📄 requirements.txt # Abhängigkeiten (z.B. python-dotenv)
|
||||
├── 📄 README.md # diese Datei
|
||||
├── 📄 CHANGELOG.md #
|
||||
├── 📄 VERSION # Versionsinfo zum Paket
|
||||
├── 📄 run.py # Einstiegspunkt für die Anwendung
|
||||
└── 📁 app/ #
|
||||
├── 📁 media/
|
||||
│ └── 📄 logo.png # Logo für GitHub
|
||||
└── 📁 app/
|
||||
├── 📄 __init__.py #
|
||||
├── 📄 main.py # Hauptlogik der Anwendung
|
||||
└── 📄 bootstrap.py # Setup- und Relaunch-Logik
|
||||
```
|
||||
|
||||
> Release-Pakete als `.zip` sind bereits von unötigem Balast bereinigt. Die dargestellte Struktur entspricht einem `git clone`.
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Erste Schritte
|
||||
|
||||
- [ ] `.env.example` in `.env` umbenennen und individuell befüllen.
|
||||
- [ ] `.vscode`-Verzeichnis löschen, wenn du eigene Einstellungen nutzt. Ich habe es versehentlich committet und aus Bequemlichkeit drin gelassen, weil es meinem Standard entspicht.
|
||||
- [ ] `requirements.txt` auf deine Bedürfnisse anpassen.
|
||||
- [ ] `media/`Verzeichnis Löschen falls vorhanden.
|
||||
|
||||
**Erster Start des Templates:**
|
||||
|
||||
```bash
|
||||
python run.py
|
||||
```
|
||||
@ -70,7 +96,11 @@ python run.py
|
||||
2. `requirements.txt` wird installiert
|
||||
3. Das Skript wird automatisch innerhalb der venv neu gestartet
|
||||
4. `.env` wird geladen (falls vorhanden)
|
||||
5. Die App startet
|
||||
5. **Die App startet 🚀**
|
||||
|
||||
> Es erfolgen einige Ausgaben, die alle aus der `main.py` stammen, außer du `DEBUG` in der `.env` aktiviert hast.
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
@ -83,6 +113,8 @@ Alle Abhängigkeiten werden aus `requirements.txt` installiert.
|
||||
python-dotenv
|
||||
```
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ .env-Datei (optional)
|
||||
@ -98,6 +130,8 @@ PORT=8080
|
||||
|
||||
Diese Werte sind im Code über `os.getenv("APP_MODE")` verfügbar.
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 📜 Beispielausgabe
|
||||
@ -111,17 +145,7 @@ Diese Werte sind im Code über `os.getenv("APP_MODE")` verfügbar.
|
||||
[APP] Hello, world!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧼 Optional: `.env.example`
|
||||
|
||||
Erstelle eine `.env.example`, um deine Konfiguration zu dokumentieren:
|
||||
|
||||
```dotenv
|
||||
APP_MODE=production
|
||||
PORT=8000
|
||||
LOGLEVEL=info
|
||||
```
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
@ -173,6 +197,8 @@ logs/app.log.1
|
||||
logs/app.log.2
|
||||
```
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Hinweise
|
||||
@ -181,6 +207,8 @@ logs/app.log.2
|
||||
- Du kannst es für jede neue App wiederverwenden.
|
||||
- `run.py` ist der einzige Einstiegspunkt – keine direkten Aufrufe von `main.py`.
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Getestet mit
|
||||
@ -189,11 +217,11 @@ logs/app.log.2
|
||||
- Windows & Linux
|
||||
- VS Code, Terminal, PowerShell
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Einsatz Linter (`pylint`)
|
||||
|
||||
|
||||
## 🛠 Einsatz von `Linter` (`pylint`)
|
||||
|
||||
```cmd
|
||||
PS C:\Users\adams\Documents\template> .\.venv\Scripts\activate
|
||||
@ -215,6 +243,8 @@ Your code has been rated at 8.33/10
|
||||
**Bonus:**
|
||||
Durch den Einsatz der <.vscode/task.json> für VS-Code, kannst du in VS-Code mit `Strg + Umschalt + P` → `Tasks: Run Task` → `Linter (pylint)` oder `Typprüfung (mypy)` aufrufen.
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 📁 Lizenz
|
||||
|
@ -29,7 +29,7 @@ def safe_log_level(level_str: str) -> int:
|
||||
|
||||
|
||||
LOGLEVEL = safe_log_level(os.getenv("LOGLEVEL", "INFO"))
|
||||
LOGFILE = os.getenv("LOGFILE") # z. B. logs/app.log
|
||||
LOGFILE = os.getenv("LOGFILE", "log/app.log") # z. B. logs/app.log
|
||||
|
||||
|
||||
def get_logger(name: str) -> logging.Logger:
|
||||
@ -49,6 +49,14 @@ def get_logger(name: str) -> logging.Logger:
|
||||
# Datei (optional)
|
||||
if LOGFILE:
|
||||
logfile_path = Path(LOGFILE)
|
||||
|
||||
# Debug: Logpfad anzeigen (nur bei DEBUG)
|
||||
if logger.isEnabledFor(logging.DEBUG):
|
||||
try:
|
||||
logger.debug(f"Logdatei: {logfile_path.resolve()}")
|
||||
except Exception:
|
||||
pass # Debug-Ausgabe darf nicht blockieren
|
||||
|
||||
try:
|
||||
logfile_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
file_handler = RotatingFileHandler(
|
||||
|
@ -32,6 +32,8 @@ def logtest():
|
||||
"""
|
||||
wirft testweise alle Logvarianten aus.
|
||||
"""
|
||||
|
||||
print(f"\n[IFO] 📰 Loglevel: aus .env: {os.getenv('LOGFILE')}\n")
|
||||
log.info("Template ready.")
|
||||
log.debug("Dies ist eine Debug-Meldung.")
|
||||
log.warning("Dies ist eine Warnung.")
|
||||
|
BIN
media/logo.png
Normal file
BIN
media/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 918 KiB |
@ -8,7 +8,7 @@ python-dotenv
|
||||
|
||||
# --- ALLES AB HIER IST OPTIONAL ---
|
||||
|
||||
# Pytest, Linter und Typprüfung:
|
||||
# Pytest, Linter und Typ-Prüfung (entfernen bei fertigem Code):
|
||||
pytest
|
||||
pytest-cov
|
||||
pytest-mock
|
||||
|
Loading…
x
Reference in New Issue
Block a user