From 87cad78679fa18cd319e32d94334a2eb3c89e1b9 Mon Sep 17 00:00:00 2001 From: starlet-dx <15929766099@163.com> Date: Mon, 10 Apr 2023 14:02:21 +0800 Subject: [PATCH] Update to 2.0.0 --- 0001-upgrade-pytest-version.patch | 25 ---- pytest-6.1-and-7.patch | 218 ------------------------------ pytest-relaxed-1.1.5.tar.gz | Bin 21751 -> 0 bytes pytest-relaxed-2.0.0.tar.gz | Bin 0 -> 21732 bytes pytest-relaxed-pr10.patch | 175 ------------------------ python-pytest-relaxed.spec | 10 +- 6 files changed, 5 insertions(+), 423 deletions(-) delete mode 100644 0001-upgrade-pytest-version.patch delete mode 100644 pytest-6.1-and-7.patch delete mode 100644 pytest-relaxed-1.1.5.tar.gz create mode 100644 pytest-relaxed-2.0.0.tar.gz delete mode 100644 pytest-relaxed-pr10.patch diff --git a/0001-upgrade-pytest-version.patch b/0001-upgrade-pytest-version.patch deleted file mode 100644 index 158004c..0000000 --- a/0001-upgrade-pytest-version.patch +++ /dev/null @@ -1,25 +0,0 @@ -From b5f50fdc046144577a06c99b596c424c19f065b0 Mon Sep 17 00:00:00 2001 -From: zhaorenhai -Date: Sat, 30 Jan 2021 11:02:43 +0000 -Subject: [PATCH] upgrade pytest version - ---- - setup.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/setup.py b/setup.py -index d3af51b..44d9393 100644 ---- a/setup.py -+++ b/setup.py -@@ -24,7 +24,7 @@ setup( - # TODO: do we need to name the LHS 'pytest_relaxed' too? meh - "pytest11": ["relaxed = pytest_relaxed.plugin"] - }, -- install_requires=["pytest>=3,<5", "six>=1,<2", "decorator>=4,<5"], -+ install_requires=["pytest>=3,<=7.0.1", "six>=1,<2", "decorator>=4,<6"], - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Framework :: Pytest", --- -2.27.0 - diff --git a/pytest-6.1-and-7.patch b/pytest-6.1-and-7.patch deleted file mode 100644 index d7a9e32..0000000 --- a/pytest-6.1-and-7.patch +++ /dev/null @@ -1,218 +0,0 @@ -Index: pytest-relaxed-1.1.5/pytest_relaxed/classes.py -=================================================================== ---- pytest-relaxed-1.1.5.orig/pytest_relaxed/classes.py -+++ pytest-relaxed-1.1.5/pytest_relaxed/classes.py -@@ -4,7 +4,7 @@ import types - import six - - from pytest import __version__ as pytest_version --from pytest import Class, Instance, Module -+from pytest import Class, Module - - # NOTE: don't see any other way to get access to pytest innards besides using - # the underscored name :( -@@ -12,6 +12,13 @@ from _pytest.python import PyCollector - - pytest_version_info = tuple(map(int, pytest_version.split(".")[:3])) - -+# https://docs.pytest.org/en/latest/deprecations.html#the-pytest-instance-collector -+# The pytest.Instance collector type has been removed in Pytest 7.0 -+if pytest_version_info < (7, 0, 0): -+ from pytest import Instance -+else: -+ from pathlib import Path -+ Instance = object - - # NOTE: these are defined here for reuse by both pytest's own machinery and our - # internal bits. -@@ -22,6 +29,47 @@ def istestclass(name): - def istestfunction(name): - return not (name.startswith("_") or name in ("setup", "teardown")) - -+def _get_obj_rec(obj, parent_obj): -+ # Obtain parent attributes, etc not found on our obj (serves as both a -+ # useful identifier of "stuff added to an outer class" and a way of -+ # ensuring that we can override such attrs), and set them on obj -+ delta = set(dir(parent_obj)).difference(set(dir(obj))) -+ for name in delta: -+ value = getattr(parent_obj, name) -+ # Pytest's pytestmark attributes always get skipped, we don't want -+ # to spread that around where it's not wanted. (Besides, it can -+ # cause a lot of collection level warnings.) -+ if name == "pytestmark": -+ continue -+ # Classes get skipped; they'd always just be other 'inner' classes -+ # that we don't want to copy elsewhere. -+ if isinstance(value, six.class_types): -+ continue -+ # Methods may get skipped, or not, depending: -+ if isinstance(value, types.MethodType): -+ # If they look like tests, they get skipped; don't want to copy -+ # tests around! -+ if istestfunction(name): -+ continue -+ # Non-test == they're probably lifecycle methods -+ # (setup/teardown) or helpers (_do_thing). Rebind them to the -+ # target instance, otherwise the 'self' in the setup/helper is -+ # not the same 'self' as that in the actual test method it runs -+ # around or within! -+ # TODO: arguably, all setup or helper methods should become -+ # autouse class fixtures (see e.g. pytest docs under 'xunit -+ # setup on steroids') -+ func = six.get_method_function(value) -+ setattr(obj, name, six.create_bound_method(func, obj)) -+ continue -+ # Same as above but for Pytest 7 which does -+ # collect methods as functions, and without the six wrapper. -+ if isinstance(value, types.FunctionType) and istestfunction(name): -+ continue -+ # Anything else should be some data-type attribute, which is copied -+ # verbatim / by-value. -+ setattr(obj, name, value) -+ return obj - - # All other classes in here currently inherit from PyCollector, and it is what - # defines the default istestfunction/istestclass, so makes sense to inherit -@@ -50,7 +98,9 @@ class SpecModule(RelaxedMixin, Module): - - @classmethod - def from_parent(cls, parent, fspath): -- if pytest_version_info >= (5, 4): -+ if pytest_version_info >= (7, 0): -+ return super(SpecModule, cls).from_parent(parent, path=Path(fspath)) -+ elif pytest_version_info >= (5, 4): - return super(SpecModule, cls).from_parent(parent, fspath=fspath) - else: - return cls(parent=parent, fspath=fspath) -@@ -96,9 +146,7 @@ class SpecModule(RelaxedMixin, Module): - return collected - - --# NOTE: no need to inherit from RelaxedMixin here as it doesn't do much by --# its lonesome --class SpecClass(Class): -+class SpecClass(RelaxedMixin, Class): - - @classmethod - def from_parent(cls, parent, name): -@@ -110,16 +158,39 @@ class SpecClass(Class): - def collect(self): - items = super(SpecClass, self).collect() - collected = [] -- # Replace Instance objects with SpecInstance objects that know how to -- # recurse into inner classes. -- # TODO: is this ever not a one-item list? Meh. - for item in items: -- item = SpecInstance.from_parent(item.parent, name=item.name) -- collected.append(item) -+ if pytest_version_info < (7, 0): -+ # Replace Instance objects with SpecInstance objects that know how to -+ # recurse into inner classes. -+ item = SpecInstance.from_parent(item.parent, name=item.name) -+ collected.append(item) -+ else: -+ # Pytest >= 7 collects the Functions in Class directly without Instance -+ # Replace any Class objects with SpecClass, and recurse into it. -+ if isinstance(item, Class): -+ subclass = SpecClass.from_parent(item.parent, name=item.name) -+ collected += subclass.collect() -+ else: -+ collected.append(item) - return collected - -+ def _getobj(self): -+ # Regular object-making first -+ obj = super(SpecClass, self)._getobj() -+ # Then decorate it with our parent's extra attributes, allowing nested -+ # test classes to appear as an aggregate of parents' "scopes". -+ # NOTE: of course, skipping if we've gone out the top into a module etc -+ if ( -+ pytest_version_info < (7, 0) -+ or not hasattr(self, "parent") -+ or not isinstance(self.parent, SpecClass) -+ ): -+ return obj -+ else: -+ return _get_obj_rec(obj, self.parent.obj) - - class SpecInstance(RelaxedMixin, Instance): -+ # This is only instantiated in Pytest < 7 - - @classmethod - def from_parent(cls, parent, name): -@@ -141,61 +212,19 @@ class SpecInstance(RelaxedMixin, Instanc - or not isinstance(self.parent.parent, SpecInstance) - ): - return obj -- parent_obj = self.parent.parent.obj -- # Obtain parent attributes, etc not found on our obj (serves as both a -- # useful identifier of "stuff added to an outer class" and a way of -- # ensuring that we can override such attrs), and set them on obj -- delta = set(dir(parent_obj)).difference(set(dir(obj))) -- for name in delta: -- value = getattr(parent_obj, name) -- # Pytest's pytestmark attributes always get skipped, we don't want -- # to spread that around where it's not wanted. (Besides, it can -- # cause a lot of collection level warnings.) -- if name == "pytestmark": -- continue -- # Classes get skipped; they'd always just be other 'inner' classes -- # that we don't want to copy elsewhere. -- if isinstance(value, six.class_types): -- continue -- # Functions (methods) may get skipped, or not, depending: -- if isinstance(value, types.MethodType): -- # If they look like tests, they get skipped; don't want to copy -- # tests around! -- if istestfunction(name): -- continue -- # Non-test == they're probably lifecycle methods -- # (setup/teardown) or helpers (_do_thing). Rebind them to the -- # target instance, otherwise the 'self' in the setup/helper is -- # not the same 'self' as that in the actual test method it runs -- # around or within! -- # TODO: arguably, all setup or helper methods should become -- # autouse class fixtures (see e.g. pytest docs under 'xunit -- # setup on steroids') -- func = six.get_method_function(value) -- setattr(obj, name, six.create_bound_method(func, obj)) -- # Anything else should be some data-type attribute, which is copied -- # verbatim / by-value. -- else: -- setattr(obj, name, value) -- return obj -+ else: -+ return _get_obj_rec(obj, self.parent.parent.obj) - -- # Stub for pytest >=3.0,<3.3 where _makeitem did not exist -- def makeitem(self, *args, **kwargs): -- return self._makeitem(*args, **kwargs) - -- def _makeitem(self, name, obj): -- # More pytestmark skipping. -- if name == "pytestmark": -- return -- # NOTE: no need to modify collect() this time, just mutate item -- # creation. TODO: but if collect() is still public, let's move to that -- # sometime, if that'll work as well. -- superb = super(SpecInstance, self) -- attr = "_makeitem" if hasattr(superb, "_makeitem") else "makeitem" -- item = getattr(superb, attr)(name, obj) -- # Replace any Class objects with SpecClass; this will automatically -- # recurse. -- # TODO: can we unify this with SpecModule's same bits? -- if isinstance(item, Class): -- item = SpecClass.from_parent(item.parent, name=item.name) -- return item -+ def collect(self): -+ items = super(SpecInstance, self).collect() -+ collected = [] -+ for item in items: -+ # Replace any Class objects with SpecClass, and recurse into it. -+ if isinstance(item, Class): -+ cls = SpecClass.from_parent(item.parent, name=item.name) -+ for item in cls.collect(): -+ collected.append(item) -+ else: -+ collected.append(item) -+ return collected diff --git a/pytest-relaxed-1.1.5.tar.gz b/pytest-relaxed-1.1.5.tar.gz deleted file mode 100644 index 18ef7c9280f75b859dc1ea037aed3e0fe2cafa64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21751 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 -Date: Thu, 7 May 2020 18:46:52 +0300 -Subject: [PATCH 1/2] Fix deprecated direct constructors for Nodes - -As of 5.4.0 Pytest emits deprecation warnings [0]: -``` -PytestDeprecationWarning: direct construction of Spec* has been -deprecated, please use Spec*.from_parent. -``` - -[0]: https://docs.pytest.org/en/5.4.0/changelog.html#deprecations - -Signed-off-by: Stanislav Levin ---- - pytest_relaxed/classes.py | 31 ++++++++++++++++++++++++++++--- - pytest_relaxed/plugin.py | 2 +- - 2 files changed, 29 insertions(+), 4 deletions(-) - -diff --git a/pytest_relaxed/classes.py b/pytest_relaxed/classes.py -index 10615bc..26edf4e 100644 ---- a/pytest_relaxed/classes.py -+++ b/pytest_relaxed/classes.py -@@ -3,12 +3,15 @@ - - import six - -+from pytest import __version__ as pytest_version - from pytest import Class, Instance, Module - - # NOTE: don't see any other way to get access to pytest innards besides using - # the underscored name :( - from _pytest.python import PyCollector - -+pytest_version_info = tuple(map(int, pytest_version.split(".")[:3])) -+ - - # NOTE: these are defined here for reuse by both pytest's own machinery and our - # internal bits. -@@ -45,6 +48,13 @@ def istestfunction(self, obj, name): - - class SpecModule(RelaxedMixin, Module): - -+ @classmethod -+ def from_parent(cls, parent, fspath): -+ if pytest_version_info >= (5, 4): -+ return super(SpecModule, cls).from_parent(parent, fspath=fspath) -+ else: -+ return cls(parent=parent, fspath=fspath) -+ - def _is_test_obj(self, test_func, obj, name): - # First run our super() test, which should be RelaxedMixin's. - good_name = getattr(super(SpecModule, self), test_func)(obj, name) -@@ -69,6 +79,7 @@ def collect(self): - # Get whatever our parent picked up as valid test items (given our - # relaxed name constraints above). It'll be nearly all module contents. - items = super(SpecModule, self).collect() -+ - collected = [] - for item in items: - # Replace Class objects with recursive SpecInstances (via -@@ -80,7 +91,7 @@ def collect(self): - # them to be handled by pytest's own unittest support) but since - # those are almost always in test_prefixed_filenames anyways...meh - if isinstance(item, Class): -- item = SpecClass(item.name, item.parent) -+ item = SpecClass.from_parent(item.parent, name=item.name) - collected.append(item) - return collected - -@@ -89,6 +100,13 @@ def collect(self): - # its lonesome - class SpecClass(Class): - -+ @classmethod -+ def from_parent(cls, parent, name): -+ if pytest_version_info >= (5, 4): -+ return super(SpecClass, cls).from_parent(parent, name=name) -+ else: -+ return cls(parent=parent, name=name) -+ - def collect(self): - items = super(SpecClass, self).collect() - collected = [] -@@ -96,13 +114,20 @@ def collect(self): - # recurse into inner classes. - # TODO: is this ever not a one-item list? Meh. - for item in items: -- item = SpecInstance(name=item.name, parent=item.parent) -+ item = SpecInstance.from_parent(item.parent, name=item.name) - collected.append(item) - return collected - - - class SpecInstance(RelaxedMixin, Instance): - -+ @classmethod -+ def from_parent(cls, parent, name): -+ if pytest_version_info >= (5, 4): -+ return super(SpecInstance, cls).from_parent(parent, name=name) -+ else: -+ return cls(parent=parent, name=name) -+ - def _getobj(self): - # Regular object-making first - obj = super(SpecInstance, self)._getobj() -@@ -172,5 +197,5 @@ def _makeitem(self, name, obj): - # recurse. - # TODO: can we unify this with SpecModule's same bits? - if isinstance(item, Class): -- item = SpecClass(item.name, item.parent) -+ item = SpecClass.from_parent(item.parent, name=item.name) - return item -diff --git a/pytest_relaxed/plugin.py b/pytest_relaxed/plugin.py -index 0f5a389..8f64358 100644 ---- a/pytest_relaxed/plugin.py -+++ b/pytest_relaxed/plugin.py -@@ -28,7 +28,7 @@ def pytest_collect_file(path, parent): - ): - # Then use our custom module class which performs modified - # function/class selection as well as class recursion -- return SpecModule(path, parent) -+ return SpecModule.from_parent(parent, fspath=path) - - - @pytest.mark.trylast # So we can be sure builtin terminalreporter exists - -From 6360ba2cc46b597d20478aaee1d6bd1d73588a88 Mon Sep 17 00:00:00 2001 -From: Stanislav Levin -Date: Fri, 6 Dec 2019 16:13:06 +0300 -Subject: [PATCH 2/2] Fixed expected colored statistics - -As of 5.3.0 Pytest improved colored statistics of the outcome: -https://docs.pytest.org/en/5.3.0/changelog.html#improvements - -Signed-off-by: Stanislav Levin ---- - tests/test_display.py | 12 +++++++++++- - 1 file changed, 11 insertions(+), 1 deletion(-) - -diff --git a/tests/test_display.py b/tests/test_display.py -index 5b7f9c8..2884c84 100644 ---- a/tests/test_display.py -+++ b/tests/test_display.py -@@ -1,4 +1,5 @@ - from pytest import skip -+from pytest import __version__ as pytest_version - - # Load some fixtures we expose, without actually loading our entire plugin - from pytest_relaxed.fixtures import environ # noqa -@@ -8,6 +9,8 @@ - # (May not be feasible if it has to assume something about how our collection - # works?) CLI option (99% sure we can hook into that as a plugin)? - -+pytest_version_info = tuple(map(int, pytest_version.split(".")[:3])) -+ - - def _expect_regular_output(testdir): - output = testdir.runpytest().stdout.str() -@@ -225,7 +228,14 @@ def behavior_four(self): - assert "== FAILURES ==" in output - assert "AssertionError" in output - # Summary -- assert "== 1 failed, 4 passed, 1 skipped in " in output -+ if pytest_version_info >= (5, 3): -+ expected_out = ( -+ "== \x1b[31m\x1b[1m1 failed\x1b[0m, \x1b[32m4 passed\x1b[0m, " -+ "\x1b[33m1 skipped\x1b[0m\x1b[31m in " -+ ) -+ else: -+ expected_out = "== 1 failed, 4 passed, 1 skipped in " -+ assert expected_out in output - - def test_nests_many_levels_deep_no_problem(self, testdir): - testdir.makepyfile( diff --git a/python-pytest-relaxed.spec b/python-pytest-relaxed.spec index 21ea7a2..6a871a4 100644 --- a/python-pytest-relaxed.spec +++ b/python-pytest-relaxed.spec @@ -5,16 +5,13 @@ is built for pytest instead of nosetests, and rethinks some aspects of \ the design (such as a decreased emphasis on the display side of things.) Name: python-%{srcname} -Version: 1.1.5 -Release: 14 +Version: 2.0.0 +Release: 1 Summary: Relaxed test discovery for pytest License: BSD URL: https://github.com/bitprophet/pytest-relaxed Source0: %{url}/archive/%{version}/%{srcname}-%{version}.tar.gz -Patch0: 0001-upgrade-pytest-version.patch -Patch1: pytest-relaxed-pr10.patch -Patch2: pytest-6.1-and-7.patch BuildArch: noarch %description @@ -52,6 +49,9 @@ PYTHONPATH=%{buildroot}%{python3_sitelib} pytest-%{python3_version} %{python3_sitelib}/pytest_relaxed/ %changelog +* Mon Apr 10 2023 yaoxin - 2.0.0-1 +- Update to 2.0.0 + * Tue Mar 28 2023 xu_ping - 1.1.5-14 - Modify pytest version