From 37793d4cdbf71f597a3c69c827e0c010528d53a5 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Tue, 12 Jun 2018 14:49:54 +0200 Subject: [PATCH 1/5] fix addmarker - extract mark from markdecorator --- changelog/3555.bugfix.rst | 1 + src/_pytest/mark/structures.py | 9 ++++++++- src/_pytest/nodes.py | 6 ++++-- testing/test_mark.py | 11 ++++++++++- 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 changelog/3555.bugfix.rst diff --git a/changelog/3555.bugfix.rst b/changelog/3555.bugfix.rst new file mode 100644 index 000000000..1911e1df5 --- /dev/null +++ b/changelog/3555.bugfix.rst @@ -0,0 +1 @@ +Fix regression in Node.add_marker by extracting the mark object of a markdecorator. diff --git a/src/_pytest/mark/structures.py b/src/_pytest/mark/structures.py index 7e86aee44..2b8dbf855 100644 --- a/src/_pytest/mark/structures.py +++ b/src/_pytest/mark/structures.py @@ -281,7 +281,14 @@ def _marked(func, mark): class MarkInfo(object): """ Marking object created by :class:`MarkDecorator` instances. """ - _marks = attr.ib() + _marks = attr.ib(convert=list) + + @_marks.validator + def validate_marks(self, attribute, value): + for item in value: + if not isinstance(item, Mark): + raise ValueError(item) + combined = attr.ib( repr=False, default=attr.Factory( diff --git a/src/_pytest/nodes.py b/src/_pytest/nodes.py index 8d82bf606..264077f5d 100644 --- a/src/_pytest/nodes.py +++ b/src/_pytest/nodes.py @@ -173,10 +173,12 @@ class Node(object): chain.reverse() return chain - def add_marker(self, marker): + def add_marker(self, marker, append=True): """ dynamically add a marker object to the node. ``marker`` can be a string or pytest.mark.* instance. + ``append=True`` whether to append the marker, + if false insert at position 0 """ from _pytest.mark import MarkDecorator, MARK_GEN @@ -185,7 +187,7 @@ class Node(object): elif not isinstance(marker, MarkDecorator): raise ValueError("is not a string or pytest.mark.* Marker") self.keywords[marker.name] = marker - self.own_markers.append(marker) + self.own_markers.append(marker.mark) def iter_markers(self, name=None): """ diff --git a/testing/test_mark.py b/testing/test_mark.py index e96af888a..e2e7369dc 100644 --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -1,7 +1,7 @@ from __future__ import absolute_import, division, print_function import os import sys - +import mock import pytest from _pytest.mark import ( MarkGenerator as Mark, @@ -9,6 +9,7 @@ from _pytest.mark import ( transfer_markers, EMPTY_PARAMETERSET_OPTION, ) +from _pytest.nodes import Node ignore_markinfo = pytest.mark.filterwarnings( "ignore:MarkInfo objects:_pytest.deprecated.RemovedInPytest4Warning" @@ -1123,3 +1124,11 @@ def test_mark_expressions_no_smear(testdir): passed_k, skipped_k, failed_k = reprec_keywords.countoutcomes() assert passed_k == 2 assert skipped_k == failed_k == 0 + + +def test_addmarker_getmarker(): + node = Node("Test", config=mock.Mock(), session=mock.Mock(), nodeid="Test") + node.add_marker(pytest.mark.a(1)) + node.add_marker("b") + node.get_marker("a").combined + node.get_marker("b").combined From 9a7c3a65f4edce61669d10db0d3f112c506d0b5c Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Tue, 12 Jun 2018 11:07:42 -0300 Subject: [PATCH 2/5] Improve CHANGELOG formatting --- changelog/3555.bugfix.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/3555.bugfix.rst b/changelog/3555.bugfix.rst index 1911e1df5..b86012c6b 100644 --- a/changelog/3555.bugfix.rst +++ b/changelog/3555.bugfix.rst @@ -1 +1 @@ -Fix regression in Node.add_marker by extracting the mark object of a markdecorator. +Fix regression in ``Node.add_marker`` by extracting the mark object of a ``MarkDecorator``. From b0ec442d2498cbb48159f2c2469126c06d1a0d35 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Tue, 12 Jun 2018 17:50:08 +0200 Subject: [PATCH 3/5] rework Node.add_marker parameter list and docstring --- src/_pytest/mark/structures.py | 6 +++++- src/_pytest/nodes.py | 8 +++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/_pytest/mark/structures.py b/src/_pytest/mark/structures.py index 2b8dbf855..1a2bd73de 100644 --- a/src/_pytest/mark/structures.py +++ b/src/_pytest/mark/structures.py @@ -287,7 +287,11 @@ class MarkInfo(object): def validate_marks(self, attribute, value): for item in value: if not isinstance(item, Mark): - raise ValueError(item) + raise ValueError( + "MarkInfo expects Mark instances, got {!r} ({!r})".format( + item, type(item) + ) + ) combined = attr.ib( repr=False, diff --git a/src/_pytest/nodes.py b/src/_pytest/nodes.py index 264077f5d..ef74c53eb 100644 --- a/src/_pytest/nodes.py +++ b/src/_pytest/nodes.py @@ -173,12 +173,10 @@ class Node(object): chain.reverse() return chain - def add_marker(self, marker, append=True): - """ dynamically add a marker object to the node. + def add_marker(self, marker): + """dynamically add a marker object to the node. - ``marker`` can be a string or pytest.mark.* instance. - ``append=True`` whether to append the marker, - if false insert at position 0 + :type marker: str or pytest.mark.* """ from _pytest.mark import MarkDecorator, MARK_GEN From 321f66f71148c978c1bf45dace61886b5e263bd4 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Tue, 12 Jun 2018 22:25:05 +0200 Subject: [PATCH 4/5] mark test_wrapped_getfuncargnames_patching as xfail --- testing/python/integration.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/testing/python/integration.py b/testing/python/integration.py index 2705bdc49..f348fdc29 100644 --- a/testing/python/integration.py +++ b/testing/python/integration.py @@ -108,6 +108,9 @@ class TestMockDecoration(object): values = getfuncargnames(f) assert values == ("x",) + @pytest.mark.xfail( + strict=False, reason="getfuncargnames breaks if mock is imported" + ) def test_wrapped_getfuncargnames_patching(self): from _pytest.compat import getfuncargnames From 88ae21f2ccaf4e3ebf5486ce423acf4361685df5 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Tue, 12 Jun 2018 18:07:40 -0300 Subject: [PATCH 5/5] Add mock dependency to py27-nobyte --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index 2d0fee99c..c346b5682 100644 --- a/tox.ini +++ b/tox.ini @@ -73,6 +73,7 @@ commands = {[testenv:py27-pexpect]commands} deps = pytest-xdist>=1.13 hypothesis>=3.56 + mock distribute = true changedir=testing setenv =