/** * 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.'); }