Title: [224657] trunk/Tools
Revision
224657
Author
[email protected]
Date
2017-11-09 16:58:32 -0800 (Thu, 09 Nov 2017)

Log Message

webkitpy: Unify version parsing code
https://bugs.webkit.org/show_bug.cgi?id=179426
<rdar://problem/35415191>

Reviewed by David Kilzer.

webkitpy needs to parse version strings or version lists frequently. Rather than
duplicate this code each time it's needed, unify it in a Version class.

* Scripts/webkitpy/common/system/platforminfo.py:
(PlatformInfo.__init__): Convert mac version string to version object and
use _win_version instead of _win_version_tuple.
(PlatformInfo.xcode_sdk_version): Convert SDK version string to Version object
before returning it.
(PlatformInfo.xcode_version): Return Version object instead of version string.
(PlatformInfo._determine_mac_version): Accept Version object instead of string,
eliminate parsing.
(PlatformInfo._determine_win_version): Accept Version object instead of tuple.
(PlatformInfo._win_version): Return Version object instead of tuple, have Version
object own version string parsing.
(PlatformInfo._win_version_tuple): Renamed to _win_version().
(PlatformInfo._win_version_tuple_from_cmd): Deleted.
* Scripts/webkitpy/common/system/platforminfo_mock.py:
(MockPlatformInfo.xcode_sdk_version): Return Version object instead of string.
(MockPlatformInfo.xcode_version): Dittio.
* Scripts/webkitpy/common/version.py: Added.
(Version): Version object.
(Version.__init__): Initialize the Version object with a string, integer,
tuple of integers, list of integers or another Version object.
(Version.__len__): Return 5 so that the Version object can be treated as
a list or tuple.
(Version.__getitem__): Get item in Version object by index or string.
(Version.__setitem__): Set item in Version object by index or string.
(Version.__str__): Convert version to printable string, omitting trailing 0's.
(Version.__cmp__): Compare two version strings, major taking precedence over
minor, minor taking precedence over build.
* Scripts/webkitpy/common/version_unittest.py: Added.
(VersionTestCase): Test behavior of Version object.
* Scripts/webkitpy/port/ios.py:
(IOSPort.default_baseline_search_path): ios_version now returns a Version object.
(IOSPort._is_valid_ios_version): Deleted.
(IOSPort.get_option): Deleted.
* Scripts/webkitpy/port/ios_device.py:
(IOSDevicePort.determine_full_port_name): Use Version object instead of owning parsing.
(IOSDevicePort.ios_version): Return Version object instead of string.
* Scripts/webkitpy/port/ios_simulator.py:
(IOSSimulatorPort.simulator_runtime): Use from_version instead of from_version_string.
(IOSSimulatorPort.ios_version): Return Version object instead of string.
(IOSSimulatorPort.use_multiple_simulator_apps): Use Version object instead of string.
* Scripts/webkitpy/xcode/simulator.py:
(Runtime.from_version): Accept Version object instead of string.
(Runtime.from_version_string): Replaced by from_version.
(Runtime.__repr__): When printing, a runtime's version will be a Version object instead
of a tuple.
(Simulator._parse_runtimes): Use Version object instead of tuple.
(Simulator._parse_devices): Ditto.
* Scripts/webkitpy/xcode/simulator_unittest.py: Use Version object instead of tuples.

Modified Paths

Added Paths

Diff

Modified: trunk/Tools/ChangeLog (224656 => 224657)


--- trunk/Tools/ChangeLog	2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/ChangeLog	2017-11-10 00:58:32 UTC (rev 224657)
@@ -1,3 +1,63 @@
+2017-11-09  Jonathan Bedard  <[email protected]>
+
+        webkitpy: Unify version parsing code
+        https://bugs.webkit.org/show_bug.cgi?id=179426
+        <rdar://problem/35415191>
+
+        Reviewed by David Kilzer.
+
+        webkitpy needs to parse version strings or version lists frequently. Rather than
+        duplicate this code each time it's needed, unify it in a Version class.
+
+        * Scripts/webkitpy/common/system/platforminfo.py:
+        (PlatformInfo.__init__): Convert mac version string to version object and
+        use _win_version instead of _win_version_tuple.
+        (PlatformInfo.xcode_sdk_version): Convert SDK version string to Version object
+        before returning it.
+        (PlatformInfo.xcode_version): Return Version object instead of version string.
+        (PlatformInfo._determine_mac_version): Accept Version object instead of string,
+        eliminate parsing.
+        (PlatformInfo._determine_win_version): Accept Version object instead of tuple.
+        (PlatformInfo._win_version): Return Version object instead of tuple, have Version
+        object own version string parsing.
+        (PlatformInfo._win_version_tuple): Renamed to _win_version().
+        (PlatformInfo._win_version_tuple_from_cmd): Deleted.
+        * Scripts/webkitpy/common/system/platforminfo_mock.py:
+        (MockPlatformInfo.xcode_sdk_version): Return Version object instead of string.
+        (MockPlatformInfo.xcode_version): Dittio.
+        * Scripts/webkitpy/common/version.py: Added.
+        (Version): Version object.
+        (Version.__init__): Initialize the Version object with a string, integer,
+        tuple of integers, list of integers or another Version object.
+        (Version.__len__): Return 5 so that the Version object can be treated as
+        a list or tuple.
+        (Version.__getitem__): Get item in Version object by index or string.
+        (Version.__setitem__): Set item in Version object by index or string.
+        (Version.__str__): Convert version to printable string, omitting trailing 0's.
+        (Version.__cmp__): Compare two version strings, major taking precedence over
+        minor, minor taking precedence over build.
+        * Scripts/webkitpy/common/version_unittest.py: Added.
+        (VersionTestCase): Test behavior of Version object.
+        * Scripts/webkitpy/port/ios.py:
+        (IOSPort.default_baseline_search_path): ios_version now returns a Version object.
+        (IOSPort._is_valid_ios_version): Deleted.
+        (IOSPort.get_option): Deleted.
+        * Scripts/webkitpy/port/ios_device.py:
+        (IOSDevicePort.determine_full_port_name): Use Version object instead of owning parsing.
+        (IOSDevicePort.ios_version): Return Version object instead of string.
+        * Scripts/webkitpy/port/ios_simulator.py:
+        (IOSSimulatorPort.simulator_runtime): Use from_version instead of from_version_string.
+        (IOSSimulatorPort.ios_version): Return Version object instead of string.
+        (IOSSimulatorPort.use_multiple_simulator_apps): Use Version object instead of string.
+        * Scripts/webkitpy/xcode/simulator.py:
+        (Runtime.from_version): Accept Version object instead of string.
+        (Runtime.from_version_string): Replaced by from_version.
+        (Runtime.__repr__): When printing, a runtime's version will be a Version object instead
+        of a tuple.
+        (Simulator._parse_runtimes): Use Version object instead of tuple.
+        (Simulator._parse_devices): Ditto.
+        * Scripts/webkitpy/xcode/simulator_unittest.py: Use Version object instead of tuples.
+
 2017-11-09  Basuke Suzuki  <[email protected]>
 
         [WinCairo] Cannot find ImageDiff executable

Modified: trunk/Tools/Scripts/webkitpy/common/system/platforminfo.py (224656 => 224657)


--- trunk/Tools/Scripts/webkitpy/common/system/platforminfo.py	2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/common/system/platforminfo.py	2017-11-10 00:58:32 UTC (rev 224657)
@@ -1,5 +1,5 @@
 # Copyright (c) 2011 Google Inc. All rights reserved.
-# Copyright (c) 2015 Apple Inc. All rights reserved.
+# Copyright (c) 2015-2017 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -30,6 +30,7 @@
 import re
 import sys
 
+from webkitpy.common.version import Version
 from webkitpy.common.system.executive import Executive
 
 
@@ -55,9 +56,9 @@
         if self.os_name == 'freebsd' or self.os_name == 'openbsd' or self.os_name == 'netbsd' or self.os_name == 'ios':
             self.os_version = platform_module.release()
         if self.os_name.startswith('mac'):
-            self.os_version = self._determine_mac_version(platform_module.mac_ver()[0])
+            self.os_version = self._determine_mac_version(Version(platform_module.mac_ver()[0]))
         if self.os_name.startswith('win'):
-            self.os_version = self._determine_win_version(self._win_version_tuple(sys_module))
+            self.os_version = self._determine_win_version(self._win_version(sys_module))
         self._is_cygwin = sys_module.platform == 'cygwin'
 
     def is_mac(self):
@@ -127,8 +128,8 @@
     def xcode_sdk_version(self, sdk_name):
         if self.is_mac():
             # Assumes that xcrun does not write to standard output on failure (e.g. SDK does not exist).
-            return self._executive.run_command(["xcrun", "--sdk", sdk_name, "--show-sdk-version"], return_stderr=False, error_handler=Executive.ignore_error).rstrip()
-        return ''
+            return Version(self._executive.run_command(["xcrun", "--sdk", sdk_name, "--show-sdk-version"], return_stderr=False, error_handler=Executive.ignore_error).rstrip())
+        return None
 
     def xcode_simctl_list(self):
         if not self.is_mac():
@@ -139,7 +140,7 @@
     def xcode_version(self):
         if not self.is_mac():
             raise NotImplementedError
-        return self._executive.run_command(['xcodebuild', '-version']).split()[1]
+        return Version(self._executive.run_command(['xcodebuild', '-version']).split()[1])
 
     def _determine_os_name(self, sys_platform):
         if sys_platform == 'darwin':
@@ -158,8 +159,7 @@
             return 'haiku'
         raise AssertionError('unrecognized platform string "%s"' % sys_platform)
 
-    def _determine_mac_version(self, mac_version_string):
-        release_version = int(mac_version_string.split('.')[1])
+    def _determine_mac_version(self, mac_version):
         version_strings = {
             5: 'leopard',
             6: 'snowleopard',
@@ -171,34 +171,27 @@
             12: 'sierra',
             13: 'highsierra',
         }
-        assert release_version >= min(version_strings.keys())
-        return version_strings.get(release_version, 'future')
+        assert mac_version.minor >= min(version_strings.keys())
+        return version_strings.get(mac_version.minor, 'future')
 
     def _determine_linux_version(self):
         # FIXME: we ignore whatever the real version is and pretend it's lucid for now.
         return 'lucid'
 
-    def _determine_win_version(self, win_version_tuple):
-        if win_version_tuple[:2] == (0, 0):
-            if win_version_tuple[2] > 10000:
+    def _determine_win_version(self, win_version):
+        if win_version.major == 0 and win_version.minor == 0:
+            if win_version[2] > 10000:
                 return 'win10'
-        if win_version_tuple[:3] == (6, 1, 7600):
+        if win_version == Version([6, 1, 7600]):
             return '7sp0'
-        if win_version_tuple[:2] == (6, 0):
+        if win_version.major == 6 and win_version.minor == 0:
             return 'vista'
-        if win_version_tuple[:2] == (5, 1):
+        if win_version.major == 5 and win_version.minor == 1:
             return 'xp'
-        assert win_version_tuple[0] > 6 or win_version_tuple[1] >= 1, 'Unrecognized Windows version tuple: "%s"' % (win_version_tuple,)
+        assert win_version[0] > 6 or win_version[1] >= 1, 'Unrecognized Windows version: "{}"'.format(win_version)
         return 'future'
 
-    def _win_version_tuple(self, sys_module):
+    def _win_version(self, sys_module):
         if hasattr(sys_module, 'getwindowsversion'):
-            return sys_module.getwindowsversion()
-        return self._win_version_tuple_from_cmd()
-
-    def _win_version_tuple_from_cmd(self):
-        # Note that this should only ever be called on windows, so this should always work.
-        ver_output = self._executive.run_command(['cmd', '/c', 'ver'], decode_output=False)
-        match_object = re.search(r'(?P<major>\d)\.(?P<minor>\d)\.(?P<build>\d+)', ver_output)
-        assert match_object, 'cmd returned an unexpected version string: ' + ver_output
-        return tuple(map(int, match_object.groups()))
+            return Version(sys_module.getwindowsversion())
+        return Version(self._executive.run_command(['cmd', '/c', 'ver'], decode_output=False))

Modified: trunk/Tools/Scripts/webkitpy/common/system/platforminfo_mock.py (224656 => 224657)


--- trunk/Tools/Scripts/webkitpy/common/system/platforminfo_mock.py	2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/common/system/platforminfo_mock.py	2017-11-10 00:58:32 UTC (rev 224657)
@@ -1,4 +1,5 @@
 # Copyright (C) 2011 Google Inc. All rights reserved.
+# Copyright (c) 2017 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -26,6 +27,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+from webkitpy.common.version import Version
 
 class MockPlatformInfo(object):
     def __init__(self, os_name='mac', os_version='snowleopard'):
@@ -61,10 +63,10 @@
         return 80
 
     def xcode_sdk_version(self, sdk_name):
-        return '8.1'
+        return Version('8.1')
 
     def xcode_version(self):
-        return '8.0'
+        return Version('8.0')
 
     def xcode_simctl_list(self):
         return self.expected_xcode_simctl_list

Added: trunk/Tools/Scripts/webkitpy/common/version.py (0 => 224657)


--- trunk/Tools/Scripts/webkitpy/common/version.py	                        (rev 0)
+++ trunk/Tools/Scripts/webkitpy/common/version.py	2017-11-10 00:58:32 UTC (rev 224657)
@@ -0,0 +1,107 @@
+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+class Version(object):
+
+    def __init__(self, ver='0'):
+        self.major = 0
+        self.minor = 0
+        self.tiny = 0
+        self.micro = 0
+        self.nano = 0
+        if isinstance(ver, int):
+            self.major = ver
+            return
+        elif isinstance(ver, str) or isinstance(ver, unicode):
+            for i in xrange(len(ver.split('.'))):
+                self[i] = ver.split('.')[i]
+            return
+        elif isinstance(ver, list) or isinstance(ver, Version) or isinstance(ver, tuple):
+            for i in xrange(len(ver)):
+                self[i] = ver[i]
+            return
+        elif ver is None:
+            return  # Empty version is implicitly zero
+        raise ValueError('Version expected to be string, integer, tuple or list of integers')
+
+    def __len__(self):
+        return 5
+
+    def __getitem__(self, key):
+        if isinstance(key, int):
+            if key == 0:
+                return self.major
+            elif key == 1:
+                return self.minor
+            elif key == 2:
+                return self.tiny
+            elif key == 3:
+                return self.micro
+            elif key == 4:
+                return self.nano
+            raise ValueError('Version key must be between 0 and 4')
+        elif isinstance(key, str):
+            if hasattr(self, key):
+                return getattr(self, key)
+            raise ValueError('Version key must be major, minor, tiny, micro or nano')
+        raise ValueError('Expected version key to be string or integer')
+
+    def __setitem__(self, key, value):
+        if isinstance(key, int):
+            if key == 0:
+                self.major = int(value)
+                return self.major
+            elif key == 1:
+                self.minor = int(value)
+                return self.minor
+            elif key == 2:
+                self.tiny = int(value)
+                return self.tiny
+            elif key == 3:
+                self.micro = int(value)
+                return self.micro
+            elif key == 4:
+                self.nano = int(value)
+                return self.nano
+            raise ValueError('Version key must be between 0 and 4')
+        elif isinstance(key, str):
+            if hasattr(self, key):
+                return setattr(self, key, value)
+            raise ValueError('Version key must be major, minor, tiny, micro or nano')
+        raise ValueError('Expected version key to be string or integer')
+
+    def __str__(self):
+        len_to_print = 1
+        for i in xrange(len(self)):
+            if self[i]:
+                len_to_print = i + 1
+        result = str(self.major)
+        for i in xrange(len_to_print - 1):
+            result += '.{}'.format(self[i + 1])
+        return result
+
+    def __cmp__(self, other):
+        for i in xrange(len(self)):
+            if cmp(self[i], other[i]):
+                return cmp(self[i], other[i])
+        return 0

Added: trunk/Tools/Scripts/webkitpy/common/version_unittest.py (0 => 224657)


--- trunk/Tools/Scripts/webkitpy/common/version_unittest.py	                        (rev 0)
+++ trunk/Tools/Scripts/webkitpy/common/version_unittest.py	2017-11-10 00:58:32 UTC (rev 224657)
@@ -0,0 +1,132 @@
+# Copyright (C) 2017 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import unittest
+
+from version import Version
+
+
+class VersionTestCase(unittest.TestCase):
+
+    def test_string_constructor(self):
+        v = Version('1.2.3.4.5')
+        self.assertEqual(v.major, 1)
+        self.assertEqual(v.minor, 2)
+        self.assertEqual(v.tiny, 3)
+        self.assertEqual(v.micro, 4)
+        self.assertEqual(v.nano, 5)
+
+    def test_list_constructor(self):
+        v = Version([1, 2, 3, 4, 5])
+        self.assertEqual(v.major, 1)
+        self.assertEqual(v.minor, 2)
+        self.assertEqual(v.tiny, 3)
+        self.assertEqual(v.micro, 4)
+        self.assertEqual(v.nano, 5)
+
+    def test_tuple_constructor(self):
+        v = Version((1, 2, 3))
+        self.assertEqual(v.major, 1)
+        self.assertEqual(v.minor, 2)
+        self.assertEqual(v.tiny, 3)
+
+    def test_int_constructor(self):
+        v = Version(1)
+        self.assertEqual(v.major, 1)
+        self.assertEqual(v.minor, 0)
+        self.assertEqual(v.tiny, 0)
+        self.assertEqual(v.micro, 0)
+        self.assertEqual(v.nano, 0)
+
+    def test_copy_constructor(self):
+        v = Version(Version([1, 2, 3, 4, 5]))
+        self.assertEqual(v.major, 1)
+        self.assertEqual(v.minor, 2)
+        self.assertEqual(v.tiny, 3)
+        self.assertEqual(v.micro, 4)
+        self.assertEqual(v.nano, 5)
+
+    def test_none_constructor(self):
+        v = Version(None)
+        self.assertEqual(v.major, 0)
+        self.assertEqual(v.minor, 0)
+        self.assertEqual(v.tiny, 0)
+        self.assertEqual(v.micro, 0)
+        self.assertEqual(v.nano, 0)
+
+    def test_len(self):
+        self.assertEqual(len(Version('1.2.3.4.5')), 5)
+        self.assertEqual(len(Version()), 5)
+
+    def test_set_by_int(self):
+        v = Version(None)
+        v[0] = 1
+        self.assertEqual(v.major, 1)
+        v[1] = 2
+        self.assertEqual(v.minor, 2)
+        v[2] = 3
+        self.assertEqual(v.tiny, 3)
+        v[3] = 4
+        self.assertEqual(v.micro, 4)
+        v[4] = 5
+        self.assertEqual(v.nano, 5)
+
+    def test_set_by_string(self):
+        v = Version(None)
+        v['major'] = 1
+        self.assertEqual(v.major, 1)
+        v['minor'] = 2
+        self.assertEqual(v.minor, 2)
+        v['tiny'] = 3
+        self.assertEqual(v.tiny, 3)
+        v['micro'] = 4
+        self.assertEqual(v.micro, 4)
+        v['nano'] = 5
+        self.assertEqual(v.nano, 5)
+
+    def test_get_by_int(self):
+        v = Version('1.2.3.4.5')
+        self.assertEqual(v[0], v.major)
+        self.assertEqual(v[1], v.minor)
+        self.assertEqual(v[2], v.tiny)
+        self.assertEqual(v[3], v.micro)
+        self.assertEqual(v[4], v.nano)
+
+    def test_get_by_string(self):
+        v = Version('1.2.3.4.5')
+        self.assertEqual(v['major'], v.major)
+        self.assertEqual(v['minor'], v.minor)
+        self.assertEqual(v['tiny'], v.tiny)
+        self.assertEqual(v['micro'], v.micro)
+        self.assertEqual(v['nano'], v.nano)
+
+    def test_string(self):
+        self.assertEqual(str(Version('1.2.3')), '1.2.3')
+        self.assertEqual(str(Version('1.2.0')), '1.2')
+        self.assertEqual(str(Version('1.2')), '1.2')
+        self.assertEqual(str(Version('0.0.3')), '0.0.3')
+
+    def test_compare_versions(self):
+        self.assertEqual(Version('1.2.3'), Version('1.2.3'))
+        self.assertGreater(Version('1.2.4'), Version('1.2.3'))
+        self.assertGreater(Version('1.3.2'), Version('1.2.3'))
+        self.assertGreater(Version('2.1.1'), Version('1.2.3'))

Modified: trunk/Tools/Scripts/webkitpy/port/ios.py (224656 => 224657)


--- trunk/Tools/Scripts/webkitpy/port/ios.py	2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/port/ios.py	2017-11-10 00:58:32 UTC (rev 224657)
@@ -24,6 +24,7 @@
 import traceback
 
 from webkitpy.common.memoized import memoized
+from webkitpy.common.version import Version
 from webkitpy.layout_tests.models.test_configuration import TestConfiguration
 from webkitpy.port.config import apple_additions
 from webkitpy.port.darwin import DarwinPort
@@ -109,11 +110,11 @@
         if self.get_option('webkit_test_runner'):
             wk_string = 'wk2'
         fallback_names = [
-            '{}-{}-{}'.format(self.port_name, self.ios_version().split('.')[0], wk_string),
-            '{}-{}'.format(self.port_name, self.ios_version().split('.')[0]),
+            '{}-{}-{}'.format(self.port_name, self.ios_version().major, wk_string),
+            '{}-{}'.format(self.port_name, self.ios_version().major),
             '{}-{}'.format(self.port_name, wk_string),
             self.port_name,
-            '{}-{}'.format(IOSPort.port_name, self.ios_version().split('.')[0]),
+            '{}-{}'.format(IOSPort.port_name, self.ios_version().major),
             '{}-{}'.format(IOSPort.port_name, wk_string),
             IOSPort.port_name,
         ]
@@ -134,22 +135,6 @@
     def test_expectations_file_position(self):
         return 4
 
-    @staticmethod
-    def _is_valid_ios_version(version_identifier):
-        # Examples of valid versions: '11', '10.3', '10.3.1'
-        if not version_identifier:
-            return False
-        split_by_period = version_identifier.split('.')
-        if len(split_by_period) > 3:
-            return False
-        return all(part.isdigit() for part in split_by_period)
-
-    def get_option(self, name, default_value=None):
-        result = super(IOSPort, self).get_option(name, default_value)
-        if name == 'version' and result and not IOSPort._is_valid_ios_version(result):
-            raise RuntimeError('{} is an invalid iOS version'.format(result))
-        return result
-
     def ios_version(self):
         raise NotImplementedError
 

Modified: trunk/Tools/Scripts/webkitpy/port/ios_device.py (224656 => 224657)


--- trunk/Tools/Scripts/webkitpy/port/ios_device.py	2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/port/ios_device.py	2017-11-10 00:58:32 UTC (rev 224657)
@@ -24,6 +24,7 @@
 
 from webkitpy.common.memoized import memoized
 from webkitpy.common.system.crashlogs import CrashLogs
+from webkitpy.common.version import Version
 from webkitpy.port.config import apple_additions
 from webkitpy.port.ios import IOSPort
 
@@ -64,8 +65,7 @@
             iphoneos_sdk_version = host.platform.xcode_sdk_version(cls.SDK)
             if not iphoneos_sdk_version:
                 raise Exception("Please install the iOS SDK.")
-            major_version_number = iphoneos_sdk_version.split('.')[0]
-            port_name = port_name + '-' + major_version_number
+            port_name = port_name + '-' + str(iphoneos_sdk_version.major)
         return port_name
 
     def path_to_crash_logs(self):
@@ -94,7 +94,7 @@
     @memoized
     def ios_version(self):
         if self.get_option('version'):
-            return self.get_option('version')
+            return Version(self.get_option('version'))
 
         if not apple_additions():
             raise RuntimeError(self.NO_ON_DEVICE_TESTING)
@@ -109,7 +109,7 @@
                 if device.platform.os_version != version:
                     raise RuntimeError('Multiple connected devices have different iOS versions')
 
-        return version
+        return Version(version)
 
     # FIXME: These need device implementations <rdar://problem/30497991>.
     def check_for_leaks(self, process_name, process_pid):

Modified: trunk/Tools/Scripts/webkitpy/port/ios_simulator.py (224656 => 224657)


--- trunk/Tools/Scripts/webkitpy/port/ios_simulator.py	2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/port/ios_simulator.py	2017-11-10 00:58:32 UTC (rev 224657)
@@ -30,6 +30,7 @@
 
 from webkitpy.common.memoized import memoized
 from webkitpy.common.system.executive import ScriptError
+from webkitpy.common.version import Version
 from webkitpy.port.device import Device
 from webkitpy.port.ios import IOSPort
 from webkitpy.xcode.simulator import Simulator, Runtime, DeviceType
@@ -102,9 +103,9 @@
         if runtime_identifier:
             runtime = Runtime.from_identifier(runtime_identifier)
         elif self.get_option('version'):
-            runtime = Runtime.from_version_string(self.get_option('version'))
+            runtime = Runtime.from_version(Version(self.get_option('version')))
         else:
-            runtime = Runtime.from_version_string(self.host.platform.xcode_sdk_version('iphonesimulator'))
+            runtime = Runtime.from_version(self.host.platform.xcode_sdk_version('iphonesimulator'))
         return runtime
 
     @memoized
@@ -111,7 +112,7 @@
     def ios_version(self):
         runtime_identifier = self.get_option('runtime')
         if self.get_option('version'):
-            return self.get_option('version')
+            return Version(self.get_option('version'))
         if runtime_identifier:
             return '.'.join(str(i) for i in Runtime.from_identifier(runtime_identifier).version)
         return self.host.platform.xcode_sdk_version('iphonesimulator')
@@ -187,7 +188,7 @@
                 _log.warning('Unable to remove Simulator' + str(i))
 
     def use_multiple_simulator_apps(self):
-        return int(self.host.platform.xcode_version().split('.')[0]) < 9
+        return int(self.host.platform.xcode_version().major) < 9
 
     def _create_simulators(self):
         if (self.default_child_processes() < self.child_processes()):

Modified: trunk/Tools/Scripts/webkitpy/xcode/simulator.py (224656 => 224657)


--- trunk/Tools/Scripts/webkitpy/xcode/simulator.py	2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/xcode/simulator.py	2017-11-10 00:58:32 UTC (rev 224657)
@@ -30,6 +30,7 @@
 
 from webkitpy.common.timeout_context import Timeout
 from webkitpy.common.host import Host
+from webkitpy.common.version import Version
 
 _log = logging.getLogger(__name__)
 
@@ -129,8 +130,8 @@
         self.is_internal_runtime = is_internal_runtime
 
     @classmethod
-    def from_version_string(cls, version):
-        return cls.from_identifier('com.apple.CoreSimulator.SimRuntime.iOS-' + version.replace('.', '-'))
+    def from_version(cls, version):
+        return cls.from_identifier('com.apple.CoreSimulator.SimRuntime.iOS-' + '{}-{}'.format(version[0], version[1]))
 
     @classmethod
     def from_identifier(cls, identifier):
@@ -156,7 +157,7 @@
         if self.is_internal_runtime:
             version_suffix = " Internal"
         return '<Runtime {version}: {identifier}. Available: {available}, {num_devices} devices>'.format(
-            version='.'.join(map(str, self.version)) + version_suffix,
+            version=str(self.version) + version_suffix,
             identifier=self.identifier,
             available=self.available,
             num_devices=len(self.devices))
@@ -334,8 +335,7 @@
                 if line != '== Devices ==':
                     raise RuntimeError('Expected == Devices == header but got: "{}"'.format(line))
                 break
-            version = tuple(map(int, runtime_match.group('version').split('.')))
-            runtime = Runtime(version=version,
+            runtime = Runtime(version=Version(runtime_match.group('version')),
                               identifier=runtime_match.group('identifier'),
                               available=runtime_match.group('availability') is None,
                               is_internal_runtime=bool(runtime_match.group('internal')))
@@ -353,8 +353,7 @@
         for line in lines:
             version_match = self.version_re.match(line)
             if version_match:
-                version = tuple(map(int, version_match.group('version').split('.')))
-                current_runtime = self.runtime(version=version, is_internal_runtime=bool(version_match.group('internal')))
+                current_runtime = self.runtime(version=Version(version_match.group('version')), is_internal_runtime=bool(version_match.group('internal')))
                 assert current_runtime
                 continue
 

Modified: trunk/Tools/Scripts/webkitpy/xcode/simulator_unittest.py (224656 => 224657)


--- trunk/Tools/Scripts/webkitpy/xcode/simulator_unittest.py	2017-11-10 00:48:51 UTC (rev 224656)
+++ trunk/Tools/Scripts/webkitpy/xcode/simulator_unittest.py	2017-11-10 00:58:32 UTC (rev 224657)
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Apple Inc. All rights reserved.
+# Copyright (C) 2015-2017 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -23,6 +23,7 @@
 import unittest
 
 from webkitpy.common.host_mock import MockHost
+from webkitpy.common.version import Version
 from webkitpy.xcode.simulator import Simulator
 
 
@@ -134,7 +135,7 @@
         self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0', runtime_ios_8.identifier)
         self.assertEqual(True, runtime_ios_8.available)
         self.assertEqual(False, runtime_ios_8.is_internal_runtime)
-        self.assertEqual(tuple([8, 0]), runtime_ios_8.version)
+        self.assertEqual(Version([8, 0]), runtime_ios_8.version)
         self.assertEqual(11, len(runtime_ios_8.devices))
 
         device_iphone_4s = runtime_ios_8.devices[0]
@@ -207,7 +208,7 @@
         self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0-Internal', runtime_ios_8_internal.identifier)
         self.assertEqual(False, runtime_ios_8_internal.available)
         self.assertEqual(True, runtime_ios_8_internal.is_internal_runtime)
-        self.assertEqual(tuple([8, 0]), runtime_ios_8_internal.version)
+        self.assertEqual(Version([8, 0]), runtime_ios_8_internal.version)
         self.assertEqual(0, len(runtime_ios_8_internal.devices))
 
         runtime_ios_8_4 = simulator.runtimes[2]
@@ -214,7 +215,7 @@
         self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-4', runtime_ios_8_4.identifier)
         self.assertEqual(True, runtime_ios_8_4.available)
         self.assertEqual(False, runtime_ios_8_4.is_internal_runtime)
-        self.assertEqual(tuple([8, 4]), runtime_ios_8_4.version)
+        self.assertEqual(Version([8, 4]), runtime_ios_8_4.version)
         self.assertEqual(0, len(runtime_ios_8_4.devices))
 
         runtime_tvos_9 = simulator.runtimes[3]
@@ -221,7 +222,7 @@
         self.assertEqual('com.apple.CoreSimulator.SimRuntime.tvOS-9-0', runtime_tvos_9.identifier)
         self.assertEqual(True, runtime_tvos_9.available)
         self.assertEqual(False, runtime_tvos_9.is_internal_runtime)
-        self.assertEqual(tuple([9, 0]), runtime_tvos_9.version)
+        self.assertEqual(Version([9, 0]), runtime_tvos_9.version)
         self.assertEqual(1, len(runtime_tvos_9.devices))
 
         device_apple_tv_1080p = runtime_tvos_9.devices[0]
@@ -234,7 +235,7 @@
         self.assertEqual('com.apple.CoreSimulator.SimRuntime.watchOS-2-0', runtime_watchos_2.identifier)
         self.assertEqual(True, runtime_watchos_2.available)
         self.assertEqual(False, runtime_watchos_2.is_internal_runtime)
-        self.assertEqual(tuple([2, 0]), runtime_watchos_2.version)
+        self.assertEqual(Version([2, 0]), runtime_watchos_2.version)
         self.assertEqual(2, len(runtime_watchos_2.devices))
 
         runtime_ios_10 = simulator.runtimes[5]
@@ -241,7 +242,7 @@
         self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-10-0', runtime_ios_10.identifier)
         self.assertEqual(True, runtime_ios_10.available)
         self.assertEqual(False, runtime_ios_10.is_internal_runtime)
-        self.assertEqual(tuple([10, 0]), runtime_ios_10.version)
+        self.assertEqual(Version([10, 0]), runtime_ios_10.version)
         self.assertEqual(0, len(runtime_ios_10.devices))
 
         device_apple_watch_38mm = runtime_watchos_2.devices[0]
@@ -315,7 +316,7 @@
         self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0', runtime_ios_8.identifier)
         self.assertEqual(True, runtime_ios_8.available)
         self.assertEqual(False, runtime_ios_8.is_internal_runtime)
-        self.assertEqual(tuple([8, 0]), runtime_ios_8.version)
+        self.assertEqual(Version([8, 0]), runtime_ios_8.version)
         self.assertEqual(1, len(runtime_ios_8.devices))
 
         device_iphone_4s = runtime_ios_8.devices[0]
@@ -328,7 +329,7 @@
         self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0-Internal', runtime_ios_8_internal.identifier)
         self.assertEqual(False, runtime_ios_8_internal.available)
         self.assertEqual(True, runtime_ios_8_internal.is_internal_runtime)
-        self.assertEqual(tuple([8, 0]), runtime_ios_8_internal.version)
+        self.assertEqual(Version([8, 0]), runtime_ios_8_internal.version)
         self.assertEqual(0, len(runtime_ios_8_internal.devices))
 
     def test_device_pairs(self):
@@ -356,7 +357,7 @@
         self.assertEqual('com.apple.CoreSimulator.SimRuntime.iOS-8-0', runtime_ios_8.identifier)
         self.assertEqual(True, runtime_ios_8.available)
         self.assertEqual(False, runtime_ios_8.is_internal_runtime)
-        self.assertEqual(tuple([8, 0]), runtime_ios_8.version)
+        self.assertEqual(Version([8, 0]), runtime_ios_8.version)
         self.assertEqual(1, len(runtime_ios_8.devices))
 
         device_iphone_4s = runtime_ios_8.devices[0]
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to