Skip to content

Commit 1d84831

Browse files
symonknicoddemus
andauthored
some small quality of life changes (#8454)
Co-authored-by: Bruno Oliveira <[email protected]>
1 parent 90b70a7 commit 1d84831

File tree

2 files changed

+27
-33
lines changed

2 files changed

+27
-33
lines changed

src/_pytest/mark/__init__.py

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -200,17 +200,12 @@ def deselect_by_keyword(items: "List[Item]", config: Config) -> None:
200200
selectuntil = True
201201
keywordexpr = keywordexpr[:-1]
202202

203-
try:
204-
expression = Expression.compile(keywordexpr)
205-
except ParseError as e:
206-
raise UsageError(
207-
f"Wrong expression passed to '-k': {keywordexpr}: {e}"
208-
) from None
203+
expr = _parse_expression(keywordexpr, "Wrong expression passed to '-k'")
209204

210205
remaining = []
211206
deselected = []
212207
for colitem in items:
213-
if keywordexpr and not expression.evaluate(KeywordMatcher.from_item(colitem)):
208+
if keywordexpr and not expr.evaluate(KeywordMatcher.from_item(colitem)):
214209
deselected.append(colitem)
215210
else:
216211
if selectuntil:
@@ -245,24 +240,26 @@ def deselect_by_mark(items: "List[Item]", config: Config) -> None:
245240
if not matchexpr:
246241
return
247242

248-
try:
249-
expression = Expression.compile(matchexpr)
250-
except ParseError as e:
251-
raise UsageError(f"Wrong expression passed to '-m': {matchexpr}: {e}") from None
252-
253-
remaining = []
254-
deselected = []
243+
expr = _parse_expression(matchexpr, "Wrong expression passed to '-m'")
244+
remaining: List[Item] = []
245+
deselected: List[Item] = []
255246
for item in items:
256-
if expression.evaluate(MarkMatcher.from_item(item)):
247+
if expr.evaluate(MarkMatcher.from_item(item)):
257248
remaining.append(item)
258249
else:
259250
deselected.append(item)
260-
261251
if deselected:
262252
config.hook.pytest_deselected(items=deselected)
263253
items[:] = remaining
264254

265255

256+
def _parse_expression(expr: str, exc_message: str) -> Expression:
257+
try:
258+
return Expression.compile(expr)
259+
except ParseError as e:
260+
raise UsageError(f"{exc_message}: {expr}: {e}") from None
261+
262+
266263
def pytest_collection_modifyitems(items: "List[Item]", config: Config) -> None:
267264
deselect_by_keyword(items, config)
268265
deselect_by_mark(items, config)

src/_pytest/mark/structures.py

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,7 @@
4040

4141

4242
def istestfunc(func) -> bool:
43-
return (
44-
hasattr(func, "__call__")
45-
and getattr(func, "__name__", "<lambda>") != "<lambda>"
46-
)
43+
return callable(func) and getattr(func, "__name__", "<lambda>") != "<lambda>"
4744

4845

4946
def get_empty_parameterset_mark(
@@ -332,9 +329,6 @@ def markname(self) -> str:
332329
""":meta private:"""
333330
return self.name # for backward-compat (2.4.1 had this attr)
334331

335-
def __repr__(self) -> str:
336-
return f"<MarkDecorator {self.mark!r}>"
337-
338332
def with_args(self, *args: object, **kwargs: object) -> "MarkDecorator":
339333
"""Return a MarkDecorator with extra arguments added.
340334
@@ -375,18 +369,21 @@ def get_unpacked_marks(obj) -> List[Mark]:
375369

376370

377371
def normalize_mark_list(mark_list: Iterable[Union[Mark, MarkDecorator]]) -> List[Mark]:
378-
"""Normalize marker decorating helpers to mark objects.
372+
"""
373+
Normalize an iterable of Mark or MarkDecorator objects into a list of marks
374+
by retrieving the `mark` attribute on MarkDecorator instances.
379375
380-
:type List[Union[Mark, Markdecorator]] mark_list:
381-
:rtype: List[Mark]
376+
:param mark_list: marks to normalize
377+
:returns: A new list of the extracted Mark objects
382378
"""
383-
extracted = [
384-
getattr(mark, "mark", mark) for mark in mark_list
385-
] # unpack MarkDecorator
386-
for mark in extracted:
387-
if not isinstance(mark, Mark):
388-
raise TypeError(f"got {mark!r} instead of Mark")
389-
return [x for x in extracted if isinstance(x, Mark)]
379+
380+
def parse_mark(mark: Union[Mark, MarkDecorator]) -> Mark:
381+
mark_obj = getattr(mark, "mark", mark)
382+
if not isinstance(mark_obj, Mark):
383+
raise TypeError(f"got {repr(mark_obj)} instead of Mark")
384+
return mark_obj
385+
386+
return [parse_mark(x) for x in mark_list]
390387

391388

392389
def store_mark(obj, mark: Mark) -> None:

0 commit comments

Comments
 (0)