Skip to content

Commit b0ede04

Browse files
authored
Merge pull request #1835 from RonnyPfannschmidt/mark-extract-param
mark plugin: move the unclean marked parameter extraction
2 parents af0ec12 + 406777d commit b0ede04

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

_pytest/mark.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,21 @@ def __call__(self, *args, **kwargs):
283283
return self.__class__(self.name, args=args, kwargs=kw)
284284

285285

286+
def extract_argvalue(maybe_marked_args):
287+
# TODO: incorrect mark data, the old code wanst able to collect lists
288+
# individual parametrized argument sets can be wrapped in a series
289+
# of markers in which case we unwrap the values and apply the mark
290+
# at Function init
291+
newmarks = {}
292+
argval = maybe_marked_args
293+
while isinstance(argval, MarkDecorator):
294+
newmark = MarkDecorator(argval.markname,
295+
argval.args[:-1], argval.kwargs)
296+
newmarks[newmark.markname] = newmark
297+
argval = argval.args[-1]
298+
return argval, newmarks
299+
300+
286301
class MarkInfo:
287302
""" Marking object created by :class:`MarkDecorator` instances. """
288303
def __init__(self, name, args, kwargs):

_pytest/python.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
import sys
66
import collections
77
import math
8+
from itertools import count
89

910
import py
1011
import pytest
11-
from _pytest.mark import MarkDecorator, MarkerError
12+
from _pytest.mark import MarkerError
1213

1314

1415
import _pytest
@@ -776,19 +777,14 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
776777
to set a dynamic scope using test context or configuration.
777778
"""
778779
from _pytest.fixtures import scopes
779-
# individual parametrized argument sets can be wrapped in a series
780-
# of markers in which case we unwrap the values and apply the mark
781-
# at Function init
782-
newkeywords = {}
780+
from _pytest.mark import extract_argvalue
781+
783782
unwrapped_argvalues = []
784-
for i, argval in enumerate(argvalues):
785-
while isinstance(argval, MarkDecorator):
786-
newmark = MarkDecorator(argval.markname,
787-
argval.args[:-1], argval.kwargs)
788-
newmarks = newkeywords.setdefault(i, {})
789-
newmarks[newmark.markname] = newmark
790-
argval = argval.args[-1]
783+
newkeywords = []
784+
for maybe_marked_args in argvalues:
785+
argval, newmarks = extract_argvalue(maybe_marked_args)
791786
unwrapped_argvalues.append(argval)
787+
newkeywords.append(newmarks)
792788
argvalues = unwrapped_argvalues
793789

794790
if not isinstance(argnames, (tuple, list)):
@@ -803,8 +799,7 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
803799
newmark = pytest.mark.skip(
804800
reason="got empty parameter set %r, function %s at %s:%d" % (
805801
argnames, self.function.__name__, fs, lineno))
806-
newmarks = newkeywords.setdefault(0, {})
807-
newmarks[newmark.markname] = newmark
802+
newkeywords = [{newmark.markname: newmark}]
808803

809804
if scope is None:
810805
if self._arg2fixturedefs:
@@ -848,12 +843,12 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
848843
ids = idmaker(argnames, argvalues, idfn, ids, self.config)
849844
newcalls = []
850845
for callspec in self._calls or [CallSpec2(self)]:
851-
for param_index, valset in enumerate(argvalues):
846+
elements = zip(ids, argvalues, newkeywords, count())
847+
for a_id, valset, keywords, param_index in elements:
852848
assert len(valset) == len(argnames)
853849
newcallspec = callspec.copy(self)
854-
newcallspec.setmulti(valtypes, argnames, valset, ids[param_index],
855-
newkeywords.get(param_index, {}), scopenum,
856-
param_index)
850+
newcallspec.setmulti(valtypes, argnames, valset, a_id,
851+
keywords, scopenum, param_index)
857852
newcalls.append(newcallspec)
858853
self._calls = newcalls
859854

0 commit comments

Comments
 (0)