diff options
| author | Monty Taylor <mordred@inaugust.com> | 2012-05-21 16:44:06 -0400 |
|---|---|---|
| committer | Monty Taylor <mordred@inaugust.com> | 2012-05-21 16:44:06 -0400 |
| commit | 1711f1f9bb3cd514ded6839cff7e3d3aff1df547 (patch) | |
| tree | 33454a3f10d9231ec5644901fbf8493d4cad5a3e | |
| parent | 471704df644eced17026c280b0aab9e549718e14 (diff) | |
| download | python-cinderclient-1711f1f9bb3cd514ded6839cff7e3d3aff1df547.tar.gz | |
Align setup.py and tox with standards.
Change-Id: Ic63c6fd4d770303ae5f295c58e43213e88e34b57
| -rw-r--r-- | AUTHORS | 60 | ||||
| -rw-r--r-- | MANIFEST.in | 1 | ||||
| -rw-r--r-- | cinderclient/openstack/__init__.py | 0 | ||||
| -rw-r--r-- | cinderclient/openstack/common/__init__.py | 0 | ||||
| -rw-r--r-- | cinderclient/openstack/common/setup.py | 183 | ||||
| -rw-r--r-- | setup.cfg | 2 | ||||
| -rw-r--r-- | setup.py | 13 | ||||
| -rw-r--r-- | tools/pip-requires | 5 | ||||
| -rw-r--r-- | tools/test-requires | 10 | ||||
| -rw-r--r-- | tox.ini | 40 |
10 files changed, 237 insertions, 77 deletions
@@ -1,60 +0,0 @@ -Aaron Lee <aaron.lee@rackspace.com> -Alex Meade <alex.meade@rackspace.com> -Alvaro Lopez Garcia <aloga@ifca.unican.es> -Andrey Brindeyev <abrindeyev@griddynamics.com> -Andy Smith <github@anarkystic.com> -Anthony Young <sleepsonthefloor@gmail.com> -Antony Messerli <amesserl@rackspace.com> -Armando Migliaccio <Armando.Migliaccio@eu.citrix.com> -Brian Lamar <brian.lamar@rackspace.com> -Brian Waldon <brian.waldon@rackspace.com> -Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk> -Chris Behrens <cbehrens+github@codestud.com> -Christian Berendt <berendt@b1-systems.de> -Christopher MacGown <ignoti+github@gmail.com> -Chuck Thier <cthier@gmail.com> -Cole Robinson <crobinso@redhat.com> -Dan Prince <dprince@redhat.com> -Dan Wendlandt <dan@nicira.com> -Dave Walker <Dave.Walker@canonical.com> -Dean Troyer <dtroyer@gmail.com> -Ed Leafe <ed@leafe.com> -Edouard Thuleau <edouard1.thuleau@orange.com> -Eldar Nugaev <eldr@ya.ru> -François Charlier <francois.charlier@ecindernce.com> -Gabriel Hurley <gabriel@strikeawe.com> -Gaurav Gupta <gaurav@denali-systems.com> -Hengqing Hu <hudayou@hotmail.com> -Ilya Alekseyev <ilyaalekseyev@acm.org> -Jake Dahn <admin@jakedahn.com> -James E. Blair <james.blair@rackspace.com> -Jason Kölker <jason@koelker.net> -Jason Straw <jason.straw@rackspace.com> -Jay Pipes <jaypipes@gmail.com> -Jesse Andrews <anotherjesse@gmail.com> -Johannes Erdfelt <johannes.erdfelt@rackspace.com> -John Garbutt <john.garbutt@citrix.com> -Josh Kearney <josh@jk0.org> -Juan G. Hernando Rivero <ghe.rivero@stackops.com> -Kevin L. Mitchell <kevin.mitchell@rackspace.com> -Kiall Mac Innes <kiall@managedit.ie> -Kirill Shileev <kshileev@griddynamics.com> -Lvov Maxim <mlvov@mirantis.com> -Matt Dietz <matt.dietz@rackspace.com> -Matt Stephenson <mattstep@mattstep.net> -Michael Basnight <mbasnight@gmail.com> -Nicholas Mistry <nmistry@gmail.com> -Nikolay Sokolov <nsokolov@griddynamics.com> -Pádraig Brady <pbrady@redhat.com> -Pavel Shkitin <pshkitin@griddynamics.com> -Peng Yong <ppyy@pubyun.com> -Rick Harris <rconradharris@gmail.com> -Robie Basak <robie.basak@canonical.com> -Russell Bryant <rbryant@redhat.com> -Sandy Walsh <sandy@darksecretsoftware.com> -Unmesh Gurjar <unmesh.gurjar@vertex.co.in> -William Wolf <throughnothing@gmail.com> -Yaguang Tang <heut2008@gmail.com> -Zhongyue Luo <lzyeval@gmail.com> -Scott Moser <smoser@ubuntu.com> -Paul Voccio <paul@substation9.com> diff --git a/MANIFEST.in b/MANIFEST.in index c217ce1..546c113 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,5 @@ include AUTHORS +include ChangeLog include HACKING include LICENSE include README.rst diff --git a/cinderclient/openstack/__init__.py b/cinderclient/openstack/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cinderclient/openstack/__init__.py diff --git a/cinderclient/openstack/common/__init__.py b/cinderclient/openstack/common/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/cinderclient/openstack/common/__init__.py diff --git a/cinderclient/openstack/common/setup.py b/cinderclient/openstack/common/setup.py new file mode 100644 index 0000000..50c59db --- /dev/null +++ b/cinderclient/openstack/common/setup.py @@ -0,0 +1,183 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# All Rights Reserved. +# +# 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 with minimum-depends for use in setup.py +""" + +import os +import re +import subprocess + +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 + return mapping + + +def canonicalize_emails(changelog, mapping): + """Takes in a string and an email alias mapping and replaces all + instances of the aliases in the string with their real email. + """ + for alias, email in mapping.iteritems(): + changelog = changelog.replace(alias, email) + return changelog + + +# Get requirements from the first file that exists +def get_reqs_from_files(requirements_files): + reqs_in = [] + for requirements_file in requirements_files: + if os.path.exists(requirements_file): + return open(requirements_file, 'r').read().split('\n') + return [] + + +def parse_requirements(requirements_files=['requirements.txt', + 'tools/pip-requires']): + requirements = [] + for line in get_reqs_from_files(requirements_files): + if re.match(r'\s*-e\s+', line): + requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1', + line)) + elif re.match(r'\s*-f\s+', line): + pass + else: + requirements.append(line) + + return requirements + + +def parse_dependency_links(requirements_files=['requirements.txt', + 'tools/pip-requires']): + dependency_links = [] + for line in get_reqs_from_files(requirements_files): + if re.match(r'(\s*#)|(\s*$)', line): + continue + if re.match(r'\s*-[ef]\s+', line): + dependency_links.append(re.sub(r'\s*-[ef]\s+', '', line)) + return dependency_links + + +def write_requirements(): + venv = os.environ.get('VIRTUAL_ENV', None) + if venv is not None: + with open("requirements.txt", "w") as req_file: + output = subprocess.Popen(["pip", "-E", venv, "freeze", "-l"], + stdout=subprocess.PIPE) + requirements = output.communicate()[0].strip() + req_file.write(requirements) + + +def _run_shell_command(cmd): + output = subprocess.Popen(["/bin/sh", "-c", cmd], + stdout=subprocess.PIPE) + return output.communicate()[0].strip() + + +def write_vcsversion(location): + """Produce a vcsversion dict that mimics the old one produced by bzr. + """ + if os.path.isdir('.git'): + branch_nick_cmd = 'git branch | grep -Ei "\* (.*)" | cut -f2 -d" "' + branch_nick = _run_shell_command(branch_nick_cmd) + revid_cmd = "git rev-parse HEAD" + revid = _run_shell_command(revid_cmd).split()[0] + revno_cmd = "git log --oneline | wc -l" + revno = _run_shell_command(revno_cmd) + with open(location, 'w') as version_file: + version_file.write(""" +# This file is automatically generated by setup.py, So don't edit it. :) +version_info = { + 'branch_nick': '%s', + 'revision_id': '%s', + 'revno': %s +} +""" % (branch_nick, revid, revno)) + + +def write_git_changelog(): + """Write a changelog based on the git changelog.""" + if os.path.isdir('.git'): + git_log_cmd = 'git log --stat' + changelog = _run_shell_command(git_log_cmd) + mailmap = parse_mailmap() + with open("ChangeLog", "w") as changelog_file: + changelog_file.write(canonicalize_emails(changelog, mailmap)) + + +def generate_authors(): + """Create AUTHORS file using git commits.""" + jenkins_email = 'jenkins@review.openstack.org' + old_authors = 'AUTHORS.in' + new_authors = 'AUTHORS' + if os.path.isdir('.git'): + # don't include jenkins email address in AUTHORS file + git_log_cmd = ("git log --format='%aN <%aE>' | sort -u | " + "grep -v " + jenkins_email) + changelog = _run_shell_command(git_log_cmd) + mailmap = parse_mailmap() + with open(new_authors, 'w') as new_authors_fh: + new_authors_fh.write(canonicalize_emails(changelog, mailmap)) + if os.path.exists(old_authors): + with open(old_authors, "r") as old_authors_fh: + new_authors_fh.write('\n' + old_authors_fh.read()) + + +def get_cmdclass(): + """Return dict of commands to run from setup.py.""" + + cmdclass = dict() + + class LocalSDist(sdist.sdist): + """Builds the ChangeLog and Authors files from VC first.""" + + def run(self): + write_git_changelog() + generate_authors() + # sdist.sdist is an old style class, can't use super() + sdist.sdist.run(self) + + cmdclass['sdist'] = LocalSDist + + # If Sphinx is installed on the box running setup.py, + # enable setup.py to build the documentation, otherwise, + # just ignore it + try: + from sphinx.setup_command import BuildDoc + + class LocalBuildDoc(BuildDoc): + def run(self): + for builder in ['html', 'man']: + self.builder = builder + self.finalize_options() + BuildDoc.run(self) + cmdclass['build_sphinx'] = LocalBuildDoc + except ImportError: + pass + + return cmdclass @@ -3,6 +3,8 @@ cover-package = cinderclient cover-html = true cover-erase = true cover-inclusive = true +verbosity=2 +detailed-errors=1 [build_sphinx] source-dir = docs/ @@ -17,11 +17,10 @@ import setuptools import sys -requirements = ["httplib2", "prettytable"] -if sys.version_info < (2, 6): - requirements.append("simplejson") -if sys.version_info < (2, 7): - requirements.append("argparse") +from cinderclient.openstack.common import setup + +requires = setup.parse_requirements() +depend_links = setup.parse_dependency_links() def read_file(file_name): @@ -38,7 +37,9 @@ setuptools.setup( license="Apache License, Version 2.0", url="https://github.com/openstack/python-cinderclient", packages=setuptools.find_packages(exclude=['tests', 'tests.*']), - install_requires=requirements, + cmdclass=setup.get_cmdclass(), + install_requires=requires, + dependency_links=depend_links, tests_require=["nose", "mock"], test_suite="nose.collector", classifiers=[ diff --git a/tools/pip-requires b/tools/pip-requires index 510f2c1..32cdbc0 100644 --- a/tools/pip-requires +++ b/tools/pip-requires @@ -1,9 +1,4 @@ argparse -coverage httplib2 -mock -nose prettytable simplejson -pep8==0.6.1 -unittest2 diff --git a/tools/test-requires b/tools/test-requires new file mode 100644 index 0000000..3ab0c0d --- /dev/null +++ b/tools/test-requires @@ -0,0 +1,10 @@ + +distribute>=0.6.24 + +mock +nose +nosexcover +openstack.nose_plugin +pep8>=1.0 +sphinx>=1.1.2 +unittest2 @@ -1,14 +1,42 @@ [tox] -envlist = py26,py27 +envlist = py26,py27,pep8 [testenv] +setenv = VIRTUAL_ENV={envdir} + NOSE_WITH_OPENSTACK=1 + NOSE_OPENSTACK_COLOR=1 + NOSE_OPENSTACK_RED=0.05 + NOSE_OPENSTACK_YELLOW=0.025 + NOSE_OPENSTACK_SHOW_ELAPSED=1 deps = -r{toxinidir}/tools/pip-requires -commands = /bin/bash run_tests.sh -N + -r{toxinidir}/tools/test-requires +commands = nosetests [testenv:pep8] deps = pep8 -commands = /bin/bash run_tests.sh -N --pep8 +commands = pep8 --repeat --show-source cinderclient setup.py -[testenv:coverage] -deps = coverage -commands = /bin/bash run_tests.sh -N --coverage +[testenv:venv] +commands = {posargs} + +[testenv:cover] +commands = nosetests --cover-erase --cover-package=cinderclient --with-xcoverage + +[tox:jenkins] +downloadcache = ~/cache/pip + +[testenv:jenkins26] +basepython = python2.6 +setenv = NOSE_WITH_XUNIT=1 + +[testenv:jenkins27] +basepython = python2.7 +setenv = NOSE_WITH_XUNIT=1 + +[testenv:jenkinscover] +setenv = NOSE_WITH_XUNIT=1 +commands = nosetests --cover-erase --cover-package=cinderclient --with-xcoverage + +[testenv:jenkinsvenv] +setenv = NOSE_WITH_XUNIT=1 +commands = {posargs} |
