diff --git a/.env.example b/.env.example index e68cb81..692b5fe 100644 --- a/.env.example +++ b/.env.example @@ -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 diff --git a/.gitignore b/.gitignore index c820c20..828b5c5 100644 --- a/.gitignore +++ b/.gitignore @@ -178,6 +178,7 @@ cython_debug/ # Custom: logs/ log/ -media/ +release/ +#media/ *.zip diff --git a/.vscode/settings.json b/.vscode/settings.jsonc similarity index 67% rename from .vscode/settings.json rename to .vscode/settings.jsonc index 789e0ce..8c46f9c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.jsonc @@ -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 - } + }, + + } diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7b110f3 --- /dev/null +++ b/CHANGELOG.md @@ -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** 🚀 diff --git a/README.md b/README.md index 0e415e0..edc4e62 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ -# Python Bootstrap-Template mit `.venv` und `.env` Support +# Python Bootstrap-Template mit `.venv`- und `.env` Support + +![Logo](./media/logo.png) 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 diff --git a/VERSION b/VERSION index 3eefcb9..7dea76e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0 +1.0.1 diff --git a/app/logging_utils.py b/app/logging_utils.py index 8bf0ee3..958a744 100644 --- a/app/logging_utils.py +++ b/app/logging_utils.py @@ -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( diff --git a/app/main.py b/app/main.py index 01b8957..10cae5a 100644 --- a/app/main.py +++ b/app/main.py @@ -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.") diff --git a/media/logo.png b/media/logo.png new file mode 100644 index 0000000..83bb675 Binary files /dev/null and b/media/logo.png differ diff --git a/requirements.txt b/requirements.txt index 75542a5..dac660b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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