diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 7ac4b027418..60c6089ad3c 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -79,6 +79,11 @@ Cross Platform Setting *terse* to true causes the function to return only the absolute minimum information needed to identify the platform. + .. versionchanged:: 3.8 + On macOS, the function now uses :func:`mac_ver`, if it returns a + non-empty release string, to get the macOS version rather than the darwin + version. + .. function:: processor() diff --git a/Lib/platform.py b/Lib/platform.py index f089a463ef9..d8455256bb9 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -1182,6 +1182,14 @@ def platform(aliased=0, terse=0): if aliased: system, release, version = system_alias(system, release, version) + if system == 'Darwin': + # macOS (darwin kernel) + macos_release = mac_ver()[0] + if macos_release: + # note: 'macOS' is different than 'MacOS' used below + system = 'macOS' + release = macos_release + if system == 'Windows': # MS platforms rel, vers, csd, ptype = win32_ver(version) diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 978d2f76ab6..c1a7e340793 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -10,6 +10,11 @@ from unittest import mock from test import support class PlatformTest(unittest.TestCase): + def clear_caches(self): + platform._platform_cache.clear() + platform._sys_version_cache.clear() + platform._uname_cache = None + def test_architecture(self): res = platform.architecture() @@ -344,5 +349,33 @@ class PlatformTest(unittest.TestCase): self.assertLess(V('0.960923'), V('2.2beta29')) + def test_macos(self): + self.addCleanup(self.clear_caches) + + uname = ('Darwin', 'hostname', '17.7.0', + ('Darwin Kernel Version 17.7.0: ' + 'Thu Jun 21 22:53:14 PDT 2018; ' + 'root:xnu-4570.71.2~1/RELEASE_X86_64'), + 'x86_64', 'i386') + arch = ('64bit', '') + with mock.patch.object(platform, 'uname', return_value=uname), \ + mock.patch.object(platform, 'architecture', return_value=arch): + for mac_ver, expected_terse, expected in [ + # darwin: mac_ver() returns empty strings + (('', '', ''), + 'Darwin-17.7.0', + 'Darwin-17.7.0-x86_64-i386-64bit'), + # macOS: mac_ver() returns macOS version + (('10.13.6', ('', '', ''), 'x86_64'), + 'macOS-10.13.6', + 'macOS-10.13.6-x86_64-i386-64bit'), + ]: + with mock.patch.object(platform, 'mac_ver', + return_value=mac_ver): + self.clear_caches() + self.assertEqual(platform.platform(terse=1), expected_terse) + self.assertEqual(platform.platform(), expected) + + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-11-29-00-23-25.bpo-35344.4QOPJQ.rst b/Misc/NEWS.d/next/Library/2018-11-29-00-23-25.bpo-35344.4QOPJQ.rst new file mode 100644 index 00000000000..a999cbe2a72 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-29-00-23-25.bpo-35344.4QOPJQ.rst @@ -0,0 +1,3 @@ +On macOS, :func:`platform.platform` now uses :func:`platform.mac_ver`, if it +returns a non-empty release string, to get the macOS version rather than the +darwin version.