Skip to content

Commit 7d615d4

Browse files
author
Pau Figueras
committed
refactor: class attribute and instance attribute
Make the class attribute immutable using a `MappingProxyType`, as suggested, and mask it a mutable instance class.
1 parent 1066a03 commit 7d615d4

1 file changed

Lines changed: 79 additions & 67 deletions

File tree

src/paho/mqtt/reasoncodes.py

Lines changed: 79 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import functools
1818
import warnings
19+
from types import MappingProxyType
1920
from typing import Any
2021

2122
from .packettypes import PacketTypes
@@ -30,70 +31,80 @@ class ReasonCode:
3031
3132
"""
3233

33-
names = {
34-
0: {
35-
"Success": [PacketTypes.CONNACK, PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.PUBREL, PacketTypes.PUBCOMP, PacketTypes.UNSUBACK, PacketTypes.AUTH],
36-
"Normal disconnection": [PacketTypes.DISCONNECT],
37-
"Granted QoS 0": [PacketTypes.SUBACK],
38-
},
39-
1: {"Granted QoS 1": [PacketTypes.SUBACK]},
40-
2: {"Granted QoS 2": [PacketTypes.SUBACK]},
41-
4: {"Disconnect with will message": [PacketTypes.DISCONNECT]},
42-
16: {"No matching subscribers": [PacketTypes.PUBACK, PacketTypes.PUBREC]},
43-
17: {"No subscription found": [PacketTypes.UNSUBACK]},
44-
24: {"Continue authentication": [PacketTypes.AUTH]},
45-
25: {"Re-authenticate": [PacketTypes.AUTH]},
46-
128: {
47-
"Unspecified error": [PacketTypes.CONNACK, PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.SUBACK, PacketTypes.UNSUBACK, PacketTypes.DISCONNECT],
48-
},
49-
129: {"Malformed packet": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
50-
130: {"Protocol error": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
51-
131: {
52-
"Implementation specific error": [
53-
PacketTypes.CONNACK,
54-
PacketTypes.PUBACK,
55-
PacketTypes.PUBREC,
56-
PacketTypes.SUBACK,
57-
PacketTypes.UNSUBACK,
58-
PacketTypes.DISCONNECT,
59-
],
60-
},
61-
132: {"Unsupported protocol version": [PacketTypes.CONNACK]},
62-
133: {"Client identifier not valid": [PacketTypes.CONNACK]},
63-
134: {"Bad user name or password": [PacketTypes.CONNACK]},
64-
135: {
65-
"Not authorized": [PacketTypes.CONNACK, PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.SUBACK, PacketTypes.UNSUBACK, PacketTypes.DISCONNECT],
66-
},
67-
136: {"Server unavailable": [PacketTypes.CONNACK]},
68-
137: {"Server busy": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
69-
138: {"Banned": [PacketTypes.CONNACK]},
70-
139: {"Server shutting down": [PacketTypes.DISCONNECT]},
71-
140: {"Bad authentication method": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
72-
141: {"Keep alive timeout": [PacketTypes.DISCONNECT]},
73-
142: {"Session taken over": [PacketTypes.DISCONNECT]},
74-
143: {"Topic filter invalid": [PacketTypes.SUBACK, PacketTypes.UNSUBACK, PacketTypes.DISCONNECT]},
75-
144: {"Topic name invalid": [PacketTypes.CONNACK, PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.DISCONNECT]},
76-
145: {"Packet identifier in use": [PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.SUBACK, PacketTypes.UNSUBACK]},
77-
146: {"Packet identifier not found": [PacketTypes.PUBREL, PacketTypes.PUBCOMP]},
78-
147: {"Receive maximum exceeded": [PacketTypes.DISCONNECT]},
79-
148: {"Topic alias invalid": [PacketTypes.DISCONNECT]},
80-
149: {"Packet too large": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
81-
150: {"Message rate too high": [PacketTypes.DISCONNECT]},
82-
151: {
83-
"Quota exceeded": [PacketTypes.CONNACK, PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.SUBACK, PacketTypes.DISCONNECT],
84-
},
85-
152: {"Administrative action": [PacketTypes.DISCONNECT]},
86-
153: {"Payload format invalid": [PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.DISCONNECT]},
87-
154: {"Retain not supported": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
88-
155: {"QoS not supported": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
89-
156: {"Use another server": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
90-
157: {"Server moved": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
91-
158: {"Shared subscription not supported": [PacketTypes.SUBACK, PacketTypes.DISCONNECT]},
92-
159: {"Connection rate exceeded": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
93-
160: {"Maximum connect time": [PacketTypes.DISCONNECT]},
94-
161: {"Subscription identifiers not supported": [PacketTypes.SUBACK, PacketTypes.DISCONNECT]},
95-
162: {"Wildcard subscription not supported": [PacketTypes.SUBACK, PacketTypes.DISCONNECT]},
96-
}
34+
names = MappingProxyType(
35+
{
36+
0: {
37+
"Success": [
38+
PacketTypes.CONNACK,
39+
PacketTypes.PUBACK,
40+
PacketTypes.PUBREC,
41+
PacketTypes.PUBREL,
42+
PacketTypes.PUBCOMP,
43+
PacketTypes.UNSUBACK,
44+
PacketTypes.AUTH,
45+
],
46+
"Normal disconnection": [PacketTypes.DISCONNECT],
47+
"Granted QoS 0": [PacketTypes.SUBACK],
48+
},
49+
1: {"Granted QoS 1": [PacketTypes.SUBACK]},
50+
2: {"Granted QoS 2": [PacketTypes.SUBACK]},
51+
4: {"Disconnect with will message": [PacketTypes.DISCONNECT]},
52+
16: {"No matching subscribers": [PacketTypes.PUBACK, PacketTypes.PUBREC]},
53+
17: {"No subscription found": [PacketTypes.UNSUBACK]},
54+
24: {"Continue authentication": [PacketTypes.AUTH]},
55+
25: {"Re-authenticate": [PacketTypes.AUTH]},
56+
128: {
57+
"Unspecified error": [PacketTypes.CONNACK, PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.SUBACK, PacketTypes.UNSUBACK, PacketTypes.DISCONNECT],
58+
},
59+
129: {"Malformed packet": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
60+
130: {"Protocol error": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
61+
131: {
62+
"Implementation specific error": [
63+
PacketTypes.CONNACK,
64+
PacketTypes.PUBACK,
65+
PacketTypes.PUBREC,
66+
PacketTypes.SUBACK,
67+
PacketTypes.UNSUBACK,
68+
PacketTypes.DISCONNECT,
69+
],
70+
},
71+
132: {"Unsupported protocol version": [PacketTypes.CONNACK]},
72+
133: {"Client identifier not valid": [PacketTypes.CONNACK]},
73+
134: {"Bad user name or password": [PacketTypes.CONNACK]},
74+
135: {
75+
"Not authorized": [PacketTypes.CONNACK, PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.SUBACK, PacketTypes.UNSUBACK, PacketTypes.DISCONNECT],
76+
},
77+
136: {"Server unavailable": [PacketTypes.CONNACK]},
78+
137: {"Server busy": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
79+
138: {"Banned": [PacketTypes.CONNACK]},
80+
139: {"Server shutting down": [PacketTypes.DISCONNECT]},
81+
140: {"Bad authentication method": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
82+
141: {"Keep alive timeout": [PacketTypes.DISCONNECT]},
83+
142: {"Session taken over": [PacketTypes.DISCONNECT]},
84+
143: {"Topic filter invalid": [PacketTypes.SUBACK, PacketTypes.UNSUBACK, PacketTypes.DISCONNECT]},
85+
144: {"Topic name invalid": [PacketTypes.CONNACK, PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.DISCONNECT]},
86+
145: {"Packet identifier in use": [PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.SUBACK, PacketTypes.UNSUBACK]},
87+
146: {"Packet identifier not found": [PacketTypes.PUBREL, PacketTypes.PUBCOMP]},
88+
147: {"Receive maximum exceeded": [PacketTypes.DISCONNECT]},
89+
148: {"Topic alias invalid": [PacketTypes.DISCONNECT]},
90+
149: {"Packet too large": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
91+
150: {"Message rate too high": [PacketTypes.DISCONNECT]},
92+
151: {
93+
"Quota exceeded": [PacketTypes.CONNACK, PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.SUBACK, PacketTypes.DISCONNECT],
94+
},
95+
152: {"Administrative action": [PacketTypes.DISCONNECT]},
96+
153: {"Payload format invalid": [PacketTypes.PUBACK, PacketTypes.PUBREC, PacketTypes.DISCONNECT]},
97+
154: {"Retain not supported": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
98+
155: {"QoS not supported": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
99+
156: {"Use another server": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
100+
157: {"Server moved": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
101+
158: {"Shared subscription not supported": [PacketTypes.SUBACK, PacketTypes.DISCONNECT]},
102+
159: {"Connection rate exceeded": [PacketTypes.CONNACK, PacketTypes.DISCONNECT]},
103+
160: {"Maximum connect time": [PacketTypes.DISCONNECT]},
104+
161: {"Subscription identifiers not supported": [PacketTypes.SUBACK, PacketTypes.DISCONNECT]},
105+
162: {"Wildcard subscription not supported": [PacketTypes.SUBACK, PacketTypes.DISCONNECT]},
106+
}
107+
)
97108

98109
def __init__(self, packetType: int, aName: str = "Success", identifier: int = -1):
99110
"""
@@ -108,6 +119,7 @@ def __init__(self, packetType: int, aName: str = "Success", identifier: int = -1
108119
109120
"""
110121

122+
self.names = dict(type(self).names)
111123
self.packetType = packetType
112124
if identifier == -1:
113125
if packetType == PacketTypes.DISCONNECT and aName == "Success":
@@ -156,8 +168,7 @@ def unpack(self, buffer):
156168
return 1
157169

158170
def getName(self):
159-
"""Returns the reason code name corresponding to the numeric value which is set.
160-
"""
171+
"""Returns the reason code name corresponding to the numeric value which is set."""
161172
return self.__getName__(self.packetType, self.value)
162173

163174
def __eq__(self, other):
@@ -205,7 +216,8 @@ def __instancecheck__(self, other: Any) -> bool:
205216

206217
class ReasonCodes(ReasonCode, metaclass=_CompatibilityIsInstance):
207218
def __init__(self, *args, **kwargs):
208-
warnings.warn("ReasonCodes is deprecated, use ReasonCode (singular) instead",
219+
warnings.warn(
220+
"ReasonCodes is deprecated, use ReasonCode (singular) instead",
209221
category=DeprecationWarning,
210222
stacklevel=2,
211223
)

0 commit comments

Comments
 (0)