Completed
Pull Request — master (#94)
by Alessandro
05:58
created

ParallelConfiguration::loadYamlConfiguration()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 16
ccs 13
cts 13
cp 1
rs 9.4285
cc 1
eloc 13
nc 1
nop 1
crap 1
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 55
    public function buildContainer(InputInterface $input, OutputInterface $output): ContainerBuilder
30
    {
31 55
        $containerBuilder = new ContainerBuilder();
32
33 55
        $this->injectOutput($containerBuilder, $output);
34 55
        $this->loadYamlConfiguration($containerBuilder);
35 55
        $this->loadCommandLineOptions($containerBuilder, $input);
36 55
        $this->tagEventSubscribers($containerBuilder);
37
38 55
        $containerBuilder->compile();
39
40 55
        $this->loadPostCompileSettings($containerBuilder, $input);
41
42 55
        return $containerBuilder;
43
    }
44
45
    /**
46
     * @param ContainerBuilder $containerBuilder
47
     * @return YamlFileLoader
48
     * @throws \Exception
49
     */
50 55
    protected function loadYamlConfiguration(ContainerBuilder $containerBuilder): YamlFileLoader
51
    {
52 55
        $loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__ . '/../Resources/config/'));
53 55
        $loader->load('configuration.yml');
54 55
        $loader->load('file.yml');
55 55
        $loader->load('parser.yml');
56 55
        $loader->load('printer.yml');
57 55
        $loader->load('process.yml');
58 55
        $loader->load('runner.yml');
59 55
        $loader->load('services.yml');
60 55
        $loader->load('test_result.yml');
61 55
        $loader->load('test_result_container.yml');
62 55
        $loader->load('test_result_format.yml');
63
64 55
        return $loader;
65
    }
66
67 55
    protected function tagEventSubscribers(ContainerBuilder $container)
68
    {
69 55
        $container->addCompilerPass(new RegisterListenersPass('event_dispatcher', null, self::TAG_EVENT_SUBSCRIBER));
70
71 55
        foreach ($container->getDefinitions() as $definition) {
72 55
            $reflection = new \ReflectionClass($definition->getClass());
73
74 55
            if ($reflection->implementsInterface(EventSubscriberInterface::class)) {
75 55
                $definition->addTag(self::TAG_EVENT_SUBSCRIBER);
76
            }
77
        }
78
    }
79
80 55
    protected function loadCommandLineOptions(ContainerBuilder $containerBuilder, InputInterface $input)
81
    {
82 55
        $containerBuilder->setParameter('paraunit.max_process_count', $input->getOption('parallel'));
83 55
        $containerBuilder->setParameter('paraunit.phpunit_config_filename', $input->getOption('configuration') ?? '.');
84 55
        $containerBuilder->setParameter('paraunit.testsuite', $input->getOption('testsuite'));
85 55
        $containerBuilder->setParameter('paraunit.string_filter', $input->getArgument('stringFilter'));
86
    }
87
88
    protected function loadPostCompileSettings(ContainerBuilder $container, InputInterface $input)
89
    {
90
    }
91
92 55
    private function injectOutput(ContainerBuilder $containerBuilder, OutputInterface $output)
93
    {
94 55
        $containerBuilder->register('output')
95 55
            ->setSynthetic(true);
96
97 55
        $containerBuilder->set('output', $output);
98
    }
99
}
100