diff -Nru python-novaclient-2012.1~rc1/AUTHORS python-novaclient-2012.1~rc2/AUTHORS --- python-novaclient-2012.1~rc1/AUTHORS 2012-03-20 05:14:53.000000000 +0000 +++ python-novaclient-2012.1~rc2/AUTHORS 2012-03-28 17:16:47.000000000 +0000 @@ -1,4 +1,5 @@ Aaron Lee +Alvaro Lopez Garcia Andrey Brindeyev Andy Smith Anthony Young diff -Nru python-novaclient-2012.1~rc1/debian/changelog python-novaclient-2012.1~rc2/debian/changelog --- python-novaclient-2012.1~rc1/debian/changelog 2012-03-20 15:27:36.000000000 +0000 +++ python-novaclient-2012.1~rc2/debian/changelog 2012-04-02 15:30:04.000000000 +0000 @@ -1,3 +1,9 @@ +python-novaclient (2012.1~rc2-0ubuntu1) precise; urgency=low + + * New upstream release. + + -- Chuck Short Mon, 02 Apr 2012 11:29:59 -0400 + python-novaclient (2012.1~rc1-0ubuntu1) precise; urgency=low * New upstream release. diff -Nru python-novaclient-2012.1~rc1/MANIFEST.in python-novaclient-2012.1~rc2/MANIFEST.in --- python-novaclient-2012.1~rc1/MANIFEST.in 2012-03-20 05:14:53.000000000 +0000 +++ python-novaclient-2012.1~rc2/MANIFEST.in 2012-03-28 17:16:47.000000000 +0000 @@ -2,6 +2,7 @@ include HACKING include LICENSE include README.rst -include run_tests.sh +include run_tests.sh tox.ini recursive-include docs * recursive-include tests * +recursive-include tools * diff -Nru python-novaclient-2012.1~rc1/novaclient/base.py python-novaclient-2012.1~rc2/novaclient/base.py --- python-novaclient-2012.1~rc1/novaclient/base.py 2012-03-20 05:14:53.000000000 +0000 +++ python-novaclient-2012.1~rc2/novaclient/base.py 2012-03-28 17:16:47.000000000 +0000 @@ -114,10 +114,10 @@ try: os.makedirs(cache_dir, 0755) except OSError as e: - if e.errno == errno.EEXIST: - pass - else: - raise + # NOTE(kiall): This is typicaly either permission denied while + # attempting to create the directory, or the directory + # already exists. Either way, don't fail. + pass resource = obj_class.__name__.lower() filename = "%s-%s-cache" % (resource, cache_type.replace('_', '-')) diff -Nru python-novaclient-2012.1~rc1/novaclient/v1_1/client.py python-novaclient-2012.1~rc2/novaclient/v1_1/client.py --- python-novaclient-2012.1~rc1/novaclient/v1_1/client.py 2012-03-20 05:14:53.000000000 +0000 +++ python-novaclient-2012.1~rc2/novaclient/v1_1/client.py 2012-03-28 17:16:47.000000000 +0000 @@ -1,5 +1,6 @@ from novaclient import client from novaclient.v1_1 import certs +from novaclient.v1_1 import cloudpipe from novaclient.v1_1 import aggregates from novaclient.v1_1 import flavors from novaclient.v1_1 import floating_ip_dns @@ -54,6 +55,7 @@ # extensions self.dns_domains = floating_ip_dns.FloatingIPDNSDomainManager(self) self.dns_entries = floating_ip_dns.FloatingIPDNSEntryManager(self) + self.cloudpipe = cloudpipe.CloudpipeManager(self) self.certs = certs.CertificateManager(self) self.floating_ips = floating_ips.FloatingIPManager(self) self.floating_ip_pools = floating_ip_pools.FloatingIPPoolManager(self) diff -Nru python-novaclient-2012.1~rc1/novaclient/v1_1/cloudpipe.py python-novaclient-2012.1~rc2/novaclient/v1_1/cloudpipe.py --- python-novaclient-2012.1~rc1/novaclient/v1_1/cloudpipe.py 1970-01-01 00:00:00.000000000 +0000 +++ python-novaclient-2012.1~rc2/novaclient/v1_1/cloudpipe.py 2012-03-28 17:16:47.000000000 +0000 @@ -0,0 +1,48 @@ +# Copyright 2012 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. + +"""Cloudpipe interface.""" + +from novaclient import base + + +class Cloudpipe(base.Resource): + """A cloudpipe instance is a VPN attached to a proejct's VLAN.""" + + def __repr__(self): + return "" % self.project_id + + def delete(self): + self.manager.delete(self) + + +class CloudpipeManager(base.ManagerWithFind): + resource_class = Cloudpipe + + def create(self, project): + """ + Launch a cloudpipe instance. + + :param project: name of the project for the cloudpipe + """ + body = {'cloudpipe': {'project_id': project}} + return self._create('/os-cloudpipe', body, 'instance_id', + return_raw=True) + + def list(self): + """ + Get a list of cloudpipe instances. + """ + return self._list('/os-cloudpipe', 'cloudpipes') diff -Nru python-novaclient-2012.1~rc1/novaclient/v1_1/shell.py python-novaclient-2012.1~rc2/novaclient/v1_1/shell.py --- python-novaclient-2012.1~rc1/novaclient/v1_1/shell.py 2012-03-20 05:14:53.000000000 +0000 +++ python-novaclient-2012.1~rc2/novaclient/v1_1/shell.py 2012-03-28 17:16:47.000000000 +0000 @@ -230,6 +230,19 @@ _poll_for_status(cs.servers.get, info['id'], 'building', ['active']) +def do_cloudpipe_list(cs, args): + """Print a list of all cloudpipe instances.""" + cloudpipes = cs.cloudpipe.list() + columns = ['Project Id', "Public IP", "Public Port", "Internal IP"] + utils.print_list(cloudpipes, columns) + + +@utils.arg('project', metavar='', help='Name of the project.') +def do_cloudpipe_create(cs, args): + """Create a cloudpipe instance for the given project""" + cs.cloudpipe.create(args.project) + + def _poll_for_status(poll_fn, obj_id, action, final_ok_states, poll_period=5, show_progress=True): """Block while an action is being performed, periodically printing @@ -847,7 +860,8 @@ # Create a list of servers to which the volume is attached for vol in volumes: - servers = [server.get('serverId') for server in vol.attachments] + servers = [s.get('server_id') or s.get('serverId') + for s in vol.attachments] setattr(vol, 'attached_to', ','.join(map(str, servers))) utils.print_list(volumes, ['ID', 'Status', 'Display Name', 'Size', 'Volume Type', 'Attached to']) diff -Nru python-novaclient-2012.1~rc1/python_novaclient.egg-info/SOURCES.txt python-novaclient-2012.1~rc2/python_novaclient.egg-info/SOURCES.txt --- python-novaclient-2012.1~rc1/python_novaclient.egg-info/SOURCES.txt 2012-03-20 09:37:24.000000000 +0000 +++ python-novaclient-2012.1~rc2/python_novaclient.egg-info/SOURCES.txt 2012-03-28 17:16:54.000000000 +0000 @@ -6,6 +6,7 @@ run_tests.sh setup.cfg setup.py +tox.ini docs/.gitignore docs/Makefile docs/api.rst @@ -33,6 +34,7 @@ novaclient/v1_1/base.py novaclient/v1_1/certs.py novaclient/v1_1/client.py +novaclient/v1_1/cloudpipe.py novaclient/v1_1/flavors.py novaclient/v1_1/floating_ip_dns.py novaclient/v1_1/floating_ip_pools.py @@ -72,6 +74,7 @@ tests/v1_1/test_aggregates.py tests/v1_1/test_auth.py tests/v1_1/test_certs.py +tests/v1_1/test_cloudpipe.py tests/v1_1/test_flavors.py tests/v1_1/test_floating_ip_dns.py tests/v1_1/test_floating_ip_pools.py @@ -87,4 +90,10 @@ tests/v1_1/test_shell.py tests/v1_1/test_usage.py tests/v1_1/testfile.txt -tests/v1_1/utils.py \ No newline at end of file +tests/v1_1/utils.py +tools/generate_authors.sh +tools/install_venv.py +tools/nova.bash_completion +tools/pip-requires +tools/rfc.sh +tools/with_venv.sh \ No newline at end of file diff -Nru python-novaclient-2012.1~rc1/tests/v1_1/fakes.py python-novaclient-2012.1~rc2/tests/v1_1/fakes.py --- python-novaclient-2012.1~rc1/tests/v1_1/fakes.py 2012-03-20 05:14:53.000000000 +0000 +++ python-novaclient-2012.1~rc2/tests/v1_1/fakes.py 2012-03-28 17:16:47.000000000 +0000 @@ -340,6 +340,18 @@ return (resp, _body) # + # Cloudpipe + # + + def get_os_cloudpipe(self, **kw): + return (200, {'cloudpipes': [ + {'project_id':1} + ]}) + + def post_os_cloudpipe(self, **ks): + return (202, {'instance_id': '9d5824aa-20e6-4b9f-b967-76a699fc51fd'}) + + # # Flavors # diff -Nru python-novaclient-2012.1~rc1/tests/v1_1/test_cloudpipe.py python-novaclient-2012.1~rc2/tests/v1_1/test_cloudpipe.py --- python-novaclient-2012.1~rc1/tests/v1_1/test_cloudpipe.py 1970-01-01 00:00:00.000000000 +0000 +++ python-novaclient-2012.1~rc2/tests/v1_1/test_cloudpipe.py 2012-03-28 17:16:47.000000000 +0000 @@ -0,0 +1,22 @@ +from novaclient import exceptions +from novaclient.v1_1 import cloudpipe +from tests import utils +from tests.v1_1 import fakes + + +cs = fakes.FakeClient() + + +class CloudpipeTest(utils.TestCase): + + def test_list_cloudpipes(self): + cp = cs.cloudpipe.list() + cs.assert_called('GET', '/os-cloudpipe') + [self.assertTrue(isinstance(c, cloudpipe.Cloudpipe)) for c in cp] + + def test_create(self): + project = "test" + cp = cs.cloudpipe.create(project) + body = {'cloudpipe': {'project_id': project}} + cs.assert_called('POST', '/os-cloudpipe', body) + self.assertTrue(isinstance(cp, str)) diff -Nru python-novaclient-2012.1~rc1/tools/generate_authors.sh python-novaclient-2012.1~rc2/tools/generate_authors.sh --- python-novaclient-2012.1~rc1/tools/generate_authors.sh 1970-01-01 00:00:00.000000000 +0000 +++ python-novaclient-2012.1~rc2/tools/generate_authors.sh 2012-03-28 17:16:47.000000000 +0000 @@ -0,0 +1,3 @@ +#!/bin/bash + +git shortlog -se | cut -c8- diff -Nru python-novaclient-2012.1~rc1/tools/install_venv.py python-novaclient-2012.1~rc2/tools/install_venv.py --- python-novaclient-2012.1~rc1/tools/install_venv.py 1970-01-01 00:00:00.000000000 +0000 +++ python-novaclient-2012.1~rc2/tools/install_venv.py 2012-03-28 17:16:47.000000000 +0000 @@ -0,0 +1,244 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# +# Copyright 2010 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. + +""" +Installation script for Nova's development virtualenv +""" + +import optparse +import os +import subprocess +import sys +import platform + + +ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) +VENV = os.path.join(ROOT, '.venv') +PIP_REQUIRES = os.path.join(ROOT, 'tools', 'pip-requires') +PY_VERSION = "python%s.%s" % (sys.version_info[0], sys.version_info[1]) + + +def die(message, *args): + print >> sys.stderr, message % args + sys.exit(1) + + +def check_python_version(): + if sys.version_info < (2, 6): + die("Need Python Version >= 2.6") + + +def run_command_with_code(cmd, redirect_output=True, check_exit_code=True): + """ + Runs a command in an out-of-process shell, returning the + output of that command. Working directory is ROOT. + """ + if redirect_output: + stdout = subprocess.PIPE + else: + stdout = None + + proc = subprocess.Popen(cmd, cwd=ROOT, stdout=stdout) + output = proc.communicate()[0] + if check_exit_code and proc.returncode != 0: + die('Command "%s" failed.\n%s', ' '.join(cmd), output) + return (output, proc.returncode) + + +def run_command(cmd, redirect_output=True, check_exit_code=True): + return run_command_with_code(cmd, redirect_output, check_exit_code)[0] + + +class Distro(object): + + def check_cmd(self, cmd): + return bool(run_command(['which', cmd], check_exit_code=False).strip()) + + def install_virtualenv(self): + if self.check_cmd('virtualenv'): + return + + if self.check_cmd('easy_install'): + print 'Installing virtualenv via easy_install...', + if run_command(['easy_install', 'virtualenv']): + print 'Succeeded' + return + else: + print 'Failed' + + die('ERROR: virtualenv not found.\n\nDevelopment' + ' requires virtualenv, please install it using your' + ' favorite package management tool') + + def post_process(self): + """Any distribution-specific post-processing gets done here. + + In particular, this is useful for applying patches to code inside + the venv.""" + pass + + +class Debian(Distro): + """This covers all Debian-based distributions.""" + + def check_pkg(self, pkg): + return run_command_with_code(['dpkg', '-l', pkg], + check_exit_code=False)[1] == 0 + + def apt_install(self, pkg, **kwargs): + run_command(['sudo', 'apt-get', 'install', '-y', pkg], **kwargs) + + def apply_patch(self, originalfile, patchfile): + run_command(['patch', originalfile, patchfile]) + + def install_virtualenv(self): + if self.check_cmd('virtualenv'): + return + + if not self.check_pkg('python-virtualenv'): + self.apt_install('python-virtualenv', check_exit_code=False) + + super(Debian, self).install_virtualenv() + + +class Fedora(Distro): + """This covers all Fedora-based distributions. + + Includes: Fedora, RHEL, CentOS, Scientific Linux""" + + def check_pkg(self, pkg): + return run_command_with_code(['rpm', '-q', pkg], + check_exit_code=False)[1] == 0 + + def yum_install(self, pkg, **kwargs): + run_command(['sudo', 'yum', 'install', '-y', pkg], **kwargs) + + def apply_patch(self, originalfile, patchfile): + run_command(['patch', originalfile, patchfile]) + + def install_virtualenv(self): + if self.check_cmd('virtualenv'): + return + + if not self.check_pkg('python-virtualenv'): + self.yum_install('python-virtualenv', check_exit_code=False) + + super(Fedora, self).install_virtualenv() + + +def get_distro(): + if os.path.exists('/etc/fedora-release') or \ + os.path.exists('/etc/redhat-release'): + return Fedora() + elif os.path.exists('/etc/debian_version'): + return Debian() + else: + return Distro() + + +def check_dependencies(): + get_distro().install_virtualenv() + + +def create_virtualenv(venv=VENV, no_site_packages=True): + """Creates the virtual environment and installs PIP only into the + virtual environment + """ + print 'Creating venv...', + if no_site_packages: + run_command(['virtualenv', '-q', '--no-site-packages', VENV]) + else: + run_command(['virtualenv', '-q', VENV]) + print 'done.' + print 'Installing pip in virtualenv...', + if not run_command(['tools/with_venv.sh', 'easy_install', + 'pip>1.0']).strip(): + die("Failed to install pip.") + print 'done.' + + +def pip_install(*args): + run_command(['tools/with_venv.sh', + 'pip', 'install', '--upgrade'] + list(args), + redirect_output=False) + + +def install_dependencies(venv=VENV): + print 'Installing dependencies with pip (this can take a while)...' + + # First things first, make sure our venv has the latest pip and distribute. + pip_install('pip') + pip_install('distribute') + + pip_install('-r', PIP_REQUIRES) + + # Tell the virtual env how to "import nova" + pthfile = os.path.join(venv, "lib", PY_VERSION, "site-packages", + "novaclient.pth") + f = open(pthfile, 'w') + f.write("%s\n" % ROOT) + + +def post_process(): + get_distro().post_process() + + +def print_help(): + help = """ + python-novaclient development environment setup is complete. + + python-novaclient development uses virtualenv to track and manage Python + dependencies while in development and testing. + + To activate the python-novaclient virtualenv for the extent of your current + shell session you can run: + + $ source .venv/bin/activate + + Or, if you prefer, you can run commands in the virtualenv on a case by case + basis by running: + + $ tools/with_venv.sh + + Also, make test will automatically use the virtualenv. + """ + print help + + +def parse_args(): + """Parse command-line arguments""" + parser = optparse.OptionParser() + parser.add_option("-n", "--no-site-packages", dest="no_site_packages", + default=False, action="store_true", + help="Do not inherit packages from global Python install") + return parser.parse_args() + + +def main(argv): + (options, args) = parse_args() + check_python_version() + check_dependencies() + create_virtualenv(no_site_packages=options.no_site_packages) + install_dependencies() + post_process() + print_help() + +if __name__ == '__main__': + main(sys.argv) diff -Nru python-novaclient-2012.1~rc1/tools/nova.bash_completion python-novaclient-2012.1~rc2/tools/nova.bash_completion --- python-novaclient-2012.1~rc1/tools/nova.bash_completion 1970-01-01 00:00:00.000000000 +0000 +++ python-novaclient-2012.1~rc2/tools/nova.bash_completion 2012-03-28 17:16:47.000000000 +0000 @@ -0,0 +1,15 @@ +_nova() +{ + local cur prev opts + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + + opts="$(nova bash_completion)" + + COMPLETION_CACHE=~/.novaclient/*/*-cache + opts+=" "$(cat $COMPLETION_CACHE 2> /dev/null | tr '\n' ' ') + + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) +} +complete -F _nova nova diff -Nru python-novaclient-2012.1~rc1/tools/pip-requires python-novaclient-2012.1~rc2/tools/pip-requires --- python-novaclient-2012.1~rc1/tools/pip-requires 1970-01-01 00:00:00.000000000 +0000 +++ python-novaclient-2012.1~rc2/tools/pip-requires 2012-03-28 17:16:47.000000000 +0000 @@ -0,0 +1,8 @@ +argparse +coverage +httplib2 +mock +nose +prettytable +simplejson +pep8==0.6.1 diff -Nru python-novaclient-2012.1~rc1/tools/rfc.sh python-novaclient-2012.1~rc2/tools/rfc.sh --- python-novaclient-2012.1~rc1/tools/rfc.sh 1970-01-01 00:00:00.000000000 +0000 +++ python-novaclient-2012.1~rc2/tools/rfc.sh 2012-03-28 17:16:47.000000000 +0000 @@ -0,0 +1,145 @@ +#!/bin/sh -e +# Copyright (c) 2010-2011 Gluster, Inc. +# This initial version of this file was taken from the source tree +# of GlusterFS. It was not directly attributed, but is assumed to be +# Copyright (c) 2010-2011 Gluster, Inc and release GPLv3 +# Subsequent modifications are Copyright (c) 2011 OpenStack, LLC. +# +# GlusterFS is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published +# by the Free Software Foundation; either version 3 of the License, +# or (at your option) any later version. +# +# GlusterFS is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + + +branch="master"; + +set_hooks_commit_msg() +{ + top_dir=`git rev-parse --show-toplevel` + f="${top_dir}/.git/hooks/commit-msg"; + u="https://review.openstack.org/tools/hooks/commit-msg"; + + if [ -x "$f" ]; then + return; + fi + + curl -o $f $u || wget -O $f $u; + + chmod +x $f; + + GIT_EDITOR=true git commit --amend +} + +add_remote() +{ + username=$1 + project=$2 + + echo "No remote set, testing ssh://$username@review.openstack.org:29418" + if project_list=`ssh -p29418 -o StrictHostKeyChecking=no $username@review.openstack.org gerrit ls-projects 2>/dev/null` + then + echo "$username@review.openstack.org:29418 worked." + if echo $project_list | grep $project >/dev/null + then + echo "Creating a git remote called gerrit that maps to:" + echo " ssh://$username@review.openstack.org:29418/$project" + git remote add gerrit ssh://$username@review.openstack.org:29418/$project + else + echo "The current project name, $project, is not a known project." + echo "Please either reclone from github/gerrit or create a" + echo "remote named gerrit that points to the intended project." + return 1 + fi + + return 0 + fi + return 1 +} + +check_remote() +{ + if ! git remote | grep gerrit >/dev/null 2>&1 + then + origin_project=`git remote show origin | grep 'Fetch URL' | perl -nle '@fields = split(m|[:/]|); $len = $#fields; print $fields[$len-1], "/", $fields[$len];'` + if add_remote $USERNAME $origin_project + then + return 0 + else + echo "Your local name doesn't work on Gerrit." + echo -n "Enter Gerrit username (same as launchpad): " + read gerrit_user + if add_remote $gerrit_user $origin_project + then + return 0 + else + echo "Can't infer where gerrit is - please set a remote named" + echo "gerrit manually and then try again." + echo + echo "For more information, please see:" + echo "\thttp://wiki.openstack.org/GerritWorkflow" + exit 1 + fi + fi + fi +} + +rebase_changes() +{ + git fetch; + + GIT_EDITOR=true git rebase -i origin/$branch || exit $?; +} + + +assert_diverge() +{ + if ! git diff origin/$branch..HEAD | grep -q . + then + echo "No changes between the current branch and origin/$branch." + exit 1 + fi +} + + +main() +{ + set_hooks_commit_msg; + + check_remote; + + rebase_changes; + + assert_diverge; + + bug=$(git show --format='%s %b' | perl -nle 'if (/\b([Bb]ug|[Ll][Pp])\s*[#:]?\s*(\d+)/) {print "$2"; exit}') + + bp=$(git show --format='%s %b' | perl -nle 'if (/\b([Bb]lue[Pp]rint|[Bb][Pp])\s*[#:]?\s*([0-9a-zA-Z-_]+)/) {print "$2"; exit}') + + if [ "$DRY_RUN" = 1 ]; then + drier='echo -e Please use the following command to send your commits to review:\n\n' + else + drier= + fi + + local_branch=`git branch | grep -Ei "\* (.*)" | cut -f2 -d' '` + if [ -z "$bug" ]; then + if [ -z "$bp" ]; then + $drier git push gerrit HEAD:refs/for/$branch/$local_branch; + else + $drier git push gerrit HEAD:refs/for/$branch/bp/$bp; + fi + else + $drier git push gerrit HEAD:refs/for/$branch/bug/$bug; + fi +} + +main "$@" diff -Nru python-novaclient-2012.1~rc1/tools/with_venv.sh python-novaclient-2012.1~rc2/tools/with_venv.sh --- python-novaclient-2012.1~rc1/tools/with_venv.sh 1970-01-01 00:00:00.000000000 +0000 +++ python-novaclient-2012.1~rc2/tools/with_venv.sh 2012-03-28 17:16:47.000000000 +0000 @@ -0,0 +1,4 @@ +#!/bin/bash +TOOLS=`dirname $0` +VENV=$TOOLS/../.venv +source $VENV/bin/activate && $@ diff -Nru python-novaclient-2012.1~rc1/tox.ini python-novaclient-2012.1~rc2/tox.ini --- python-novaclient-2012.1~rc1/tox.ini 1970-01-01 00:00:00.000000000 +0000 +++ python-novaclient-2012.1~rc2/tox.ini 2012-03-28 17:16:47.000000000 +0000 @@ -0,0 +1,14 @@ +[tox] +envlist = py26,py27 + +[testenv] +deps = -r{toxinidir}/tools/pip-requires +commands = /bin/bash run_tests.sh -N + +[testenv:pep8] +deps = pep8 +commands = /bin/bash run_tests.sh -N --pep8 + +[testenv:coverage] +deps = coverage +commands = /bin/bash run_tests.sh -N --coverage