diff --git a/migrate-to-pytest.patch b/migrate-to-pytest.patch new file mode 100644 index 0000000..a02b1fc --- /dev/null +++ b/migrate-to-pytest.patch @@ -0,0 +1,316 @@ +From 94bb11bfe6a9583896de6d54861af68e9ce6b957 Mon Sep 17 00:00:00 2001 +From: Jeff Forcier +Date: Fri, 17 Jan 2020 15:16:49 -0500 +Subject: [PATCH] Migrate to pytest-relaxed from spec + +--- + dev-requirements.txt | 3 +- + docs/changelog.rst | 2 ++ + integration/integration.py | 6 ++-- + integration/util.py | 66 ++++++++++++++++++++------------------ + setup.cfg | 4 +++ + tasks.py | 7 ++-- + tests/_util.py | 6 ++-- + tests/organization.py | 35 ++++++++++---------- + tests/presentation.py | 25 +++++++-------- + 9 files changed, 80 insertions(+), 74 deletions(-) + +Index: releases-1.6.3/dev-requirements.txt +=================================================================== +--- releases-1.6.3.orig/dev-requirements.txt ++++ releases-1.6.3/dev-requirements.txt +@@ -2,7 +2,8 @@ + invoke>=0.6.0,<2.0 + invocations>=0.14,<2.0 + # Tests (N.B. integration suite also uses Invoke as above) +-spec>=0.11.3,<2.0 ++pytest-relaxed==1.1.5 ++pytest==4.6.9 + mock==1.0.1 + # Just for tests...heh + six>=1.4.1,<2.0 +Index: releases-1.6.3/docs/changelog.rst +=================================================================== +--- releases-1.6.3.orig/docs/changelog.rst ++++ releases-1.6.3/docs/changelog.rst +@@ -2,6 +2,8 @@ + Changelog + ========= + ++- :support:`-` Migrated the test suite to use ``pytest-relaxed`` (and thus ++ pytest) instead of ``spec``. + - :release:`1.6.3 <2020-01-10>` + - :support:`87 backported` (via :issue:`88`) Our upper Sphinx version limit was + mostly defensive and at this point is just too old to even build on +Index: releases-1.6.3/tasks.py +=================================================================== +--- releases-1.6.3.orig/tasks.py ++++ releases-1.6.3/tasks.py +@@ -1,17 +1,14 @@ + from os.path import join + + from invocations import docs +-from invocations.testing import test, integration, watch_tests ++from invocations.pytest import test, integration + from invocations.packaging import release + + from invoke import Collection + + +-ns = Collection(test, integration, watch_tests, release, docs) ++ns = Collection(test, integration, release, docs) + ns.configure({ +- 'tests': { +- 'package': 'releases', +- }, + 'packaging': { + 'sign': True, + 'wheel': True, +Index: releases-1.6.3/tests/_util.py +=================================================================== +--- releases-1.6.3.orig/tests/_util.py ++++ releases-1.6.3/tests/_util.py +@@ -2,7 +2,6 @@ from docutils.nodes import ( + list_item, paragraph, + ) + from mock import Mock +-from spec import eq_, ok_ + import six + + from releases import ( +@@ -108,9 +107,10 @@ def expect_releases(entries, release_map + err += "\nFull changelog: {!r}\n" + for rel, issues in six.iteritems(release_map): + found = changelog.pop(rel) +- eq_(set(found), set(issues), err.format(rel, issues, found, snapshot)) ++ msg = err.format(rel, issues, found, snapshot) ++ assert set(found) == set(issues), msg + # Sanity: ensure no leftover issue lists exist (empty ones are OK) + for key in list(changelog.keys()): + if not changelog[key]: + del changelog[key] +- ok_(not changelog, "Found leftovers: {}".format(changelog)) ++ assert not changelog, "Found leftovers: {}".format(changelog) +Index: releases-1.6.3/tests/organization.py +=================================================================== +--- releases-1.6.3.orig/tests/organization.py ++++ releases-1.6.3/tests/organization.py +@@ -1,5 +1,6 @@ + import six +-from spec import Spec, eq_, raises, skip ++from pytest import skip ++from pytest_relaxed import raises + from docutils.nodes import ( + list_item, raw, paragraph, Text, + ) +@@ -20,7 +21,7 @@ from _util import ( + ) + + +-class organization(Spec): ++class organization(object): + """ + Organization of issues into releases (parsing) + """ +@@ -30,7 +31,7 @@ class organization(Spec): + def _expect_entries(self, all_entries, in_, not_in): + # Grab 2nd release as 1st is the empty 'beginning of time' one + entries = releases(*all_entries)[1]['entries'] +- eq_(len(entries), len(in_)) ++ assert len(entries) == len(in_) + for x in in_: + assert x in entries + for x in not_in: +@@ -86,22 +87,22 @@ class organization(Spec): + fake = list_item('', paragraph('', '', raw('', 'whatever'))) + changelog = releases('1.0.2', self.f, fake) + entries = changelog[1]['entries'] +- eq_(len(entries), 1) ++ assert len(entries) == 1 + assert self.f not in entries + assert isinstance(entries[0], Issue) +- eq_(entries[0].number, None) ++ assert entries[0].number is None + + def unreleased_items_go_in_unreleased_releases(self): + changelog = releases(self.f, self.b) + # Should have two unreleased lists, one feature w/ feature, one bugfix + # w/ bugfix. + bugfix, feature = changelog[1:] +- eq_(len(feature['entries']), 1) +- eq_(len(bugfix['entries']), 1) ++ assert len(feature['entries']) == 1 ++ assert len(bugfix['entries']) == 1 + assert self.f in feature['entries'] + assert self.b in bugfix['entries'] +- eq_(feature['obj'].number, 'unreleased_1.x_feature') +- eq_(bugfix['obj'].number, 'unreleased_1.x_bugfix') ++ assert feature['obj'].number == 'unreleased_1.x_feature' ++ assert bugfix['obj'].number == 'unreleased_1.x_bugfix' + + def issues_consumed_by_releases_are_not_in_unreleased(self): + changelog = releases('1.0.2', self.f, self.b, self.s, self.bs) +@@ -148,7 +149,7 @@ class organization(Spec): + ('1.1.2', [b50, b42]), + ('1.2.1', [b50, b42]), + ): +- eq_(set(c[rel]), set(issues)) ++ assert set(c[rel]) == set(issues) + + def releases_can_specify_issues_explicitly(self): + # Build regular list-o-entries +@@ -218,7 +219,7 @@ class organization(Spec): + def duplicate_issue_numbers_adds_two_issue_items(self): + test_changelog = releases('1.0.1', self.b, self.b) + test_changelog = changelog2dict(test_changelog) +- eq_(len(test_changelog['1.0.1']), 2) ++ assert len(test_changelog['1.0.1']) == 2 + + def duplicate_zeroes_dont_error(self): + cl = releases('1.0.1', b(0), b(0)) +@@ -239,7 +240,7 @@ class organization(Spec): + # Order should be feature, bug, support. While it doesn't REALLY + # matter, assert that within each category the order matches the old + # 'reverse chronological' order. +- eq_(changelog['1.1'], [f2, f1, b2, b1, s2, s1]) ++ assert changelog['1.1'], [f2, f1, b2, b1, s2 == s1] + + def rolling_release_works_without_annotation(self): + b1 = b(1) +@@ -397,8 +398,8 @@ class organization(Spec): + second = changelog['0.1.1'] + assert b1 in first + assert f2 in first +- eq_(len(first), 3) # Meh, hard to assert about the implicit one +- eq_(second, [b3]) ++ assert len(first) == 3 # Meh, hard to assert about the implicit one ++ assert second == [b3] + + def specs_and_keywords_play_together_nicely(self): + b1 = b(1) +@@ -429,13 +430,13 @@ class organization(Spec): + def changelogs_without_any_releases_display_unreleased_normally(self): + changelog = releases(self.f, self.b, skip_initial=True) + # Ensure only the two unreleased 'releases' showed up +- eq_(len(changelog), 2) ++ assert len(changelog) == 2 + # And assert that both items appeared in one of them (since there's no + # real releases at all, the bugfixes are treated as 'major' bugs, as + # per concepts doc.) + bugfix, feature = changelog +- eq_(len(feature['entries']), 2) +- eq_(len(bugfix['entries']), 0) ++ assert len(feature['entries']) == 2 ++ assert len(bugfix['entries']) == 0 + + class unstable_prehistory: + def _expect_releases(self, *args, **kwargs): +Index: releases-1.6.3/tests/presentation.py +=================================================================== +--- releases-1.6.3.orig/tests/presentation.py ++++ releases-1.6.3/tests/presentation.py +@@ -1,4 +1,3 @@ +-from spec import Spec, eq_ + from docutils.nodes import ( + reference, bullet_list, list_item, literal, raw, paragraph, Text + ) +@@ -30,7 +29,7 @@ def _expect_type(node, cls): + assert isinstance(node, cls), msg + + +-class presentation(Spec): ++class presentation(object): + """ + Expansion/extension of docutils nodes (rendering) + """ +@@ -58,7 +57,7 @@ class presentation(Spec): + assert expected in header + elif type_ == 'issue': + link = nodes[0][1][0][0][2] +- eq_(link['refuri'], expected) ++ assert link['refuri'] == expected + else: + raise Exception("Gave unknown type_ kwarg to _test_link()!") + +@@ -139,7 +138,7 @@ class presentation(Spec): + Text("fixes an issue in "), literal('', 'methodname'))) + node = self._generate('1.0.2', fake) + # [, , , , ] +- eq_(len(node[0]), 5) ++ assert len(node[0]) == 5 + assert 'Bug' in str(node[0][0]) + assert 'fixes an issue' in str(node[0][3]) + assert 'methodname' in str(node[0][4]) +@@ -149,7 +148,7 @@ class presentation(Spec): + fake = list_item('', paragraph('', '', raw('', 'whatever'))) + node = self._generate('0.1.0', fake, app=app, skip_initial=True) + # [] +- eq_(len(node[0]), 1) ++ assert len(node[0]) == 1 + assert 'Bug' not in str(node[0][0]) + assert 'whatever' in str(node[0][0]) + +@@ -173,9 +172,9 @@ class presentation(Spec): + ) + # Trailing nodes should appear post-processing after the link/etc + rest = self._generate('1.0.2', issue)[0] +- eq_(len(rest), 5) ++ assert len(rest) == 5 + _expect_type(rest[4], raw) +- eq_(rest[4].astext(), 'x') ++ assert rest[4].astext() == 'x' + + def complex_descriptions_are_preserved(self): + # Complex 'entry' mapping to an outer list_item (list) containing two +@@ -188,14 +187,14 @@ class presentation(Spec): + li = self._generate('1.0.2', issue) + # Expect that the machinery parsing issue nodes/nodelists, is not + # discarding our 2nd 'paragraph' +- eq_(len(li), 2) ++ assert len(li) == 2 + p1, p2 = li + # Last item in 1st para is our 1st raw node + _expect_type(p1[4], raw) +- eq_(p1[4].astext(), 'x') ++ assert p1[4].astext() == 'x' + # Only item in 2nd para is our 2nd raw node + _expect_type(p2[0], raw) +- eq_(p2[0].astext(), 'y') ++ assert p2[0].astext() == 'y' + + def descriptions_are_parsed_for_issue_roles(self): + item = list_item('', +@@ -207,11 +206,11 @@ class presentation(Spec): + assert not isinstance(para[4], Issue) + # First/primary link + _expect_type(para[2], reference) +- eq_(para[2].astext(), '#15') ++ assert para[2].astext() == '#15' + assert 'Bug' in para[0].astext() + # Second/inline link + _expect_type(para[6], reference) +- eq_(para[6].astext(), '#5') ++ assert para[6].astext() == '#5' + assert 'Support' in para[4].astext() + + def unreleased_buckets_omit_major_version_when_only_one_exists(self): +@@ -246,7 +245,7 @@ class presentation(Spec): + ) + # Expectation: [1.x unreleased, 1.0.1] - no 2.x. + result = self._generate(*entries, raw=True) +- eq_(len(result), 2) ++ assert len(result) == 2 + html = str(result[0][0][0]) + assert "Next 1.x bugfix release" in html + +Index: releases-1.6.3/setup.cfg +=================================================================== +--- releases-1.6.3.orig/setup.cfg ++++ releases-1.6.3/setup.cfg +@@ -10,3 +10,6 @@ universal = 1 + tag_build = + tag_date = 0 + ++[tool:pytest] ++testpaths = tests ++python_files = * diff --git a/python-releases.changes b/python-releases.changes index 43518ac..f61250f 100644 --- a/python-releases.changes +++ b/python-releases.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Sep 13 06:17:58 UTC 2021 - Steve Kowalik + +- Add patch migrate-to-pytest.patch: + * Migrate to pytest, lightly rebased from upstream. + ------------------------------------------------------------------- Mon May 25 21:27:01 UTC 2020 - Benjamin Greiner diff --git a/python-releases.spec b/python-releases.spec index ef44ba8..2f77d01 100644 --- a/python-releases.spec +++ b/python-releases.spec @@ -1,7 +1,7 @@ # -# spec file for package python +# spec file # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -33,6 +33,7 @@ License: BSD-2-Clause URL: https://github.com/bitprophet/releases Source: https://files.pythonhosted.org/packages/source/r/releases/releases-%{version}.tar.gz Patch0: semanticversioning.patch +Patch1: migrate-to-pytest.patch BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: python-rpm-macros @@ -45,9 +46,9 @@ BuildRequires: %{python_module Sphinx >= 1.3} BuildRequires: %{python_module invocations} BuildRequires: %{python_module invoke} BuildRequires: %{python_module mock >= 1.0.1} +BuildRequires: %{python_module pytest-relaxed} BuildRequires: %{python_module semantic_version} BuildRequires: %{python_module six >= 1.4.1} -BuildRequires: %{python_module spec >= 0.11.3} %endif %python_subpackages @@ -70,7 +71,7 @@ Specifically: %prep %setup -q -n releases-%{version} -%patch0 -p1 +%autopatch -p1 %build %python_build