merged branch jfsimon/issue-8371 (PR #8451)
This PR was merged into the master branch.
Discussion
----------
[console] makes descriptors use output instead of returning a string
This PR changes `DescriptorInterface::describe($object, array $options = array())` method signature to `describe(OutputInterface $output, $object, array $options = array())` and all subsequent implementations.
It's now possible to use helpers inside descriptors.
That was not easy!
@lyrixx this is all for you
@fabpot I just added one new class
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | no
| BC breaks? | yes
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #8371
Commits
-------
b9fa52c
[Console] made descriptors use output instead of returning a string
This commit is contained in:
commit
2c7c4a5ea0
|
@ -20,6 +20,7 @@ use Symfony\Component\Console\Input\InputDefinition;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\InputAwareInterface;
|
use Symfony\Component\Console\Input\InputAwareInterface;
|
||||||
|
use Symfony\Component\Console\Output\BufferedOutput;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
use Symfony\Component\Console\Output\ConsoleOutput;
|
use Symfony\Component\Console\Output\ConsoleOutput;
|
||||||
use Symfony\Component\Console\Output\ConsoleOutputInterface;
|
use Symfony\Component\Console\Output\ConsoleOutputInterface;
|
||||||
|
@ -685,8 +686,10 @@ class Application
|
||||||
public function asText($namespace = null, $raw = false)
|
public function asText($namespace = null, $raw = false)
|
||||||
{
|
{
|
||||||
$descriptor = new TextDescriptor();
|
$descriptor = new TextDescriptor();
|
||||||
|
$output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, !$raw);
|
||||||
|
$descriptor->describe($output, $this, array('namespace' => $namespace, 'raw_output' => true));
|
||||||
|
|
||||||
return $descriptor->describe($this, array('namespace' => $namespace, 'raw_text' => $raw));
|
return $output->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -703,7 +706,14 @@ class Application
|
||||||
{
|
{
|
||||||
$descriptor = new XmlDescriptor();
|
$descriptor = new XmlDescriptor();
|
||||||
|
|
||||||
return $descriptor->describe($this, array('namespace' => $namespace, 'as_dom' => $asDom));
|
if ($asDom) {
|
||||||
|
return $descriptor->getApplicationDocument($this, $namespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = new BufferedOutput();
|
||||||
|
$descriptor->describe($output, $this, array('namespace' => $namespace));
|
||||||
|
|
||||||
|
return $output->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
2.4.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
* [BC BREAK] made descriptors use output instead of returning a string
|
||||||
|
|
||||||
2.3.0
|
2.3.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ use Symfony\Component\Console\Input\InputDefinition;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
use Symfony\Component\Console\Output\BufferedOutput;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
use Symfony\Component\Console\Application;
|
use Symfony\Component\Console\Application;
|
||||||
use Symfony\Component\Console\Helper\HelperSet;
|
use Symfony\Component\Console\Helper\HelperSet;
|
||||||
|
@ -576,8 +577,10 @@ class Command
|
||||||
public function asText()
|
public function asText()
|
||||||
{
|
{
|
||||||
$descriptor = new TextDescriptor();
|
$descriptor = new TextDescriptor();
|
||||||
|
$output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
|
||||||
|
$descriptor->describe($output, $this, array('raw_output' => true));
|
||||||
|
|
||||||
return $descriptor->describe($this);
|
return $output->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -593,7 +596,14 @@ class Command
|
||||||
{
|
{
|
||||||
$descriptor = new XmlDescriptor();
|
$descriptor = new XmlDescriptor();
|
||||||
|
|
||||||
return $descriptor->describe($this, array('as_dom' => $asDom));
|
if ($asDom) {
|
||||||
|
return $descriptor->getCommandDocument($this);
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = new BufferedOutput();
|
||||||
|
$descriptor->describe($output, $this);
|
||||||
|
|
||||||
|
return $output->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function validateName($name)
|
private function validateName($name)
|
||||||
|
|
|
@ -38,7 +38,7 @@ class HelpCommand extends Command
|
||||||
->setDefinition(array(
|
->setDefinition(array(
|
||||||
new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'),
|
new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'),
|
||||||
new InputOption('xml', null, InputOption::VALUE_NONE, 'To output help as XML'),
|
new InputOption('xml', null, InputOption::VALUE_NONE, 'To output help as XML'),
|
||||||
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'To output help in other formats'),
|
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'To output help in other formats', 'txt'),
|
||||||
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'),
|
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'),
|
||||||
))
|
))
|
||||||
->setDescription('Displays help for a command')
|
->setDescription('Displays help for a command')
|
||||||
|
@ -81,7 +81,11 @@ EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
$helper = new DescriptorHelper();
|
$helper = new DescriptorHelper();
|
||||||
$helper->describe($output, $this->command, $input->getOption('format'), $input->getOption('raw'));
|
$helper->describe($output, $this->command, array(
|
||||||
|
'format' => $input->getOption('format'),
|
||||||
|
'raw' => $input->getOption('raw'),
|
||||||
|
));
|
||||||
|
|
||||||
$this->command = null;
|
$this->command = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,11 @@ EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
$helper = new DescriptorHelper();
|
$helper = new DescriptorHelper();
|
||||||
$helper->describe($output, $this->getApplication(), $input->getOption('format'), $input->getOption('raw'), $input->getArgument('namespace'));
|
$helper->describe($output, $this->getApplication(), array(
|
||||||
|
'format' => $input->getOption('format'),
|
||||||
|
'raw_text' => $input->getOption('raw'),
|
||||||
|
'namespace' => $input->getArgument('namespace'),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -85,7 +89,7 @@ EOF
|
||||||
new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'),
|
new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'),
|
||||||
new InputOption('xml', null, InputOption::VALUE_NONE, 'To output list as XML'),
|
new InputOption('xml', null, InputOption::VALUE_NONE, 'To output list as XML'),
|
||||||
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'),
|
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'),
|
||||||
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'To output list in other formats'),
|
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'To output list in other formats', 'txt'),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,28 +16,55 @@ use Symfony\Component\Console\Command\Command;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\InputDefinition;
|
use Symfony\Component\Console\Input\InputDefinition;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
|
* @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
|
||||||
*/
|
*/
|
||||||
abstract class Descriptor implements DescriptorInterface
|
abstract class Descriptor implements DescriptorInterface
|
||||||
{
|
{
|
||||||
public function describe($object, array $options = array())
|
/**
|
||||||
|
* @var OutputInterface
|
||||||
|
*/
|
||||||
|
private $output;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function describe(OutputInterface $output, $object, array $options = array())
|
||||||
{
|
{
|
||||||
|
$this->output = $output;
|
||||||
|
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case $object instanceof InputArgument:
|
case $object instanceof InputArgument:
|
||||||
return $this->describeInputArgument($object, $options);
|
$this->describeInputArgument($object, $options);
|
||||||
|
break;
|
||||||
case $object instanceof InputOption:
|
case $object instanceof InputOption:
|
||||||
return $this->describeInputOption($object, $options);
|
$this->describeInputOption($object, $options);
|
||||||
|
break;
|
||||||
case $object instanceof InputDefinition:
|
case $object instanceof InputDefinition:
|
||||||
return $this->describeInputDefinition($object, $options);
|
$this->describeInputDefinition($object, $options);
|
||||||
|
break;
|
||||||
case $object instanceof Command:
|
case $object instanceof Command:
|
||||||
return $this->describeCommand($object, $options);
|
$this->describeCommand($object, $options);
|
||||||
|
break;
|
||||||
case $object instanceof Application:
|
case $object instanceof Application:
|
||||||
return $this->describeApplication($object, $options);
|
$this->describeApplication($object, $options);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new \InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_class($object)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new \InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_class($object)));
|
/**
|
||||||
|
* Writes content to output.
|
||||||
|
*
|
||||||
|
* @param string $content
|
||||||
|
* @param boolean $decorated
|
||||||
|
*/
|
||||||
|
protected function write($content, $decorated = false)
|
||||||
|
{
|
||||||
|
$this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
|
|
||||||
namespace Symfony\Component\Console\Descriptor;
|
namespace Symfony\Component\Console\Descriptor;
|
||||||
|
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Descriptor interface.
|
* Descriptor interface.
|
||||||
*
|
*
|
||||||
|
@ -21,10 +23,9 @@ interface DescriptorInterface
|
||||||
/**
|
/**
|
||||||
* Describes an InputArgument instance.
|
* Describes an InputArgument instance.
|
||||||
*
|
*
|
||||||
|
* @param OutputInterface $output
|
||||||
* @param object $object
|
* @param object $object
|
||||||
* @param array $options
|
* @param array $options
|
||||||
*
|
|
||||||
* @return string|mixed
|
|
||||||
*/
|
*/
|
||||||
public function describe($object, array $options = array());
|
public function describe(OutputInterface $output, $object, array $options = array());
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,13 +29,7 @@ class JsonDescriptor extends Descriptor
|
||||||
*/
|
*/
|
||||||
protected function describeInputArgument(InputArgument $argument, array $options = array())
|
protected function describeInputArgument(InputArgument $argument, array $options = array())
|
||||||
{
|
{
|
||||||
return $this->output(array(
|
$this->writeData($this->getInputArgumentData($argument), $options);
|
||||||
'name' => $argument->getName(),
|
|
||||||
'is_required' => $argument->isRequired(),
|
|
||||||
'is_array' => $argument->isArray(),
|
|
||||||
'description' => $argument->getDescription(),
|
|
||||||
'default' => $argument->getDefault(),
|
|
||||||
), $options);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,15 +37,7 @@ class JsonDescriptor extends Descriptor
|
||||||
*/
|
*/
|
||||||
protected function describeInputOption(InputOption $option, array $options = array())
|
protected function describeInputOption(InputOption $option, array $options = array())
|
||||||
{
|
{
|
||||||
return $this->output(array(
|
$this->writeData($this->getInputOptionData($option), $options);
|
||||||
'name' => '--'.$option->getName(),
|
|
||||||
'shortcut' => $option->getShortcut() ? '-'.implode('|-', explode('|', $option->getShortcut())) : '',
|
|
||||||
'accept_value' => $option->acceptValue(),
|
|
||||||
'is_value_required' => $option->isValueRequired(),
|
|
||||||
'is_multiple' => $option->isArray(),
|
|
||||||
'description' => $option->getDescription(),
|
|
||||||
'default' => $option->getDefault(),
|
|
||||||
), $options);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,17 +45,7 @@ class JsonDescriptor extends Descriptor
|
||||||
*/
|
*/
|
||||||
protected function describeInputDefinition(InputDefinition $definition, array $options = array())
|
protected function describeInputDefinition(InputDefinition $definition, array $options = array())
|
||||||
{
|
{
|
||||||
$inputArguments = array();
|
$this->writeData($this->getInputDefinitionData($definition), $options);
|
||||||
foreach ($definition->getArguments() as $name => $argument) {
|
|
||||||
$inputArguments[$name] = $this->describeInputArgument($argument, array('as_array' => true));
|
|
||||||
}
|
|
||||||
|
|
||||||
$inputOptions = array();
|
|
||||||
foreach ($definition->getOptions() as $name => $option) {
|
|
||||||
$inputOptions[$name] = $this->describeInputOption($option, array('as_array' => true));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->output(array('arguments' => $inputArguments, 'options' => $inputOptions), $options);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -77,17 +53,7 @@ class JsonDescriptor extends Descriptor
|
||||||
*/
|
*/
|
||||||
protected function describeCommand(Command $command, array $options = array())
|
protected function describeCommand(Command $command, array $options = array())
|
||||||
{
|
{
|
||||||
$command->getSynopsis();
|
$this->writeData($this->getCommandData($command), $options);
|
||||||
$command->mergeApplicationDefinition(false);
|
|
||||||
|
|
||||||
return $this->output(array(
|
|
||||||
'name' => $command->getName(),
|
|
||||||
'usage' => $command->getSynopsis(),
|
|
||||||
'description' => $command->getDescription(),
|
|
||||||
'help' => $command->getProcessedHelp(),
|
|
||||||
'aliases' => $command->getAliases(),
|
|
||||||
'definition' => $this->describeInputDefinition($command->getNativeDefinition(), array('as_array' => true)),
|
|
||||||
), $options);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -100,30 +66,100 @@ class JsonDescriptor extends Descriptor
|
||||||
$commands = array();
|
$commands = array();
|
||||||
|
|
||||||
foreach ($description->getCommands() as $command) {
|
foreach ($description->getCommands() as $command) {
|
||||||
$commands[] = $this->describeCommand($command, array('as_array' => true));
|
$commands[] = $this->getCommandData($command);
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = $describedNamespace
|
$data = $describedNamespace
|
||||||
? array('commands' => $commands, 'namespace' => $describedNamespace)
|
? array('commands' => $commands, 'namespace' => $describedNamespace)
|
||||||
: array('commands' => $commands, 'namespaces' => array_values($description->getNamespaces()));
|
: array('commands' => $commands, 'namespaces' => array_values($description->getNamespaces()));
|
||||||
|
|
||||||
return $this->output($data, $options);
|
$this->writeData($data, $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Outputs data as array or string according to options.
|
* Writes data as json.
|
||||||
*
|
*
|
||||||
* @param array $data
|
* @param array $data
|
||||||
* @param array $options
|
* @param array $options
|
||||||
*
|
*
|
||||||
* @return array|string
|
* @return array|string
|
||||||
*/
|
*/
|
||||||
private function output(array $data, array $options)
|
private function writeData(array $data, array $options)
|
||||||
{
|
{
|
||||||
if (isset($options['as_array']) && $options['as_array']) {
|
$this->write(json_encode($data, isset($options['json_encoding']) ? $options['json_encoding'] : 0));
|
||||||
return $data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return json_encode($data, isset($options['json_encoding']) ? $options['json_encoding'] : 0);
|
/**
|
||||||
|
* @param InputArgument $argument
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getInputArgumentData(InputArgument $argument)
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'name' => $argument->getName(),
|
||||||
|
'is_required' => $argument->isRequired(),
|
||||||
|
'is_array' => $argument->isArray(),
|
||||||
|
'description' => $argument->getDescription(),
|
||||||
|
'default' => $argument->getDefault(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param InputOption $option
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getInputOptionData(InputOption $option)
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'name' => '--'.$option->getName(),
|
||||||
|
'shortcut' => $option->getShortcut() ? '-'.implode('|-', explode('|', $option->getShortcut())) : '',
|
||||||
|
'accept_value' => $option->acceptValue(),
|
||||||
|
'is_value_required' => $option->isValueRequired(),
|
||||||
|
'is_multiple' => $option->isArray(),
|
||||||
|
'description' => $option->getDescription(),
|
||||||
|
'default' => $option->getDefault(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param InputDefinition $definition
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getInputDefinitionData(InputDefinition $definition)
|
||||||
|
{
|
||||||
|
$inputArguments = array();
|
||||||
|
foreach ($definition->getArguments() as $name => $argument) {
|
||||||
|
$inputArguments[$name] = $this->getInputArgumentData($argument);
|
||||||
|
}
|
||||||
|
|
||||||
|
$inputOptions = array();
|
||||||
|
foreach ($definition->getOptions() as $name => $option) {
|
||||||
|
$inputOptions[$name] = $this->getInputOptionData($option);
|
||||||
|
}
|
||||||
|
|
||||||
|
return array('arguments' => $inputArguments, 'options' => $inputOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Command $command
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getCommandData(Command $command)
|
||||||
|
{
|
||||||
|
$command->getSynopsis();
|
||||||
|
$command->mergeApplicationDefinition(false);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'name' => $command->getName(),
|
||||||
|
'usage' => $command->getSynopsis(),
|
||||||
|
'description' => $command->getDescription(),
|
||||||
|
'help' => $command->getProcessedHelp(),
|
||||||
|
'aliases' => $command->getAliases(),
|
||||||
|
'definition' => $this->getInputDefinitionData($command->getNativeDefinition()),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,12 +29,14 @@ class MarkdownDescriptor extends Descriptor
|
||||||
*/
|
*/
|
||||||
protected function describeInputArgument(InputArgument $argument, array $options = array())
|
protected function describeInputArgument(InputArgument $argument, array $options = array())
|
||||||
{
|
{
|
||||||
return '**'.$argument->getName().':**'."\n\n"
|
$this->write(
|
||||||
|
'**'.$argument->getName().':**'."\n\n"
|
||||||
.'* Name: '.($argument->getName() ?: '<none>')."\n"
|
.'* Name: '.($argument->getName() ?: '<none>')."\n"
|
||||||
.'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n"
|
.'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n"
|
||||||
.'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n"
|
.'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n"
|
||||||
.'* Description: '.($argument->getDescription() ?: '<none>')."\n"
|
.'* Description: '.($argument->getDescription() ?: '<none>')."\n"
|
||||||
.'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`';
|
.'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -42,14 +44,16 @@ class MarkdownDescriptor extends Descriptor
|
||||||
*/
|
*/
|
||||||
protected function describeInputOption(InputOption $option, array $options = array())
|
protected function describeInputOption(InputOption $option, array $options = array())
|
||||||
{
|
{
|
||||||
return '**'.$option->getName().':**'."\n\n"
|
$this->write(
|
||||||
|
'**'.$option->getName().':**'."\n\n"
|
||||||
.'* Name: `--'.$option->getName().'`'."\n"
|
.'* Name: `--'.$option->getName().'`'."\n"
|
||||||
.'* Shortcut: '.($option->getShortcut() ? '`-'.implode('|-', explode('|', $option->getShortcut())).'`' : '<none>')."\n"
|
.'* Shortcut: '.($option->getShortcut() ? '`-'.implode('|-', explode('|', $option->getShortcut())).'`' : '<none>')."\n"
|
||||||
.'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n"
|
.'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n"
|
||||||
.'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n"
|
.'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n"
|
||||||
.'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n"
|
.'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n"
|
||||||
.'* Description: '.($option->getDescription() ?: '<none>')."\n"
|
.'* Description: '.($option->getDescription() ?: '<none>')."\n"
|
||||||
.'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`';
|
.'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -57,23 +61,25 @@ class MarkdownDescriptor extends Descriptor
|
||||||
*/
|
*/
|
||||||
protected function describeInputDefinition(InputDefinition $definition, array $options = array())
|
protected function describeInputDefinition(InputDefinition $definition, array $options = array())
|
||||||
{
|
{
|
||||||
$blocks = array();
|
if ($showArguments = count($definition->getArguments()) > 0) {
|
||||||
|
$this->write('### Arguments:');
|
||||||
if (count($definition->getArguments()) > 0) {
|
|
||||||
$blocks[] = '### Arguments:';
|
|
||||||
foreach ($definition->getArguments() as $argument) {
|
foreach ($definition->getArguments() as $argument) {
|
||||||
$blocks[] = $this->describeInputArgument($argument);
|
$this->write("\n\n");
|
||||||
|
$this->write($this->describeInputArgument($argument));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count($definition->getOptions()) > 0) {
|
if (count($definition->getOptions()) > 0) {
|
||||||
$blocks[] = '### Options:';
|
if ($showArguments) {
|
||||||
foreach ($definition->getOptions() as $option) {
|
$this->write("\n\n");
|
||||||
$blocks[] = $this->describeInputOption($option);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return implode("\n\n", $blocks);
|
$this->write('### Options:');
|
||||||
|
foreach ($definition->getOptions() as $option) {
|
||||||
|
$this->write("\n\n");
|
||||||
|
$this->write($this->describeInputOption($option));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -84,21 +90,23 @@ class MarkdownDescriptor extends Descriptor
|
||||||
$command->getSynopsis();
|
$command->getSynopsis();
|
||||||
$command->mergeApplicationDefinition(false);
|
$command->mergeApplicationDefinition(false);
|
||||||
|
|
||||||
$markdown = $command->getName()."\n"
|
$this->write(
|
||||||
|
$command->getName()."\n"
|
||||||
.str_repeat('-', strlen($command->getName()))."\n\n"
|
.str_repeat('-', strlen($command->getName()))."\n\n"
|
||||||
.'* Description: '.($command->getDescription() ?: '<none>')."\n"
|
.'* Description: '.($command->getDescription() ?: '<none>')."\n"
|
||||||
.'* Usage: `'.$command->getSynopsis().'`'."\n"
|
.'* Usage: `'.$command->getSynopsis().'`'."\n"
|
||||||
.'* Aliases: '.(count($command->getAliases()) ? '`'.implode('`, `', $command->getAliases()).'`' : '<none>');
|
.'* Aliases: '.(count($command->getAliases()) ? '`'.implode('`, `', $command->getAliases()).'`' : '<none>')
|
||||||
|
);
|
||||||
|
|
||||||
if ($help = $command->getProcessedHelp()) {
|
if ($help = $command->getProcessedHelp()) {
|
||||||
$markdown .= "\n\n".$help;
|
$this->write("\n\n");
|
||||||
|
$this->write($help);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($definitionMarkdown = $this->describeInputDefinition($command->getNativeDefinition())) {
|
if ($definition = $command->getNativeDefinition()) {
|
||||||
$markdown .= "\n\n".$definitionMarkdown;
|
$this->write("\n\n");
|
||||||
|
$this->describeInputDefinition($command->getNativeDefinition());
|
||||||
}
|
}
|
||||||
|
|
||||||
return $markdown;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -108,22 +116,24 @@ class MarkdownDescriptor extends Descriptor
|
||||||
{
|
{
|
||||||
$describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
|
$describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
|
||||||
$description = new ApplicationDescription($application, $describedNamespace);
|
$description = new ApplicationDescription($application, $describedNamespace);
|
||||||
$blocks = array($application->getName()."\n".str_repeat('=', strlen($application->getName())));
|
|
||||||
|
$this->write($application->getName()."\n".str_repeat('=', strlen($application->getName())));
|
||||||
|
|
||||||
foreach ($description->getNamespaces() as $namespace) {
|
foreach ($description->getNamespaces() as $namespace) {
|
||||||
if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
|
if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
|
||||||
$blocks[] = '**'.$namespace['id'].':**';
|
$this->write("\n\n");
|
||||||
|
$this->write('**'.$namespace['id'].':**');
|
||||||
}
|
}
|
||||||
|
|
||||||
$blocks[] = implode("\n", array_map(function ($commandName) {
|
$this->write("\n\n");
|
||||||
|
$this->write(array_map(function ($commandName) {
|
||||||
return '* '.$commandName;
|
return '* '.$commandName;
|
||||||
} , $namespace['commands']));
|
} , $namespace['commands']));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($description->getCommands() as $command) {
|
foreach ($description->getCommands() as $command) {
|
||||||
$blocks[] = $this->describeCommand($command);
|
$this->write("\n\n");
|
||||||
}
|
$this->write($this->describeCommand($command));
|
||||||
|
}
|
||||||
return implode("\n\n", $blocks);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ use Symfony\Component\Console\Command\Command;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\InputDefinition;
|
use Symfony\Component\Console\Input\InputDefinition;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Text descriptor.
|
* Text descriptor.
|
||||||
|
@ -36,10 +37,12 @@ class TextDescriptor extends Descriptor
|
||||||
}
|
}
|
||||||
|
|
||||||
$nameWidth = isset($options['name_width']) ? $options['name_width'] : strlen($argument->getName());
|
$nameWidth = isset($options['name_width']) ? $options['name_width'] : strlen($argument->getName());
|
||||||
$output = str_replace("\n", "\n".str_repeat(' ', $nameWidth + 2), $argument->getDescription());
|
|
||||||
$output = sprintf(" <info>%-${nameWidth}s</info> %s%s", $argument->getName(), $output, $default);
|
|
||||||
|
|
||||||
return isset($options['raw_text']) && $options['raw_text'] ? strip_tags($output) : $output;
|
$this->writeText(sprintf(" <info>%-${nameWidth}s</info> %s%s",
|
||||||
|
$argument->getName(),
|
||||||
|
str_replace("\n", "\n".str_repeat(' ', $nameWidth + 2), $argument->getDescription()),
|
||||||
|
$default
|
||||||
|
), $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -56,15 +59,13 @@ class TextDescriptor extends Descriptor
|
||||||
$nameWidth = isset($options['name_width']) ? $options['name_width'] : strlen($option->getName());
|
$nameWidth = isset($options['name_width']) ? $options['name_width'] : strlen($option->getName());
|
||||||
$nameWithShortcutWidth = $nameWidth - strlen($option->getName()) - 2;
|
$nameWithShortcutWidth = $nameWidth - strlen($option->getName()) - 2;
|
||||||
|
|
||||||
$output = sprintf(" <info>%s</info> %-${nameWithShortcutWidth}s%s%s%s",
|
$this->writeText(sprintf(" <info>%s</info> %-${nameWithShortcutWidth}s%s%s%s",
|
||||||
'--'.$option->getName(),
|
'--'.$option->getName(),
|
||||||
$option->getShortcut() ? sprintf('(-%s) ', $option->getShortcut()) : '',
|
$option->getShortcut() ? sprintf('(-%s) ', $option->getShortcut()) : '',
|
||||||
str_replace("\n", "\n".str_repeat(' ', $nameWidth + 2), $option->getDescription()),
|
str_replace("\n", "\n".str_repeat(' ', $nameWidth + 2), $option->getDescription()),
|
||||||
$default,
|
$default,
|
||||||
$option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''
|
$option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''
|
||||||
);
|
), $options);
|
||||||
|
|
||||||
return isset($options['raw_text']) && $options['raw_text'] ? strip_tags($output) : $output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -85,27 +86,27 @@ class TextDescriptor extends Descriptor
|
||||||
}
|
}
|
||||||
++$nameWidth;
|
++$nameWidth;
|
||||||
|
|
||||||
$messages = array();
|
|
||||||
|
|
||||||
if ($definition->getArguments()) {
|
if ($definition->getArguments()) {
|
||||||
$messages[] = '<comment>Arguments:</comment>';
|
$this->writeText('<comment>Arguments:</comment>', $options);
|
||||||
|
$this->writeText("\n");
|
||||||
foreach ($definition->getArguments() as $argument) {
|
foreach ($definition->getArguments() as $argument) {
|
||||||
$messages[] = $this->describeInputArgument($argument, array('name_width' => $nameWidth));
|
$this->describeInputArgument($argument, array_merge($options, array('name_width' => $nameWidth)));
|
||||||
|
$this->writeText("\n");
|
||||||
}
|
}
|
||||||
$messages[] = '';
|
}
|
||||||
|
|
||||||
|
if ($definition->getArguments() && $definition->getOptions()) {
|
||||||
|
$this->writeText("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($definition->getOptions()) {
|
if ($definition->getOptions()) {
|
||||||
$messages[] = '<comment>Options:</comment>';
|
$this->writeText('<comment>Options:</comment>', $options);
|
||||||
|
$this->writeText("\n");
|
||||||
foreach ($definition->getOptions() as $option) {
|
foreach ($definition->getOptions() as $option) {
|
||||||
$messages[] = $this->describeInputOption($option, array('name_width' => $nameWidth));
|
$this->describeInputOption($option, array_merge($options, array('name_width' => $nameWidth)));
|
||||||
|
$this->writeText("\n");
|
||||||
}
|
}
|
||||||
$messages[] = '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$output = implode("\n", $messages);
|
|
||||||
|
|
||||||
return isset($options['raw_text']) && $options['raw_text'] ? strip_tags($output) : $output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -115,22 +116,30 @@ class TextDescriptor extends Descriptor
|
||||||
{
|
{
|
||||||
$command->getSynopsis();
|
$command->getSynopsis();
|
||||||
$command->mergeApplicationDefinition(false);
|
$command->mergeApplicationDefinition(false);
|
||||||
$messages = array('<comment>Usage:</comment>', ' '.$command->getSynopsis(), '');
|
|
||||||
|
|
||||||
if ($command->getAliases()) {
|
$this->writeText('<comment>Usage:</comment>', $options);
|
||||||
$messages[] = '<comment>Aliases:</comment> <info>'.implode(', ', $command->getAliases()).'</info>';
|
$this->writeText("\n");
|
||||||
|
$this->writeText(' '.$command->getSynopsis(), $options);
|
||||||
|
$this->writeText("\n");
|
||||||
|
|
||||||
|
if (count($command->getAliases()) > 0) {
|
||||||
|
$this->writeText("\n");
|
||||||
|
$this->writeText('<comment>Aliases:</comment> <info>'.implode(', ', $command->getAliases()).'</info>', $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
$messages[] = $this->describeInputDefinition($command->getNativeDefinition());
|
if ($definition = $command->getNativeDefinition()) {
|
||||||
|
$this->writeText("\n");
|
||||||
|
$this->describeInputDefinition($definition, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->writeText("\n");
|
||||||
|
|
||||||
if ($help = $command->getProcessedHelp()) {
|
if ($help = $command->getProcessedHelp()) {
|
||||||
$messages[] = '<comment>Help:</comment>';
|
$this->writeText('<comment>Help:</comment>', $options);
|
||||||
$messages[] = ' '.str_replace("\n", "\n ", $help)."\n";
|
$this->writeText("\n");
|
||||||
|
$this->writeText(' '.str_replace("\n", "\n ", $help), $options);
|
||||||
|
$this->writeText("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
$output = implode("\n", $messages);
|
|
||||||
|
|
||||||
return isset($options['raw_text']) && $options['raw_text'] ? strip_tags($output) : $output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -140,41 +149,52 @@ class TextDescriptor extends Descriptor
|
||||||
{
|
{
|
||||||
$describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
|
$describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
|
||||||
$description = new ApplicationDescription($application, $describedNamespace);
|
$description = new ApplicationDescription($application, $describedNamespace);
|
||||||
$messages = array();
|
|
||||||
|
|
||||||
if (isset($options['raw_text']) && $options['raw_text']) {
|
if (isset($options['raw_text']) && $options['raw_text']) {
|
||||||
$width = $this->getColumnWidth($description->getCommands());
|
$width = $this->getColumnWidth($description->getCommands());
|
||||||
|
|
||||||
foreach ($description->getCommands() as $command) {
|
foreach ($description->getCommands() as $command) {
|
||||||
$messages[] = sprintf("%-${width}s %s", $command->getName(), $command->getDescription());
|
$this->writeText(sprintf("%-${width}s %s", $command->getName(), $command->getDescription()), $options);
|
||||||
|
$this->writeText("\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$width = $this->getColumnWidth($description->getCommands());
|
$width = $this->getColumnWidth($description->getCommands());
|
||||||
|
|
||||||
$messages[] = $application->getHelp();
|
$this->writeText($application->getHelp(), $options);
|
||||||
$messages[] = '';
|
$this->writeText("\n\n");
|
||||||
|
|
||||||
if ($describedNamespace) {
|
if ($describedNamespace) {
|
||||||
$messages[] = sprintf("<comment>Available commands for the \"%s\" namespace:</comment>", $describedNamespace);
|
$this->writeText(sprintf("<comment>Available commands for the \"%s\" namespace:</comment>", $describedNamespace), $options);
|
||||||
} else {
|
} else {
|
||||||
$messages[] = '<comment>Available commands:</comment>';
|
$this->writeText('<comment>Available commands:</comment>', $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
// add commands by namespace
|
// add commands by namespace
|
||||||
foreach ($description->getNamespaces() as $namespace) {
|
foreach ($description->getNamespaces() as $namespace) {
|
||||||
if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
|
if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
|
||||||
$messages[] = '<comment>'.$namespace['id'].'</comment>';
|
$this->writeText("\n");
|
||||||
|
$this->writeText('<comment>'.$namespace['id'].'</comment>', $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($namespace['commands'] as $name) {
|
foreach ($namespace['commands'] as $name) {
|
||||||
$messages[] = sprintf(" <info>%-${width}s</info> %s", $name, $description->getCommand($name)->getDescription());
|
$this->writeText("\n");
|
||||||
}
|
$this->writeText(sprintf(" <info>%-${width}s</info> %s", $name, $description->getCommand($name)->getDescription()), $options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$output = implode("\n", $messages);
|
$this->writeText("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return isset($options['raw_text']) && $options['raw_text'] ? strip_tags($output) : $output;
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
private function writeText($content, array $options = array())
|
||||||
|
{
|
||||||
|
$this->write(
|
||||||
|
isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content,
|
||||||
|
isset($options['raw_output']) ? !$options['raw_output'] : true
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,10 +24,177 @@ use Symfony\Component\Console\Input\InputOption;
|
||||||
*/
|
*/
|
||||||
class XmlDescriptor extends Descriptor
|
class XmlDescriptor extends Descriptor
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @param InputDefinition $definition
|
||||||
|
*
|
||||||
|
* @return \DOMDocument
|
||||||
|
*/
|
||||||
|
public function getInputDefinitionDocument(InputDefinition $definition)
|
||||||
|
{
|
||||||
|
$dom = new \DOMDocument('1.0', 'UTF-8');
|
||||||
|
$dom->appendChild($definitionXML = $dom->createElement('definition'));
|
||||||
|
|
||||||
|
$definitionXML->appendChild($argumentsXML = $dom->createElement('arguments'));
|
||||||
|
foreach ($definition->getArguments() as $argument) {
|
||||||
|
$this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument));
|
||||||
|
}
|
||||||
|
|
||||||
|
$definitionXML->appendChild($optionsXML = $dom->createElement('options'));
|
||||||
|
foreach ($definition->getOptions() as $option) {
|
||||||
|
$this->appendDocument($optionsXML, $this->getInputOptionDocument($option));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dom;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Command $command
|
||||||
|
*
|
||||||
|
* @return \DOMDocument
|
||||||
|
*/
|
||||||
|
public function getCommandDocument(Command $command)
|
||||||
|
{
|
||||||
|
$dom = new \DOMDocument('1.0', 'UTF-8');
|
||||||
|
$dom->appendChild($commandXML = $dom->createElement('command'));
|
||||||
|
|
||||||
|
$command->getSynopsis();
|
||||||
|
$command->mergeApplicationDefinition(false);
|
||||||
|
|
||||||
|
$commandXML->setAttribute('id', $command->getName());
|
||||||
|
$commandXML->setAttribute('name', $command->getName());
|
||||||
|
|
||||||
|
$commandXML->appendChild($usageXML = $dom->createElement('usage'));
|
||||||
|
$usageXML->appendChild($dom->createTextNode(sprintf($command->getSynopsis(), '')));
|
||||||
|
|
||||||
|
$commandXML->appendChild($descriptionXML = $dom->createElement('description'));
|
||||||
|
$descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription())));
|
||||||
|
|
||||||
|
$commandXML->appendChild($helpXML = $dom->createElement('help'));
|
||||||
|
$helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp())));
|
||||||
|
|
||||||
|
$commandXML->appendChild($aliasesXML = $dom->createElement('aliases'));
|
||||||
|
foreach ($command->getAliases() as $alias) {
|
||||||
|
$aliasesXML->appendChild($aliasXML = $dom->createElement('alias'));
|
||||||
|
$aliasXML->appendChild($dom->createTextNode($alias));
|
||||||
|
}
|
||||||
|
|
||||||
|
$definitionXML = $this->getInputDefinitionDocument($command->getNativeDefinition());
|
||||||
|
$this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0));
|
||||||
|
|
||||||
|
return $dom;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Application $application
|
||||||
|
* @param string|null $namespace
|
||||||
|
*
|
||||||
|
* @return \DOMDocument
|
||||||
|
*/
|
||||||
|
public function getApplicationDocument(Application $application, $namespace = null)
|
||||||
|
{
|
||||||
|
$dom = new \DOMDocument('1.0', 'UTF-8');
|
||||||
|
$dom->appendChild($rootXml = $dom->createElement('symfony'));
|
||||||
|
$rootXml->appendChild($commandsXML = $dom->createElement('commands'));
|
||||||
|
|
||||||
|
$description = new ApplicationDescription($application, $namespace);
|
||||||
|
|
||||||
|
if ($namespace) {
|
||||||
|
$commandsXML->setAttribute('namespace', $namespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($description->getCommands() as $command) {
|
||||||
|
$this->appendDocument($commandsXML, $this->getCommandDocument($command));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$namespace) {
|
||||||
|
$rootXml->appendChild($namespacesXML = $dom->createElement('namespaces'));
|
||||||
|
|
||||||
|
foreach ($description->getNamespaces() as $namespaceDescription) {
|
||||||
|
$namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace'));
|
||||||
|
$namespaceArrayXML->setAttribute('id', $namespaceDescription['id']);
|
||||||
|
|
||||||
|
foreach ($namespaceDescription['commands'] as $name) {
|
||||||
|
$namespaceArrayXML->appendChild($commandXML = $dom->createElement('command'));
|
||||||
|
$commandXML->appendChild($dom->createTextNode($name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dom;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
protected function describeInputArgument(InputArgument $argument, array $options = array())
|
protected function describeInputArgument(InputArgument $argument, array $options = array())
|
||||||
|
{
|
||||||
|
$this->writeDocument($this->getInputArgumentDocument($argument));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function describeInputOption(InputOption $option, array $options = array())
|
||||||
|
{
|
||||||
|
$this->writeDocument($this->getInputOptionDocument($option));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function describeInputDefinition(InputDefinition $definition, array $options = array())
|
||||||
|
{
|
||||||
|
$this->writeDocument($this->getInputDefinitionDocument($definition));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function describeCommand(Command $command, array $options = array())
|
||||||
|
{
|
||||||
|
$this->writeDocument($this->getCommandDocument($command));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function describeApplication(Application $application, array $options = array())
|
||||||
|
{
|
||||||
|
$this->writeDocument($this->getApplicationDocument($application, isset($options['namespace']) ? $options['namespace'] : null));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends document children to parent node.
|
||||||
|
*
|
||||||
|
* @param \DOMNode $parentNode
|
||||||
|
* @param \DOMNode $importedParent
|
||||||
|
*/
|
||||||
|
private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent)
|
||||||
|
{
|
||||||
|
foreach ($importedParent->childNodes as $childNode) {
|
||||||
|
$parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes DOM document.
|
||||||
|
*
|
||||||
|
* @param \DOMDocument $dom
|
||||||
|
*
|
||||||
|
* @return \DOMDocument|string
|
||||||
|
*/
|
||||||
|
private function writeDocument(\DOMDocument $dom)
|
||||||
|
{
|
||||||
|
$dom->formatOutput = true;
|
||||||
|
$this->write($dom->saveXML());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param InputArgument $argument
|
||||||
|
*
|
||||||
|
* @return \DOMDocument
|
||||||
|
*/
|
||||||
|
private function getInputArgumentDocument(InputArgument $argument)
|
||||||
{
|
{
|
||||||
$dom = new \DOMDocument('1.0', 'UTF-8');
|
$dom = new \DOMDocument('1.0', 'UTF-8');
|
||||||
|
|
||||||
|
@ -45,13 +212,15 @@ class XmlDescriptor extends Descriptor
|
||||||
$defaultXML->appendChild($dom->createTextNode($default));
|
$defaultXML->appendChild($dom->createTextNode($default));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->output($dom, $options);
|
return $dom;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* @param InputOption $option
|
||||||
|
*
|
||||||
|
* @return \DOMDocument
|
||||||
*/
|
*/
|
||||||
protected function describeInputOption(InputOption $option, array $options = array())
|
private function getInputOptionDocument(InputOption $option)
|
||||||
{
|
{
|
||||||
$dom = new \DOMDocument('1.0', 'UTF-8');
|
$dom = new \DOMDocument('1.0', 'UTF-8');
|
||||||
|
|
||||||
|
@ -82,131 +251,6 @@ class XmlDescriptor extends Descriptor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->output($dom, $options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function describeInputDefinition(InputDefinition $definition, array $options = array())
|
|
||||||
{
|
|
||||||
$dom = new \DOMDocument('1.0', 'UTF-8');
|
|
||||||
$dom->appendChild($definitionXML = $dom->createElement('definition'));
|
|
||||||
|
|
||||||
$definitionXML->appendChild($argumentsXML = $dom->createElement('arguments'));
|
|
||||||
foreach ($definition->getArguments() as $argument) {
|
|
||||||
$this->appendDocument($argumentsXML, $this->describeInputArgument($argument, array('as_dom' => true)));
|
|
||||||
}
|
|
||||||
|
|
||||||
$definitionXML->appendChild($optionsXML = $dom->createElement('options'));
|
|
||||||
foreach ($definition->getOptions() as $option) {
|
|
||||||
$this->appendDocument($optionsXML, $this->describeInputOption($option, array('as_dom' => true)));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->output($dom, $options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function describeCommand(Command $command, array $options = array())
|
|
||||||
{
|
|
||||||
$dom = new \DOMDocument('1.0', 'UTF-8');
|
|
||||||
$dom->appendChild($commandXML = $dom->createElement('command'));
|
|
||||||
|
|
||||||
$command->getSynopsis();
|
|
||||||
$command->mergeApplicationDefinition(false);
|
|
||||||
|
|
||||||
$commandXML->setAttribute('id', $command->getName());
|
|
||||||
$commandXML->setAttribute('name', $command->getName());
|
|
||||||
|
|
||||||
$commandXML->appendChild($usageXML = $dom->createElement('usage'));
|
|
||||||
$usageXML->appendChild($dom->createTextNode(sprintf($command->getSynopsis(), '')));
|
|
||||||
|
|
||||||
$commandXML->appendChild($descriptionXML = $dom->createElement('description'));
|
|
||||||
$descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription())));
|
|
||||||
|
|
||||||
$commandXML->appendChild($helpXML = $dom->createElement('help'));
|
|
||||||
$helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp())));
|
|
||||||
|
|
||||||
$commandXML->appendChild($aliasesXML = $dom->createElement('aliases'));
|
|
||||||
foreach ($command->getAliases() as $alias) {
|
|
||||||
$aliasesXML->appendChild($aliasXML = $dom->createElement('alias'));
|
|
||||||
$aliasXML->appendChild($dom->createTextNode($alias));
|
|
||||||
}
|
|
||||||
|
|
||||||
$definitionXML = $this->describeInputDefinition($command->getNativeDefinition(), array('as_dom' => true));
|
|
||||||
$this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0));
|
|
||||||
|
|
||||||
return $this->output($dom, $options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function describeApplication(Application $application, array $options = array())
|
|
||||||
{
|
|
||||||
$dom = new \DOMDocument('1.0', 'UTF-8');
|
|
||||||
$dom->appendChild($rootXml = $dom->createElement('symfony'));
|
|
||||||
$rootXml->appendChild($commandsXML = $dom->createElement('commands'));
|
|
||||||
|
|
||||||
$describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
|
|
||||||
$description = new ApplicationDescription($application, $describedNamespace);
|
|
||||||
|
|
||||||
if ($describedNamespace) {
|
|
||||||
$commandsXML->setAttribute('namespace', $describedNamespace);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($description->getCommands() as $command) {
|
|
||||||
$this->appendDocument($commandsXML, $this->describeCommand($command, array('as_dom' => true)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$describedNamespace) {
|
|
||||||
$rootXml->appendChild($namespacesXML = $dom->createElement('namespaces'));
|
|
||||||
|
|
||||||
foreach ($description->getNamespaces() as $namespace) {
|
|
||||||
$namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace'));
|
|
||||||
$namespaceArrayXML->setAttribute('id', $namespace['id']);
|
|
||||||
|
|
||||||
foreach ($namespace['commands'] as $name) {
|
|
||||||
$namespaceArrayXML->appendChild($commandXML = $dom->createElement('command'));
|
|
||||||
$commandXML->appendChild($dom->createTextNode($name));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->output($dom, $options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends document children to parent node.
|
|
||||||
*
|
|
||||||
* @param \DOMNode $parentNode
|
|
||||||
* @param \DOMNode $importedParent
|
|
||||||
*/
|
|
||||||
private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent)
|
|
||||||
{
|
|
||||||
foreach ($importedParent->childNodes as $childNode) {
|
|
||||||
$parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Outputs document as DOMDocument or string according to options.
|
|
||||||
*
|
|
||||||
* @param \DOMDocument $dom
|
|
||||||
* @param array $options
|
|
||||||
*
|
|
||||||
* @return \DOMDocument|string
|
|
||||||
*/
|
|
||||||
private function output(\DOMDocument $dom, array $options)
|
|
||||||
{
|
|
||||||
if (isset($options['as_dom']) && $options['as_dom']) {
|
|
||||||
return $dom;
|
return $dom;
|
||||||
}
|
}
|
||||||
|
|
||||||
$dom->formatOutput = true;
|
|
||||||
|
|
||||||
return $dom->saveXML();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,23 +46,29 @@ class DescriptorHelper extends Helper
|
||||||
/**
|
/**
|
||||||
* Describes an object if supported.
|
* Describes an object if supported.
|
||||||
*
|
*
|
||||||
|
* Available options are:
|
||||||
|
* * format: string, the output format name
|
||||||
|
* * raw_text: boolean, sets output type as raw
|
||||||
|
*
|
||||||
* @param OutputInterface $output
|
* @param OutputInterface $output
|
||||||
* @param object $object
|
* @param object $object
|
||||||
* @param string $format
|
* @param array $options
|
||||||
* @param boolean $raw
|
*
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
*/
|
*/
|
||||||
public function describe(OutputInterface $output, $object, $format = null, $raw = false, $namespace = null)
|
public function describe(OutputInterface $output, $object, array $options = array())
|
||||||
{
|
{
|
||||||
$options = array('raw_text' => $raw, 'format' => $format ?: 'txt', 'namespace' => $namespace);
|
$options = array_merge(array(
|
||||||
$type = !$raw && 'txt' === $options['format'] ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW;
|
'raw_text' => false,
|
||||||
|
'format' => 'txt',
|
||||||
|
), $options);
|
||||||
|
|
||||||
if (!isset($this->descriptors[$options['format']])) {
|
if (!isset($this->descriptors[$options['format']])) {
|
||||||
throw new \InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format']));
|
throw new \InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format']));
|
||||||
}
|
}
|
||||||
|
|
||||||
$descriptor = $this->descriptors[$options['format']];
|
$descriptor = $this->descriptors[$options['format']];
|
||||||
|
$descriptor->describe($output, $object, $options);
|
||||||
$output->writeln($descriptor->describe($object, $options), $type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -13,6 +13,7 @@ namespace Symfony\Component\Console\Input;
|
||||||
|
|
||||||
use Symfony\Component\Console\Descriptor\TextDescriptor;
|
use Symfony\Component\Console\Descriptor\TextDescriptor;
|
||||||
use Symfony\Component\Console\Descriptor\XmlDescriptor;
|
use Symfony\Component\Console\Descriptor\XmlDescriptor;
|
||||||
|
use Symfony\Component\Console\Output\BufferedOutput;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A InputDefinition represents a set of valid command line arguments and options.
|
* A InputDefinition represents a set of valid command line arguments and options.
|
||||||
|
@ -421,8 +422,10 @@ class InputDefinition
|
||||||
public function asText()
|
public function asText()
|
||||||
{
|
{
|
||||||
$descriptor = new TextDescriptor();
|
$descriptor = new TextDescriptor();
|
||||||
|
$output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
|
||||||
|
$descriptor->describe($output, $this, array('raw_output' => true));
|
||||||
|
|
||||||
return $descriptor->describe($this);
|
return $output->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -438,6 +441,13 @@ class InputDefinition
|
||||||
{
|
{
|
||||||
$descriptor = new XmlDescriptor();
|
$descriptor = new XmlDescriptor();
|
||||||
|
|
||||||
return $descriptor->describe($this, array('as_dom' => $asDom));
|
if ($asDom) {
|
||||||
|
return $descriptor->getInputDefinitionDocument($this);
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = new BufferedOutput();
|
||||||
|
$descriptor->describe($output, $this);
|
||||||
|
|
||||||
|
return $output->fetch();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace Symfony\Component\Console\Output;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||||
|
*/
|
||||||
|
class BufferedOutput extends Output
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $buffer = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empties buffer and returns its content.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function fetch()
|
||||||
|
{
|
||||||
|
$content = $this->buffer;
|
||||||
|
$this->buffer = '';
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function doWrite($message, $newline)
|
||||||
|
{
|
||||||
|
$this->buffer .= $message;
|
||||||
|
|
||||||
|
if ($newline) {
|
||||||
|
$this->buffer .= "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,31 +16,32 @@ use Symfony\Component\Console\Command\Command;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\InputDefinition;
|
use Symfony\Component\Console\Input\InputDefinition;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
use Symfony\Component\Console\Output\BufferedOutput;
|
||||||
|
|
||||||
abstract class AbstractDescriptorTest extends \PHPUnit_Framework_TestCase
|
abstract class AbstractDescriptorTest extends \PHPUnit_Framework_TestCase
|
||||||
{
|
{
|
||||||
/** @dataProvider getDescribeInputArgumentTestData */
|
/** @dataProvider getDescribeInputArgumentTestData */
|
||||||
public function testDescribeInputArgument(InputArgument $argument, $expectedDescription)
|
public function testDescribeInputArgument(InputArgument $argument, $expectedDescription)
|
||||||
{
|
{
|
||||||
$this->assertEquals(trim($expectedDescription), trim($this->getDescriptor()->describe($argument)));
|
$this->assertDescription($expectedDescription, $argument);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @dataProvider getDescribeInputOptionTestData */
|
/** @dataProvider getDescribeInputOptionTestData */
|
||||||
public function testDescribeInputOption(InputOption $option, $expectedDescription)
|
public function testDescribeInputOption(InputOption $option, $expectedDescription)
|
||||||
{
|
{
|
||||||
$this->assertEquals(trim($expectedDescription), trim($this->getDescriptor()->describe($option)));
|
$this->assertDescription($expectedDescription, $option);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @dataProvider getDescribeInputDefinitionTestData */
|
/** @dataProvider getDescribeInputDefinitionTestData */
|
||||||
public function testDescribeInputDefinition(InputDefinition $definition, $expectedDescription)
|
public function testDescribeInputDefinition(InputDefinition $definition, $expectedDescription)
|
||||||
{
|
{
|
||||||
$this->assertEquals(trim($expectedDescription), trim($this->getDescriptor()->describe($definition)));
|
$this->assertDescription($expectedDescription, $definition);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @dataProvider getDescribeCommandTestData */
|
/** @dataProvider getDescribeCommandTestData */
|
||||||
public function testDescribeCommand(Command $command, $expectedDescription)
|
public function testDescribeCommand(Command $command, $expectedDescription)
|
||||||
{
|
{
|
||||||
$this->assertEquals(trim($expectedDescription), trim($this->getDescriptor()->describe($command)));
|
$this->assertDescription($expectedDescription, $command);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @dataProvider getDescribeApplicationTestData */
|
/** @dataProvider getDescribeApplicationTestData */
|
||||||
|
@ -53,7 +54,7 @@ abstract class AbstractDescriptorTest extends \PHPUnit_Framework_TestCase
|
||||||
$command->setHelp(str_replace('%command.full_name%', 'app/console %command.name%', $command->getHelp()));
|
$command->setHelp(str_replace('%command.full_name%', 'app/console %command.name%', $command->getHelp()));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->assertEquals(trim($expectedDescription), trim(str_replace(PHP_EOL, "\n", $this->getDescriptor()->describe($application))));
|
$this->assertDescription($expectedDescription, $application);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDescribeInputArgumentTestData()
|
public function getDescribeInputArgumentTestData()
|
||||||
|
@ -94,4 +95,11 @@ abstract class AbstractDescriptorTest extends \PHPUnit_Framework_TestCase
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function assertDescription($expectedDescription, $describedObject)
|
||||||
|
{
|
||||||
|
$output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
|
||||||
|
$this->getDescriptor()->describe($output, $describedObject, array('raw_output' => true));
|
||||||
|
$this->assertEquals(trim($expectedDescription), trim(str_replace(PHP_EOL, "\n", $output->fetch())));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
{"commands":[{"name":"help","usage":"help [--xml] [--format=\"...\"] [--raw] [command_name]","description":"Displays help for a command","help":"The <info>help<\/info> command displays help for a given command:\n\n <info>php app\/console help list<\/info>\n\nYou can also output the help in other formats by using the <comment>--format<\/comment> option:\n\n <info>php app\/console help --format=xml list<\/info>\n\nTo display the list of available commands, please use the <info>list<\/info> command.","aliases":[],"definition":{"arguments":{"command_name":{"name":"command_name","is_required":false,"is_array":false,"description":"The command name","default":"help"}},"options":{"xml":{"name":"--xml","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output help as XML","default":false},"format":{"name":"--format","shortcut":"","accept_value":true,"is_value_required":true,"is_multiple":false,"description":"To output help in other formats","default":null},"raw":{"name":"--raw","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output raw command help","default":false},"help":{"name":"--help","shortcut":"-h","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this help message.","default":false},"quiet":{"name":"--quiet","shortcut":"-q","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not output any message.","default":false},"verbose":{"name":"--verbose","shortcut":"-v|-vv|-vvv","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","default":false},"version":{"name":"--version","shortcut":"-V","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this application version.","default":false},"ansi":{"name":"--ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Force ANSI output.","default":false},"no-ansi":{"name":"--no-ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Disable ANSI output.","default":false},"no-interaction":{"name":"--no-interaction","shortcut":"-n","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not ask any interactive question.","default":false}}}},{"name":"list","usage":"list [--xml] [--raw] [--format=\"...\"] [namespace]","description":"Lists commands","help":"The <info>list<\/info> command lists all commands:\n\n <info>php app\/console list<\/info>\n\nYou can also display the commands for a specific namespace:\n\n <info>php app\/console list test<\/info>\n\nYou can also output the information in other formats by using the <comment>--format<\/comment> option:\n\n <info>php app\/console list --format=xml<\/info>\n\nIt's also possible to get raw list of commands (useful for embedding command runner):\n\n <info>php app\/console list --raw<\/info>","aliases":[],"definition":{"arguments":{"namespace":{"name":"namespace","is_required":false,"is_array":false,"description":"The namespace name","default":null}},"options":{"xml":{"name":"--xml","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output list as XML","default":false},"raw":{"name":"--raw","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output raw command list","default":false},"format":{"name":"--format","shortcut":"","accept_value":true,"is_value_required":true,"is_multiple":false,"description":"To output list in other formats","default":null}}}}],"namespaces":[{"id":"_global","commands":["help","list"]}]}
|
{"commands":[{"name":"help","usage":"help [--xml] [--format=\"...\"] [--raw] [command_name]","description":"Displays help for a command","help":"The <info>help<\/info> command displays help for a given command:\n\n <info>php app\/console help list<\/info>\n\nYou can also output the help in other formats by using the <comment>--format<\/comment> option:\n\n <info>php app\/console help --format=xml list<\/info>\n\nTo display the list of available commands, please use the <info>list<\/info> command.","aliases":[],"definition":{"arguments":{"command_name":{"name":"command_name","is_required":false,"is_array":false,"description":"The command name","default":"help"}},"options":{"xml":{"name":"--xml","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output help as XML","default":false},"format":{"name":"--format","shortcut":"","accept_value":true,"is_value_required":true,"is_multiple":false,"description":"To output help in other formats","default":"txt"},"raw":{"name":"--raw","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output raw command help","default":false},"help":{"name":"--help","shortcut":"-h","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this help message.","default":false},"quiet":{"name":"--quiet","shortcut":"-q","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not output any message.","default":false},"verbose":{"name":"--verbose","shortcut":"-v|-vv|-vvv","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","default":false},"version":{"name":"--version","shortcut":"-V","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this application version.","default":false},"ansi":{"name":"--ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Force ANSI output.","default":false},"no-ansi":{"name":"--no-ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Disable ANSI output.","default":false},"no-interaction":{"name":"--no-interaction","shortcut":"-n","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not ask any interactive question.","default":false}}}},{"name":"list","usage":"list [--xml] [--raw] [--format=\"...\"] [namespace]","description":"Lists commands","help":"The <info>list<\/info> command lists all commands:\n\n <info>php app\/console list<\/info>\n\nYou can also display the commands for a specific namespace:\n\n <info>php app\/console list test<\/info>\n\nYou can also output the information in other formats by using the <comment>--format<\/comment> option:\n\n <info>php app\/console list --format=xml<\/info>\n\nIt's also possible to get raw list of commands (useful for embedding command runner):\n\n <info>php app\/console list --raw<\/info>","aliases":[],"definition":{"arguments":{"namespace":{"name":"namespace","is_required":false,"is_array":false,"description":"The namespace name","default":null}},"options":{"xml":{"name":"--xml","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output list as XML","default":false},"raw":{"name":"--raw","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output raw command list","default":false},"format":{"name":"--format","shortcut":"","accept_value":true,"is_value_required":true,"is_multiple":false,"description":"To output list in other formats","default":"txt"}}}}],"namespaces":[{"id":"_global","commands":["help","list"]}]}
|
||||||
|
|
|
@ -51,7 +51,7 @@ To display the list of available commands, please use the <info>list</info> comm
|
||||||
* Is value required: yes
|
* Is value required: yes
|
||||||
* Is multiple: no
|
* Is multiple: no
|
||||||
* Description: To output help in other formats
|
* Description: To output help in other formats
|
||||||
* Default: `NULL`
|
* Default: `'txt'`
|
||||||
|
|
||||||
**raw:**
|
**raw:**
|
||||||
|
|
||||||
|
@ -196,4 +196,4 @@ It's also possible to get raw list of commands (useful for embedding command run
|
||||||
* Is value required: yes
|
* Is value required: yes
|
||||||
* Is multiple: no
|
* Is multiple: no
|
||||||
* Description: To output list in other formats
|
* Description: To output list in other formats
|
||||||
* Default: `NULL`
|
* Default: `'txt'`
|
||||||
|
|
|
@ -28,7 +28,9 @@
|
||||||
</option>
|
</option>
|
||||||
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
||||||
<description>To output help in other formats</description>
|
<description>To output help in other formats</description>
|
||||||
<defaults/>
|
<defaults>
|
||||||
|
<default>txt</default>
|
||||||
|
</defaults>
|
||||||
</option>
|
</option>
|
||||||
<option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
|
<option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
|
||||||
<description>To output raw command help</description>
|
<description>To output raw command help</description>
|
||||||
|
@ -90,7 +92,9 @@
|
||||||
</option>
|
</option>
|
||||||
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
||||||
<description>To output list in other formats</description>
|
<description>To output list in other formats</description>
|
||||||
<defaults/>
|
<defaults>
|
||||||
|
<default>txt</default>
|
||||||
|
</defaults>
|
||||||
</option>
|
</option>
|
||||||
</options>
|
</options>
|
||||||
</command>
|
</command>
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -58,7 +58,7 @@ To display the list of available commands, please use the <info>list</info> comm
|
||||||
* Is value required: yes
|
* Is value required: yes
|
||||||
* Is multiple: no
|
* Is multiple: no
|
||||||
* Description: To output help in other formats
|
* Description: To output help in other formats
|
||||||
* Default: `NULL`
|
* Default: `'txt'`
|
||||||
|
|
||||||
**raw:**
|
**raw:**
|
||||||
|
|
||||||
|
@ -203,7 +203,7 @@ It's also possible to get raw list of commands (useful for embedding command run
|
||||||
* Is value required: yes
|
* Is value required: yes
|
||||||
* Is multiple: no
|
* Is multiple: no
|
||||||
* Description: To output list in other formats
|
* Description: To output list in other formats
|
||||||
* Default: `NULL`
|
* Default: `'txt'`
|
||||||
|
|
||||||
descriptor:command1
|
descriptor:command1
|
||||||
-------------------
|
-------------------
|
||||||
|
|
|
@ -28,7 +28,9 @@
|
||||||
</option>
|
</option>
|
||||||
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
||||||
<description>To output help in other formats</description>
|
<description>To output help in other formats</description>
|
||||||
<defaults/>
|
<defaults>
|
||||||
|
<default>txt</default>
|
||||||
|
</defaults>
|
||||||
</option>
|
</option>
|
||||||
<option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
|
<option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
|
||||||
<description>To output raw command help</description>
|
<description>To output raw command help</description>
|
||||||
|
@ -90,7 +92,9 @@
|
||||||
</option>
|
</option>
|
||||||
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
||||||
<description>To output list in other formats</description>
|
<description>To output list in other formats</description>
|
||||||
<defaults/>
|
<defaults>
|
||||||
|
<default>txt</default>
|
||||||
|
</defaults>
|
||||||
</option>
|
</option>
|
||||||
</options>
|
</options>
|
||||||
</command>
|
</command>
|
||||||
|
|
|
@ -28,7 +28,9 @@
|
||||||
</option>
|
</option>
|
||||||
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
||||||
<description>To output help in other formats</description>
|
<description>To output help in other formats</description>
|
||||||
<defaults/>
|
<defaults>
|
||||||
|
<default>txt</default>
|
||||||
|
</defaults>
|
||||||
</option>
|
</option>
|
||||||
<option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
|
<option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
|
||||||
<description>To output raw command help</description>
|
<description>To output raw command help</description>
|
||||||
|
@ -90,7 +92,9 @@
|
||||||
</option>
|
</option>
|
||||||
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
<option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
|
||||||
<description>To output list in other formats</description>
|
<description>To output list in other formats</description>
|
||||||
<defaults/>
|
<defaults>
|
||||||
|
<default>txt</default>
|
||||||
|
</defaults>
|
||||||
</option>
|
</option>
|
||||||
</options>
|
</options>
|
||||||
</command>
|
</command>
|
||||||
|
|
|
@ -7,7 +7,7 @@ Arguments:
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
--xml To output help as XML
|
--xml To output help as XML
|
||||||
--format To output help in other formats
|
--format To output help in other formats (default: "txt")
|
||||||
--raw To output raw command help
|
--raw To output raw command help
|
||||||
--help (-h) Display this help message.
|
--help (-h) Display this help message.
|
||||||
--quiet (-q) Do not output any message.
|
--quiet (-q) Do not output any message.
|
||||||
|
@ -27,4 +27,3 @@ Help:
|
||||||
php app/console help --format=xml list
|
php app/console help --format=xml list
|
||||||
|
|
||||||
To display the list of available commands, please use the list command.
|
To display the list of available commands, please use the list command.
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ Arguments:
|
||||||
Options:
|
Options:
|
||||||
--xml To output list as XML
|
--xml To output list as XML
|
||||||
--raw To output raw command list
|
--raw To output raw command list
|
||||||
--format To output list in other formats
|
--format To output list in other formats (default: "txt")
|
||||||
|
|
||||||
Help:
|
Help:
|
||||||
The list command lists all commands:
|
The list command lists all commands:
|
||||||
|
@ -25,4 +25,3 @@ Help:
|
||||||
It's also possible to get raw list of commands (useful for embedding command runner):
|
It's also possible to get raw list of commands (useful for embedding command runner):
|
||||||
|
|
||||||
php app/console list --raw
|
php app/console list --raw
|
||||||
|
|
||||||
|
|
Reference in New Issue