8
8
from contextlib import contextmanager
9
9
from contextlib import ExitStack
10
10
from contextlib import nullcontext
11
+ import dataclasses
11
12
import sys
12
13
import time
13
14
from typing import Any
14
15
from typing import TYPE_CHECKING
15
16
from unittest import TestCase
16
17
17
- import attr
18
18
import pluggy
19
19
20
20
from _pytest ._code import ExceptionInfo
@@ -58,15 +58,15 @@ def pytest_addoption(parser: Parser) -> None:
58
58
)
59
59
60
60
61
- @attr . s
61
+ @dataclasses . dataclass
62
62
class SubTestContext :
63
- msg : str | None = attr . ib ()
64
- kwargs : dict [str , Any ] = attr . ib ()
63
+ msg : str | None
64
+ kwargs : dict [str , Any ]
65
65
66
66
67
- @attr . s (init = False )
67
+ @dataclasses . dataclass (init = False )
68
68
class SubTestReport (TestReport ): # type: ignore[misc]
69
- context : SubTestContext = attr . ib ()
69
+ context : SubTestContext
70
70
71
71
@property
72
72
def head_line (self ) -> str :
@@ -88,7 +88,7 @@ def _to_json(self) -> dict[str, Any]:
88
88
data = super ()._to_json ()
89
89
del data ["context" ]
90
90
data ["_report_type" ] = "SubTestReport"
91
- data ["_subtest.context" ] = attr .asdict (self .context )
91
+ data ["_subtest.context" ] = dataclasses .asdict (self .context )
92
92
return data
93
93
94
94
@classmethod
@@ -232,11 +232,11 @@ def subtests(request: SubRequest) -> Generator[SubTests, None, None]:
232
232
yield SubTests (request .node .ihook , suspend_capture_ctx , request )
233
233
234
234
235
- @attr . s
235
+ @dataclasses . dataclass
236
236
class SubTests :
237
- ihook : pluggy .HookRelay = attr . ib ()
238
- suspend_capture_ctx : Callable [[], AbstractContextManager [None ]] = attr . ib ()
239
- request : SubRequest = attr . ib ()
237
+ ihook : pluggy .HookRelay
238
+ suspend_capture_ctx : Callable [[], AbstractContextManager [None ]]
239
+ request : SubRequest
240
240
241
241
@property
242
242
def item (self ) -> Any :
@@ -267,7 +267,7 @@ def test(
267
267
)
268
268
269
269
270
- @attr . s ( auto_attribs = True )
270
+ @dataclasses . dataclass
271
271
class _SubTestContextManager :
272
272
"""
273
273
Context manager for subtests, capturing exceptions raised inside the subtest scope and handling
@@ -423,10 +423,10 @@ def ignore_pytest_private_warning() -> Generator[None, None, None]:
423
423
yield
424
424
425
425
426
- @attr . s
426
+ @dataclasses . dataclass ()
427
427
class Captured :
428
- out = attr . ib ( default = "" , type = str )
429
- err = attr . ib ( default = "" , type = str )
428
+ out : str = ""
429
+ err : str = ""
430
430
431
431
def update_report (self , report : TestReport ) -> None :
432
432
if self .out :
0 commit comments