From ae9463ebcb9533c1e0e8094913734acd83755897 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Fri, 4 Sep 2026 03:42:18 +0000 Subject: [PATCH] [FIX] kdbx : nommer le coffre avant que getpass ne pose sa question MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'invite de `getpass` part vers le terminal, la ligne qui nomme le coffre vers la sortie standard — un TUBE dès qu'un menu nous lance. Sans vidage, les deux ressortaient dans le désordre : « Mot de passe du coffre : Coffre KeePass : », la question avant ce dont elle parle. Le bouchon de `print` des tests accepte désormais la signature complète de `print` : sans `**k`, ajouter un `flush` au code testé faisait échouer six tests sur une différence étrangère à ce qu'ils vérifient. --- EN --- The `getpass` prompt goes to the terminal, the line naming the vault to standard output — a PIPE as soon as a menu launches us. Without a flush the two came out in the wrong order: "Vault password: KeePass vault: ", the question before what it is about. The tests' `print` stub now accepts the full signature of `print`: without `**k`, adding a `flush` to the code under test failed six tests over a difference foreign to what they check. Assisted-by: Claude Opus 5 --- script/todo/kdbx_manager.py | 6 +++++- test/test_kdbx_manager.py | 12 ++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/script/todo/kdbx_manager.py b/script/todo/kdbx_manager.py index 8032165..edcb6e4 100644 --- a/script/todo/kdbx_manager.py +++ b/script/todo/kdbx_manager.py @@ -82,7 +82,11 @@ class KdbxManager: # pas une panne : la bibliothèque lève `CredentialsError` et, sans # ce rattrapage, la trace remontait jusqu'à tuer le CLI. On nomme # aussi le coffre — l'invite ne disait pas DE QUOI elle parlait. - print(f"{t('kdbx_vault_is')} {kdbx_file_path}") + # `flush` : l'invite de getpass part vers le terminal, ce `print` + # vers la sortie standard — qui est un TUBE quand le menu nous lance. + # Sans vidage, on lisait « Mot de passe du coffre : Coffre KeePass : + # /chemin » — la question avant ce dont elle parle. + print(f"{t('kdbx_vault_is')} {kdbx_file_path}", flush=True) for _ in range(attempts): password = getpass.getpass(prompt=t("kdbx_ask_password")) if not password: diff --git a/test/test_kdbx_manager.py b/test/test_kdbx_manager.py index 716a04f..24f9ba5 100644 --- a/test/test_kdbx_manager.py +++ b/test/test_kdbx_manager.py @@ -42,7 +42,11 @@ class KdbxCase(unittest.TestCase): vues = [] with patch("getpass.getpass", side_effect=list(reponses)), patch( "builtins.print", - side_effect=lambda *a: vues.append(" ".join(map(str, a))), + # `**k` : un bouchon de `print` doit accepter la signature de + # `print`. Sans lui, ajouter un `flush=True` dans le code + # testé faisait échouer six tests sur une différence qui n'a + # rien à voir avec ce qu'ils vérifient. + side_effect=lambda *a, **k: vues.append(" ".join(map(str, a))), ): resultat = self._manager().get_kdbx() return resultat, "\n".join(vues) @@ -106,7 +110,11 @@ class TestRecoveryAndSuccess(KdbxCase): vues = [] with patch( "builtins.print", - side_effect=lambda *a: vues.append(" ".join(map(str, a))), + # `**k` : un bouchon de `print` doit accepter la signature de + # `print`. Sans lui, ajouter un `flush=True` dans le code + # testé faisait échouer six tests sur une différence qui n'a + # rien à voir avec ce qu'ils vérifient. + side_effect=lambda *a, **k: vues.append(" ".join(map(str, a))), ): resultat = self._manager("mauvais").get_kdbx() self.assertIsNone(resultat)