64 lines
3.3 KiB
Python
64 lines
3.3 KiB
Python
"""Pin the repository to English: no German text outside the operator's quoted trigger phrases."""
|
|||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import re
|
||
|
|
import subprocess
|
||
|
|
import unittest
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
||
|
|
WORDS = (
|
||
|
|
"und", "nicht", "oder", "wird", "werden", "wurde", "kein", "keine", "keinen", "eine", "einen", "einem", "einer",
|
||
|
|
"ist", "sind", "auf", "für", "bitte", "noch", "schon", "alle", "aus", "zum", "zur", "bei", "beim", "nach", "über",
|
||
|
|
"dieser", "diese", "dieses", "jetzt", "heißt", "sich", "auch", "wenn", "dann", "mehr", "kann", "muss", "soll",
|
||
|
|
"gibt", "ohne", "vom", "von", "läuft", "wählen", "speichern", "löschen", "abbrechen", "schließen", "bearbeiten",
|
||
|
|
"anzeigen", "öffnen", "zeigen", "aufnehmen", "vorlesen", "regeln", "regel", "regelwunsch", "steuerung",
|
||
|
|
"ausführen", "ressourcen", "hierarchie", "freigabe", "freigeben", "ablehnen", "warten", "wartet", "offen",
|
||
|
|
"erledigt", "neu", "neuer", "angenommen", "abgelehnt", "gestoppt", "abgelaufen", "unbekannt",
|
||
|
|
"fehlgeschlagen", "verweigert", "besetzt", "abberufen", "aufgabe", "aufgaben", "entfernt", "entfernen", "gemergt",
|
||
|
|
"bleibt", "stoppt", "erzwingt", "verwirft", "hintergrund", "kategorien", "ansicht", "quelle", "namen", "suchen",
|
||
|
|
"anheften", "entscheiden", "entscheidungen", "nacht", "abend", "himmel", "sonnenuntergang", "sonnenaufgang",
|
||
|
|
"aufnahme", "nachricht", "nachrichten", "einstellungen", "sprache", "stumm", "fertig", "fehler", "gesperrt",
|
||
|
|
"signiert", "heute", "gestern", "stunden", "minuten", "sekunden", "warnung", "hinweis", "sofort", "zeit",
|
||
|
|
"weiter", "kopieren", "kopiert", "starten", "gestartet", "beenden", "beendet",
|
||
|
|
)
|
||
|
|
GERMAN = re.compile(r"[äöüÄÖÜß]|\b(?:" + "|".join(WORDS) + r")\b", re.IGNORECASE)
|
||
|
|
ALLOWED = (
|
||
|
|
'"rechtlich prüfen"', '"lizenz prüfen"', '"aufräumen"', '"branches aufräumen"', '"worktrees aufräumen"',
|
||
|
|
'"was soll ich tun"', '"was muss ich tun"', '"was fehlt noch"', '"welche skills gibt es"', '"skill übersicht"',
|
||
|
|
'"übersicht"', '"zuständigkeiten"', '"verwaiste branches"', '"alte worktrees"', '"was kann weg"', '"ä"',
|
||
|
|
"(Regeln → Firewall, Hierarchie → Hierarchy, Ressourcen → Resources,", "Steuerung → Controls, Ausführen → Run)",
|
||
|
|
)
|
||
|
|
SELF = Path(__file__).resolve().relative_to(REPO_ROOT).as_posix()
|
||
|
|
|
||
|
|
|
||
|
|
def german_lines() -> list[str]:
|
||
|
|
"""Returns:
|
||
|
|
Every `path:line` of a tracked text file that carries German once the
|
||
|
|
allowed trigger phrases are removed from it.
|
||
|
|
"""
|
||
|
|
files = subprocess.run(["git", "ls-files"], cwd=REPO_ROOT, capture_output=True, text=True, check=True).stdout.split()
|
||
|
|
hits = []
|
||
|
|
for name in files:
|
||
|
|
if name == SELF:
|
||
|
|
continue
|
||
|
|
try:
|
||
|
|
text = (REPO_ROOT / name).read_text(encoding="utf-8")
|
||
|
|
except (UnicodeDecodeError, IsADirectoryError, FileNotFoundError):
|
||
|
|
continue
|
||
|
|
for number, line in enumerate(text.splitlines(), 1):
|
||
|
|
for phrase in ALLOWED:
|
||
|
|
line = line.replace(phrase, "")
|
||
|
|
if GERMAN.search(line):
|
||
|
|
hits.append(f"{name}:{number}")
|
||
|
|
return hits
|
||
|
|
|
||
|
|
|
||
|
|
class TestEnglish(unittest.TestCase):
|
||
|
|
def test_no_german_outside_quoted_trigger_phrases(self):
|
||
|
|
self.assertEqual(german_lines(), [])
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
print("\n".join(german_lines()))
|