From 6bafe5a635ff9970c50309d285e53016d938d2be Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Thu, 20 Sep 2012 13:28:43 +0200 Subject: [PATCH] moved some code to the component --- .../Command/ConfigDumpReferenceCommand.php | 157 +--------------- .../Config/Definition/ReferenceDumper.php | 175 ++++++++++++++++++ 2 files changed, 178 insertions(+), 154 deletions(-) create mode 100644 src/Symfony/Component/Config/Definition/ReferenceDumper.php diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php index 36c0593a84ed..3036bdbc0441 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php @@ -11,6 +11,7 @@ namespace Symfony\Bundle\FrameworkBundle\Command; +use Symfony\Component\Config\Definition\ReferenceDumper; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -26,8 +27,6 @@ */ class ConfigDumpReferenceCommand extends ContainerDebugCommand { - protected $output; - /** * @see Command */ @@ -61,7 +60,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->output = $output; $bundles = $this->getContainer()->get('kernel')->getBundles(); $containerBuilder = $this->getContainerBuilder(); @@ -112,158 +110,9 @@ protected function execute(InputInterface $input, OutputInterface $output) '" should implement ConfigurationInterface in order to be dumpable'); } - $rootNode = $configuration->getConfigTreeBuilder()->buildTree(); - $output->writeln($message); - // root node - $this->outputNode($rootNode); - } - - /** - * Outputs a single config reference line - * - * @param string $text - * @param int $indent - */ - private function outputLine($text, $indent = 0) - { - $indent = strlen($text) + $indent; - - $format = '%'.$indent.'s'; - - $this->output->writeln(sprintf($format, $text)); - } - - private function outputArray(array $array, $depth) - { - $isIndexed = array_values($array) === $array; - - foreach ($array as $key => $value) { - if (is_array($value)) { - $val = ''; - } else { - $val = $value; - } - - if ($isIndexed) { - $this->outputLine('- '.$val, $depth * 4); - } else { - $this->outputLine(sprintf('%-20s %s', $key.':', $val), $depth * 4); - } - - if (is_array($value)) { - $this->outputArray($value, $depth + 1); - } - } - } - - /** - * @param NodeInterface $node - * @param int $depth - */ - private function outputNode(NodeInterface $node, $depth = 0) - { - $comments = array(); - $default = ''; - $defaultArray = null; - $children = null; - $example = $node->getExample(); - - // defaults - if ($node instanceof ArrayNode) { - $children = $node->getChildren(); - - if ($node instanceof PrototypedArrayNode) { - $prototype = $node->getPrototype(); - - if ($prototype instanceof ArrayNode) { - $children = $prototype->getChildren(); - } - - // check for attribute as key - if ($key = $node->getKeyAttribute()) { - $keyNode = new ArrayNode($key, $node); - $keyNode->setInfo('Prototype'); - - // add children - foreach ($children as $childNode) { - $keyNode->addChild($childNode); - } - $children = array($key => $keyNode); - } - } - - if (!$children) { - if ($node->hasDefaultValue() && count($defaultArray = $node->getDefaultValue())) { - $default = ''; - } elseif (!is_array($example)) { - $default = '[]'; - } - } - } else { - $default = '~'; - - if ($node->hasDefaultValue()) { - $default = $node->getDefaultValue(); - - if (true === $default) { - $default = 'true'; - } elseif (false === $default) { - $default = 'false'; - } elseif (null === $default) { - $default = '~'; - } - } - } - - // required? - if ($node->isRequired()) { - $comments[] = 'Required'; - } - - // example - if ($example && !is_array($example)) { - $comments[] = 'Example: '.$example; - } - - $default = (string) $default != '' ? ' '.$default : ''; - $comments = count($comments) ? '# '.implode(', ', $comments) : ''; - - $text = sprintf('%-20s %s %s', $node->getName().':', $default, $comments); - - if ($info = $node->getInfo()) { - $this->outputLine(''); - $this->outputLine('# '.$info, $depth * 4); - } - - $this->outputLine($text, $depth * 4); - - // output defaults - if ($defaultArray) { - $this->outputLine(''); - - $message = count($defaultArray) > 1 ? 'Defaults' : 'Default'; - - $this->outputLine('# '.$message.':', $depth * 4 + 4); - - $this->outputArray($defaultArray, $depth + 1); - } - - if (is_array($example)) { - $this->outputLine(''); - - $message = count($example) > 1 ? 'Examples' : 'Example'; - - $this->outputLine('# '.$message.':', $depth * 4 + 4); - - $this->outputArray($example, $depth + 1); - } - - if ($children) { - foreach ($children as $childNode) { - $this->outputNode($childNode, $depth + 1); - } - } + $dumper = new ReferenceDumper(); + $output->writeln($dumper->dump($configuration)); } } diff --git a/src/Symfony/Component/Config/Definition/ReferenceDumper.php b/src/Symfony/Component/Config/Definition/ReferenceDumper.php new file mode 100644 index 000000000000..6c4312db109a --- /dev/null +++ b/src/Symfony/Component/Config/Definition/ReferenceDumper.php @@ -0,0 +1,175 @@ + + */ +class ReferenceDumper +{ + private $reference; + + public function dump(ConfigurationInterface $configuration) + { + return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree()); + } + + public function dumpNode(NodeInterface $node) + { + $this->reference = ''; + $this->writeNode($node); + $ref = $this->reference; + $this->reference = null; + + return $ref; + } + + /** + * @param int $depth + */ + private function writeNode(NodeInterface $node, $depth = 0) + { + $comments = array(); + $default = ''; + $defaultArray = null; + $children = null; + $example = $node->getExample(); + + // defaults + if ($node instanceof ArrayNode) { + $children = $node->getChildren(); + + if ($node instanceof PrototypedArrayNode) { + $prototype = $node->getPrototype(); + + if ($prototype instanceof ArrayNode) { + $children = $prototype->getChildren(); + } + + // check for attribute as key + if ($key = $node->getKeyAttribute()) { + $keyNode = new ArrayNode($key, $node); + $keyNode->setInfo('Prototype'); + + // add children + foreach ($children as $childNode) { + $keyNode->addChild($childNode); + } + $children = array($key => $keyNode); + } + } + + if (!$children) { + if ($node->hasDefaultValue() && count($defaultArray = $node->getDefaultValue())) { + $default = ''; + } elseif (!is_array($example)) { + $default = '[]'; + } + } + } else { + $default = '~'; + + if ($node->hasDefaultValue()) { + $default = $node->getDefaultValue(); + + if (true === $default) { + $default = 'true'; + } elseif (false === $default) { + $default = 'false'; + } elseif (null === $default) { + $default = '~'; + } + } + } + + // required? + if ($node->isRequired()) { + $comments[] = 'Required'; + } + + // example + if ($example && !is_array($example)) { + $comments[] = 'Example: '.$example; + } + + $default = (string) $default != '' ? ' '.$default : ''; + $comments = count($comments) ? '# '.implode(', ', $comments) : ''; + + $text = sprintf('%-20s %s %s', $node->getName().':', $default, $comments); + + if ($info = $node->getInfo()) { + $this->writeLine(''); + $this->writeLine('# '.$info, $depth * 4); + } + + $this->writeLine($text, $depth * 4); + + // output defaults + if ($defaultArray) { + $this->writeLine(''); + + $message = count($defaultArray) > 1 ? 'Defaults' : 'Default'; + + $this->writeLine('# '.$message.':', $depth * 4 + 4); + + $this->writeArray($defaultArray, $depth + 1); + } + + if (is_array($example)) { + $this->writeLine(''); + + $message = count($example) > 1 ? 'Examples' : 'Example'; + + $this->writeLine('# '.$message.':', $depth * 4 + 4); + + $this->writeArray($example, $depth + 1); + } + + if ($children) { + foreach ($children as $childNode) { + $this->writeNode($childNode, $depth + 1); + } + } + } + + /** + * Outputs a single config reference line + * + * @param string $text + * @param int $indent + */ + private function writeLine($text, $indent = 0) + { + $indent = strlen($text) + $indent; + $format = '%'.$indent.'s'; + + $this->reference .= sprintf($format, $text)."\n"; + } + + private function writeArray(array $array, $depth) + { + $isIndexed = array_values($array) === $array; + + foreach ($array as $key => $value) { + if (is_array($value)) { + $val = ''; + } else { + $val = $value; + } + + if ($isIndexed) { + $this->writeLine('- '.$val, $depth * 4); + } else { + $this->writeLine(sprintf('%-20s %s', $key.':', $val), $depth * 4); + } + + if (is_array($value)) { + $this->writeArray($value, $depth + 1); + } + } + } +} \ No newline at end of file