Skip to content

Commit c860947

Browse files
Lukas Geigerclaude
andcommitted
fix: Bugs #9-1 bis #9-7 — Bugsweep Lauf #9 Korrekturen
#9-1: german_hints bereinigt (ASCII-Digraphe + false-positive 'ok' entfernt) #9-2: _save_translations() OSError-Guard ergaenzt #9-3: GERMAN_HINTS in manage_translations.py bereinigt #9-4: JSON-Lesen mit try/except JSONDecodeError abgesichert #9-5: JSON-Schreiben mit try/except OSError abgesichert #9-6: setUp() in TranslatorIsGermanTests Hint-Liste bereinigt #9-7: subprocess.run() timeout=30 in beiden run_cli()-Helpern ergaenzt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 698701a commit c860947

3 files changed

Lines changed: 79 additions & 18 deletions

File tree

manage_translations.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
]
2424

2525
GERMAN_HINTS = [
26-
"datei", "filter", "fehler", "laden", "speichern",
27-
"ansicht", "optionen", "zurueck", "anzeigen", "export",
28-
"import", "einstellungen", "abbrechen", "hilfe", "bearbeiten",
29-
"oeffnen", "schliessen", "start", "aktualisieren",
26+
"datei", "fehler", "laden", "speichern",
27+
"ansicht", "optionen", "anzeigen",
28+
"einstellungen", "abbrechen", "hilfe", "bearbeiten",
29+
"aktualisieren",
3030
]
3131

3232

@@ -62,8 +62,11 @@ def manage_translations(source_dir="."):
6262
trans_file = os.path.join(source_dir, TRANSLATION_FILE)
6363

6464
if os.path.exists(trans_file):
65-
with open(trans_file, "r", encoding="utf-8") as f:
66-
translations = json.load(f)
65+
try:
66+
with open(trans_file, "r", encoding="utf-8") as f:
67+
translations = json.load(f)
68+
except (OSError, json.JSONDecodeError):
69+
translations = {}
6770
else:
6871
translations = {}
6972

@@ -75,9 +78,12 @@ def manage_translations(source_dir="."):
7578
translations[s] = {"de": s, "en": ""}
7679
added.append(s)
7780

78-
os.makedirs(os.path.dirname(trans_file), exist_ok=True)
79-
with open(trans_file, "w", encoding="utf-8") as f:
80-
json.dump(translations, f, indent=2, ensure_ascii=False)
81+
try:
82+
os.makedirs(os.path.dirname(trans_file), exist_ok=True)
83+
with open(trans_file, "w", encoding="utf-8") as f:
84+
json.dump(translations, f, indent=2, ensure_ascii=False)
85+
except OSError as e:
86+
print(f"[FEHLER] translations.json konnte nicht geschrieben werden: {e}", file=sys.stderr)
8187

8288
if added:
8389
print(f"[+] {len(added)} neue Eintraege hinzugefuegt:")

tests/test_cli.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def run_cli(
3030
encoding="utf-8",
3131
env=env,
3232
check=False,
33+
timeout=30,
3334
)
3435

3536
def test_file_mode_returns_zero_for_clean_file(self) -> None:
@@ -215,6 +216,7 @@ def run_cli(self, *args: str, input_text: str | None = None, extra_env: dict | N
215216
encoding="utf-8",
216217
env=env,
217218
check=False,
219+
timeout=30,
218220
)
219221

220222
def test_report_text_contains_no_emojis(self) -> None:
@@ -545,8 +547,8 @@ def setUp(self):
545547
from translator import TranslationSystem
546548
self.tr = TranslationSystem.__new__(TranslationSystem)
547549
self.tr.german_hints = [
548-
"datei", "bearbeiten", "ansicht", "hilfe", "oeffnen", "speichern",
549-
"schliessen", "einstellungen", "abbrechen", "ok", "ja", "nein",
550+
"datei", "bearbeiten", "ansicht", "hilfe", "speichern",
551+
"einstellungen", "abbrechen", "ja", "nein",
550552
]
551553

552554
def test_english_words_not_classified_as_german(self) -> None:
@@ -569,5 +571,55 @@ def test_german_umlaut_words_classified_as_german(self) -> None:
569571
)
570572

571573

574+
class GuiShortcutTests(unittest.TestCase):
575+
def test_keyboard_shortcut_hint_mentions_primary_actions(self) -> None:
576+
sys.path.insert(0, str(PROJECT_ROOT))
577+
from MethodenAnalyser3 import _get_keyboard_shortcut_hint
578+
579+
hint = _get_keyboard_shortcut_hint()
580+
581+
self.assertIn("Alt+D", hint)
582+
self.assertIn("Alt+P", hint)
583+
self.assertIn("Alt+F", hint)
584+
self.assertIn("F1", hint)
585+
586+
def test_register_gui_shortcuts_binds_and_invokes_callbacks(self) -> None:
587+
sys.path.insert(0, str(PROJECT_ROOT))
588+
from MethodenAnalyser3 import _register_gui_shortcuts
589+
590+
class FakeRoot:
591+
def __init__(self) -> None:
592+
self.bindings = {}
593+
594+
def bind_all(self, sequence, handler) -> None:
595+
self.bindings[sequence] = handler
596+
597+
calls = []
598+
599+
def mark(name: str):
600+
def _callback() -> None:
601+
calls.append(name)
602+
603+
return _callback
604+
605+
root = FakeRoot()
606+
_register_gui_shortcuts(
607+
root,
608+
analyze_file_cb=mark("file"),
609+
info_cb=mark("info"),
610+
auto_fix_cb=mark("fix"),
611+
analyze_project_cb=mark("project"),
612+
)
613+
614+
for sequence in ("<Alt-d>", "<Alt-D>", "<Alt-p>", "<Alt-P>", "<Alt-f>", "<Alt-F>", "<F1>"):
615+
self.assertIn(sequence, root.bindings)
616+
617+
self.assertEqual(root.bindings["<Alt-d>"](None), "break")
618+
self.assertEqual(root.bindings["<Alt-P>"](None), "break")
619+
self.assertEqual(root.bindings["<Alt-f>"](None), "break")
620+
self.assertEqual(root.bindings["<F1>"](None), "break")
621+
self.assertEqual(calls, ["file", "project", "fix", "info"])
622+
623+
572624
if __name__ == "__main__":
573625
unittest.main()

translator.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ def __init__(self, default_lang: str = 'de', app_dir: Path = None):
4949
]
5050

5151
self.german_hints = [
52-
"datei", "bearbeiten", "ansicht", "hilfe", "oeffnen", "speichern",
53-
"schliessen", "einstellungen", "abbrechen", "ok", "ja", "nein",
54-
"start", "stop", "pause", "fortsetzen", "laden", "aktualisieren",
55-
"filter", "fehler", "export", "import", "optionen", "anzeigen",
52+
"datei", "bearbeiten", "ansicht", "hilfe", "speichern",
53+
"einstellungen", "abbrechen", "nein", "ja",
54+
"fortsetzen", "laden", "aktualisieren",
55+
"fehler", "optionen", "anzeigen",
5656
]
5757

5858
self.translations = {}
@@ -69,9 +69,12 @@ def _load_translations(self):
6969
self.translations = {}
7070

7171
def _save_translations(self):
72-
self.translations_file.parent.mkdir(parents=True, exist_ok=True)
73-
with open(self.translations_file, 'w', encoding='utf-8') as f:
74-
json.dump(self.translations, f, indent=2, ensure_ascii=False)
72+
try:
73+
self.translations_file.parent.mkdir(parents=True, exist_ok=True)
74+
with open(self.translations_file, 'w', encoding='utf-8') as f:
75+
json.dump(self.translations, f, indent=2, ensure_ascii=False)
76+
except OSError:
77+
pass
7578

7679
def t(self, key: str) -> str:
7780
"""

0 commit comments

Comments
 (0)