Bläddra i källkod

[Config] [DependencyInjection] removed DependencyInjection dependency in Config, fix tests

Martin Hason 14 år sedan
förälder
incheckning
d231a8a8d5

+ 3 - 4
src/Symfony/Component/Config/Definition/ArrayNode.php

@@ -15,7 +15,6 @@ use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
 use Symfony\Component\Config\Definition\Exception\DuplicateKeyException;
 use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
 use Symfony\Component\Config\Definition\Exception\UnsetKeyException;
-use Symfony\Component\DependencyInjection\Extension\Extension;
 
 /**
  * Represents an ARRAY node in the config tree.
@@ -237,7 +236,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
     /**
      * Sets the node prototype.
      *
-     * @param PrototypeNodeInterface $node 
+     * @param PrototypeNodeInterface $node
      * @throws \RuntimeException if the node doesn't have concrete children
      */
     public function setPrototype(PrototypeNodeInterface $node)
@@ -276,7 +275,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
     /**
      * Finalises the value of this node.
      *
-     * @param mixed $value 
+     * @param mixed $value
      * @return mixed The finalised value
      * @throws UnsetKeyException
      * @throws InvalidConfigurationException if the node doesn't have enough children
@@ -374,7 +373,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
                 continue;
             }
 
-            $value[$plural] = Extension::normalizeConfig($value, $singular, $plural);
+            $value[$plural] = Processor::normalizeConfig($value, $singular, $plural);
             unset($value[$singular]);
         }
 

+ 1 - 1
src/Symfony/Component/Config/Definition/Builder/NodeBuilder.php

@@ -113,7 +113,7 @@ class NodeBuilder
      *         ->node('baz', 'scalar')
      *     ;
      *
-     * @return Symfony\Component\DependencyInjection\Configuration\Builder\NodeBuilder This builder node
+     * @return Symfony\Component\Config\Definition\Builder\NodeBuilder This builder node
      */
     public function builder(NodeBuilder $node)
     {

+ 74 - 3
src/Symfony/Component/Config/Definition/Processor.php

@@ -11,8 +11,6 @@
 
 namespace Symfony\Component\Config\Definition;
 
-use Symfony\Component\DependencyInjection\Extension\Extension;
-
 /**
  * This class is the entry point for config normalization/merging/finalization.
  *
@@ -29,7 +27,7 @@ class Processor
      */
     public function process(NodeInterface $configTree, array $configs)
     {
-        $configs = Extension::normalizeKeys($configs);
+        $configs = self::normalizeKeys($configs);
 
         $currentConfig = array();
         foreach ($configs as $config) {
@@ -39,4 +37,77 @@ class Processor
 
         return $configTree->finalize($currentConfig);
     }
+
+    /**
+     * This method normalizes keys between the different configuration formats
+     *
+     * Namely, you mostly have foo_bar in YAML while you have foo-bar in XML.
+     * After running this method, all keys are normalized to foo_bar.
+     *
+     * If you have a mixed key like foo-bar_moo, it will not be altered.
+     * The key will also not be altered if the target key already exists.
+     *
+     * @param array $config
+     *
+     * @return array the config with normalized keys
+     */
+    public static function normalizeKeys(array $config)
+    {
+        foreach ($config as $key => $value) {
+            if (is_array($value)) {
+                $config[$key] = self::normalizeKeys($value);
+            }
+
+            if (false !== strpos($key, '-') && false === strpos($key, '_') && !array_key_exists($normalizedKey = str_replace('-', '_', $key), $config)) {
+                $config[$normalizedKey] = $config[$key];
+                unset($config[$key]);
+            }
+        }
+
+        return $config;
+    }
+
+    /**
+     * Normalizes a configuration entry.
+     *
+     * This method returns a normalize configuration array for a given key
+     * to remove the differences due to the original format (YAML and XML mainly).
+     *
+     * Here is an example.
+     *
+     * The configuration is XML:
+     *
+     * <twig:extension id="twig.extension.foo" />
+     * <twig:extension id="twig.extension.bar" />
+     *
+     * And the same configuration in YAML:
+     *
+     * twig.extensions: ['twig.extension.foo', 'twig.extension.bar']
+     *
+     * @param array  $config A config array
+     * @param string $key    The key to normalize
+     * @param string $plural The plural form of the key if it is irregular
+     *
+     * @return array
+     */
+    public static function normalizeConfig($config, $key, $plural = null)
+    {
+        if (null === $plural) {
+            $plural = $key.'s';
+        }
+
+        $values = array();
+        if (isset($config[$plural])) {
+            $values = $config[$plural];
+        } elseif (isset($config[$key])) {
+            if (is_string($config[$key]) || !is_int(key($config[$key]))) {
+                // only one
+                $values = array($config[$key]);
+            } else {
+                $values = $config[$key];
+            }
+        }
+
+        return $values;
+    }
 }

+ 51 - 55
tests/Symfony/Tests/Component/DependencyInjection/Extension/ExtensionTest.php

@@ -1,55 +1,51 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Tests\Component\DependencyInjection\Extension;
-
-use Symfony\Component\DependencyInjection\Extension\Extension;
-
-require_once __DIR__.'/../Fixtures/includes/ProjectExtension.php';
-
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-
-class ExtensionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @dataProvider getKeyNormalizationTests
-     */
-    public function testNormalizeKeys($denormalized, $normalized)
-    {
-        $this->assertSame($normalized, Extension::normalizeKeys($denormalized));
-    }
-
-    public function getKeyNormalizationTests()
-    {
-        return array(
-            array(
-                array('foo-bar' => 'foo'),
-                array('foo_bar' => 'foo'),
-            ),
-            array(
-                array('foo-bar_moo' => 'foo'),
-                array('foo-bar_moo' => 'foo'),
-            ),
-            array(
-                array('foo-bar' => null, 'foo_bar' => 'foo'),
-                array('foo-bar' => null, 'foo_bar' => 'foo'),
-            ),
-            array(
-                array('foo-bar' => array('foo-bar' => 'foo')),
-                array('foo_bar' => array('foo_bar' => 'foo')),
-            ),
-            array(
-                array('foo_bar' => array('foo-bar' => 'foo')),
-                array('foo_bar' => array('foo_bar' => 'foo')),
-            )
-        );
-    }
-}
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Tests\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Processor;
+
+class ProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getKeyNormalizationTests
+     */
+    public function testNormalizeKeys($denormalized, $normalized)
+    {
+        $this->assertSame($normalized, Processor::normalizeKeys($denormalized));
+    }
+
+    public function getKeyNormalizationTests()
+    {
+        return array(
+            array(
+                array('foo-bar' => 'foo'),
+                array('foo_bar' => 'foo'),
+            ),
+            array(
+                array('foo-bar_moo' => 'foo'),
+                array('foo-bar_moo' => 'foo'),
+            ),
+            array(
+                array('foo-bar' => null, 'foo_bar' => 'foo'),
+                array('foo-bar' => null, 'foo_bar' => 'foo'),
+            ),
+            array(
+                array('foo-bar' => array('foo-bar' => 'foo')),
+                array('foo_bar' => array('foo_bar' => 'foo')),
+            ),
+            array(
+                array('foo_bar' => array('foo-bar' => 'foo')),
+                array('foo_bar' => array('foo_bar' => 'foo')),
+            )
+        );
+    }
+}