Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
moved some code to the component
  • Loading branch information
schmittjoh committed Sep 20, 2012
1 parent ad91b3b commit 6bafe5a
Show file tree
Hide file tree
Showing 2 changed files with 178 additions and 154 deletions.
Expand Up @@ -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;
Expand All @@ -26,8 +27,6 @@
*/
class ConfigDumpReferenceCommand extends ContainerDebugCommand
{
protected $output;

/**
* @see Command
*/
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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));
}
}
175 changes: 175 additions & 0 deletions src/Symfony/Component/Config/Definition/ReferenceDumper.php
@@ -0,0 +1,175 @@
<?php

namespace Symfony\Component\Config\Definition;

/**
* Dumps a reference configuration for the given configuration/node instance.
*
* Currently, only YML format is supported.
*
* @author Kevin Bond <kevinbond@gmail.com>
*/
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);
}
}
}
}

0 comments on commit 6bafe5a

Please sign in to comment.