base.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import os
  2. import sys
  3. from optparse import OptionParser, make_option as Option
  4. import celery
  5. class Command(object):
  6. args = ''
  7. version = celery.__version__
  8. option_list = ()
  9. preload_options = (
  10. Option("--app",
  11. default=None, action="store", dest="app",
  12. help="Name of the app instance to use. "),
  13. Option("--loader",
  14. default=None, action="store", dest="loader",
  15. help="Name of the loader class to use. "
  16. "Taken from the environment variable CELERY_LOADER, "
  17. "or 'default' if that is not set."),
  18. Option("--config",
  19. default="celeryconfig", action="store",
  20. dest="config_module",
  21. help="Name of the module to read configuration from.")
  22. )
  23. enable_config_from_cmdline = False
  24. namespace = "celery"
  25. Parser = OptionParser
  26. def __init__(self, app=None, get_app=None):
  27. self.get_app = get_app or self._get_default_app
  28. def usage(self):
  29. return "%%prog [options] %s" % (self.args, )
  30. def get_options(self):
  31. return self.option_list
  32. def handle_argv(self, prog_name, argv):
  33. options, args = self.parse_options(prog_name, argv)
  34. return self.run(*args, **vars(options))
  35. def run(self, *args, **options):
  36. raise NotImplementedError("subclass responsibility")
  37. def execute_from_commandline(self, argv=None):
  38. if argv is None:
  39. argv = list(sys.argv)
  40. argv = self.setup_app_from_commandline(argv)
  41. prog_name = os.path.basename(argv[0])
  42. return self.handle_argv(prog_name, argv[1:])
  43. def parse_options(self, prog_name, arguments):
  44. """Parse the available options."""
  45. parser = self.create_parser(prog_name)
  46. options, args = parser.parse_args(arguments)
  47. return options, args
  48. def create_parser(self, prog_name):
  49. return self.Parser(prog=prog_name,
  50. usage=self.usage(),
  51. version=self.version,
  52. option_list=(self.preload_options +
  53. self.get_options()))
  54. def setup_app_from_commandline(self, argv):
  55. preload_options = self.parse_preload_options(argv)
  56. app = (preload_options.pop("app", None) or
  57. os.environ.get("CELERY_APP"))
  58. loader = (preload_options.pop("loader", None) or
  59. os.environ.get("CELERY_LOADER") or
  60. "default")
  61. config_module = preload_options.pop("config_module", None)
  62. if config_module:
  63. os.environ["CELERY_CONFIG_MODULE"] = config_module
  64. self.app = (app and get_symbol_by_name(app) or
  65. self.get_app(loader=loader))
  66. if self.enable_config_from_cmdline:
  67. argv = self.process_cmdline_config(argv)
  68. return argv
  69. def get_symbol_by_name(self, name):
  70. from celery.utils import get_symbol_by_name
  71. return get_symbol_by_name(name)
  72. def process_cmdline_config(self, argv):
  73. try:
  74. cargs_start = argv.index('--')
  75. except ValueError:
  76. return argv
  77. argv, cargs = argv[:cargs_start], argv[cargs_start + 1:]
  78. self.app.config_from_cmdline(cargs, namespace=self.namespace)
  79. return argv
  80. def parse_preload_options(self, args):
  81. acc = {}
  82. preload_options = dict((opt._long_opts[0], opt.dest)
  83. for opt in self.preload_options)
  84. for arg in args:
  85. if arg.startswith('--') and '=' in arg:
  86. key, value = arg.split('=', 1)
  87. dest = preload_options.get(key)
  88. if dest:
  89. acc[dest] = value
  90. return acc
  91. def _get_default_app(self, *args, **kwargs):
  92. return celery.Celery(*args, **kwargs)