Skip to content

Commit a10e93a

Browse files
committed
Use dataclass instead of attrs, one less dependency.
Unfortunately, we can't get rid of Step.__init__
1 parent 163a015 commit a10e93a

File tree

1 file changed

+36
-28
lines changed

1 file changed

+36
-28
lines changed

pytest_bdd/parser.py

+36-28
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
import textwrap
66
import typing
77
from collections import OrderedDict
8+
from dataclasses import dataclass, field
89
from typing import cast
910

10-
from attrs import define, field # add attrs dep
11-
1211
from . import exceptions, types
1312

1413
if typing.TYPE_CHECKING:
@@ -183,7 +182,7 @@ def parse_feature(basedir: str, filename: str, encoding: str = "utf-8") -> Featu
183182
return feature
184183

185184

186-
@define
185+
@dataclass
187186
class Feature:
188187
"""Feature."""
189188

@@ -197,7 +196,7 @@ class Feature:
197196
description: str
198197

199198

200-
@define
199+
@dataclass
201200
class ScenarioTemplate:
202201
"""A scenario template.
203202
@@ -206,15 +205,15 @@ class ScenarioTemplate:
206205
feature: Feature
207206
name: str
208207
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()
218217

219218
def add_step(self, step: Step) -> None:
220219
"""Add step to the scenario.
@@ -243,21 +242,22 @@ def render(self, context: Mapping[str, Any]) -> Scenario:
243242
return Scenario(feature=self.feature, name=self.name, line_number=self.line_number, steps=steps, tags=self.tags)
244243

245244

246-
@define
245+
@dataclass
247246
class Scenario:
248247
"""Scenario."""
249248

250249
feature: Feature
251250
name: str
252251
line_number: int
253252
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()
258258

259259

260-
@define(eq=True)
260+
@dataclass
261261
class Step:
262262
type: str
263263
_name: str
@@ -267,7 +267,18 @@ class Step:
267267
failed: bool = field(init=False, default=False)
268268
scenario: ScenarioTemplate | None = field(init=False, default=None)
269269
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 = []
271282

272283
def add_line(self, line: str) -> None:
273284
"""Add line to the multiple step.
@@ -301,9 +312,6 @@ def __str__(self) -> str:
301312
"""Full step name including the type."""
302313
return f'{self.type.capitalize()} "{self.name}"'
303314

304-
# def __repr__(self) -> str:
305-
# return f"Step <{self.type.capitalize()} {self.name} [{self.line_number}:{self.indent}]>"
306-
307315
@property
308316
def params(self) -> tuple[str, ...]:
309317
"""Get step params."""
@@ -317,24 +325,24 @@ def replacer(m: Match):
317325
return STEP_PARAM_RE.sub(replacer, self.name)
318326

319327

320-
@define
328+
@dataclass
321329
class Background:
322330
feature: Feature
323331
line_number: int
324-
steps: list[Step] = field(factory=list)
332+
steps: list[Step] = field(init=False, default_factory=list)
325333

326334
def add_step(self, step: Step) -> None:
327335
"""Add step to the background."""
328336
step.background = self
329337
self.steps.append(step)
330338

331339

332-
@define
340+
@dataclass
333341
class Examples:
334342
"""Example table."""
335343

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)
338346
line_number: int | None = field(default=None)
339347
name: str | None = field(default=None)
340348

0 commit comments

Comments
 (0)