https://github.com/python/cpython/commit/c7a1716296446386c77d405d1f34b43bc2367016
commit: c7a1716296446386c77d405d1f34b43bc2367016
branch: main
author: Petr Viktorin <[email protected]>
committer: vstinner <[email protected]>
date: 2026-10-16T13:05:15+02:00
summary:

gh-157899: Skip test_readlink_is_marked_as_supports_fd() on older macOS & iOS 
(#159403)

- Generalize `@requires_mac_ver` logic to add `@requires_ios_ver`
- Skip test_readlink_is_marked_as_supports_fd() on lower Apple OS versions

files:
M Lib/test/support/__init__.py
M Lib/test/test_os/test_posix.py

diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index 5331615b1b1587a..3bcb4b111d669c4 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -19,6 +19,7 @@
 import types
 import unittest
 import warnings
+lazy import platform
 
 
 __all__ = [
@@ -33,6 +34,7 @@
     "is_resource_enabled", "get_resource_value", "requires", 
"requires_resource",
     "requires_freebsd_version",
     "requires_gil_enabled", "requires_linux_version", "requires_mac_ver",
+    "requires_ios_ver",
     "check_syntax_error",
     "requires_gzip", "requires_bz2", "requires_lzma", "requires_zstd",
     "bigmemtest", "nomemtest", "bigaddrspacetest", "cpython_only", 
"get_attribute",
@@ -229,7 +231,6 @@ def _force_run(path, func, *args):
 def _is_gui_available():
     if hasattr(_is_gui_available, 'result'):
         return _is_gui_available.result
-    import platform
     reason = None
     if sys.platform.startswith('win') and platform.win32_is_iot():
         reason = "gui is not available on Windows IoT Core"
@@ -354,7 +355,6 @@ def _requires_unix_version(sysname, min_version):
     For example, @_requires_unix_version('FreeBSD', (7, 2)) raises SkipTest if
     the FreeBSD version is less than 7.2.
     """
-    import platform
     min_version_txt = '.'.join(map(str, min_version))
     version_txt = platform.release().split('-', 1)[0]
     if platform.system() == sysname:
@@ -392,19 +392,12 @@ def requires_linux_version(*min_version):
     """
     return _requires_unix_version('Linux', min_version)
 
-def requires_mac_ver(*min_version):
-    """Decorator raising SkipTest if the OS is Mac OS X and the OS X
-    version if less than min_version.
-
-    For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
-    is lesser than 10.5.
-    """
+def _requires_apple_os_version(name, sys_platform, get_version_text, 
min_version):
     def decorator(func):
         @functools.wraps(func)
         def wrapper(*args, **kw):
-            if sys.platform == 'darwin':
-                import platform
-                version_txt = platform.mac_ver()[0]
+            if sys.platform == sys_platform:
+                version_txt = get_version_text()
                 try:
                     version = tuple(map(int, version_txt.split('.')))
                 except ValueError:
@@ -413,14 +406,40 @@ def wrapper(*args, **kw):
                     if version < min_version:
                         min_version_txt = '.'.join(map(str, min_version))
                         raise unittest.SkipTest(
-                            "Mac OS X %s or higher required, not %s"
-                            % (min_version_txt, version_txt))
+                            f"{name} {min_version_txt} or higher required, "
+                            + f"not {version_txt}")
             return func(*args, **kw)
         wrapper.min_version = min_version
         return wrapper
     return decorator
 
 
+def requires_mac_ver(*min_version):
+    """Decorator raising SkipTest if the OS is Mac OS X and the OS X
+    version if less than min_version.
+
+    For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
+    is lesser than 10.5.
+    """
+    return _requires_apple_os_version(
+        "macOS", "darwin",
+        get_version_text=lambda: platform.mac_ver()[0],
+        min_version=min_version)
+
+
+def requires_ios_ver(*min_version):
+    """Decorator raising SkipTest if the OS is iOS and the OS version
+    version if less than min_version.
+
+    For example, requires_ios_ver(16, 0) raises SkipTest if the iOS version
+    is lesser than 16.0.
+    """
+    return _requires_apple_os_version(
+        "iOS", "ios",
+        get_version_text=lambda: platform.ios_ver().release,
+        min_version=min_version)
+
+
 def thread_unsafe(reason):
     """Mark a test as not thread safe. When the test runner is run with
     --parallel-threads=N, the test will be run in a single thread."""
@@ -2223,7 +2242,6 @@ def setswitchinterval(interval):
     if is_android and interval < minimum_interval:
         global _old_android_emulator
         if _old_android_emulator is None:
-            import platform
             av = platform.android_ver()
             _old_android_emulator = av.is_emulator and av.api_level < 24
         if _old_android_emulator:
@@ -3480,7 +3498,6 @@ def linked_to_musl():
 
     # On linux, we'll depend on the platform module to do the check, so new
     # musl platforms should add support in that module if possible.
-    import platform
     lib, version = platform.libc_ver()
     if lib != 'musl':
         _linked_to_musl = False
diff --git a/Lib/test/test_os/test_posix.py b/Lib/test/test_os/test_posix.py
index 7b8f8d2ddadd96b..82115c338906fc0 100644
--- a/Lib/test/test_os/test_posix.py
+++ b/Lib/test/test_os/test_posix.py
@@ -1946,6 +1946,8 @@ def 
test_readlink_with_fd_throws_not_implemented_error(self):
 
     @unittest.skipUnless(sys.platform in ["linux", "android", "darwin", "ios"],
                          "feature not supported on this platform")
+    @support.requires_mac_ver(13, 0)
+    @support.requires_ios_ver(16, 0)
     def test_readlink_is_marked_as_supports_fd(self):
         self.assertIn(os.readlink, os.supports_fd)
 

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to