NoExtension   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 11

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 11
dl 0
loc 62
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A process() 0 3 1
A getConfigKey() 0 4 1
A initialize() 0 3 1
A configure() 0 7 1
A load() 0 6 1
A loadImports() 0 15 2
A loadParameters() 0 6 2
A loadArgumentResolver() 0 8 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Zalas\Behat\NoExtension\ServiceContainer;
5
6
use Behat\Testwork\ServiceContainer\Extension;
7
use Behat\Testwork\ServiceContainer\ExtensionManager;
8
use Psr\Container\ContainerInterface;
9
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
10
use Symfony\Component\Config\FileLocator;
11
use Symfony\Component\Config\Loader\DelegatingLoader;
12
use Symfony\Component\Config\Loader\LoaderResolver;
13
use Symfony\Component\DependencyInjection\ContainerBuilder;
14
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
15
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
16
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
17
use Symfony\Component\DependencyInjection\Reference;
18
use Zalas\Behat\NoExtension\Context\Argument\ServiceArgumentResolver;
19
20
final class NoExtension implements Extension
21
{
22
    public function process(ContainerBuilder $container)
23
    {
24
    }
25
26
    public function getConfigKey()
27
    {
28
        return 'no';
29
    }
30
31
    public function initialize(ExtensionManager $extensionManager)
32
    {
33
    }
34
35
    public function configure(ArrayNodeDefinition $builder)
36
    {
37
        $config = $builder->children();
38
        $config->arrayNode('imports')->prototype('scalar');
39
        $config->arrayNode('parameters')->prototype('variable');
40
        $config->booleanNode('argument_resolver')->defaultFalse();
41
    }
42
43
    public function load(ContainerBuilder $container, array $config)
44
    {
45
        $this->loadImports($container, $config);
46
        $this->loadParameters($container, $config);
47
        $this->loadArgumentResolver($container, $config);
48
    }
49
50
    private function loadImports(ContainerBuilder $container, array $config): void
51
    {
52
        $basePath = $container->getParameter('paths.base');
53
        $resolver = new LoaderResolver([
54
            new YamlFileLoader($container, new FileLocator($basePath)),
55
            new PhpFileLoader($container, new FileLocator($basePath)),
56
            new XmlFileLoader($container, new FileLocator($basePath)),
57
        ]);
58
        $loader = new DelegatingLoader($resolver);
59
60
        foreach ($config['imports'] as $file) {
61
            $file = \str_replace('%paths.base%', $basePath, $file);
62
            $loader->load($file);
63
        }
64
    }
65
66
    private function loadParameters(ContainerBuilder $container, array $config): void
67
    {
68
        foreach ($config['parameters'] as $name => $value) {
69
            $container->setParameter($name, $value);
70
        }
71
    }
72
73
    private function loadArgumentResolver(ContainerBuilder $container, array $config): void
74
    {
75
        if ($config['argument_resolver']) {
76
            $container->register(ServiceArgumentResolver::class)
77
                ->addArgument(new Reference(ContainerInterface::class))
78
                ->addTag('context.argument_resolver');
79
        }
80
    }
81
}
82