namespace Symfony\Component\Config\Definition\Dumper;
-use Symfony\Component\Config\Definition\ConfigurationInterface;
-use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\ArrayNode;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\EnumNode;
+use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\PrototypedArrayNode;
+use Symfony\Component\Config\Definition\ScalarNode;
use Symfony\Component\Yaml\Inline;
/**
return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree());
}
+ public function dumpAtPath(ConfigurationInterface $configuration, $path)
+ {
+ $rootNode = $node = $configuration->getConfigTreeBuilder()->buildTree();
+
+ foreach (explode('.', $path) as $step) {
+ if (!$node instanceof ArrayNode) {
+ throw new \UnexpectedValueException(sprintf('Unable to find node at path "%s.%s"', $rootNode->getName(), $path));
+ }
+
+ /** @var NodeInterface[] $children */
+ $children = $node instanceof PrototypedArrayNode ? $this->getPrototypeChildren($node) : $node->getChildren();
+
+ foreach ($children as $child) {
+ if ($child->getName() === $step) {
+ $node = $child;
+
+ continue 2;
+ }
+ }
+
+ throw new \UnexpectedValueException(sprintf('Unable to find node at path "%s.%s"', $rootNode->getName(), $path));
+ }
+
+ return $this->dumpNode($node);
+ }
+
public function dumpNode(NodeInterface $node)
{
$this->reference = '';
}
/**
- * @param NodeInterface $node
- * @param int $depth
+ * @param NodeInterface $node
+ * @param NodeInterface|null $parentNode
+ * @param int $depth
+ * @param bool $prototypedArray
*/
- private function writeNode(NodeInterface $node, $depth = 0)
+ private function writeNode(NodeInterface $node, NodeInterface $parentNode = null, $depth = 0, $prototypedArray = false)
{
$comments = array();
$default = '';
$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()) {
- $keyNodeClass = 'Symfony\Component\Config\Definition\\'.($prototype instanceof ArrayNode ? 'ArrayNode' : 'ScalarNode');
- $keyNode = new $keyNodeClass($key, $node);
-
- $info = 'Prototype';
- if (null !== $prototype->getInfo()) {
- $info .= ': '.$prototype->getInfo();
- }
- $keyNode->setInfo($info);
-
- // add children
- foreach ($children as $childNode) {
- $keyNode->addChild($childNode);
- }
- $children = array($key => $keyNode);
- }
+ $children = $this->getPrototypeChildren($node);
}
if (!$children) {
- if ($node->hasDefaultValue() && count($defaultArray = $node->getDefaultValue())) {
+ if ($node->hasDefaultValue() && \count($defaultArray = $node->getDefaultValue())) {
$default = '';
- } elseif (!is_array($example)) {
+ } elseif (!\is_array($example)) {
$default = '[]';
}
}
if ($node->hasDefaultValue()) {
$default = $node->getDefaultValue();
- if (is_array($default)) {
- if (count($defaultArray = $node->getDefaultValue())) {
+ if (\is_array($default)) {
+ if (\count($defaultArray = $node->getDefaultValue())) {
$default = '';
- } elseif (!is_array($example)) {
+ } elseif (!\is_array($example)) {
$default = '[]';
}
} else {
$comments[] = 'Required';
}
+ // deprecated?
+ if ($node->isDeprecated()) {
+ $comments[] = sprintf('Deprecated (%s)', $node->getDeprecationMessage($node->getName(), $parentNode ? $parentNode->getPath() : $node->getPath()));
+ }
+
// example
- if ($example && !is_array($example)) {
+ if ($example && !\is_array($example)) {
$comments[] = 'Example: '.$example;
}
- $default = (string) $default != '' ? ' '.$default : '';
- $comments = count($comments) ? '# '.implode(', ', $comments) : '';
+ $default = '' != (string) $default ? ' '.$default : '';
+ $comments = \count($comments) ? '# '.implode(', ', $comments) : '';
- $text = rtrim(sprintf('%-21s%s %s', $node->getName().':', $default, $comments), ' ');
+ $key = $prototypedArray ? '-' : $node->getName().':';
+ $text = rtrim(sprintf('%-21s%s %s', $key, $default, $comments), ' ');
if ($info = $node->getInfo()) {
$this->writeLine('');
if ($defaultArray) {
$this->writeLine('');
- $message = count($defaultArray) > 1 ? 'Defaults' : 'Default';
+ $message = \count($defaultArray) > 1 ? 'Defaults' : 'Default';
$this->writeLine('# '.$message.':', $depth * 4 + 4);
$this->writeArray($defaultArray, $depth + 1);
}
- if (is_array($example)) {
+ if (\is_array($example)) {
$this->writeLine('');
- $message = count($example) > 1 ? 'Examples' : 'Example';
+ $message = \count($example) > 1 ? 'Examples' : 'Example';
$this->writeLine('# '.$message.':', $depth * 4 + 4);
if ($children) {
foreach ($children as $childNode) {
- $this->writeNode($childNode, $depth + 1);
+ $this->writeNode($childNode, $node, $depth + 1, $node instanceof PrototypedArrayNode && !$node->getKeyAttribute());
}
}
}
*/
private function writeLine($text, $indent = 0)
{
- $indent = strlen($text) + $indent;
+ $indent = \strlen($text) + $indent;
$format = '%'.$indent.'s';
$this->reference .= sprintf($format, $text)."\n";
$isIndexed = array_values($array) === $array;
foreach ($array as $key => $value) {
- if (is_array($value)) {
+ if (\is_array($value)) {
$val = '';
} else {
$val = $value;
$this->writeLine(sprintf('%-20s %s', $key.':', $val), $depth * 4);
}
- if (is_array($value)) {
+ if (\is_array($value)) {
$this->writeArray($value, $depth + 1);
}
}
}
+
+ /**
+ * @param PrototypedArrayNode $node
+ *
+ * @return array
+ */
+ private function getPrototypeChildren(PrototypedArrayNode $node)
+ {
+ $prototype = $node->getPrototype();
+ $key = $node->getKeyAttribute();
+
+ // Do not expand prototype if it isn't an array node nor uses attribute as key
+ if (!$key && !$prototype instanceof ArrayNode) {
+ return $node->getChildren();
+ }
+
+ if ($prototype instanceof ArrayNode) {
+ $keyNode = new ArrayNode($key, $node);
+ $children = $prototype->getChildren();
+
+ if ($prototype instanceof PrototypedArrayNode && $prototype->getKeyAttribute()) {
+ $children = $this->getPrototypeChildren($prototype);
+ }
+
+ // add children
+ foreach ($children as $childNode) {
+ $keyNode->addChild($childNode);
+ }
+ } else {
+ $keyNode = new ScalarNode($key, $node);
+ }
+
+ $info = 'Prototype';
+ if (null !== $prototype->getInfo()) {
+ $info .= ': '.$prototype->getInfo();
+ }
+ $keyNode->setInfo($info);
+
+ return array($key => $keyNode);
+ }
}