def bind(cls, app): was_bound, cls.__bound__ = cls.__bound__, True cls._app = app conf = app.conf cls._exec_options = None # clear option cache if cls.typing is None: cls.typing = app.strict_typing for attr_name, config_name in cls.from_config: if getattr(cls, attr_name, None) is None: setattr(cls, attr_name, conf[config_name]) # decorate with annotations from config. if not was_bound: cls.annotate() from celery.utils.threads import LocalStack cls.request_stack = LocalStack() # PeriodicTask uses this to add itself to the PeriodicTask schedule. cls.on_bound(app) return app
def bind(self, app): was_bound, self.__bound__ = self.__bound__, True self._app = app conf = app.conf self._exec_options = None # clear option cache for attr_name, config_name in self.from_config: if getattr(self, attr_name, None) is None: setattr(self, attr_name, conf[config_name]) if self.accept_magic_kwargs is None: self.accept_magic_kwargs = app.accept_magic_kwargs self.backend = app.backend # decorate with annotations from config. if not was_bound: self.annotate() from celery.utils.threads import LocalStack self.request_stack = LocalStack() # PeriodicTask uses this to add itself to the PeriodicTask schedule. self.on_bound(app) return app
#: Global default app used when no current app. default_app = None #: List of all app instances (weakrefs), must not be used directly. _apps = set() class _TLS(threading.local): #: Apps with the :attr:`~celery.app.base.BaseApp.set_as_current` attribute #: sets this, so it will always contain the last instantiated app, #: and is the default app returned by :func:`app_or_default`. current_app = None _tls = _TLS() _task_stack = LocalStack() def set_default_app(app): global default_app default_app = app def _get_current_app(): if default_app is None: #: creates the global fallback app instance. from celery.app import Celery set_default_app(Celery( 'default', loader=os.environ.get('CELERY_LOADER') or 'default', set_as_current=False, accept_magic_kwargs=True,
def test_instantiation(self): from celery.utils.threads import LocalStack with self.subTest("Name can't end with _orig"): # noinspection PyAbstractClass class TestTask(FireXTask): name = self.__module__ + "." + self.__class__.__name__ + "." \ + f"TestClass{REPLACEMENT_TASK_NAME_POSTFIX}" with self.assertRaises(IllegalTaskNameException): test_obj = TestTask() with self.subTest("Without overrides"): # Make sure you can instantiate without the need for the pre and post overrides # noinspection PyAbstractClass class TestTask(FireXTask): name = self.__module__ + "." + self.__class__.__name__ + "." + "TestClass" def run(self): pass test_obj = TestTask() self.assertIsNotNone(test_obj, "Task object not instantiated") self.assertTrue(callable(test_obj.undecorated)) test_obj.request_stack = LocalStack() # simulate binding test_obj() with self.subTest("With overrides"): # create a class using the override class TestTask(FireXTask): ran = False pre_ran = False post_ran = False name = self.__module__ + "." + self.__class__.__name__ + "." + "TestClass" def pre_task_run(self): TestTask.pre_ran = True def run(self): TestTask.ran = True def post_task_run(self, results): TestTask.post_ran = True test_obj = TestTask() self.assertIsNotNone(test_obj, "Task object not instantiated") self.assertTrue(callable(test_obj.undecorated)) test_obj.request_stack = LocalStack() # simulate binding test_obj() self.assertTrue(TestTask.pre_ran, "pre_task_run() was not called") self.assertTrue(TestTask.ran, "run() was not called") self.assertTrue(TestTask.post_ran, "post_task_run() was not called") with self.subTest("Must have Run"): # noinspection PyAbstractClass class TestTask(FireXTask): name = self.__module__ + "." + self.__class__.__name__ + "." + "TestClass" test_obj = TestTask() test_obj.request_stack = LocalStack() # simulate binding with self.assertRaises(NotImplementedError): test_obj()