diff options
| author | Davanum Srinivas <davanum@gmail.com> | 2012-12-03 23:51:18 -0500 |
|---|---|---|
| committer | Davanum Srinivas <davanum@gmail.com> | 2012-12-04 10:37:33 -0500 |
| commit | c67f2881a4bbe5958048610458180c3f9d914964 (patch) | |
| tree | 16fe1d73cc9bd43152aa182ebc3203b0fa59bffb /openstack | |
| parent | 45e6afcbf51f07a381b17fbe30a87776ee84ad59 (diff) | |
| download | oslo-c67f2881a4bbe5958048610458180c3f9d914964.tar.gz oslo-c67f2881a4bbe5958048610458180c3f9d914964.tar.xz oslo-c67f2881a4bbe5958048610458180c3f9d914964.zip | |
Fix broken --version command
The code for lazy loading of version string was broken. The way it
breaks in glance and oslo is different. This patch is just for oslo.
Here we end up overriding more methods in our lazy string class to make
argparse happy and added test cases to make sure we don't break again.
we also sure we cache the result of the lookup so we return the same
version everytime and for performance. Added a few test cases as well.
Fixes LP #1085984
Change-Id: I0635899c37fa8e5a7edf282907d2a5e04aa064cb
Diffstat (limited to 'openstack')
| -rw-r--r-- | openstack/common/version.py | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/openstack/common/version.py b/openstack/common/version.py index a19e422..dae88e3 100644 --- a/openstack/common/version.py +++ b/openstack/common/version.py @@ -24,17 +24,37 @@ import pkg_resources import setup -class _deferred_version_string(object): +class _deferred_version_string(str): """Internal helper class which provides delayed version calculation.""" - def __init__(self, version_info, prefix): - self.version_info = version_info - self.prefix = prefix + + 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 "%s%s" % (self.prefix, self.version_info.version_string()) + return self._get_cached_version() def __repr__(self): - return "%s%s" % (self.prefix, self.version_info.version_string()) + return self._get_cached_version() class VersionInfo(object): |
