From 46da5746b0af23640e7b6a9a7f90494916a8aadc Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Tue, 11 Dec 2012 18:05:03 -0500 Subject: fix intermittent failures with deferred version test Need to get rid of the deferred string approach as the problem was overriding string methods is hard and flaky. There is just no other documented argparse hook to allow deferring of the version calculation as version passed in has to be a str or buffer. Added a test to try longer string and even run it in a loop just to be sure. Fixes LP #1087575 Change-Id: Icf83944d67b8ce5d3230627f3de10501da3276f2 --- openstack/common/version.py | 41 ++++++----------------------------------- 1 file changed, 6 insertions(+), 35 deletions(-) (limited to 'openstack/common') 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 -- cgit