summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openstack/common/version.py41
-rw-r--r--tests/unit/test_version.py27
2 files changed, 29 insertions, 39 deletions
diff --git a/openstack/common/version.py b/openstack/common/version.py
index dae88e3..2c11fbc 100644
--- a/openstack/common/version.py
+++ b/openstack/common/version.py
@@ -24,39 +24,6 @@ import pkg_resources
import setup
-class _deferred_version_string(str):
- """Internal helper class which provides delayed version calculation."""
-
- def __new__(cls, version_info, prefix):
- new_obj = str.__new__(cls, "")
- new_obj._version_info = version_info
- new_obj._prefix = prefix
- new_obj._cached_version = None
- return new_obj
-
- def _get_cached_version(self):
- if not self._cached_version:
- self._cached_version = \
- "%s%s" % (self._prefix,
- self._version_info.version_string())
- return self._cached_version
-
- def __len__(self):
- return self._get_cached_version().__len__()
-
- def __contains__(self, item):
- return self._get_cached_version().__contains__(item)
-
- def __getslice__(self, i, j):
- return self._get_cached_version().__getslice__(i, j)
-
- def __str__(self):
- return self._get_cached_version()
-
- def __repr__(self):
- return self._get_cached_version()
-
-
class VersionInfo(object):
def __init__(self, package, python_package=None, pre_version=None):
@@ -77,6 +44,7 @@ class VersionInfo(object):
self.python_package = python_package
self.pre_version = pre_version
self.version = None
+ self._cached_version = None
def _generate_version(self):
"""Defer to the openstack.common.setup routines for making a
@@ -158,11 +126,14 @@ class VersionInfo(object):
else:
return '%s-dev' % (version_parts[0],)
- def deferred_version_string(self, prefix=""):
+ def cached_version_string(self, prefix=""):
"""Generate an object which will expand in a string context to
the results of version_string(). We do this so that don't
call into pkg_resources every time we start up a program when
passing version information into the CONF constructor, but
rather only do the calculation when and if a version is requested
"""
- return _deferred_version_string(self, prefix)
+ if not self._cached_version:
+ self._cached_version = "%s%s" % (prefix,
+ self.version_string())
+ return self._cached_version
diff --git a/tests/unit/test_version.py b/tests/unit/test_version.py
index 8e60f51..c67ccde 100644
--- a/tests/unit/test_version.py
+++ b/tests/unit/test_version.py
@@ -42,23 +42,23 @@ class DeferredVersionTestCase(BaseTestCase):
super(DeferredVersionTestCase, self).setUp()
self.conf = ConfigOpts()
- def test_deferred_version(self):
+ def test_cached_version(self):
class MyVersionInfo(version.VersionInfo):
def _generate_version(self):
return "5.5.5.5"
deferred_string = MyVersionInfo("openstack").\
- deferred_version_string()
+ cached_version_string()
self.conf([], project="project", prog="prog", version=deferred_string)
self.assertEquals("5.5.5.5", str(self.conf.version))
- def test_print_deferred_version(self):
+ def test_print_cached_version(self):
class MyVersionInfo(version.VersionInfo):
def _generate_version(self):
return "5.5.5.5"
deferred_string = MyVersionInfo("openstack")\
- .deferred_version_string()
+ .cached_version_string()
self.stubs.Set(sys, 'stderr', StringIO.StringIO())
self.assertRaises(SystemExit,
self.conf, ['--version'],
@@ -66,3 +66,22 @@ class DeferredVersionTestCase(BaseTestCase):
prog="prog",
version=deferred_string)
self.assertEquals("5.5.5.5", sys.stderr.getvalue().strip())
+
+ def test_print_cached_version_with_long_string(self):
+ my_version = "11111222223333344444555556666677777888889999900000"
+
+ class MyVersionInfo(version.VersionInfo):
+ def _generate_version(self):
+ return my_version
+
+ deferred_string = MyVersionInfo("openstack")\
+ .cached_version_string()
+
+ for i in range(50):
+ self.stubs.Set(sys, 'stderr', StringIO.StringIO())
+ self.assertRaises(SystemExit,
+ self.conf, ['--version'],
+ project="project",
+ prog="prog",
+ version=deferred_string)
+ self.assertEquals(my_version, sys.stderr.getvalue().strip())