/** * Generate the usage for a shell based on its arguments and options. * Usage strings favor short options over the long ones. and optional args will * be indicated with [] * * @return string */ protected function _generateUsage() { $usage = ['cake ' . $this->_parser->command()]; $subcommands = $this->_parser->subcommands(); if (!empty($subcommands)) { $usage[] = '[subcommand]'; } $options = []; foreach ($this->_parser->options() as $option) { $options[] = $option->usage(); } if (count($options) > $this->_maxOptions) { $options = ['[options]']; } $usage = array_merge($usage, $options); $args = []; foreach ($this->_parser->arguments() as $argument) { $args[] = $argument->usage(); } if (count($args) > $this->_maxArgs) { $args = ['[arguments]']; } $usage = array_merge($usage, $args); return implode(' ', $usage); }
/** * 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. * * For tasks to be invoked they *must* be exposed as subcommands. If you define any subcommands, * you must define all the subcommands your shell needs, whether they be methods on this class * or methods on tasks. * * @param array $argv Array of arguments to run the shell with. This array should be missing the shell name. * @param bool $autoMethod Set to true to allow any public method to be called even if it * was not defined as a subcommand. This is used by ShellDispatcher to make building simple shells easy. * @param array $extra Extra parameters that you can manually pass to the Shell * to be dispatched. * Built-in extra parameter is : * - `requested` : if used, will prevent the Shell welcome message to be displayed * @return mixed * @link http://book.cakephp.org/3.0/en/console-and-shells.html#the-cakephp-console */ public function runCommand($argv, $autoMethod = false, $extra = []) { $command = isset($argv[0]) ? $argv[0] : null; $this->OptionParser = $this->getOptionParser(); try { list($this->params, $this->args) = $this->OptionParser->parse($argv); } catch (ConsoleException $e) { $this->err('<error>Error: ' . $e->getMessage() . '</error>'); $this->out($this->OptionParser->help($command)); return false; } if (!empty($extra) && is_array($extra)) { $this->params = array_merge($this->params, $extra); } if (!empty($this->params['quiet'])) { $this->_io->level(ConsoleIo::QUIET); $this->_io->setLoggers(false); } if (!empty($this->params['verbose'])) { $this->_io->level(ConsoleIo::VERBOSE); } if (!empty($this->params['plugin'])) { Plugin::load($this->params['plugin']); } $this->command = $command; if (!empty($this->params['help'])) { return $this->_displayHelp($command); } $subcommands = $this->OptionParser->subcommands(); $method = Inflector::camelize($command); $isMethod = $this->hasMethod($method); if ($isMethod && $autoMethod && count($subcommands) === 0) { array_shift($this->args); $this->startup(); return call_user_func_array([$this, $method], $this->args); } if ($isMethod && isset($subcommands[$command])) { $this->startup(); return call_user_func_array([$this, $method], $this->args); } if ($this->hasTask($command) && isset($subcommands[$command])) { $this->startup(); array_shift($argv); return $this->{$method}->runCommand($argv, false); } if ($this->hasMethod('main')) { $this->startup(); return call_user_func_array([$this, 'main'], $this->args); } $this->out($this->OptionParser->help($command)); return false; }
/** * test removeSubcommand with an object. * * @return void */ public function testRemoveSubcommand() { $parser = new ConsoleOptionParser('test', false); $parser->addSubcommand(new ConsoleInputSubcommand('test')); $result = $parser->subcommands(); $this->assertEquals(1, count($result)); $parser->removeSubcommand('test'); $result = $parser->subcommands(); $this->assertEquals(0, count($result), 'Remove a subcommand does not work'); }
/** * test addSubcommand with an object. * * @return void */ public function testAddSubcommandObject() { $parser = new ConsoleOptionParser('test', false); $parser->addSubcommand(new ConsoleInputSubcommand('test')); $result = $parser->subcommands(); $this->assertEquals(1, count($result)); $this->assertEquals('test', $result['test']->name()); }