From 45694f1deaa98b8c9a1b506d903ec24c25863e72 Mon Sep 17 00:00:00 2001 From: Thomas Kluyver Date: Tue, 28 Jun 2022 14:39:38 +0100 Subject: [PATCH 1/5] Let devpi fall back to other options if keyring fails keyring provides a plugin to supply the password to devpi-client. However, if keyring fails - e.g. it's installed but no backend is working, or unlocking the keyring fails - then `devpi login` becomes impossible, because the keyring exception is uncaught. This catches any KeyringError, and returns None instead, which signals to devpi that it should try another way to get the password ([docs](https://devpi.net/docs/devpi/devpi/stable/+d/devguide/hooks.html#devpi-client-plugin-hooks-experimental)). --- keyring/devpi_client.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/keyring/devpi_client.py b/keyring/devpi_client.py index c9837fe4..a02a2ba3 100644 --- a/keyring/devpi_client.py +++ b/keyring/devpi_client.py @@ -1,6 +1,7 @@ from pluggy import HookimplMarker import keyring +from keyring.errors import KeyringError hookimpl = HookimplMarker("devpiclient") @@ -8,4 +9,7 @@ @hookimpl() def devpiclient_get_password(url, username): - return keyring.get_password(url, username) + try: + return keyring.get_password(url, username) + except KeyringError: + return None From 1d8fa378f39a150f6ee1558be153b9adcc05f17f Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Thu, 14 Jul 2022 01:56:42 -0400 Subject: [PATCH 2/5] Update changelog. --- CHANGES.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a7b94d5b..cc3ad5d1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,8 @@ +v23.7.0 +------- + +* #582: Suppress KeyringErrors for devpi client. + v23.6.0 ------- From bf3f62995715fb5acbba2f74417beb83136882bd Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Thu, 14 Jul 2022 02:02:46 -0400 Subject: [PATCH 3/5] Prefer suppress decorator. Achieves the same without extra blocks and indentation. --- keyring/devpi_client.py | 7 +++---- setup.cfg | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyring/devpi_client.py b/keyring/devpi_client.py index a02a2ba3..078bb553 100644 --- a/keyring/devpi_client.py +++ b/keyring/devpi_client.py @@ -1,4 +1,5 @@ from pluggy import HookimplMarker +from jaraco.context import suppress import keyring from keyring.errors import KeyringError @@ -8,8 +9,6 @@ @hookimpl() +@suppress(KeyringError) def devpiclient_get_password(url, username): - try: - return keyring.get_password(url, username) - except KeyringError: - return None + return keyring.get_password(url, username) diff --git a/setup.cfg b/setup.cfg index 43c09bcb..1aca211d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -24,6 +24,7 @@ install_requires = SecretStorage>=3.2; sys_platform=="linux" jeepney>=0.4.2; sys_platform=="linux" importlib_metadata >= 3.6; python_version < "3.10" + jaraco.context [options.packages.find] exclude = From 8858582fc6faa568f8b5e264a1b41cd52efdff3b Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Thu, 14 Jul 2022 02:12:25 -0400 Subject: [PATCH 4/5] Remove dependency at the expense of a nested block. --- keyring/devpi_client.py | 7 ++++--- setup.cfg | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyring/devpi_client.py b/keyring/devpi_client.py index 078bb553..6348f2ca 100644 --- a/keyring/devpi_client.py +++ b/keyring/devpi_client.py @@ -1,5 +1,6 @@ +import contextlib + from pluggy import HookimplMarker -from jaraco.context import suppress import keyring from keyring.errors import KeyringError @@ -9,6 +10,6 @@ @hookimpl() -@suppress(KeyringError) def devpiclient_get_password(url, username): - return keyring.get_password(url, username) + with contextlib.suppress(KeyringError): + return keyring.get_password(url, username) diff --git a/setup.cfg b/setup.cfg index 1aca211d..43c09bcb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -24,7 +24,6 @@ install_requires = SecretStorage>=3.2; sys_platform=="linux" jeepney>=0.4.2; sys_platform=="linux" importlib_metadata >= 3.6; python_version < "3.10" - jaraco.context [options.packages.find] exclude = From 314c8d36fa06090938f95d2672316471b15a6e65 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Thu, 14 Jul 2022 02:16:30 -0400 Subject: [PATCH 5/5] Inline the suppress decorator from jaraco.context. --- keyring/devpi_client.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/keyring/devpi_client.py b/keyring/devpi_client.py index 6348f2ca..dfc02452 100644 --- a/keyring/devpi_client.py +++ b/keyring/devpi_client.py @@ -9,7 +9,11 @@ hookimpl = HookimplMarker("devpiclient") +# https://github.com/jaraco/jaraco.context/blob/c3a9b739/jaraco/context.py#L205 +suppress = type('suppress', (contextlib.suppress, contextlib.ContextDecorator), {}) + + @hookimpl() +@suppress(KeyringError) def devpiclient_get_password(url, username): - with contextlib.suppress(KeyringError): - return keyring.get_password(url, username) + return keyring.get_password(url, username)