Ejemplo n.º 1
0
 /**
  * Runs the Shell with the provided argv.
  *
  * Delegates calls to Tasks and resolves methods inside the class. Commands are looked
  * up with the following order:
  *
  * - Method on the shell.
  * - Matching task name.
  * - `main()` method.
  *
  * If a shell implements a `main()` method, all missing method calls will be sent to
  * `main()` with the original method name in the argv.
  *
  * @param string $command The command name to run on this shell. If this argument is empty,
  *   and the shell has a `main()` method, that will be called instead.
  * @param array $argv Array of arguments to run the shell with. This array should be missing the shell name.
  * @return void
  * @link http://book.cakephp.org/2.0/en/console-and-shells.html#Shell::runCommand
  */
 public function runCommand($command, $argv)
 {
     $isTask = $this->hasTask($command);
     $isMethod = $this->hasMethod($command);
     $isMain = $this->hasMethod('main');
     if ($isTask || $isMethod && $command !== 'execute') {
         array_shift($argv);
     }
     try {
         $this->OptionParser = $this->getOptionParser();
         list($this->params, $this->args) = $this->OptionParser->parse($argv, $command);
     } catch (ConsoleException $e) {
         $this->out($this->OptionParser->help($command));
         return false;
     }
     $this->command = $command;
     if (!empty($this->params['help'])) {
         return $this->_displayHelp($command);
     }
     if (($isTask || $isMethod || $isMain) && $command !== 'execute') {
         $this->startup();
     }
     if ($isTask) {
         $command = Inflector::camelize($command);
         return $this->{$command}->runCommand('execute', $argv);
     }
     if ($isMethod) {
         return $this->{$command}();
     }
     if ($isMain) {
         return $this->main();
     }
     $this->out($this->OptionParser->help($command));
     return false;
 }
 /**
  * test that parse() takes a subcommand argument, and that the subcommand parser
  * is used.
  *
  * @return void
  */
 public function testParsingWithSubParser()
 {
     $parser = new ConsoleOptionParser('test', FALSE);
     $parser->addOption('primary')->addArgument('one', array('required' => TRUE, 'choices' => array('a', 'b')))->addArgument('two', array('required' => TRUE))->addSubcommand('sub', array('parser' => array('options' => array('secondary' => array('boolean' => TRUE), 'fourth' => array('help' => 'fourth option')), 'arguments' => array('sub_arg' => array('choices' => array('c', 'd'))))));
     $result = $parser->parse(array('--secondary', '--fourth', '4', 'c'), 'sub');
     $expected = array(array('secondary' => TRUE, 'fourth' => '4', 'help' => FALSE, 'verbose' => FALSE, 'quiet' => FALSE), array('c'));
     $this->assertEquals($expected, $result, 'Sub parser did not parse request.');
 }