commit 63a9a5fa524e352c94bab7beabd5052e4972c6c4
Author: Damian Johnson <atagar(a)torproject.org>
Date: Thu Oct 27 20:31:43 2011 -0700
Merging version constructor and parser
The version constructor wasn't really useful so merging it with the get_version
function to make its usage more intuitive.
---
stem/process.py | 4 +-
stem/types.py | 66 ++++++++++++++++++++-----------------------------
test/unit/version.py | 36 +++++++++++++-------------
3 files changed, 47 insertions(+), 59 deletions(-)
diff --git a/stem/process.py b/stem/process.py
index 0e22685..4eaf1f7 100644
--- a/stem/process.py
+++ b/stem/process.py
@@ -18,7 +18,7 @@ from stem.util import system
# number of seconds before we time out our attempt to start a tor instance
DEFAULT_INIT_TIMEOUT = 90
-# cache for the get_version function
+# cache for the get_tor_version function
VERSION_CACHE = {}
def get_tor_version(tor_cmd = "tor"):
@@ -52,7 +52,7 @@ def get_tor_version(tor_cmd = "tor"):
if last_line.startswith("Tor version ") and last_line.endswith("."):
try:
version_str = last_line[12:-1]
- VERSION_CACHE[tor_cmd] = stem.types.get_version(version_str)
+ VERSION_CACHE[tor_cmd] = stem.types.Version(version_str)
except ValueError, exc:
raise IOError(exc)
else:
diff --git a/stem/types.py b/stem/types.py
index 10b120b..b289921 100644
--- a/stem/types.py
+++ b/stem/types.py
@@ -12,7 +12,6 @@ ControlMessage - Message from the control socket.
|- __str__ - content stripped of protocol formatting
+- __iter__ - message components stripped of protocol formatting
-get_version - Converts a version string to a Version instance.
Version - Tor versioning information.
|- __str__ - string representation
+- __cmp__ - compares with another Version
@@ -202,37 +201,6 @@ class ControlMessage:
for _, _, content in self._parsed_content:
yield content
-def get_version(version_str):
- """
- Parses a version string, providing back a types.Version instance.
-
- Arguments:
- version_str (str) - representation of a tor version (ex. "0.2.2.23-alpha")
-
- Returns:
- stem.types.Version instance
-
- Raises:
- ValueError if input isn't a valid tor version
- """
-
- if not isinstance(version_str, str):
- raise ValueError("argument is not a string")
-
- m = re.match(r'^([0-9]+).([0-9]+).([0-9]+)(.[0-9]+)?(-\S*)?$', version_str)
-
- if m:
- major, minor, micro, patch, status = m.groups()
-
- # The patch and status matches are optional (may be None) and have an extra
- # proceeding period or dash if they exist. Stripping those off.
-
- if patch: patch = int(patch[1:])
- if status: status = status[1:]
-
- return Version(int(major), int(minor), int(micro), patch, status)
- else: raise ValueError("'%s' isn't a properly formatted tor version" % version_str)
-
class Version:
"""
Comparable tor version, as per the 'new version' of the version-spec...
@@ -247,12 +215,32 @@ class Version:
'alpha', 'beta-dev', etc (None if undefined)
"""
- def __init__(self, major, minor, micro, patch = None, status = None):
- self.major = major
- self.minor = minor
- self.micro = micro
- self.patch = patch
- self.status = status
+ def __init__(self, version_str):
+ """
+ Parses a valid tor version string, for instance "0.1.4" or
+ "0.2.2.23-alpha".
+
+ Raises:
+ ValueError if input isn't a valid tor version
+ """
+
+ m = re.match(r'^([0-9]+).([0-9]+).([0-9]+)(.[0-9]+)?(-\S*)?$', version_str)
+
+ if m:
+ major, minor, micro, patch, status = m.groups()
+
+ # The patch and status matches are optional (may be None) and have an extra
+ # proceeding period or dash if they exist. Stripping those off.
+
+ if patch: patch = int(patch[1:])
+ if status: status = status[1:]
+
+ self.major = int(major)
+ self.minor = int(minor)
+ self.micro = int(micro)
+ self.patch = patch
+ self.status = status
+ else: raise ValueError("'%s' isn't a properly formatted tor version" % version_str)
def __str__(self):
"""
@@ -292,5 +280,5 @@ class Version:
return cmp(my_status, other_status)
# TODO: version requirements will probably be moved to another module later
-REQ_GETINFO_CONFIG_TEXT = get_version("0.2.2.7-alpha")
+REQ_GETINFO_CONFIG_TEXT = Version("0.2.2.7-alpha")
diff --git a/test/unit/version.py b/test/unit/version.py
index 0c4a34a..3200d05 100644
--- a/test/unit/version.py
+++ b/test/unit/version.py
@@ -12,36 +12,36 @@ class TestVerionFunctions(unittest.TestCase):
def test_parsing(self):
"""
- Tests parsing by the 'get_version' function.
+ Tests parsing by the Version class constructor.
"""
# valid versions with various number of compontents to the version
- version = stem.types.get_version("0.1.2.3-tag")
+ version = stem.types.Version("0.1.2.3-tag")
self.assert_versions_match(version, 0, 1, 2, 3, "tag")
- version = stem.types.get_version("0.1.2.3")
+ version = stem.types.Version("0.1.2.3")
self.assert_versions_match(version, 0, 1, 2, 3, None)
- version = stem.types.get_version("0.1.2-tag")
+ version = stem.types.Version("0.1.2-tag")
self.assert_versions_match(version, 0, 1, 2, None, "tag")
- version = stem.types.get_version("0.1.2")
+ version = stem.types.Version("0.1.2")
self.assert_versions_match(version, 0, 1, 2, None, None)
# checks an empty tag
- version = stem.types.get_version("0.1.2.3-")
+ version = stem.types.Version("0.1.2.3-")
self.assert_versions_match(version, 0, 1, 2, 3, "")
- version = stem.types.get_version("0.1.2-")
+ version = stem.types.Version("0.1.2-")
self.assert_versions_match(version, 0, 1, 2, None, "")
# checks invalid version strings
- self.assertRaises(ValueError, stem.types.get_version, "")
- self.assertRaises(ValueError, stem.types.get_version, "1.2.3.4nodash")
- self.assertRaises(ValueError, stem.types.get_version, "1.2.3.a")
- self.assertRaises(ValueError, stem.types.get_version, "1.2.a.4")
- self.assertRaises(ValueError, stem.types.get_version, "12.3")
- self.assertRaises(ValueError, stem.types.get_version, "1.-2.3")
+ self.assertRaises(ValueError, stem.types.Version, "")
+ self.assertRaises(ValueError, stem.types.Version, "1.2.3.4nodash")
+ self.assertRaises(ValueError, stem.types.Version, "1.2.3.a")
+ self.assertRaises(ValueError, stem.types.Version, "1.2.a.4")
+ self.assertRaises(ValueError, stem.types.Version, "12.3")
+ self.assertRaises(ValueError, stem.types.Version, "1.-2.3")
def test_comparison(self):
"""
@@ -97,8 +97,8 @@ class TestVerionFunctions(unittest.TestCase):
second (also checking the inverse).
"""
- version1 = stem.types.get_version(first_version)
- version2 = stem.types.get_version(second_version)
+ version1 = stem.types.Version(first_version)
+ version2 = stem.types.Version(second_version)
self.assertEqual(version1 > version2, True)
self.assertEqual(version1 < version2, False)
@@ -107,8 +107,8 @@ class TestVerionFunctions(unittest.TestCase):
Asserts that the parsed version of the first version equals the second.
"""
- version1 = stem.types.get_version(first_version)
- version2 = stem.types.get_version(second_version)
+ version1 = stem.types.Version(first_version)
+ version2 = stem.types.Version(second_version)
self.assertEqual(version1, version2)
def assert_string_matches(self, version):
@@ -117,5 +117,5 @@ class TestVerionFunctions(unittest.TestCase):
matches the input.
"""
- self.assertEqual(version, str(stem.types.get_version(version)))
+ self.assertEqual(version, str(stem.types.Version(version)))