diff --git a/keyring/cli.py b/keyring/cli.py index 2c0ba4d3..4ea346de 100644 --- a/keyring/cli.py +++ b/keyring/cli.py @@ -91,9 +91,15 @@ def __init__(self): 'service', nargs="?", ) + try: + default_user = getpass.getuser() + except (OSError, KeyError, ModuleNotFoundError): + # on recent Python versions (>=3.13), `OSError` should suffice + default_user = None self.parser.add_argument( 'username', nargs="?", + default=default_user, ) completion.install(self.parser) diff --git a/pyproject.toml b/pyproject.toml index 18bb6eb0..f1e431fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,6 +79,9 @@ type = [ # upstream "pytest-mypy >= 1.0.1", + ## workaround for python/mypy#20454 + "mypy < 1.19; python_implementation == 'PyPy'", + # local "pygobject-stubs", "shtab", # Optional install for completion diff --git a/tests/test_cli.py b/tests/test_cli.py index a4bc49c7..15287c49 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,5 +1,6 @@ import getpass import itertools +import os import sys from unittest import mock @@ -42,6 +43,19 @@ def mocked_get_credential(): yield get_credential +def test_set_no_user(monkeypatch, mocked_set): + for name in ('LOGNAME', 'USER', 'LNAME', 'USERNAME'): + monkeypatch.delitem(os.environ, name, raising=False) + monkeypatch.setattr(os, 'getuid', lambda: -1, raising=False) + tool = cli.CommandLineTool() + tool.service = 'svc' + tool.username = 'usr' + monkeypatch.setattr(sys.stdin, 'isatty', lambda: True) + monkeypatch.setattr(getpass, 'getpass', PasswordEmitter('foo123')) + tool.do_set() + mocked_set.assert_called_once_with('svc', 'usr', 'foo123') + + def test_set_interactive(monkeypatch, mocked_set): tool = cli.CommandLineTool() tool.service = 'svc' diff --git a/tox.ini b/tox.ini index 14243051..e05a3d4a 100644 --- a/tox.ini +++ b/tox.ini @@ -20,7 +20,7 @@ deps = diff-cover commands = pytest {posargs} --cov-report xml - diff-cover coverage.xml --compare-branch=origin/main --html-report diffcov.html + diff-cover coverage.xml --compare-branch=origin/main --format html:diffcov.html diff-cover coverage.xml --compare-branch=origin/main --fail-under=100 [testenv:docs]