diff --git a/spec/Tacker/Loader/ProcessorLoaderSpec.php b/spec/Tacker/Loader/ProcessorLoaderSpec.php new file mode 100644 index 0000000..50a6fee --- /dev/null +++ b/spec/Tacker/Loader/ProcessorLoaderSpec.php @@ -0,0 +1,51 @@ +beConstructedWith($loader, $configuration); + } + + function it_is_initializable() + { + $this->shouldHaveType('Tacker\Loader\ProcessorLoader'); + } + + function it_processes_configuration($loader, $configuration) + { + $builder = new TreeBuilder; + $root = $builder->root(''); + $root + ->children() + ->booleanNode('auto_connect') + ->defaultTrue() + ->end() + ->end() + ; + + + $configuration->getConfigTreeBuilder()->willReturn($builder); + + $loader->load('file', null)->willReturn([]); + + $this->load('file')->shouldReturn(['auto_connect' => true]); + } + + function it_delegates_supports_to_loader($loader) + { + $loader->supports('php', null)->willReturn(false)->shouldBeCalled(); + $loader->supports('yml', null)->willReturn(true)->shouldBeCalled(); + + $this->supports('php')->shouldReturn(false); + $this->supports('yml')->shouldReturn(true); + } +} diff --git a/src/Loader/ProcessorLoader.php b/src/Loader/ProcessorLoader.php new file mode 100644 index 0000000..82b974c --- /dev/null +++ b/src/Loader/ProcessorLoader.php @@ -0,0 +1,38 @@ +loader = $loader; + $this->configuration = $configuration; + } + + public function load($resource, $type = null) + { + $parameters = $this->loader->load($resource, $type); + + return $this->processConfiguration($parameters); + } + + public function supports($resource, $type = null) + { + return $this->loader->supports($resource, $type); + } + + private function processConfiguration(array $parameters) + { + $processor = new Processor; + + return $processor->processConfiguration($this->configuration, [$parameters]); + } +} diff --git a/src/LoaderBuilder.php b/src/LoaderBuilder.php index 5ce0b87..b5b9f0f 100644 --- a/src/LoaderBuilder.php +++ b/src/LoaderBuilder.php @@ -3,12 +3,14 @@ namespace Tacker; use Symfony\Component\Config\FileLocator; +use Symfony\Component\Config\Definition\ConfigurationInterface; use Symfony\Component\Config\Loader\LoaderResolver; use Symfony\Component\Config\Loader\DelegatingLoader; use Tacker\Loader\CacheLoader; use Tacker\Loader\IniFileLoader; use Tacker\Loader\JsonFileLoader; use Tacker\Loader\NormalizerLoader; +use Tacker\Loader\ProcessorLoader; use Tacker\Loader\PhpFileLoader; use Tacker\Loader\YamlFileLoader; use Tacker\Normalizer\ChainNormalizer; @@ -26,6 +28,7 @@ final class LoaderBuilder private $normalizer; private $resolver; private $resources; + private $configuration; private $locator; private $debug; private $cacheDir; @@ -79,6 +82,11 @@ public function setDebug($debug) return $this; } + public function setConfiguration(ConfigurationInterface $configuration) + { + $this->configuration = $configuration; + } + public function build() { if (false == $this->resolverConfigured) { @@ -89,7 +97,13 @@ public function build() $this->addDefaultNormalizers(); } - $loader = new CacheLoader($this->createNormalizerLoader(), $this->resources); + $loader = $this->createNormalizerLoader(); + + if ($this->configuration) { + $loader = new ProcessorLoader($loader, $this->configuration); + } + + $loader = new CacheLoader($loader, $this->resources); $loader->setCacheDir($this->cacheDir); $loader->setDebug($this->debug);