5
5
import textwrap
6
6
import typing
7
7
from collections import OrderedDict
8
+ from dataclasses import dataclass , field
8
9
from typing import cast
9
10
10
- from attrs import define , field # add attrs dep
11
-
12
11
from . import exceptions , types
13
12
14
13
if typing .TYPE_CHECKING :
@@ -183,7 +182,7 @@ def parse_feature(basedir: str, filename: str, encoding: str = "utf-8") -> Featu
183
182
return feature
184
183
185
184
186
- @define
185
+ @dataclass
187
186
class Feature :
188
187
"""Feature."""
189
188
@@ -197,7 +196,7 @@ class Feature:
197
196
description : str
198
197
199
198
200
- @define
199
+ @dataclass
201
200
class ScenarioTemplate :
202
201
"""A scenario template.
203
202
@@ -206,15 +205,15 @@ class ScenarioTemplate:
206
205
feature : Feature
207
206
name : str
208
207
line_number : int
209
- tags : set [str ] = field (
210
- factory = set ,
211
- converter = lambda v : v if v is not None else set (),
212
- )
213
- examples : Examples | None = field (
214
- factory = lambda : Examples (),
215
- converter = lambda v : v if v is not None else Examples (),
216
- )
217
- _steps : list [ Step ] = field ( factory = list )
208
+ tags : set [str ] = field (default_factory = set )
209
+ examples : Examples | None = field ( default_factory = lambda : Examples ())
210
+ _steps : list [ Step ] = field ( init = False , default_factory = list )
211
+
212
+ def __post_init__ ( self ):
213
+ if self . examples is None :
214
+ self . examples = Examples ()
215
+ if self . tags is None :
216
+ self . tags = set ( )
218
217
219
218
def add_step (self , step : Step ) -> None :
220
219
"""Add step to the scenario.
@@ -243,21 +242,22 @@ def render(self, context: Mapping[str, Any]) -> Scenario:
243
242
return Scenario (feature = self .feature , name = self .name , line_number = self .line_number , steps = steps , tags = self .tags )
244
243
245
244
246
- @define
245
+ @dataclass
247
246
class Scenario :
248
247
"""Scenario."""
249
248
250
249
feature : Feature
251
250
name : str
252
251
line_number : int
253
252
steps : list [Step ]
254
- tags : set [str ] = field (
255
- factory = set ,
256
- converter = lambda v : v if v is not None else set (),
257
- )
253
+ tags : set [str ] = field (default_factory = set )
254
+
255
+ def __post_init__ (self ):
256
+ if self .tags is None :
257
+ self .tags = set ()
258
258
259
259
260
- @define ( eq = True )
260
+ @dataclass
261
261
class Step :
262
262
type : str
263
263
_name : str
@@ -267,7 +267,18 @@ class Step:
267
267
failed : bool = field (init = False , default = False )
268
268
scenario : ScenarioTemplate | None = field (init = False , default = None )
269
269
background : Background | None = field (init = False , default = None )
270
- lines : list [str ] = field (init = False , factory = list )
270
+ lines : list [str ] = field (init = False , default_factory = list )
271
+
272
+ def __init__ (self , type : str , name : str , line_number : int , indent : int , keyword : str ):
273
+ self .type = type
274
+ self .name = name
275
+ self .line_number = line_number
276
+ self .indent = indent
277
+ self .keyword = keyword
278
+ self .failed = False
279
+ self .scenario = None
280
+ self .background = None
281
+ self .lines = []
271
282
272
283
def add_line (self , line : str ) -> None :
273
284
"""Add line to the multiple step.
@@ -301,9 +312,6 @@ def __str__(self) -> str:
301
312
"""Full step name including the type."""
302
313
return f'{ self .type .capitalize ()} "{ self .name } "'
303
314
304
- # def __repr__(self) -> str:
305
- # return f"Step <{self.type.capitalize()} {self.name} [{self.line_number}:{self.indent}]>"
306
-
307
315
@property
308
316
def params (self ) -> tuple [str , ...]:
309
317
"""Get step params."""
@@ -317,24 +325,24 @@ def replacer(m: Match):
317
325
return STEP_PARAM_RE .sub (replacer , self .name )
318
326
319
327
320
- @define
328
+ @dataclass
321
329
class Background :
322
330
feature : Feature
323
331
line_number : int
324
- steps : list [Step ] = field (factory = list )
332
+ steps : list [Step ] = field (init = False , default_factory = list )
325
333
326
334
def add_step (self , step : Step ) -> None :
327
335
"""Add step to the background."""
328
336
step .background = self
329
337
self .steps .append (step )
330
338
331
339
332
- @define
340
+ @dataclass
333
341
class Examples :
334
342
"""Example table."""
335
343
336
- example_params : list [str ] = field (factory = list )
337
- examples : list [Sequence [str ]] = field (factory = list )
344
+ example_params : list [str ] = field (default_factory = list )
345
+ examples : list [Sequence [str ]] = field (default_factory = list )
338
346
line_number : int | None = field (default = None )
339
347
name : str | None = field (default = None )
340
348
0 commit comments