|  | @@ -7,6 +7,7 @@ import itertools
 | 
	
		
			
				|  |  |  from copy import deepcopy
 | 
	
		
			
				|  |  |  from pickle import loads, dumps
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +from amqp import promise
 | 
	
		
			
				|  |  |  from kombu import Exchange
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from celery import shared_task, current_app
 | 
	
	
		
			
				|  | @@ -46,6 +47,14 @@ object_config = ObjectConfig()
 | 
	
		
			
				|  |  |  dict_config = dict(FOO=10, BAR=20)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +class ObjectConfig2(object):
 | 
	
		
			
				|  |  | +    LEAVE_FOR_WORK = True
 | 
	
		
			
				|  |  | +    MOMENT_TO_STOP = True
 | 
	
		
			
				|  |  | +    CALL_ME_BACK = 123456789
 | 
	
		
			
				|  |  | +    WANT_ME_TO = False
 | 
	
		
			
				|  |  | +    UNDERSTAND_ME = True
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  class Object(object):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def __init__(self, **kwargs):
 | 
	
	
		
			
				|  | @@ -156,20 +165,38 @@ class test_App(AppCase):
 | 
	
		
			
				|  |  |          self.app._using_v1_reduce = True
 | 
	
		
			
				|  |  |          self.assertTrue(loads(dumps(self.app)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    def test_autodiscover_tasks(self):
 | 
	
		
			
				|  |  | +    def test_autodiscover_tasks_force(self):
 | 
	
		
			
				|  |  |          self.app.conf.CELERY_FORCE_BILLIARD_LOGGING = True
 | 
	
		
			
				|  |  |          with patch('celery.app.base.ensure_process_aware_logger') as ep:
 | 
	
		
			
				|  |  |              self.app.loader.autodiscover_tasks = Mock()
 | 
	
		
			
				|  |  | -            self.app.autodiscover_tasks(['proj.A', 'proj.B'])
 | 
	
		
			
				|  |  | +            self.app.autodiscover_tasks(['proj.A', 'proj.B'], force=True)
 | 
	
		
			
				|  |  |              ep.assert_called_with()
 | 
	
		
			
				|  |  |              self.app.loader.autodiscover_tasks.assert_called_with(
 | 
	
		
			
				|  |  |                  ['proj.A', 'proj.B'], 'tasks',
 | 
	
		
			
				|  |  |              )
 | 
	
		
			
				|  |  |          with patch('celery.app.base.ensure_process_aware_logger') as ep:
 | 
	
		
			
				|  |  | +            self.app.loader.autodiscover_tasks = Mock()
 | 
	
		
			
				|  |  |              self.app.conf.CELERY_FORCE_BILLIARD_LOGGING = False
 | 
	
		
			
				|  |  | -            self.app.autodiscover_tasks(['proj.A', 'proj.B'])
 | 
	
		
			
				|  |  | +            self.app.autodiscover_tasks(
 | 
	
		
			
				|  |  | +                lambda: ['proj.A', 'proj.B'],
 | 
	
		
			
				|  |  | +                related_name='george',
 | 
	
		
			
				|  |  | +                force=True,
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +            self.app.loader.autodiscover_tasks.assert_called_with(
 | 
	
		
			
				|  |  | +                ['proj.A', 'proj.B'], 'george',
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  |              self.assertFalse(ep.called)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    def test_autodiscover_tasks_lazy(self):
 | 
	
		
			
				|  |  | +        with patch('celery.signals.import_modules') as import_modules:
 | 
	
		
			
				|  |  | +            packages = lambda: [1, 2, 3]
 | 
	
		
			
				|  |  | +            self.app.autodiscover_tasks(packages)
 | 
	
		
			
				|  |  | +            self.assertTrue(import_modules.connect.called)
 | 
	
		
			
				|  |  | +            prom = import_modules.connect.call_args[0][0]
 | 
	
		
			
				|  |  | +            self.assertIsInstance(prom, promise)
 | 
	
		
			
				|  |  | +            self.assertEqual(prom.fun, self.app._autodiscover_tasks)
 | 
	
		
			
				|  |  | +            self.assertEqual(prom.args[0](), [1, 2, 3])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @with_environ('CELERY_BROKER_URL', '')
 | 
	
		
			
				|  |  |      def test_with_broker(self):
 | 
	
		
			
				|  |  |          with self.Celery(broker='foo://baribaz') as app:
 | 
	
	
		
			
				|  | @@ -346,23 +373,26 @@ class test_App(AppCase):
 | 
	
		
			
				|  |  |          self.app.config_from_envvar('CELERYTEST_CONFIG_OBJECT')
 | 
	
		
			
				|  |  |          self.assertEqual(self.app.conf.THIS_IS_A_KEY, 'this is a value')
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    def test_config_from_object(self):
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        class Object(object):
 | 
	
		
			
				|  |  | -            LEAVE_FOR_WORK = True
 | 
	
		
			
				|  |  | -            MOMENT_TO_STOP = True
 | 
	
		
			
				|  |  | -            CALL_ME_BACK = 123456789
 | 
	
		
			
				|  |  | -            WANT_ME_TO = False
 | 
	
		
			
				|  |  | -            UNDERSTAND_ME = True
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        self.app.config_from_object(Object())
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +    def assert_config2(self):
 | 
	
		
			
				|  |  |          self.assertTrue(self.app.conf.LEAVE_FOR_WORK)
 | 
	
		
			
				|  |  |          self.assertTrue(self.app.conf.MOMENT_TO_STOP)
 | 
	
		
			
				|  |  |          self.assertEqual(self.app.conf.CALL_ME_BACK, 123456789)
 | 
	
		
			
				|  |  |          self.assertFalse(self.app.conf.WANT_ME_TO)
 | 
	
		
			
				|  |  |          self.assertTrue(self.app.conf.UNDERSTAND_ME)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    def test_config_from_object__lazy(self):
 | 
	
		
			
				|  |  | +        conf = ObjectConfig2()
 | 
	
		
			
				|  |  | +        self.app.config_from_object(conf)
 | 
	
		
			
				|  |  | +        self.assertFalse(self.app.loader._conf)
 | 
	
		
			
				|  |  | +        self.assertIs(self.app._config_source, conf)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        self.assert_config2()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def test_config_from_object__force(self):
 | 
	
		
			
				|  |  | +        self.app.config_from_object(ObjectConfig2(), force=True)
 | 
	
		
			
				|  |  | +        self.assertTrue(self.app.loader._conf)
 | 
	
		
			
				|  |  | +        self.assert_config2()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      def test_config_from_cmdline(self):
 | 
	
		
			
				|  |  |          cmdline = ['.always_eager=no',
 | 
	
		
			
				|  |  |                     '.result_backend=/dev/null',
 | 
	
	
		
			
				|  | @@ -434,22 +464,28 @@ class test_App(AppCase):
 | 
	
		
			
				|  |  |              next(app for app in _state._get_active_apps() if id(app) == appid)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def test_config_from_envvar_more(self, key='CELERY_HARNESS_CFG1'):
 | 
	
		
			
				|  |  | -        self.assertFalse(self.app.config_from_envvar('HDSAJIHWIQHEWQU',
 | 
	
		
			
				|  |  | -                                                     silent=True))
 | 
	
		
			
				|  |  | +        self.assertFalse(
 | 
	
		
			
				|  |  | +            self.app.config_from_envvar(
 | 
	
		
			
				|  |  | +                'HDSAJIHWIQHEWQU', force=True, silent=True),
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  |          with self.assertRaises(ImproperlyConfigured):
 | 
	
		
			
				|  |  | -            self.app.config_from_envvar('HDSAJIHWIQHEWQU', silent=False)
 | 
	
		
			
				|  |  | +            self.app.config_from_envvar(
 | 
	
		
			
				|  |  | +                'HDSAJIHWIQHEWQU', force=True, silent=False,
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  |          os.environ[key] = __name__ + '.object_config'
 | 
	
		
			
				|  |  | -        self.assertTrue(self.app.config_from_envvar(key))
 | 
	
		
			
				|  |  | +        self.assertTrue(self.app.config_from_envvar(key, force=True))
 | 
	
		
			
				|  |  |          self.assertEqual(self.app.conf['FOO'], 1)
 | 
	
		
			
				|  |  |          self.assertEqual(self.app.conf['BAR'], 2)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          os.environ[key] = 'unknown_asdwqe.asdwqewqe'
 | 
	
		
			
				|  |  |          with self.assertRaises(ImportError):
 | 
	
		
			
				|  |  |              self.app.config_from_envvar(key, silent=False)
 | 
	
		
			
				|  |  | -        self.assertFalse(self.app.config_from_envvar(key, silent=True))
 | 
	
		
			
				|  |  | +        self.assertFalse(
 | 
	
		
			
				|  |  | +            self.app.config_from_envvar(key, force=True, silent=True),
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          os.environ[key] = __name__ + '.dict_config'
 | 
	
		
			
				|  |  | -        self.assertTrue(self.app.config_from_envvar(key))
 | 
	
		
			
				|  |  | +        self.assertTrue(self.app.config_from_envvar(key, force=True))
 | 
	
		
			
				|  |  |          self.assertEqual(self.app.conf['FOO'], 10)
 | 
	
		
			
				|  |  |          self.assertEqual(self.app.conf['BAR'], 20)
 | 
	
		
			
				|  |  |  
 |