Browse Source

celery command: Do not remove options from beginning (rather move to end)

Ask Solem 11 years ago
parent
commit
25eb48a7e4
2 changed files with 25 additions and 10 deletions
  1. 7 4
      celery/bin/celery.py
  2. 18 6
      celery/tests/bin/test_celery.py

+ 7 - 4
celery/bin/celery.py

@@ -686,16 +686,18 @@ class CeleryCommand(Command):
             self=self, command=command,
         )))
 
-    def remove_options_at_beginning(self, argv, index=0):
+    def _relocate_args_from_start(self, argv, index=0):
         if argv:
+            rest = []
             while index < len(argv):
                 value = argv[index]
                 if value.startswith('--'):
-                    pass
+                    rest.append(value)
                 elif value.startswith('-'):
+                    rest.extend([value] + [argv[index + 1]])
                     index += 1
                 else:
-                    return argv[index:]
+                    return argv[index:] + rest
                 index += 1
         return []
 
@@ -706,7 +708,8 @@ class CeleryCommand(Command):
 
     def handle_argv(self, prog_name, argv):
         self.prog_name = self.prepare_prog_name(prog_name)
-        argv = self.remove_options_at_beginning(argv)
+        print('ARGV THEN IS: %r' % (argv, ))
+        argv = self._relocate_args_from_start(argv)
         _, argv = self.prepare_args(None, argv)
         try:
             command = argv[0]

+ 18 - 6
celery/tests/bin/test_celery.py

@@ -330,13 +330,25 @@ class test_CeleryCommand(AppCase):
         self.assertEqual(determine_exit_status('true'), EX_OK)
         self.assertEqual(determine_exit_status(''), EX_FAILURE)
 
-    def test_remove_options_at_beginning(self):
+    def test_relocate_args_from_start(self):
         x = CeleryCommand(app=self.app)
-        self.assertEqual(x.remove_options_at_beginning(None), [])
-        self.assertEqual(x.remove_options_at_beginning(['-c 3', '--foo']), [])
-        self.assertEqual(x.remove_options_at_beginning(['--foo', '-c 3']), [])
-        self.assertEqual(x.remove_options_at_beginning(
-            ['foo', '--foo=1']), ['foo', '--foo=1'])
+        self.assertEqual(x._relocate_args_from_start(None), [])
+        self.assertEqual(
+            x._relocate_args_from_start(
+                ['-l', 'debug', 'worker', '-c', '3', '--foo'],
+            ),
+            ['worker', '-c', '3', '--foo', '-l', 'debug'],
+        )
+        self.assertEqual(
+            x._relocate_args_from_start(
+                ['--pool=gevent', '-l', 'debug', 'worker', '--foo', '-c', '3'],
+            ),
+            ['worker', '--foo', '-c', '3', '--pool=gevent', '-l', 'debug'],
+        )
+        self.assertEqual(
+            x._relocate_args_from_start(['foo', '--foo=1']),
+            ['foo', '--foo=1'],
+        )
 
     def test_handle_argv(self):
         x = CeleryCommand(app=self.app)