registry.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.registry
  4. ~~~~~~~~~~~~~~~
  5. Registry of available tasks.
  6. :copyright: (c) 2009 - 2011 by Ask Solem.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. from __future__ import absolute_import
  10. import inspect
  11. from .exceptions import NotRegistered
  12. class TaskRegistry(dict):
  13. NotRegistered = NotRegistered
  14. def regular(self):
  15. """Get all regular task types."""
  16. return self.filter_types("regular")
  17. def periodic(self):
  18. """Get all periodic task types."""
  19. return self.filter_types("periodic")
  20. def register(self, task):
  21. """Register a task in the task registry.
  22. The task will be automatically instantiated if not already an
  23. instance.
  24. """
  25. self[task.name] = inspect.isclass(task) and task() or task
  26. def unregister(self, name):
  27. """Unregister task by name.
  28. :param name: name of the task to unregister, or a
  29. :class:`celery.task.base.Task` with a valid `name` attribute.
  30. :raises celery.exceptions.NotRegistered: if the task has not
  31. been registered.
  32. """
  33. try:
  34. # Might be a task class
  35. name = name.name
  36. except AttributeError:
  37. pass
  38. self.pop(name)
  39. def filter_types(self, type):
  40. """Return all tasks of a specific type."""
  41. return dict((name, task) for name, task in self.iteritems()
  42. if task.type == type)
  43. def pop(self, key, *args):
  44. try:
  45. return dict.pop(self, key, *args)
  46. except KeyError:
  47. raise self.NotRegistered(key)
  48. #: Global task registry.
  49. tasks = TaskRegistry()
  50. def _unpickle_task(name):
  51. return tasks[name]