From ff23347f1f050d2544cfb89ff6aa9af885c27375 Mon Sep 17 00:00:00 2001 From: Warren Markham Date: Sun, 27 Aug 2023 22:40:24 +1000 Subject: [PATCH] Fix platform-dependent type-check errors (#11345) Use more explicit `sys.platform` checks, instead of the previous check using `in`, which mypy understands. Fixes #11343 --- src/_pytest/compat.py | 25 +++++++++++++++++-------- testing/test_parseopt.py | 3 ++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/_pytest/compat.py b/src/_pytest/compat.py index cead6c311..73d77f978 100644 --- a/src/_pytest/compat.py +++ b/src/_pytest/compat.py @@ -314,15 +314,24 @@ def safe_isclass(obj: object) -> bool: def get_user_id() -> int | None: - """Return the current user id, or None if we cannot get it reliably on the current platform.""" - # win32 does not have a getuid() function. - # On Emscripten, getuid() is a stub that always returns 0. - if sys.platform in ("win32", "emscripten"): + """Return the current process's real user id or None if it could not be + determined. + + :return: The user id or None if it could not be determined. + """ + # mypy follows the version and platform checking expectation of PEP 484: + # https://mypy.readthedocs.io/en/stable/common_issues.html?highlight=platform#python-version-and-system-platform-checks + # Containment checks are too complex for mypy v1.5.0 and cause failure. + if sys.platform == "win32" or sys.platform == "emscripten": + # win32 does not have a getuid() function. + # Emscripten has a return 0 stub. return None - # getuid shouldn't fail, but cpython defines such a case. - # Let's hope for the best. - uid = os.getuid() - return uid if uid != -1 else None + else: + # On other platforms, a return value of -1 is assumed to indicate that + # the current process's real user id could not be determined. + ERROR = -1 + uid = os.getuid() + return uid if uid != ERROR else None # Perform exhaustiveness checking. diff --git a/testing/test_parseopt.py b/testing/test_parseopt.py index 1899abe15..b6df035aa 100644 --- a/testing/test_parseopt.py +++ b/testing/test_parseopt.py @@ -291,7 +291,8 @@ class TestParser: def test_argcomplete(pytester: Pytester, monkeypatch: MonkeyPatch) -> None: try: - encoding = locale.getencoding() # New in Python 3.11, ignores utf-8 mode + # New in Python 3.11, ignores utf-8 mode + encoding = locale.getencoding() # type: ignore[attr-defined] except AttributeError: encoding = locale.getpreferredencoding(False) try: