Skip to content

Commit e8c4204

Browse files
turn Markinfo into atts clsas, and return correct instances of it from node.get_marker
1 parent 8a0030f commit e8c4204

File tree

4 files changed

+21
-13
lines changed

4 files changed

+21
-13
lines changed

_pytest/mark/structures.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
import inspect
55

66
import attr
7+
78
from ..deprecated import MARK_PARAMETERSET_UNPACKING, MARK_INFO_ATTRIBUTE
89
from ..compat import NOTSET, getfslineno
9-
from six.moves import map
10+
from six.moves import map, reduce
1011

1112

1213
EMPTY_PARAMETERSET_OPTION = "empty_parameter_set_mark"
@@ -233,7 +234,7 @@ def store_legacy_markinfo(func, mark):
233234
raise TypeError("got {mark!r} instead of a Mark".format(mark=mark))
234235
holder = getattr(func, mark.name, None)
235236
if holder is None:
236-
holder = MarkInfo(mark)
237+
holder = MarkInfo.for_mark(mark)
237238
setattr(func, mark.name, holder)
238239
else:
239240
holder.add_mark(mark)
@@ -266,18 +267,24 @@ def _marked(func, mark):
266267
return any(mark == info.combined for info in func_mark)
267268

268269

270+
@attr.s
269271
class MarkInfo(object):
270272
""" Marking object created by :class:`MarkDecorator` instances. """
271273

272-
def __init__(self, mark):
273-
assert isinstance(mark, Mark), repr(mark)
274-
self.combined = mark
275-
self._marks = [mark]
274+
_marks = attr.ib()
275+
combined = attr.ib(
276+
repr=False,
277+
default=attr.Factory(lambda self: reduce(Mark.combined_with, self._marks),
278+
takes_self=True))
276279

277280
name = alias('combined.name', warning=MARK_INFO_ATTRIBUTE)
278281
args = alias('combined.args', warning=MARK_INFO_ATTRIBUTE)
279282
kwargs = alias('combined.kwargs', warning=MARK_INFO_ATTRIBUTE)
280283

284+
@classmethod
285+
def for_mark(cls, mark):
286+
return cls([mark])
287+
281288
def __repr__(self):
282289
return "<MarkInfo {0!r}>".format(self.combined)
283290

@@ -288,7 +295,7 @@ def add_mark(self, mark):
288295

289296
def __iter__(self):
290297
""" yield MarkInfo objects each relating to a marking-call. """
291-
return map(MarkInfo, self._marks)
298+
return map(MarkInfo.for_mark, self._marks)
292299

293300

294301
class MarkGenerator(object):

_pytest/nodes.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44
import six
55
import py
66
import attr
7-
from more_itertools import first
87

98
import _pytest
109
import _pytest._code
1110

12-
from _pytest.mark.structures import NodeKeywords, NodeMarkers
11+
from _pytest.mark.structures import NodeKeywords, NodeMarkers, MarkInfo
1312

1413
SEP = "/"
1514

@@ -194,7 +193,9 @@ def find_markers(self, name):
194193
def get_marker(self, name):
195194
""" get a marker object from this node or None if
196195
the node doesn't have a marker with that name. """
197-
return first(self.find_markers(name), None)
196+
markers = list(self.find_markers(name))
197+
if markers:
198+
return MarkInfo(markers)
198199

199200
def listextrakeywords(self):
200201
""" Return a set of all extra keywords in self and any parents."""

_pytest/warnings.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ def catch_warnings_for_item(item):
6060
for arg in inifilters:
6161
_setoption(warnings, arg)
6262

63-
mark = item.get_marker('filterwarnings')
64-
if mark:
63+
for mark in item.find_markers('filterwarnings'):
6564
for arg in mark.args:
6665
warnings._setoption(arg)
6766

testing/test_mark.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
class TestMark(object):
1515
def test_markinfo_repr(self):
1616
from _pytest.mark import MarkInfo, Mark
17-
m = MarkInfo(Mark("hello", (1, 2), {}))
17+
m = MarkInfo.for_mark(Mark("hello", (1, 2), {}))
1818
repr(m)
1919

2020
@pytest.mark.parametrize('attr', ['mark', 'param'])
@@ -684,6 +684,7 @@ def test_function():
684684
reprec = testdir.inline_run()
685685
reprec.assertoutcome(passed=1)
686686

687+
@ignore_markinfo
687688
def test_keyword_added_for_session(self, testdir):
688689
testdir.makeconftest("""
689690
import pytest

0 commit comments

Comments
 (0)