Completed
Push — master ( b61e2e...b32211 )
by Alessandro
11s
created

ParallelConfiguration::tagEventSubscribers()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 12
ccs 6
cts 6
cp 1
rs 9.4285
c 1
b 0
f 0
cc 3
eloc 6
nc 3
nop 1
crap 3
1
<?php
2
declare(strict_types=1);
3
4
namespace Paraunit\Configuration;
5
6
use Symfony\Component\Config\FileLocator;
7
use Symfony\Component\Console\Input\InputInterface;
8
use Symfony\Component\Console\Output\OutputInterface;
9
use Symfony\Component\DependencyInjection\ContainerBuilder;
10
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
11
use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
12
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
13
14
/**
15
 * Class Paraunit
16
 * @package Paraunit\Configuration
17
 */
18
class ParallelConfiguration
19
{
20
    const TAG_EVENT_SUBSCRIBER = 'paraunit.event_subscriber';
21
22
    /**
23
     * @param InputInterface $input
24
     * @param OutputInterface $output
25
     * @return ContainerBuilder
26
     * @throws \Symfony\Component\DependencyInjection\Exception\BadMethodCallException
27
     * @throws \Exception
28
     */
29 56
    public function buildContainer(InputInterface $input, OutputInterface $output): ContainerBuilder
30
    {
31 56
        $containerBuilder = new ContainerBuilder();
32
33 56
        $this->injectOutput($containerBuilder, $output);
34 56
        $this->loadYamlConfiguration($containerBuilder);
35 56
        $this->loadCommandLineOptions($containerBuilder, $input);
36 56
        $this->tagEventSubscribers($containerBuilder);
37
38 56
        $containerBuilder->compile();
39
40 56
        $this->loadPostCompileSettings($containerBuilder, $input);
41
42 56
        return $containerBuilder;
43
    }
44
45
    /**
46
     * @param ContainerBuilder $containerBuilder
47
     * @return YamlFileLoader
48
     * @throws \Exception
49
     */
50 56
    protected function loadYamlConfiguration(ContainerBuilder $containerBuilder): YamlFileLoader
51
    {
52 56
        $loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__ . '/../Resources/config/'));
53 56
        $loader->load('configuration.yml');
54 56
        $loader->load('file.yml');
55 56
        $loader->load('parser.yml');
56 56
        $loader->load('printer.yml');
57 56
        $loader->load('process.yml');
58 56
        $loader->load('runner.yml');
59 56
        $loader->load('services.yml');
60 56
        $loader->load('test_result.yml');
61 56
        $loader->load('test_result_container.yml');
62 56
        $loader->load('test_result_format.yml');
63
64 56
        return $loader;
65
    }
66
67 56
    protected function tagEventSubscribers(ContainerBuilder $container)
68
    {
69 56
        $container->addCompilerPass(new RegisterListenersPass('event_dispatcher', null, self::TAG_EVENT_SUBSCRIBER));
70
71 56
        foreach ($container->getDefinitions() as $definition) {
72 56
            $reflection = new \ReflectionClass($definition->getClass());
73
74 56
            if ($reflection->implementsInterface(EventSubscriberInterface::class)) {
75 56
                $definition->addTag(self::TAG_EVENT_SUBSCRIBER);
76
            }
77
        }
78
    }
79
80 56
    protected function loadCommandLineOptions(ContainerBuilder $containerBuilder, InputInterface $input)
81
    {
82 56
        $containerBuilder->setParameter('paraunit.max_process_count', $input->getOption('parallel'));
83 56
        $containerBuilder->setParameter('paraunit.phpunit_config_filename', $input->getOption('configuration') ?? '.');
84 56
        $containerBuilder->setParameter('paraunit.testsuite', $input->getOption('testsuite'));
85 56
        $containerBuilder->setParameter('paraunit.string_filter', $input->getArgument('stringFilter'));
86
    }
87
88
    protected function loadPostCompileSettings(ContainerBuilder $container, InputInterface $input)
89
    {
90
    }
91
92 56
    private function injectOutput(ContainerBuilder $containerBuilder, OutputInterface $output)
93
    {
94 56
        $containerBuilder->register('output')
95 56
            ->setSynthetic(true);
96
97 56
        $containerBuilder->set('output', $output);
98
    }
99
}
100