diff options
| -rw-r--r-- | openstack/common/version.py | 41 | ||||
| -rw-r--r-- | tests/unit/test_version.py | 27 |
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()) |
