summaryrefslogtreecommitdiff
path: root/_pytest
diff options
context:
space:
mode:
authorRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2018-03-19 18:39:56 +0100
committerRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2018-03-29 17:52:01 +0200
commit159ea9b7c0654f7e300ec2a91d7502ce1ae45571 (patch)
treef859eb2f2d731c8145146370d1633754254b9745 /_pytest
parent775fb96ac3f86de3e53120769fd0eb72c1d9dce0 (diff)
downloadpytest-159ea9b7c0654f7e300ec2a91d7502ce1ae45571.tar.gz
turn Markinfo into atts clsas, and return correct instances of it from node.get_marker
Diffstat (limited to '_pytest')
-rw-r--r--_pytest/mark/structures.py21
-rw-r--r--_pytest/nodes.py7
-rw-r--r--_pytest/warnings.py3
3 files changed, 19 insertions, 12 deletions
diff --git a/_pytest/mark/structures.py b/_pytest/mark/structures.py
index 9b1411acf..853d89fdd 100644
--- a/_pytest/mark/structures.py
+++ b/_pytest/mark/structures.py
@@ -4,9 +4,10 @@ from operator import attrgetter
import inspect
import attr
+
from ..deprecated import MARK_PARAMETERSET_UNPACKING, MARK_INFO_ATTRIBUTE
from ..compat import NOTSET, getfslineno
-from six.moves import map
+from six.moves import map, reduce
EMPTY_PARAMETERSET_OPTION = "empty_parameter_set_mark"
@@ -233,7 +234,7 @@ def store_legacy_markinfo(func, mark):
raise TypeError("got {mark!r} instead of a Mark".format(mark=mark))
holder = getattr(func, mark.name, None)
if holder is None:
- holder = MarkInfo(mark)
+ holder = MarkInfo.for_mark(mark)
setattr(func, mark.name, holder)
else:
holder.add_mark(mark)
@@ -266,18 +267,24 @@ def _marked(func, mark):
return any(mark == info.combined for info in func_mark)
+@attr.s
class MarkInfo(object):
""" Marking object created by :class:`MarkDecorator` instances. """
- def __init__(self, mark):
- assert isinstance(mark, Mark), repr(mark)
- self.combined = mark
- self._marks = [mark]
+ _marks = attr.ib()
+ combined = attr.ib(
+ repr=False,
+ default=attr.Factory(lambda self: reduce(Mark.combined_with, self._marks),
+ takes_self=True))
name = alias('combined.name', warning=MARK_INFO_ATTRIBUTE)
args = alias('combined.args', warning=MARK_INFO_ATTRIBUTE)
kwargs = alias('combined.kwargs', warning=MARK_INFO_ATTRIBUTE)
+ @classmethod
+ def for_mark(cls, mark):
+ return cls([mark])
+
def __repr__(self):
return "<MarkInfo {0!r}>".format(self.combined)
@@ -288,7 +295,7 @@ class MarkInfo(object):
def __iter__(self):
""" yield MarkInfo objects each relating to a marking-call. """
- return map(MarkInfo, self._marks)
+ return map(MarkInfo.for_mark, self._marks)
class MarkGenerator(object):
diff --git a/_pytest/nodes.py b/_pytest/nodes.py
index 0e08c1c28..a37fa4698 100644
--- a/_pytest/nodes.py
+++ b/_pytest/nodes.py
@@ -4,12 +4,11 @@ import os
import six
import py
import attr
-from more_itertools import first
import _pytest
import _pytest._code
-from _pytest.mark.structures import NodeKeywords, NodeMarkers
+from _pytest.mark.structures import NodeKeywords, NodeMarkers, MarkInfo
SEP = "/"
@@ -194,7 +193,9 @@ class Node(object):
def get_marker(self, name):
""" get a marker object from this node or None if
the node doesn't have a marker with that name. """
- return first(self.find_markers(name), None)
+ markers = list(self.find_markers(name))
+ if markers:
+ return MarkInfo(markers)
def listextrakeywords(self):
""" Return a set of all extra keywords in self and any parents."""
diff --git a/_pytest/warnings.py b/_pytest/warnings.py
index 3c2b1914f..8183d6d66 100644
--- a/_pytest/warnings.py
+++ b/_pytest/warnings.py
@@ -60,8 +60,7 @@ def catch_warnings_for_item(item):
for arg in inifilters:
_setoption(warnings, arg)
- mark = item.get_marker('filterwarnings')
- if mark:
+ for mark in item.find_markers('filterwarnings'):
for arg in mark.args:
warnings._setoption(arg)