Two minor tweaks in MarkDecorator's implementation (#6150)

Two minor tweaks in MarkDecorator's implementation
This commit is contained in:
Bruno Oliveira 2019-11-08 10:46:48 -03:00 committed by GitHub
commit 04891048e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 17 deletions

View File

@ -2,7 +2,6 @@ import inspect
import warnings import warnings
from collections import namedtuple from collections import namedtuple
from collections.abc import MutableMapping from collections.abc import MutableMapping
from operator import attrgetter
from typing import Set from typing import Set
import attr import attr
@ -17,16 +16,6 @@ from _pytest.warning_types import PytestUnknownMarkWarning
EMPTY_PARAMETERSET_OPTION = "empty_parameter_set_mark" EMPTY_PARAMETERSET_OPTION = "empty_parameter_set_mark"
def alias(name, warning=None):
getter = attrgetter(name)
def warned(self):
warnings.warn(warning, stacklevel=2)
return getter(self)
return property(getter if warning is None else warned, doc="alias for " + name)
def istestfunc(func): def istestfunc(func):
return ( return (
hasattr(func, "__call__") hasattr(func, "__call__")
@ -205,17 +194,25 @@ class MarkDecorator:
mark = attr.ib(validator=attr.validators.instance_of(Mark)) mark = attr.ib(validator=attr.validators.instance_of(Mark))
name = alias("mark.name") @property
args = alias("mark.args") def name(self):
kwargs = alias("mark.kwargs") """alias for mark.name"""
return self.mark.name
@property
def args(self):
"""alias for mark.args"""
return self.mark.args
@property
def kwargs(self):
"""alias for mark.kwargs"""
return self.mark.kwargs
@property @property
def markname(self): def markname(self):
return self.name # for backward-compat (2.4.1 had this attr) return self.name # for backward-compat (2.4.1 had this attr)
def __eq__(self, other):
return self.mark == other.mark if isinstance(other, MarkDecorator) else False
def __repr__(self): def __repr__(self):
return "<MarkDecorator {!r}>".format(self.mark) return "<MarkDecorator {!r}>".format(self.mark)

View File

@ -831,6 +831,12 @@ class TestMarkDecorator:
def test__eq__(self, lhs, rhs, expected): def test__eq__(self, lhs, rhs, expected):
assert (lhs == rhs) == expected assert (lhs == rhs) == expected
def test_aliases(self) -> None:
md = pytest.mark.foo(1, "2", three=3)
assert md.name == "foo"
assert md.args == (1, "2")
assert md.kwargs == {"three": 3}
@pytest.mark.parametrize("mark", [None, "", "skip", "xfail"]) @pytest.mark.parametrize("mark", [None, "", "skip", "xfail"])
def test_parameterset_for_parametrize_marks(testdir, mark): def test_parameterset_for_parametrize_marks(testdir, mark):