From cf4170f5905e53cad11388ad6f3336cecd7af82a Mon Sep 17 00:00:00 2001 From: Florian Zumpe Date: Sat, 3 Oct 2026 12:53:42 +0200 Subject: [PATCH] syntax fix --- test/python/test_moderate_routes.py | 15 +++++++++++++++ tools/python/moderate_routes.py | 29 +++++++++++++++-------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/test/python/test_moderate_routes.py b/test/python/test_moderate_routes.py index 759cbe6..63c2cc4 100644 --- a/test/python/test_moderate_routes.py +++ b/test/python/test_moderate_routes.py @@ -86,6 +86,21 @@ class ModerationTests(unittest.TestCase): self.assertEqual(self.run_cli(args), 1) self.assertFalse(self.path.exists()) + def test_export_prefix_accepts_whitespace_and_preserves_variable_names(self): + env_file = self.root / ".env" + for prefix in ["export ", " export\t", "\texport ", ""]: + env_file.write_text(f'{prefix}DATA_DIR="anderer Ordner"\n', encoding="utf-8") + self.assertEqual(moderate_routes.database_path(self.root), + self.root / "anderer Ordner" / "wegwichtel.sqlite") + env_file.write_text("exportDATA_DIR=anders\nexport_path=anders\n", encoding="utf-8") + self.assertEqual(moderate_routes.database_path(self.root), self.path) + + def test_env_read_errors_are_reported_without_changing_database(self): + with patch.object(Path, "read_text", side_effect=PermissionError("Lesen nicht erlaubt")): + self.assertEqual(self.run_cli(["-e", "1"]), 1) + self.assertIsNone(self.activation()) + self.assertIn("Lesen nicht erlaubt", self.error.getvalue()) + def test_bad_env_reports_line_without_secrets(self): for value in ["secret-without-equals", 'DATA_DIR="secret']: (self.root / ".env").write_text(value, encoding="utf-8") diff --git a/tools/python/moderate_routes.py b/tools/python/moderate_routes.py index d40ad01..44002d3 100644 --- a/tools/python/moderate_routes.py +++ b/tools/python/moderate_routes.py @@ -5,10 +5,10 @@ import argparse from datetime import datetime, timezone import os from pathlib import Path +import re import shlex import sqlite3 import sys -import re PROJECT_ROOT = Path(__file__).resolve().parents[2] @@ -18,19 +18,20 @@ def database_path(project_root): settings = {} env_file = project_root / ".env" try: - for number, line in enumerate(env_file.read_text(encoding="utf-8-sig").splitlines(), 1): - line = re.sub(r'^\s*export\s+', '', line).strip() - if not line or line.startswith("#"): - continue - if line.startswith("export "): - line = line[7:].lstrip() - key, separator, value = line.partition("=") - if not separator: - raise ValueError(f"Ungültige .env-Angabe in Zeile {number}.") - try: - settings[key.strip()] = " ".join(shlex.split(value, comments=True)) - except ValueError as error: - raise ValueError(f"Ungültige .env-Anführungszeichen in Zeile {number}.") from error + contents = env_file.read_text(encoding="utf-8-sig") + except FileNotFoundError: + contents = "" + for number, line in enumerate(contents.splitlines(), 1): + line = re.sub(r'^\s*export\s+', '', line).strip() + if not line or line.startswith("#"): + continue + key, separator, value = line.partition("=") + if not separator: + raise ValueError(f"Ungültige .env-Angabe in Zeile {number}.") + try: + settings[key.strip()] = " ".join(shlex.split(value, comments=True)) + except ValueError as error: + raise ValueError(f"Ungültige .env-Anführungszeichen in Zeile {number}.") from error data_dir = os.environ.get("DATA_DIR", settings.get("DATA_DIR", "")) or "data" return (project_root / data_dir / "wegwichtel.sqlite").resolve()