Skip to content

Commit 5fc893f

Browse files
authored
Set frozen, kw_only, slots to dataclasses when possible (#39)
1 parent 00ac534 commit 5fc893f

File tree

6 files changed

+32
-34
lines changed

6 files changed

+32
-34
lines changed

stompman/client.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class MultiHostHostLike(TypedDict):
5454
port: int | None
5555

5656

57-
@dataclass
57+
@dataclass(frozen=True, slots=True)
5858
class ConnectionParameters:
5959
host: str
6060
port: int
@@ -106,9 +106,9 @@ def from_pydantic_multihost_hosts(cls, hosts: list[MultiHostHostLike]) -> list[S
106106
return servers
107107

108108

109-
@dataclass
109+
@dataclass(kw_only=True, slots=True)
110110
class Client:
111-
servers: list[ConnectionParameters]
111+
servers: list[ConnectionParameters] = field(kw_only=False)
112112
heartbeat: Heartbeat = field(default=Heartbeat(1000, 1000))
113113
connect_retry_attempts: int = 3
114114
connect_retry_interval: int = 1
@@ -300,7 +300,7 @@ async def listen(self) -> AsyncIterator["AnyListeningEvent"]:
300300
raise AssertionError(msg, frame)
301301

302302

303-
@dataclass
303+
@dataclass(kw_only=True, slots=True)
304304
class MessageEvent:
305305
body: bytes = field(init=False)
306306
_frame: MessageFrame
@@ -352,7 +352,7 @@ async def with_auto_ack(
352352
await self.ack()
353353

354354

355-
@dataclass
355+
@dataclass(kw_only=True, slots=True)
356356
class ErrorEvent:
357357
message_header: str = field(init=False)
358358
"""Short description of the error."""
@@ -366,7 +366,7 @@ def __post_init__(self) -> None:
366366
self.body = self._frame.body
367367

368368

369-
@dataclass
369+
@dataclass(frozen=True, kw_only=True, slots=True)
370370
class HeartbeatEvent:
371371
_frame: HeartbeatFrame
372372
_client: Client = field(repr=False)

stompman/connection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
FrameType = TypeVar("FrameType", bound=AnyClientFrame | AnyServerFrame)
1313

1414

15-
@dataclass
15+
@dataclass(kw_only=True)
1616
class AbstractConnection(Protocol):
1717
active: bool = True
1818

@@ -24,7 +24,7 @@ async def write_frame(self, frame: AnyClientFrame) -> None: ...
2424
def read_frames(self, max_chunk_size: int, timeout: int) -> AsyncGenerator[AnyServerFrame, None]: ...
2525

2626

27-
@dataclass(kw_only=True)
27+
@dataclass(kw_only=True, slots=True)
2828
class Connection(AbstractConnection):
2929
reader: asyncio.StreamReader
3030
writer: asyncio.StreamWriter

stompman/errors.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,31 @@
77
from stompman.client import ConnectionParameters
88

99

10-
@dataclass
10+
@dataclass(frozen=True, kw_only=True, slots=True)
1111
class Error(Exception):
1212
def __str__(self) -> str:
1313
return self.__repr__()
1414

1515

16-
@dataclass
16+
@dataclass(frozen=True, kw_only=True, slots=True)
1717
class ConnectionConfirmationTimeoutError(Error):
1818
timeout: int
1919
frames: list[MessageFrame | ReceiptFrame | ErrorFrame]
2020

2121

22-
@dataclass
22+
@dataclass(frozen=True, kw_only=True, slots=True)
2323
class UnsupportedProtocolVersionError(Error):
2424
given_version: str
2525
supported_version: str
2626

2727

28-
@dataclass
28+
@dataclass(frozen=True, kw_only=True, slots=True)
2929
class FailedAllConnectAttemptsError(Error):
3030
servers: list["ConnectionParameters"]
3131
retry_attempts: int
3232
retry_interval: int
3333
timeout: int
3434

3535

36-
@dataclass
36+
@dataclass(frozen=True, kw_only=True, slots=True)
3737
class ConnectionLostError(Error): ...

stompman/frames.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -120,85 +120,85 @@
120120
)
121121

122122

123-
@dataclass
123+
@dataclass(frozen=True, kw_only=True, slots=True)
124124
class ConnectFrame:
125125
headers: ConnectHeaders
126126

127127

128-
@dataclass
128+
@dataclass(frozen=True, kw_only=True, slots=True)
129129
class StompFrame:
130130
headers: ConnectHeaders
131131

132132

133-
@dataclass
133+
@dataclass(frozen=True, kw_only=True, slots=True)
134134
class ConnectedFrame:
135135
headers: ConnectedHeaders
136136

137137

138-
@dataclass
138+
@dataclass(frozen=True, kw_only=True, slots=True)
139139
class SendFrame:
140140
headers: SendHeaders
141141
body: bytes = b""
142142

143143

144-
@dataclass
144+
@dataclass(frozen=True, kw_only=True, slots=True)
145145
class SubscribeFrame:
146146
headers: SubscribeHeaders
147147

148148

149-
@dataclass
149+
@dataclass(frozen=True, kw_only=True, slots=True)
150150
class UnsubscribeFrame:
151151
headers: UnsubscribeHeaders
152152

153153

154-
@dataclass
154+
@dataclass(frozen=True, kw_only=True, slots=True)
155155
class AckFrame:
156156
headers: AckHeaders
157157

158158

159-
@dataclass
159+
@dataclass(frozen=True, kw_only=True, slots=True)
160160
class NackFrame:
161161
headers: NackHeaders
162162

163163

164-
@dataclass
164+
@dataclass(frozen=True, kw_only=True, slots=True)
165165
class BeginFrame:
166166
headers: BeginHeaders
167167

168168

169-
@dataclass
169+
@dataclass(frozen=True, kw_only=True, slots=True)
170170
class CommitFrame:
171171
headers: CommitHeaders
172172

173173

174-
@dataclass
174+
@dataclass(frozen=True, kw_only=True, slots=True)
175175
class AbortFrame:
176176
headers: AbortHeaders
177177

178178

179-
@dataclass
179+
@dataclass(frozen=True, kw_only=True, slots=True)
180180
class DisconnectFrame:
181181
headers: DisconnectHeaders
182182

183183

184-
@dataclass
184+
@dataclass(frozen=True, kw_only=True, slots=True)
185185
class ReceiptFrame:
186186
headers: ReceiptHeaders
187187

188188

189-
@dataclass
189+
@dataclass(frozen=True, kw_only=True, slots=True)
190190
class MessageFrame:
191191
headers: MessageHeaders
192192
body: bytes
193193

194194

195-
@dataclass
195+
@dataclass(frozen=True, kw_only=True, slots=True)
196196
class ErrorFrame:
197197
headers: ErrorHeaders
198198
body: bytes = b""
199199

200200

201-
@dataclass
201+
@dataclass(frozen=True, kw_only=True, slots=True)
202202
class HeartbeatFrame: ...
203203

204204

stompman/serde.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def parse_lines_into_frame(lines: deque[bytearray]) -> AnyClientFrame | AnyServe
156156
return make_frame_from_parts(command=command, headers=headers, body=body)
157157

158158

159-
@dataclass
159+
@dataclass(kw_only=True, slots=True)
160160
class FrameParser:
161161
_lines: deque[bytearray] = field(default_factory=deque, init=False)
162162
_current_line: bytearray = field(default_factory=bytearray, init=False)

tests/test_client.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
pytestmark = pytest.mark.anyio
4242

4343

44-
@dataclass
4544
class BaseMockConnection(AbstractConnection):
4645
@classmethod
4746
async def connect(cls, host: str, port: int, timeout: int) -> Self | None:
@@ -61,7 +60,6 @@ async def read_frames(
6160
def create_spying_connection(
6261
read_frames_yields: list[list[AnyServerFrame]],
6362
) -> tuple[type[AbstractConnection], list[AnyClientFrame | AnyServerFrame | HeartbeatFrame]]:
64-
@dataclass
6563
class BaseCollectingConnection(BaseMockConnection):
6664
@staticmethod
6765
async def write_frame(frame: AnyClientFrame) -> None:
@@ -93,10 +91,10 @@ def assert_frames_between_lifespan_match(
9391
assert collected_frames[2:-2] == expected_frames
9492

9593

96-
@dataclass
94+
@dataclass(kw_only=True, slots=True)
9795
class EnrichedClient(Client):
9896
servers: list[ConnectionParameters] = field(
99-
default_factory=lambda: [ConnectionParameters("localhost", 12345, "login", "passcode")]
97+
default_factory=lambda: [ConnectionParameters("localhost", 12345, "login", "passcode")], kw_only=False
10098
)
10199

102100

0 commit comments

Comments
 (0)