Skip to content

Commit 3953186

Browse files
committed
Modernize dataclasses use
Since 3.9 was dropped in 3.9, `slots` is now usable, which means defaults also work, meaning most of the code in the final content dataclasses can be dropped. While at it, enable slots on `Result` and `DefaultedResult` where it was unset, and remove the explicit declaration on `PartialResult`.
1 parent 0188997 commit 3953186

File tree

1 file changed

+23
-65
lines changed

1 file changed

+23
-65
lines changed

src/ua_parser/core.py

Lines changed: 23 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -16,78 +16,37 @@
1616
]
1717

1818

19-
@dataclass(frozen=True)
19+
@dataclass(frozen=True, slots=True)
2020
class UserAgent:
2121
"""Browser ("user agent" aka the software responsible for the request)
2222
information parsed from the user agent string.
2323
"""
2424

25-
__slots__ = ("family", "major", "minor", "patch", "patch_minor")
26-
family: str
27-
major: Optional[str]
28-
minor: Optional[str]
29-
patch: Optional[str]
30-
patch_minor: Optional[str]
31-
32-
def __init__(
33-
self,
34-
family: str = "Other",
35-
major: Optional[str] = None,
36-
minor: Optional[str] = None,
37-
patch: Optional[str] = None,
38-
patch_minor: Optional[str] = None,
39-
) -> None:
40-
object.__setattr__(self, "family", family)
41-
object.__setattr__(self, "major", major)
42-
object.__setattr__(self, "minor", minor)
43-
object.__setattr__(self, "patch", patch)
44-
object.__setattr__(self, "patch_minor", patch_minor)
45-
46-
47-
@dataclass(frozen=True)
25+
family: str = "Other"
26+
major: Optional[str] = None
27+
minor: Optional[str] = None
28+
patch: Optional[str] = None
29+
patch_minor: Optional[str] = None
30+
31+
32+
@dataclass(frozen=True, slots=True)
4833
class OS:
4934
"""OS information parsed from the user agent string."""
5035

51-
__slots__ = ("family", "major", "minor", "patch", "patch_minor")
52-
family: str
53-
major: Optional[str]
54-
minor: Optional[str]
55-
patch: Optional[str]
56-
patch_minor: Optional[str]
57-
58-
def __init__(
59-
self,
60-
family: str = "Other",
61-
major: Optional[str] = None,
62-
minor: Optional[str] = None,
63-
patch: Optional[str] = None,
64-
patch_minor: Optional[str] = None,
65-
) -> None:
66-
object.__setattr__(self, "family", family)
67-
object.__setattr__(self, "major", major)
68-
object.__setattr__(self, "minor", minor)
69-
object.__setattr__(self, "patch", patch)
70-
object.__setattr__(self, "patch_minor", patch_minor)
71-
72-
73-
@dataclass(frozen=True)
36+
family: str = "Other"
37+
major: Optional[str] = None
38+
minor: Optional[str] = None
39+
patch: Optional[str] = None
40+
patch_minor: Optional[str] = None
41+
42+
43+
@dataclass(frozen=True, slots=True)
7444
class Device:
7545
"""Device information parsed from the user agent string."""
7646

77-
__slots__ = ("brand", "family", "model")
78-
family: str
79-
brand: Optional[str]
80-
model: Optional[str]
81-
82-
def __init__(
83-
self,
84-
family: str = "Other",
85-
brand: Optional[str] = None,
86-
model: Optional[str] = None,
87-
) -> None:
88-
object.__setattr__(self, "family", family)
89-
object.__setattr__(self, "brand", brand)
90-
object.__setattr__(self, "model", model)
47+
family: str = "Other"
48+
brand: Optional[str] = None
49+
model: Optional[str] = None
9150

9251

9352
class Domain(Flag):
@@ -105,7 +64,7 @@ class Domain(Flag):
10564
ALL = USER_AGENT | OS | DEVICE
10665

10766

108-
@dataclass(frozen=True)
67+
@dataclass(frozen=True, slots=True)
10968
class DefaultedResult:
11069
"""Variant of :class:`Result` where attributes are set
11170
to a default value if their resolution failed.
@@ -120,7 +79,7 @@ class DefaultedResult:
12079
string: str
12180

12281

123-
@dataclass(frozen=True)
82+
@dataclass(frozen=True, slots=True)
12483
class Result:
12584
"""Complete result.
12685
@@ -152,7 +111,7 @@ def with_defaults(self) -> DefaultedResult:
152111
)
153112

154113

155-
@dataclass(frozen=True)
114+
@dataclass(frozen=True, slots=True)
156115
class PartialResult:
157116
"""Potentially partial (incomplete) result.
158117
@@ -172,7 +131,6 @@ class PartialResult:
172131
173132
"""
174133

175-
__slots__ = ("device", "domains", "os", "string", "user_agent")
176134
domains: Domain
177135
user_agent: Optional[UserAgent]
178136
os: Optional[OS]

0 commit comments

Comments
 (0)