Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/890.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Improve logging when keyring fails.
20 changes: 18 additions & 2 deletions tests/test_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,14 +152,14 @@ def test_get_username_runtime_error_suppressed(
entered_username, keyring_no_backends_get_credential, caplog, config
):
assert auth.Resolver(config, auth.CredentialInput()).username == "entered user"
assert caplog.messages == ["fail!"]
assert caplog.messages == ["Error from keyring"] and "fail!" in caplog.text


def test_get_password_runtime_error_suppressed(
entered_password, keyring_no_backends, caplog, config
):
assert auth.Resolver(config, auth.CredentialInput("user")).password == "entered pw"
assert caplog.messages == ["fail!"]
assert caplog.messages == ["Error from keyring"] and "fail!" in caplog.text


def test_get_username_return_none(entered_username, monkeypatch, config):
Expand Down Expand Up @@ -227,3 +227,19 @@ def test_warns_for_empty_password(
assert auth.Resolver(config, auth.CredentialInput()).password == password

assert caplog.messages[0].startswith(warning)


def test_log_exception_on_keyring_failure(config, monkeypatch, caplog):
class FailKeyring:
@staticmethod
def get_credential(system, username):
# Simulate the error from https://github.com/pypa/twine/issues/889
environ = {}
environ["HOME"]

monkeypatch.setattr(auth, "keyring", FailKeyring())

assert not auth.Resolver(config, auth.CredentialInput()).get_username_from_keyring()
assert not auth.Resolver(config, auth.CredentialInput()).get_password_from_keyring()

assert caplog.messages[0] == "Error from keyring" and "KeyError: 'HOME'" in caplog.text
4 changes: 2 additions & 2 deletions twine/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def get_username_from_keyring(self) -> Optional[str]:
# To support keyring prior to 15.2
pass
except Exception as exc:
logger.warning(str(exc))
logger.warning("Error from keyring", exc_info=exc)
return None

def get_password_from_keyring(self) -> Optional[str]:
Expand All @@ -73,7 +73,7 @@ def get_password_from_keyring(self) -> Optional[str]:
logger.info("Querying keyring for password")
return cast(str, keyring.get_password(system, username))
except Exception as exc:
logger.warning(str(exc))
logger.warning("Error from keyring", exc_info=exc)
return None

def username_from_keyring_or_prompt(self) -> str:
Expand Down