Completed
Pull Request — master (#112)
by Alessandro
10:33 queued 35s
created

ParallelConfiguration::injectOutput()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 7
ccs 0
cts 0
cp 0
rs 9.4285
c 1
b 0
f 0
cc 1
eloc 4
nc 1
nop 2
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Paraunit\Configuration;
6
7
use Paraunit\Configuration\DependencyInjection\ParallelContainerDefinition;
8
use Paraunit\Printer\DebugPrinter;
9
use Symfony\Component\Console\Input\InputInterface;
10
use Symfony\Component\Console\Output\OutputInterface;
11
use Symfony\Component\DependencyInjection\ContainerBuilder;
12
use Symfony\Component\DependencyInjection\Definition;
13
use Symfony\Component\DependencyInjection\Reference;
14
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15
16
/**
17
 * Class Paraunit
18
 * @package Paraunit\Configuration
19
 */
20
class ParallelConfiguration
21
{
22
    const TAG_EVENT_SUBSCRIBER = 'paraunit.event_subscriber';
23
24
    /** @var ParallelContainerDefinition */
25
    protected $containerDefinition;
26
27
    public function __construct()
28 20
    {
29
        $this->containerDefinition = new ParallelContainerDefinition();
30 20
    }
31
32
    /**
33
     * @param InputInterface $input
34
     * @param OutputInterface $output
35
     * @return ContainerBuilder
36
     * @throws \Symfony\Component\DependencyInjection\Exception\BadMethodCallException
37
     * @throws \Exception
38
     */
39
    public function buildContainer(InputInterface $input, OutputInterface $output): ContainerBuilder
40 63
    {
41
        $containerBuilder = new ContainerBuilder();
42 63
43
        $this->injectOutput($containerBuilder, $output);
44 63
        $this->containerDefinition->configure($containerBuilder);
45 63
        $this->loadCommandLineOptions($containerBuilder, $input);
46 63
        $this->tagEventSubscribers($containerBuilder);
47 63
48
        $containerBuilder->compile();
49 63
50
        return $containerBuilder;
51 63
    }
52
53 63
    protected function tagEventSubscribers(ContainerBuilder $container)
54
    {
55
        foreach ($container->getDefinitions() as $definition) {
56 63
            if ($definition->isSynthetic() || $definition->isAbstract()) {
57
                continue;
58 63
            }
59 63
60 63
            if (array_key_exists(EventSubscriberInterface::class, class_implements($definition->getClass()))) {
61
                $definition->addTag(self::TAG_EVENT_SUBSCRIBER);
62
            }
63 63
        }
64 63
    }
65
66
    protected function loadCommandLineOptions(ContainerBuilder $containerBuilder, InputInterface $input)
67
    {
68
        $containerBuilder->setParameter('paraunit.max_process_count', $input->getOption('parallel'));
69 63
        $containerBuilder->setParameter('paraunit.phpunit_config_filename', $input->getOption('configuration') ?? '.');
70
        $containerBuilder->setParameter('paraunit.testsuite', $input->getOption('testsuite'));
71 63
        $containerBuilder->setParameter('paraunit.string_filter', $input->getArgument('stringFilter'));
72 63
        $containerBuilder->setParameter('paraunit.show_logo', $input->getOption('logo'));
73 63
74 63
        if ($input->getOption('debug')) {
75 63
            $this->enableDebugMode($containerBuilder);
76
        }
77 63
    }
78 3
79
    private function injectOutput(ContainerBuilder $containerBuilder, OutputInterface $output)
80
    {
81
        $containerBuilder->register(OutputInterface::class)
82
            ->setSynthetic(true);
83
84
        $containerBuilder->set(OutputInterface::class, $output);
85
    }
86 63
87
    private function enableDebugMode(ContainerBuilder $containerBuilder)
88 63
    {
89 63
        $definition = new Definition(DebugPrinter::class, [new Reference(OutputInterface::class)]);
90
        $definition->addTag(self::TAG_EVENT_SUBSCRIBER);
91 63
92
        $containerBuilder->setDefinition(DebugPrinter::class, $definition);
93
    }
94
}
95