summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKiall Mac Innes <kiall@managedit.ie>2012-11-01 15:25:56 +0000
committerKiall Mac Innes <kiall@managedit.ie>2012-11-01 15:25:56 +0000
commit77409845403b51945b52e25550bbc599d4cd71af (patch)
tree441b40965350cc0cf3447d7896f416ffb61011d8
parentfbce3d38bf139f96506ecf3c710937661018d882 (diff)
downloadpython-designateclient-77409845403b51945b52e25550bbc599d4cd71af.tar.gz
Sync with OS-Common 3d6c2368 + Use OS-C's Version Module
Change-Id: I5208d2955f477973cff713713989a9ae8b74f80b
-rw-r--r--.gitignore4
-rw-r--r--monikerclient/openstack/common/setup.py28
-rw-r--r--monikerclient/openstack/common/version.py148
-rw-r--r--monikerclient/version.py18
-rw-r--r--openstack-common.conf2
-rwxr-xr-xsetup.py3
6 files changed, 189 insertions, 14 deletions
diff --git a/.gitignore b/.gitignore
index a99705a..ad65c36 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,7 @@ etc/*.conf
etc/*.ini
AUTHORS
ChangeLog
+doc/source/api/*
+doc/build/*
+dist
+moniker/versioninfo
diff --git a/monikerclient/openstack/common/setup.py b/monikerclient/openstack/common/setup.py
index 317e82d..83eef07 100644
--- a/monikerclient/openstack/common/setup.py
+++ b/monikerclient/openstack/common/setup.py
@@ -31,13 +31,13 @@ from setuptools.command import sdist
def parse_mailmap(mailmap='.mailmap'):
mapping = {}
if os.path.exists(mailmap):
- fp = open(mailmap, 'r')
- for l in fp:
- l = l.strip()
- if not l.startswith('#') and ' ' in l:
- canonical_email, alias = [x for x in l.split(' ')
- if x.startswith('<')]
- mapping[alias] = canonical_email
+ with open(mailmap, 'r') as fp:
+ for l in fp:
+ l = l.strip()
+ if not l.startswith('#') and ' ' in l:
+ canonical_email, alias = [x for x in l.split(' ')
+ if x.startswith('<')]
+ mapping[alias] = canonical_email
return mapping
@@ -54,7 +54,8 @@ def canonicalize_emails(changelog, mapping):
def get_reqs_from_files(requirements_files):
for requirements_file in requirements_files:
if os.path.exists(requirements_file):
- return open(requirements_file, 'r').read().split('\n')
+ with open(requirements_file, 'r') as fil:
+ return fil.read().split('\n')
return []
@@ -135,15 +136,17 @@ def _get_git_next_version_suffix(branch_name):
_run_shell_command("git fetch origin +refs/meta/*:refs/remotes/meta/*")
milestone_cmd = "git show meta/openstack/release:%s" % branch_name
milestonever = _run_shell_command(milestone_cmd)
- if not milestonever:
- milestonever = ""
+ if milestonever:
+ first_half = "%s~%s" % (milestonever, datestamp)
+ else:
+ first_half = datestamp
+
post_version = _get_git_post_version()
# post version should look like:
# 0.1.1.4.gcc9e28a
# where the bit after the last . is the short sha, and the bit between
# the last and second to last is the revno count
(revno, sha) = post_version.split(".")[-2:]
- first_half = "%s~%s" % (milestonever, datestamp)
second_half = "%s%s.%s" % (revno_prefix, revno, sha)
return ".".join((first_half, second_half))
@@ -236,7 +239,8 @@ def read_versioninfo(project):
def write_versioninfo(project, version):
"""Write a simple file containing the version of the package."""
- open(os.path.join(project, 'versioninfo'), 'w').write("%s\n" % version)
+ with open(os.path.join(project, 'versioninfo'), 'w') as fil:
+ fil.write("%s\n" % version)
def get_cmdclass():
diff --git a/monikerclient/openstack/common/version.py b/monikerclient/openstack/common/version.py
new file mode 100644
index 0000000..a19e422
--- /dev/null
+++ b/monikerclient/openstack/common/version.py
@@ -0,0 +1,148 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2012 OpenStack LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""
+Utilities for consuming the auto-generated versioninfo files.
+"""
+
+import datetime
+import pkg_resources
+
+import setup
+
+
+class _deferred_version_string(object):
+ """Internal helper class which provides delayed version calculation."""
+ def __init__(self, version_info, prefix):
+ self.version_info = version_info
+ self.prefix = prefix
+
+ def __str__(self):
+ return "%s%s" % (self.prefix, self.version_info.version_string())
+
+ def __repr__(self):
+ return "%s%s" % (self.prefix, self.version_info.version_string())
+
+
+class VersionInfo(object):
+
+ def __init__(self, package, python_package=None, pre_version=None):
+ """Object that understands versioning for a package
+ :param package: name of the top level python namespace. For glance,
+ this would be "glance" for python-glanceclient, it
+ would be "glanceclient"
+ :param python_package: optional name of the project name. For
+ glance this can be left unset. For
+ python-glanceclient, this would be
+ "python-glanceclient"
+ :param pre_version: optional version that the project is working to
+ """
+ self.package = package
+ if python_package is None:
+ self.python_package = package
+ else:
+ self.python_package = python_package
+ self.pre_version = pre_version
+ self.version = None
+
+ def _generate_version(self):
+ """Defer to the openstack.common.setup routines for making a
+ version from git."""
+ if self.pre_version is None:
+ return setup.get_post_version(self.python_package)
+ else:
+ return setup.get_pre_version(self.python_package, self.pre_version)
+
+ def _newer_version(self, pending_version):
+ """Check to see if we're working with a stale version or not.
+ We expect a version string that either looks like:
+ 2012.2~f3~20120708.10.4426392
+ which is an unreleased version of a pre-version, or:
+ 0.1.1.4.gcc9e28a
+ which is an unreleased version of a post-version, or:
+ 0.1.1
+ Which is a release and which should match tag.
+ For now, if we have a date-embedded version, check to see if it's
+ old, and if so re-generate. Otherwise, just deal with it.
+ """
+ try:
+ version_date = int(self.version.split("~")[-1].split('.')[0])
+ if version_date < int(datetime.date.today().strftime('%Y%m%d')):
+ return self._generate_version()
+ else:
+ return pending_version
+ except Exception:
+ return pending_version
+
+ def version_string_with_vcs(self, always=False):
+ """Return the full version of the package including suffixes indicating
+ VCS status.
+
+ For instance, if we are working towards the 2012.2 release,
+ canonical_version_string should return 2012.2 if this is a final
+ release, or else something like 2012.2~f1~20120705.20 if it's not.
+
+ :param always: if true, skip all version caching
+ """
+ if always:
+ self.version = self._generate_version()
+
+ if self.version is None:
+
+ requirement = pkg_resources.Requirement.parse(self.python_package)
+ versioninfo = "%s/versioninfo" % self.package
+ try:
+ raw_version = pkg_resources.resource_string(requirement,
+ versioninfo)
+ self.version = self._newer_version(raw_version.strip())
+ except (IOError, pkg_resources.DistributionNotFound):
+ self.version = self._generate_version()
+
+ return self.version
+
+ def canonical_version_string(self, always=False):
+ """Return the simple version of the package excluding any suffixes.
+
+ For instance, if we are working towards the 2012.2 release,
+ canonical_version_string should return 2012.2 in all cases.
+
+ :param always: if true, skip all version caching
+ """
+ return self.version_string_with_vcs(always).split('~')[0]
+
+ def version_string(self, always=False):
+ """Return the base version of the package.
+
+ For instance, if we are working towards the 2012.2 release,
+ version_string should return 2012.2 if this is a final release, or
+ 2012.2-dev if it is not.
+
+ :param always: if true, skip all version caching
+ """
+ version_parts = self.version_string_with_vcs(always).split('~')
+ if len(version_parts) == 1:
+ return version_parts[0]
+ else:
+ return '%s-dev' % (version_parts[0],)
+
+ def deferred_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)
diff --git a/monikerclient/version.py b/monikerclient/version.py
new file mode 100644
index 0000000..c51ff17
--- /dev/null
+++ b/monikerclient/version.py
@@ -0,0 +1,18 @@
+# Copyright 2012 Managed I.T.
+#
+# Author: Kiall Mac Innes <kiall@managedit.ie>
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+from monikerclient.openstack.common import version as common_version
+
+version_info = common_version.VersionInfo('monikerclient')
diff --git a/openstack-common.conf b/openstack-common.conf
index cc88b6f..1ebaec1 100644
--- a/openstack-common.conf
+++ b/openstack-common.conf
@@ -1,3 +1,3 @@
[DEFAULT]
-modules=setup
+modules=setup,version
base=monikerclient
diff --git a/setup.py b/setup.py
index b6b5bb5..bd6e49d 100755
--- a/setup.py
+++ b/setup.py
@@ -16,6 +16,7 @@
# under the License.
from setuptools import setup, find_packages
from monikerclient.openstack.common import setup as common_setup
+from monikerclient.version import version_info as version
install_requires = common_setup.parse_requirements(['tools/pip-requires'])
tests_require = common_setup.parse_requirements(['tools/test-requires'])
@@ -28,7 +29,7 @@ dependency_links = common_setup.parse_dependency_links([
setup(
name='python-monikerclient',
- version='0.0',
+ version=version.canonical_version_string(always=True),
description='DNS as a Service - Client',
author='Kiall Mac Innes',
author_email='kiall@managedit.ie',