ソースを参照

Ensure task has name prior to registration. Resolves issue #3615. (#3616)

Rick Wargo 8 年 前
コミット
b535e3a584
2 ファイル変更10 行追加2 行削除
  1. 4 2
      celery/app/registry.py
  2. 6 0
      t/unit/app/test_registry.py

+ 4 - 2
celery/app/registry.py

@@ -4,7 +4,7 @@ from __future__ import absolute_import, unicode_literals
 import inspect
 from importlib import import_module
 from celery._state import get_current_app
-from celery.exceptions import NotRegistered
+from celery.exceptions import NotRegistered, InvalidTaskError
 from celery.five import items
 
 __all__ = ['TaskRegistry']
@@ -22,8 +22,10 @@ class TaskRegistry(dict):
         """Register a task in the task registry.
 
         The task will be automatically instantiated if not already an
-        instance.
+        instance. Name must be configured prior to registration.
         """
+        if task.name is None:
+            raise InvalidTaskError('Task "class {0}" must specify name'.format(task.__class__.__name__))
         self[task.name] = inspect.isclass(task) and task() or task
 
     def unregister(self, name):

+ 6 - 0
t/unit/app/test_registry.py

@@ -1,6 +1,7 @@
 from __future__ import absolute_import, unicode_literals
 import pytest
 from celery.app.registry import _unpickle_task, _unpickle_task_v2
+from celery.exceptions import InvalidTaskError
 
 
 def returns():
@@ -24,6 +25,8 @@ class test_TaskRegistry:
 
     def setup(self):
         self.mytask = self.app.task(name='A', shared=False)(returns)
+        self.missing_name_task = self.app.task(name=None, shared=False)(returns)
+        self.missing_name_task.name = None  # name is overridden with path
         self.myperiodic = self.app.task(
             name='B', shared=False, type='periodic',
         )(returns)
@@ -45,6 +48,9 @@ class test_TaskRegistry:
         self.assert_register_unregister_cls(r, self.mytask)
         self.assert_register_unregister_cls(r, self.myperiodic)
 
+        with pytest.raises(InvalidTaskError):
+            r.register(self.missing_name_task)
+
         r.register(self.myperiodic)
         r.unregister(self.myperiodic.name)
         assert self.myperiodic not in r