Skip to content

Commit 78ff480

Browse files
authored
fix: subclass naming conflict in __init_subclass__ for TaskPoller and… (#242)
1 parent 6c2d1c0 commit 78ff480

5 files changed

Lines changed: 28 additions & 5 deletions

File tree

sdks/blue-krill/CHANGE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
## Change logs
22

3+
### 2.1.4
4+
5+
- Fix: `TaskPoller.__init_subclass__``CallbackHandler.__init_subclass__` 中同名子类注册覆盖的问题
6+
37
### 2.1.3
48

59
- Fix: EncryptField 无法正常处理以特殊 header 文本开头的内容

sdks/blue-krill/blue_krill/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@
1515
# We undertake not to change the open source license (MIT license) applicable
1616
# to the current version of the project delivered to anyone in the future.
1717

18-
__version__ = "2.1.3"
18+
__version__ = "2.1.4"

sdks/blue-krill/blue_krill/async_utils/poll_task.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ def __init__(self, params: Dict, metadata: PollingMetadata):
9191
self.metadata = metadata
9292

9393
def __init_subclass__(cls, *args, **kwargs):
94+
if cls.__name__ in cls._registered_pollers:
95+
raise TypeError(
96+
f"A TaskPoller subclass named '{cls.__name__}' is already registered. Poller names must be unique."
97+
)
9498
cls._registered_pollers[cls.__name__] = cls
9599

96100
@classmethod
@@ -204,6 +208,10 @@ class CallbackHandler(ABC):
204208
_registered_handlers: Dict[str, Type["CallbackHandler"]] = {}
205209

206210
def __init_subclass__(cls, *args, **kwargs):
211+
if cls.__name__ in cls._registered_handlers:
212+
raise TypeError(
213+
f"A CallbackHandler subclass named '{cls.__name__}' is already registered. Handler names must be unique."
214+
)
207215
cls._registered_handlers[cls.__name__] = cls
208216

209217
@classmethod

sdks/blue-krill/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ name = "blue-krill"
99
description = "Tools and common packages for blueking PaaS platform."
1010
requires-python = ">=3.9,<3.12"
1111
license = "MIT"
12-
version = "2.1.3"
12+
version = "2.1.4"
1313
# classifieres is dynamic because we want to create Python classifiers automatically
1414
dynamic = ["classifiers"]
1515
readme = "README.md"

sdks/blue-krill/tests/async_utils/test_poll_task.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ class TimeoutedPoller(BasePoller):
9999
def query(self) -> PollingResult:
100100
return PollingResult.done(data={"foo": "bar"})
101101

102+
@classmethod
103+
def unregister(cls):
104+
del cls._registered_pollers[cls.__name__]
105+
102106
class TimeoutedHandler(CallbackHandler):
103107
result = None
104108
poller = None
@@ -107,6 +111,10 @@ def handle(self, result, poller):
107111
TimeoutedHandler.result = result
108112
TimeoutedHandler.poller = poller
109113

114+
@classmethod
115+
def unregister(cls):
116+
del cls._registered_handlers[cls.__name__]
117+
110118
metadata = PollingMetadata(retries=0, query_started_at=time.time(), queried_count=0)
111119
scheduler = PollTaskScheduler(TimeoutedPoller({"param": 1}, metadata), TimeoutedHandler)
112120
next_metadata = scheduler.run()
@@ -120,6 +128,9 @@ def handle(self, result, poller):
120128
assert TimeoutedHandler.poller
121129
assert TimeoutedHandler.poller.params == {"param": 1}
122130

131+
TimeoutedPoller.unregister()
132+
TimeoutedHandler.unregister()
133+
123134
def test_exception(self):
124135
class ExceptionPoller(BasePoller):
125136
def query(self) -> PollingResult: # type: ignore
@@ -171,12 +182,12 @@ def handle(self, result, poller):
171182

172183
class TestTaskPoller:
173184
def test_continue(self):
174-
class DoingPoller(BasePoller):
185+
class DoingTaskPoller(BasePoller):
175186
def query(self) -> PollingResult:
176187
return PollingResult.doing()
177188

178-
DoingPoller.start({}, NullResultHandler)
179-
assert DoingPoller.get_async_task().subtask().apply_async.called
189+
DoingTaskPoller.start({}, NullResultHandler)
190+
assert DoingTaskPoller.get_async_task().subtask().apply_async.called
180191

181192
def test_no_continue(self):
182193
class DonePoller(BasePoller):

0 commit comments

Comments
 (0)