Passed
Push — master ( 0977af...89c8c5 )
by ANTHONIUS
03:48
created

Extension::load()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 2
c 0
b 0
f 0
dl 0
loc 4
rs 10
ccs 3
cts 3
cp 1
cc 1
nc 1
nop 2
crap 1
1
<?php
2
3
4
namespace Doyo\PhpSpec\CodeCoverage;
5
6
use Doyo\Bridge\CodeCoverage\Environment\Runtime;
7
use Doyo\Bridge\CodeCoverage\CodeCoverage;
8
use Doyo\Bridge\CodeCoverage\Console\Console;
9
use Doyo\Bridge\CodeCoverage\Driver\Dummy;
10
use Doyo\Bridge\CodeCoverage\Report\Html;
11
use Doyo\Bridge\CodeCoverage\Report\PHP;
12
use Doyo\PhpSpec\CodeCoverage\Listener\CoverageListener;
13
use PhpSpec\Extension as BaseExtension;
14
use PhpSpec\ServiceContainer;
15
use SebastianBergmann\CodeCoverage\Filter;
16
use Symfony\Component\Console\Input\InputOption;
17
use Doyo\Bridge\CodeCoverage\Processor;
18
19
class Extension implements BaseExtension
20
{
21 1
    public function load(ServiceContainer $container, array $params)
22
    {
23 1
        $this->addCoverageOptions($container);
24 1
        $this->loadCoverageListener($container, $params);
25
    }
26
27 1
    public function addCoverageOptions(ServiceContainer $container)
28
    {
29
        /* @var \PhpSpec\Console\Command\RunCommand $command */
30 1
        $command = $container->get('console.commands.run');
31 1
        $command->addOption(
32 1
            'coverage',
33 1
            null,
34 1
            InputOption::VALUE_NONE,
35 1
            'Run phpspec with code coverage'
36
        );
37
    }
38
39 1
    public function loadCoverageListener(ServiceContainer $container, array $params)
40
    {
41
        /* @var \Symfony\Component\Console\Input\InputInterface $input */
42 1
        $input = $container->get('console.input');
43
44
45 1
        if(false === $input->hasParameterOption(['--coverage'])){
46
            return;
47
        }
48
49 1
        $this->loadDriver($container);
50 1
        $this->loadFilter($container, $params);
51 1
        $this->loadProcessor($container, $params);
52 1
        $this->loadReports($container, $params);
53 1
        $container->define('doyo.coverage.code_coverage', function($container){
54 1
            $processor = $container->get('doyo.coverage.processor');
55 1
            $input = $container->get('console.input');
56 1
            $output = $container->get('console.output');
57 1
            $consoleIO = new Console($input, $output);
58 1
            $runtime = $container->get('doyo.coverage.runtime');
59 1
            $dispatcher = new CodeCoverage($processor, $consoleIO, $runtime);
60 1
            return $dispatcher;
61 1
        });
62
63 1
        $container->define('doyo.coverage.listener',function($container){
64
            $coverage = $container->get('doyo.coverage.code_coverage');
65
            return new CoverageListener($coverage);
66 1
        }, ['event_dispatcher.listeners']);
67
68 1
        $container->define('doyo.coverage.report', function($container){
69
70 1
            $coverage = $container->get('doyo.coverage.code_coverage');
71 1
            $report = new \Doyo\Bridge\CodeCoverage\Report();
72 1
            $coverage->addSubscriber($report);
73
74 1
            return $report;
75 1
        });
76
77
78 1
        $reportProcessors = $container->getByTag('doyo.coverage.reports');
79 1
        $report = $container->get('doyo.coverage.report');
80 1
        foreach($reportProcessors as $processor){
81 1
            $report->addProcessor($processor);
82
        }
83
    }
84
85
    private function loadDriver(ServiceContainer $container)
86
    {
87 1
        $container->define('doyo.coverage.runtime', function(){
88 1
            return new Runtime();
89 1
        });
90 1
        $container->define('doyo.coverage.driver', function($container){
91 1
            $driverClass = $container->get('doyo.coverage.runtime')->getDriverClass();
92 1
            return new $driverClass;
93 1
        });
94
    }
95
96
    private function loadFilter(ServiceContainer $container, array $params)
97
    {
98 1
        $container->define('doyo.coverage.filter', function() use ($params){
99 1
            $filters = $params['filters'] ?:[];
100 1
            $whitelist = isset($filters['whitelist']) ? $filters['whitelist']:[];
101 1
            $blacklist = isset($filters['blacklist']) ? $filters['blacklist']:[];
102 1
            $filter = new Filter();
103
104 1
            foreach($whitelist as $dir){
105 1
                $filter->addDirectoryToWhitelist($dir);
106
            }
107
108 1
            foreach($blacklist as $dir){
109 1
                $filter->removeDirectoryFromWhitelist($dir);
110
            }
111
112 1
            return $filter;
113 1
        });
114
    }
115
116
    private function loadProcessor(ServiceContainer $container, array $params)
117
    {
118 1
        $container->define('doyo.coverage.processor', function($container) use ($params){
0 ignored issues
show
Unused Code introduced by
The import $params is not used and could be removed.

This check looks for imports that have been defined, but are not used in the scope.

Loading history...
119 1
            $driver = $container->get('doyo.coverage.driver');
120 1
            $filter = $container->get('doyo.coverage.filter');
121 1
            $processor = new Processor($driver, $filter);
122
123 1
            return $processor;
124 1
        });
125
    }
126
127 1
    private function loadReports(ServiceContainer $container, array $params)
128
    {
129
        $reports = [
130 1
            'html' => Html::class,
131
            'php' => PHP::class
132
        ];
133
134 1
        $reportConfig = isset($params['reports']) ? $params['reports']:[];
135 1
        foreach($reports as $type => $class){
136 1
            $this->configureReport($container, $reportConfig, $type, $class);
137
        }
138
    }
139
140 1
    private function configureReport(ServiceContainer $container, array $reportConfig, $type, $class)
141
    {
142 1
        if(!isset($reportConfig[$type])){
143
            return;
144
        }
145
146 1
        $options = [];
147
148 1
        if(is_string($reportConfig[$type])){
149 1
            $options['target'] = $reportConfig[$type];
150
        }else{
151
            $options = $reportConfig[$type];
152
        }
153 1
        $id = 'doyo.coverage.reports.'.$type;
154 1
        $container->define($id, function() use ($class, $options){
155 1
            return new $class($options);
156 1
        },['doyo.coverage.reports']);
157
    }
158
159
    public static function canCollectCodeCoverage()
160
    {
161
        return Extension::class !== Dummy::class;
162
    }
163
}