summaryrefslogtreecommitdiffstats
path: root/WebKitTools/Scripts/webkitpy/python24
diff options
context:
space:
mode:
Diffstat (limited to 'WebKitTools/Scripts/webkitpy/python24')
-rw-r--r--WebKitTools/Scripts/webkitpy/python24/__init__.py1
-rw-r--r--WebKitTools/Scripts/webkitpy/python24/versioning.py133
-rw-r--r--WebKitTools/Scripts/webkitpy/python24/versioning_unittest.py134
3 files changed, 268 insertions, 0 deletions
diff --git a/WebKitTools/Scripts/webkitpy/python24/__init__.py b/WebKitTools/Scripts/webkitpy/python24/__init__.py
new file mode 100644
index 0000000..ef65bee
--- /dev/null
+++ b/WebKitTools/Scripts/webkitpy/python24/__init__.py
@@ -0,0 +1 @@
+# Required for Python to search this directory for module files
diff --git a/WebKitTools/Scripts/webkitpy/python24/versioning.py b/WebKitTools/Scripts/webkitpy/python24/versioning.py
new file mode 100644
index 0000000..8b1f21b
--- /dev/null
+++ b/WebKitTools/Scripts/webkitpy/python24/versioning.py
@@ -0,0 +1,133 @@
+# Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
+#
+# 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.
+
+"""Supports Python version checking."""
+
+import logging
+import sys
+
+_log = logging.getLogger("webkitpy.python24.versioning")
+
+# The minimum Python version the webkitpy package supports.
+_MINIMUM_SUPPORTED_PYTHON_VERSION = "2.5"
+
+
+def compare_version(sysmodule=None, target_version=None):
+ """Compare the current Python version with a target version.
+
+ Args:
+ sysmodule: An object with version and version_info data attributes
+ used to detect the current Python version. The attributes
+ should have the same semantics as sys.version and
+ sys.version_info. This parameter should only be used
+ for unit testing. Defaults to sys.
+ target_version: A string representing the Python version to compare
+ the current version against. The string should have
+ one of the following three forms: 2, 2.5, or 2.5.3.
+ Defaults to the minimum version that the webkitpy
+ package supports.
+
+ Returns:
+ A triple of (comparison, current_version, target_version).
+
+ comparison: An integer representing the result of comparing the
+ current version with the target version. A positive
+ number means the current version is greater than the
+ target, 0 means they are the same, and a negative number
+ means the current version is less than the target.
+ This method compares version information only up
+ to the precision of the given target version. For
+ example, if the target version is 2.6 and the current
+ version is 2.5.3, this method uses 2.5 for the purposes
+ of comparing with the target.
+ current_version: A string representing the current Python version, for
+ example 2.5.3.
+ target_version: A string representing the version that the current
+ version was compared against, for example 2.5.
+
+ """
+ if sysmodule is None:
+ sysmodule = sys
+ if target_version is None:
+ target_version = _MINIMUM_SUPPORTED_PYTHON_VERSION
+
+ # The number of version parts to compare.
+ precision = len(target_version.split("."))
+
+ # We use sys.version_info rather than sys.version since its first
+ # three elements are guaranteed to be integers.
+ current_version_info_to_compare = sysmodule.version_info[:precision]
+ # Convert integers to strings.
+ current_version_info_to_compare = map(str, current_version_info_to_compare)
+ current_version_to_compare = ".".join(current_version_info_to_compare)
+
+ # Compare version strings lexicographically.
+ if current_version_to_compare > target_version:
+ comparison = 1
+ elif current_version_to_compare == target_version:
+ comparison = 0
+ else:
+ comparison = -1
+
+ # The version number portion of the current version string, for
+ # example "2.6.4".
+ current_version = sysmodule.version.split()[0]
+
+ return (comparison, current_version, target_version)
+
+
+# FIXME: Add a logging level parameter to allow the version message
+# to be logged at levels other than WARNING, for example CRITICAL.
+def check_version(log=None, sysmodule=None, target_version=None):
+ """Check the current Python version against a target version.
+
+ Logs a warning message if the current version is less than the
+ target version.
+
+ Args:
+ log: A logging.logger instance to use when logging the version warning.
+ Defaults to the logger of this module.
+ sysmodule: See the compare_version() docstring.
+ target_version: See the compare_version() docstring.
+
+ Returns:
+ A boolean value of whether the current version is greater than
+ or equal to the target version.
+
+ """
+ if log is None:
+ log = _log
+
+ (comparison, current_version, target_version) = \
+ compare_version(sysmodule, target_version)
+
+ if comparison >= 0:
+ # Then the current version is at least the minimum version.
+ return True
+
+ message = ("WebKit Python scripts do not support your current Python "
+ "version (%s). The minimum supported version is %s.\n"
+ " See the following page to upgrade your Python version:\n\n"
+ " http://trac.webkit.org/wiki/PythonGuidelines\n"
+ % (current_version, target_version))
+ log.warn(message)
+ return False
diff --git a/WebKitTools/Scripts/webkitpy/python24/versioning_unittest.py b/WebKitTools/Scripts/webkitpy/python24/versioning_unittest.py
new file mode 100644
index 0000000..6939e2d
--- /dev/null
+++ b/WebKitTools/Scripts/webkitpy/python24/versioning_unittest.py
@@ -0,0 +1,134 @@
+# Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
+#
+# 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.
+
+"""Contains unit tests for versioning.py."""
+
+import logging
+import unittest
+
+from webkitpy.common.system.logtesting import LogTesting
+from webkitpy.python24.versioning import check_version
+from webkitpy.python24.versioning import compare_version
+
+class MockSys(object):
+
+ """A mock sys module for passing to version-checking methods."""
+
+ def __init__(self, current_version):
+ """Create an instance.
+
+ current_version: A version string with major, minor, and micro
+ version parts.
+
+ """
+ version_info = current_version.split(".")
+ version_info = map(int, version_info)
+
+ self.version = current_version + " Version details."
+ self.version_info = version_info
+
+
+class CompareVersionTest(unittest.TestCase):
+
+ """Tests compare_version()."""
+
+ def _mock_sys(self, current_version):
+ return MockSys(current_version)
+
+ def test_default_minimum_version(self):
+ """Test the configured minimum version that webkitpy supports."""
+ (comparison, current_version, min_version) = compare_version()
+ self.assertEquals(min_version, "2.5")
+
+ def compare_version(self, target_version, current_version=None):
+ """Call compare_version()."""
+ if current_version is None:
+ current_version = "2.5.3"
+ mock_sys = self._mock_sys(current_version)
+ return compare_version(mock_sys, target_version)
+
+ def compare(self, target_version, current_version=None):
+ """Call compare_version(), and return the comparison."""
+ return self.compare_version(target_version, current_version)[0]
+
+ def test_returned_current_version(self):
+ """Test the current_version return value."""
+ current_version = self.compare_version("2.5")[1]
+ self.assertEquals(current_version, "2.5.3")
+
+ def test_returned_target_version(self):
+ """Test the current_version return value."""
+ target_version = self.compare_version("2.5")[2]
+ self.assertEquals(target_version, "2.5")
+
+ def test_target_version_major(self):
+ """Test major version for target."""
+ self.assertEquals(-1, self.compare("3"))
+ self.assertEquals(0, self.compare("2"))
+ self.assertEquals(1, self.compare("2", "3.0.0"))
+
+ def test_target_version_minor(self):
+ """Test minor version for target."""
+ self.assertEquals(-1, self.compare("2.6"))
+ self.assertEquals(0, self.compare("2.5"))
+ self.assertEquals(1, self.compare("2.4"))
+
+ def test_target_version_micro(self):
+ """Test minor version for target."""
+ self.assertEquals(-1, self.compare("2.5.4"))
+ self.assertEquals(0, self.compare("2.5.3"))
+ self.assertEquals(1, self.compare("2.5.2"))
+
+
+class CheckVersionTest(unittest.TestCase):
+
+ """Tests check_version()."""
+
+ def setUp(self):
+ self._log = LogTesting.setUp(self)
+
+ def tearDown(self):
+ self._log.tearDown()
+
+ def _check_version(self, minimum_version):
+ """Call check_version()."""
+ mock_sys = MockSys("2.5.3")
+ return check_version(sysmodule=mock_sys, target_version=minimum_version)
+
+ def test_true_return_value(self):
+ """Test the configured minimum version that webkitpy supports."""
+ is_current = self._check_version("2.4")
+ self.assertEquals(True, is_current)
+ self._log.assertMessages([]) # No warning was logged.
+
+ def test_false_return_value(self):
+ """Test the configured minimum version that webkitpy supports."""
+ is_current = self._check_version("2.6")
+ self.assertEquals(False, is_current)
+ expected_message = ('WARNING: WebKit Python scripts do not support '
+ 'your current Python version (2.5.3). '
+ 'The minimum supported version is 2.6.\n '
+ 'See the following page to upgrade your Python '
+ 'version:\n\n '
+ 'http://trac.webkit.org/wiki/PythonGuidelines\n\n')
+ self._log.assertMessages([expected_message])
+