diff options
author | Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> | 2018-03-19 18:39:56 +0100 |
---|---|---|
committer | Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> | 2018-03-29 17:52:01 +0200 |
commit | 159ea9b7c0654f7e300ec2a91d7502ce1ae45571 (patch) | |
tree | f859eb2f2d731c8145146370d1633754254b9745 /_pytest | |
parent | 775fb96ac3f86de3e53120769fd0eb72c1d9dce0 (diff) | |
download | pytest-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.py | 21 | ||||
-rw-r--r-- | _pytest/nodes.py | 7 | ||||
-rw-r--r-- | _pytest/warnings.py | 3 |
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) |