Hello community, here is the log from the commit of package python-reno for openSUSE:Factory checked in at 2016-06-07 23:49:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-reno (Old) and /work/SRC/openSUSE:Factory/.python-reno.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-reno" Changes: -------- --- /work/SRC/openSUSE:Factory/python-reno/python-reno.changes 2016-03-07 13:24:17.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.python-reno.new/python-reno.changes 2016-06-07 23:49:31.000000000 +0200 @@ -1,0 +2,13 @@ +Sat Jun 4 06:24:55 UTC 2016 - [email protected] + +- update to 1.6.2: + * default to collapsing pre-releases in sphinxext + * handle deleted notes properly + * refactor argument buildup to make it more reusable + * improve test coverage + * always show coverage report for test runs + * Add deprecations section to usage documentation + * use less entropy in unit tests + * collapse pre-release notes into regular releases by default + +------------------------------------------------------------------- Old: ---- reno-1.5.0.tar.gz New: ---- reno-1.6.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-reno.spec ++++++ --- /var/tmp/diff_new_pack.YgrV0U/_old 2016-06-07 23:49:32.000000000 +0200 +++ /var/tmp/diff_new_pack.YgrV0U/_new 2016-06-07 23:49:32.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-reno # -# Copyright (c) 2016 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -13,20 +13,21 @@ # published by the Open Source Initiative. # Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Name: python-reno -Version: 1.5.0 +Version: 1.6.2 Release: 0 -License: Apache-2.0 Summary: RElease NOtes manager -Url: http://www.openstack.org/ +License: Apache-2.0 Group: Development/Languages/Python +Url: http://www.openstack.org/ Source: https://pypi.python.org/packages/source/r/reno/reno-%{version}.tar.gz BuildRequires: python-Babel +BuildRequires: python-PyYAML BuildRequires: python-devel BuildRequires: python-pbr -BuildRequires: python-PyYAML BuildRequires: python-setuptools %if %{with tests} BuildRequires: python-testrepository @@ -77,7 +78,6 @@ %_sbindir/update-alternatives --remove reno %{_bindir}/reno-%{py_ver} fi - %files %defattr(-,root,root,-) %doc LICENSE ChangeLog README.rst AUTHORS ++++++ reno-1.5.0.tar.gz -> reno-1.6.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/AUTHORS new/reno-1.6.2/AUTHORS --- old/reno-1.5.0/AUTHORS 2016-02-10 15:53:53.000000000 +0100 +++ new/reno-1.6.2/AUTHORS 2016-04-07 10:37:22.000000000 +0200 @@ -3,4 +3,5 @@ Graham Hayes <[email protected]> Ian Cordasco <[email protected]> Louis Taylor <[email protected]> +Mike Perez <[email protected]> Monty Taylor <[email protected]> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/ChangeLog new/reno-1.6.2/ChangeLog --- old/reno-1.5.0/ChangeLog 2016-02-10 15:53:53.000000000 +0100 +++ new/reno-1.6.2/ChangeLog 2016-04-07 10:37:22.000000000 +0200 @@ -1,6 +1,26 @@ CHANGES ======= +1.6.2 +----- + +* default to collapsing pre-releases in sphinxext + +1.6.1 +----- + +* handle deleted notes properly +* refactor argument buildup to make it more reusable +* improve test coverage +* always show coverage report for test runs + +1.6.0 +----- + +* Add deprecations section to usage documentation +* use less entropy in unit tests +* collapse pre-release notes into regular releases by default + 1.5.0 ----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/PKG-INFO new/reno-1.6.2/PKG-INFO --- old/reno-1.5.0/PKG-INFO 2016-02-10 15:53:54.000000000 +0100 +++ new/reno-1.6.2/PKG-INFO 2016-04-07 10:37:23.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: reno -Version: 1.5.0 +Version: 1.6.2 Summary: RElease NOtes manager Home-page: http://www.openstack.org/ Author: OpenStack diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/doc/source/usage.rst new/reno-1.6.2/doc/source/usage.rst --- old/reno-1.5.0/doc/source/usage.rst 2016-02-10 15:53:35.000000000 +0100 +++ new/reno-1.6.2/doc/source/usage.rst 2016-04-07 10:35:17.000000000 +0200 @@ -64,6 +64,13 @@ A list of upgrade notes in the release. For example, if a database schema alteration is needed. +deprecations + + A list of features, APIs, configuration options to be deprecated in the + release. Deprecations should not be used for something that is removed in the + release, use upgrade section instead. Deprecation should allow time for users + to make necessary changes for the removal to happen in a future release. + critical A list of *fixed* critical bugs. @@ -96,6 +103,8 @@ - List known issues here, or remove this section. upgrade: - List upgrade notes here, or remove this section. + deprecations: + - List deprecation notes here, or remove this section critical: - Add critical notes here, or remove this section. security: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno/main.py new/reno-1.6.2/reno/main.py --- old/reno-1.5.0/reno/main.py 2016-02-10 15:53:35.000000000 +0100 +++ new/reno-1.6.2/reno/main.py 2016-04-07 10:35:17.000000000 +0200 @@ -19,6 +19,33 @@ from reno import lister from reno import report +_query_args = [ + (('--version',), + dict(default=[], + action='append', + help='the version(s) to include, defaults to all')), + (('--branch',), + dict(default=None, + help='the branch to scan, defaults to the current')), + (('--collapse-pre-releases',), + dict(action='store_true', + default=True, + help='combine pre-releases with their final release')), + (('--no-collapse-pre-releases',), + dict(action='store_false', + dest='collapse_pre_releases', + help='show pre-releases separately')), + (('--earliest-version',), + dict(default=None, + help='stop when this version is reached in the history')), +] + + +def _build_query_arg_group(parser): + group = parser.add_argument_group('query') + for args, kwds in _query_args: + group.add_argument(*args, **kwds) + def main(argv=sys.argv[1:]): parser = argparse.ArgumentParser() @@ -61,32 +88,11 @@ 'list', help='list notes files based on query arguments', ) + _build_query_arg_group(do_list) do_list.add_argument( 'reporoot', help='root of the git repository', ) - do_list.add_argument( - '--version', - default=[], - action='append', - help='the version(s) to include, defaults to all', - ) - do_list.add_argument( - '--branch', - default=None, - help='the branch to scan, defaults to the current', - ) - do_list.add_argument( - '--collapse-pre-releases', - action='store_true', - default=False, - help='combine pre-releases with their final release', - ) - do_list.add_argument( - '--earliest-version', - default=None, - help='stop when this version is reached in the history', - ) do_list.set_defaults(func=lister.list_cmd) do_report = subparsers.add_parser( @@ -102,28 +108,7 @@ default=None, help='output filename, defaults to stdout', ) - do_report.add_argument( - '--branch', - default=None, - help='the branch to scan, defaults to the current', - ) - do_report.add_argument( - '--version', - default=[], - action='append', - help='the version(s) to include, defaults to all', - ) - do_report.add_argument( - '--collapse-pre-releases', - action='store_true', - default=False, - help='combine pre-releases with their final release', - ) - do_report.add_argument( - '--earliest-version', - default=None, - help='stop when this version is reached in the history', - ) + _build_query_arg_group(do_report) do_report.set_defaults(func=report.report_cmd) args = parser.parse_args() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno/scanner.py new/reno-1.6.2/reno/scanner.py --- old/reno-1.5.0/reno/scanner.py 2016-02-10 15:53:35.000000000 +0100 +++ new/reno-1.6.2/reno/scanner.py 2016-04-07 10:35:17.000000000 +0200 @@ -150,7 +150,7 @@ def get_notes_by_version(reporoot, notesdir, branch=None, - collapse_pre_releases=False, + collapse_pre_releases=True, earliest_version=None): """Return an OrderedDict mapping versions to lists of notes files. @@ -197,6 +197,9 @@ # renames. last_name_by_id = {} + # Remember uniqueids that have had files deleted. + uniqueids_deleted = collections.defaultdict(set) + # FIXME(dhellmann): This might need to be more line-oriented for # longer histories. log_cmd = [ @@ -256,22 +259,45 @@ for f in filenames: # Updated as older tags are found, handling edits to release # notes. - LOG.debug('setting earliest reference to %s to %s' % - (f, tags[0])) uniqueid = _get_unique_id(f) + LOG.debug('%s: found file %s', + uniqueid, f) + LOG.debug('%s: setting earliest reference to %s' % + (uniqueid, tags[0])) earliest_seen[uniqueid] = tags[0] if uniqueid in last_name_by_id: # We already have a filename for this id from a # new commit, so use that one in case the name has # changed. - LOG.debug('%s was seen before' % f) + LOG.debug('%s: was seen before in %s', + uniqueid, last_name_by_id[uniqueid]) continue - if _file_exists_at_commit(reporoot, f, sha): - # Remember this filename as the most recent version of - # the unique id we have seen, in case the name - # changed from an older commit. - last_name_by_id[uniqueid] = (f, sha) - LOG.debug('remembering %s as filename for %s' % (f, uniqueid)) + elif _file_exists_at_commit(reporoot, f, sha): + LOG.debug('%s: looking for %s in deleted files %s', + uniqueid, f, uniqueids_deleted[uniqueid]) + if f in uniqueids_deleted[uniqueid]: + # The file exists in the commit, but was deleted + # later in the history. + LOG.debug('%s: skipping deleted file %s', + uniqueid, f) + else: + # Remember this filename as the most recent version of + # the unique id we have seen, in case the name + # changed from an older commit. + last_name_by_id[uniqueid] = (f, sha) + LOG.debug('%s: remembering %s as filename', + uniqueid, f) + else: + # Track files that have been deleted. The rename logic + # above checks for repeated references to files that + # are deleted later, and the inversion logic below + # checks for any remaining values and skips those + # entries. + LOG.debug('%s: saw a file that no longer exists', + uniqueid) + uniqueids_deleted[uniqueid].add(f) + LOG.debug('%s: deleted files %s', + uniqueid, uniqueids_deleted[uniqueid]) # Invert earliest_seen to make a list of notes files for each # version. @@ -283,6 +309,9 @@ for uniqueid, version in earliest_seen.items(): try: base, sha = last_name_by_id[uniqueid] + if base in uniqueids_deleted.get(uniqueid, set()): + LOG.debug('skipping deleted note %s' % uniqueid) + continue files_and_tags[version].append((base, sha)) except KeyError: # Unable to find the file again, skip it to avoid breaking diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno/sphinxext.py new/reno-1.6.2/reno/sphinxext.py --- old/reno-1.5.0/reno/sphinxext.py 2016-02-10 15:53:35.000000000 +0100 +++ new/reno-1.6.2/reno/sphinxext.py 2016-04-07 10:35:18.000000000 +0200 @@ -52,7 +52,9 @@ defaults.RELEASE_NOTES_SUBDIR) notessubdir = self.options.get('notesdir', defaults.NOTES_SUBDIR) version_opt = self.options.get('version') - collapse = self.options.get('collapse-pre-releases') + # FIXME(dhellmann): Force this flag True for now and figure + # out how Sphinx passes a "false" flag later. + collapse = True # 'collapse-pre-releases' in self.options earliest_version = self.options.get('earliest-version') notesdir = os.path.join(relnotessubdir, notessubdir) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno/tests/test_create.py new/reno-1.6.2/reno/tests/test_create.py --- old/reno-1.5.0/reno/tests/test_create.py 2016-02-10 15:53:35.000000000 +0100 +++ new/reno-1.6.2/reno/tests/test_create.py 2016-04-07 10:35:17.000000000 +0200 @@ -15,6 +15,7 @@ from reno import create from reno.tests import base +import fixtures import mock @@ -29,3 +30,24 @@ 'somepath', 'someslug', ) + + @mock.patch('os.path.exists') + def test_random_enough(self, exists): + exists.return_value = False + result = create._pick_note_file_name('somepath', 'someslug') + self.assertIn('somepath', result) + self.assertIn('someslug', result) + + +class TestCreate(base.TestCase): + + def setUp(self): + super(TestCreate, self).setUp() + self.tmpdir = self.useFixture(fixtures.TempDir()).path + + def test_create_from_template(self): + filename = create._pick_note_file_name(self.tmpdir, 'theslug') + create._make_note_file(filename) + with open(filename, 'r') as f: + body = f.read() + self.assertEqual(create._TEMPLATE, body) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno/tests/test_formatter.py new/reno-1.6.2/reno/tests/test_formatter.py --- old/reno-1.5.0/reno/tests/test_formatter.py 1970-01-01 01:00:00.000000000 +0100 +++ new/reno-1.6.2/reno/tests/test_formatter.py 2016-04-07 10:35:17.000000000 +0200 @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- + +# 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. + +import textwrap + +from reno import formatter +from reno.tests import base + +from oslotest import mockpatch + + +class TestFormatter(base.TestCase): + + scanner_output = { + '0.0.0': [('note1', 'shaA')], + '1.0.0': [('note2', 'shaB'), ('note3', 'shaC')], + } + + versions = ['0.0.0', '1.0.0'] + + note_bodies = { + 'note1': textwrap.dedent(""" + prelude: > + This is the prelude. + """), + 'note2': textwrap.dedent(""" + issues: + - This is the first issue. + - This is the second issue. + """), + 'note3': textwrap.dedent(""" + features: + - We added a feature! + """) + } + + def _get_note_body(self, reporoot, filename, sha): + return self.note_bodies.get(filename, '') + + def setUp(self): + super(TestFormatter, self).setUp() + self.useFixture( + mockpatch.Patch('reno.scanner.get_file_at_commit', + new=self._get_note_body) + ) + + def test_with_title(self): + result = formatter.format_report( + reporoot=None, + scanner_output=self.scanner_output, + versions_to_include=self.versions, + title='This is the title', + ) + self.assertIn('This is the title', result) + + def test_versions(self): + result = formatter.format_report( + reporoot=None, + scanner_output=self.scanner_output, + versions_to_include=self.versions, + title='This is the title', + ) + self.assertIn('0.0.0\n=====', result) + self.assertIn('1.0.0\n=====', result) + + def test_without_title(self): + result = formatter.format_report( + reporoot=None, + scanner_output=self.scanner_output, + versions_to_include=self.versions, + title=None, + ) + self.assertNotIn('This is the title', result) + + def test_section_order(self): + result = formatter.format_report( + reporoot=None, + scanner_output=self.scanner_output, + versions_to_include=self.versions, + title=None, + ) + prelude_pos = result.index('This is the prelude.') + issues_pos = result.index('This is the first issue.') + features_pos = result.index('We added a feature!') + expected = [prelude_pos, features_pos, issues_pos] + actual = list(sorted([prelude_pos, features_pos, issues_pos])) + self.assertEqual(expected, actual) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno/tests/test_scanner.py new/reno-1.6.2/reno/tests/test_scanner.py --- old/reno-1.5.0/reno/tests/test_scanner.py 2016-02-10 15:53:35.000000000 +0100 +++ new/reno-1.6.2/reno/tests/test_scanner.py 2016-04-07 10:35:17.000000000 +0200 @@ -65,7 +65,7 @@ gnupg_version_re = re.compile('^gpg\s.*\s([\d+])\.([\d+])\.([\d+])') gnupg_version = utils.check_output(['gpg', '--version'], cwd=tempdir.path) - for line in gnupg_version[0].split('\n'): + for line in gnupg_version.split('\n'): gnupg_version = gnupg_version_re.match(line) if gnupg_version: gnupg_version = (int(gnupg_version.group(1)), @@ -98,17 +98,17 @@ # Note that --quick-random (--debug-quick-random in GnuPG 2.x) # does not have a corresponding preferences file setting and # must be passed explicitly on the command line instead - # if gnupg_version[0] == 1: - # gnupg_random = '--quick-random' - # elif gnupg_version[0] >= 2: - # gnupg_random = '--debug-quick-random' - # else: - # gnupg_random = '' - subprocess.check_call( - ['gpg', '--gen-key', '--batch', - # gnupg_random, - config_file], - cwd=tempdir.path) + if gnupg_version[0] == 1: + gnupg_random = '--quick-random' + elif gnupg_version[0] >= 2: + gnupg_random = '--debug-quick-random' + else: + gnupg_random = '' + cmd = ['gpg', '--gen-key', '--batch'] + if gnupg_random: + cmd.append(gnupg_random) + cmd.append(config_file) + subprocess.check_call(cmd, cwd=tempdir.path) class Base(base.TestCase): @@ -482,6 +482,53 @@ }, results, ) + + def test_delete_file(self): + self._make_python_package() + self._run_git('tag', '-s', '-m', 'first tag', '1.0.0') + f1 = self._add_notes_file('slug1') + f2 = self._add_notes_file('slug2') + self._run_git('rm', f1) + self._git_commit('remove note file') + self._run_git('tag', '-s', '-m', 'first tag', '2.0.0') + raw_results = scanner.get_notes_by_version( + self.reporoot, + 'releasenotes/notes', + ) + results = { + k: [f for (f, n) in v] + for (k, v) in raw_results.items() + } + self.assertEqual( + {'2.0.0': [f2], + }, + results, + ) + + def test_rename_then_delete_file(self): + self._make_python_package() + self._run_git('tag', '-s', '-m', 'first tag', '1.0.0') + f1 = self._add_notes_file('slug1') + f2 = f1.replace('slug1', 'slug2') + self._run_git('mv', f1, f2) + self._git_commit('rename note file') + self._run_git('rm', f2) + self._git_commit('remove note file') + f3 = self._add_notes_file('slug3') + self._run_git('tag', '-s', '-m', 'first tag', '2.0.0') + raw_results = scanner.get_notes_by_version( + self.reporoot, + 'releasenotes/notes', + ) + results = { + k: [f for (f, n) in v] + for (k, v) in raw_results.items() + } + self.assertEqual( + {'2.0.0': [f3], + }, + results, + ) class PreReleaseTest(Base): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno/utils.py new/reno-1.6.2/reno/utils.py --- old/reno-1.5.0/reno/utils.py 2016-02-10 15:53:35.000000000 +0100 +++ new/reno-1.6.2/reno/utils.py 2016-04-07 10:35:17.000000000 +0200 @@ -51,9 +51,11 @@ output, errors = process.communicate() retcode = process.poll() if errors: - LOG.debug('error output from (%s): %s', - ' '.join(*args), - errors.rstrip()) + LOG.debug('ran: %s', ' '.join(*args)) + LOG.debug('returned: %s', retcode) + LOG.debug('error output: %s', errors.rstrip()) + LOG.debug('regular output: %s', output.rstrip()) if retcode: + LOG.debug('raising error') raise subprocess.CalledProcessError(retcode, args, output=output) return output.decode('utf-8') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno.egg-info/PKG-INFO new/reno-1.6.2/reno.egg-info/PKG-INFO --- old/reno-1.5.0/reno.egg-info/PKG-INFO 2016-02-10 15:53:53.000000000 +0100 +++ new/reno-1.6.2/reno.egg-info/PKG-INFO 2016-04-07 10:37:22.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: reno -Version: 1.5.0 +Version: 1.6.2 Summary: RElease NOtes manager Home-page: http://www.openstack.org/ Author: OpenStack diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno.egg-info/SOURCES.txt new/reno-1.6.2/reno.egg-info/SOURCES.txt --- old/reno-1.5.0/reno.egg-info/SOURCES.txt 2016-02-10 15:53:54.000000000 +0100 +++ new/reno-1.6.2/reno.egg-info/SOURCES.txt 2016-04-07 10:37:23.000000000 +0200 @@ -59,5 +59,6 @@ reno/tests/__init__.py reno/tests/base.py reno/tests/test_create.py +reno/tests/test_formatter.py reno/tests/test_scanner.py reno/tests/test_utils.py \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/reno.egg-info/pbr.json new/reno-1.6.2/reno.egg-info/pbr.json --- old/reno-1.5.0/reno.egg-info/pbr.json 2016-02-10 15:53:53.000000000 +0100 +++ new/reno-1.6.2/reno.egg-info/pbr.json 2016-04-07 10:37:22.000000000 +0200 @@ -1 +1 @@ -{"git_version": "f4e2d66", "is_release": true} \ No newline at end of file +{"git_version": "11a2b7a", "is_release": true} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/setup.cfg new/reno-1.6.2/setup.cfg --- old/reno-1.5.0/setup.cfg 2016-02-10 15:53:54.000000000 +0100 +++ new/reno-1.6.2/setup.cfg 2016-04-07 10:37:23.000000000 +0200 @@ -54,7 +54,7 @@ output_file = reno/locale/reno.pot [egg_info] -tag_svn_revision = 0 -tag_build = tag_date = 0 +tag_build = +tag_svn_revision = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/reno-1.5.0/tox.ini new/reno-1.6.2/tox.ini --- old/reno-1.5.0/tox.ini 2016-02-10 15:53:35.000000000 +0100 +++ new/reno-1.6.2/tox.ini 2016-04-07 10:35:17.000000000 +0200 @@ -11,7 +11,9 @@ deps = -r{toxinidir}/test-requirements.txt .[sphinx] -commands = python setup.py test --slowest --testr-args='{posargs}' +commands = + python setup.py test --slowest --coverage --coverage-package-name=reno --testr-args='{posargs}' + coverage report --show-missing [testenv:pep8] commands = flake8
