Completed
Push — master ( 89c8c5...241e52 )
by ANTHONIUS
15s
created

Extension::loadProcessor()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 8
ccs 6
cts 6
cp 1
rs 10
c 0
b 0
f 0
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;
11
use Doyo\Bridge\CodeCoverage\Report\Html;
12
use Doyo\Bridge\CodeCoverage\Report\PHP;
13
use Doyo\PhpSpec\CodeCoverage\Listener\CoverageListener;
14
use PhpSpec\Extension as BaseExtension;
15
use PhpSpec\ServiceContainer;
16
use SebastianBergmann\CodeCoverage\Filter;
17
use Symfony\Component\Console\Input\InputOption;
18
use Doyo\Bridge\CodeCoverage\Processor;
19
20
class Extension implements BaseExtension
21
{
22 1
    public function load(ServiceContainer $container, array $params)
23
    {
24 1
        $this->addCoverageOptions($container);
25 1
        $this->loadCoverageListener($container, $params);
26
    }
27
28 2
    public function addCoverageOptions(ServiceContainer $container)
29
    {
30
        /* @var \PhpSpec\Console\Command\RunCommand $command */
31 2
        $command = $container->get('console.commands.run');
32 2
        $command->addOption(
33 2
            'coverage',
34 2
            null,
35 2
            InputOption::VALUE_NONE,
36 2
            'Run phpspec with code coverage'
37
        );
38
    }
39
40 3
    public function loadCoverageListener(ServiceContainer $container, array $params)
41
    {
42
        /* @var \Symfony\Component\Console\Input\InputInterface $input */
43 3
        $input = $container->get('console.input');
44
45
46 3
        if(false === $input->hasParameterOption(['--coverage'])){
47 1
            return;
48
        }
49
50 2
        $this->loadDriver($container);
51 2
        $this->loadFilter($container, $params);
52 2
        $this->loadProcessor($container, $params);
53 2
        $this->loadReports($container, $params);
54 2
        $container->define('doyo.coverage.code_coverage', function($container){
55 1
            $processor = $container->get('doyo.coverage.processor');
56 1
            $input = $container->get('console.input');
57 1
            $output = $container->get('console.output');
58 1
            $consoleIO = new Console($input, $output);
59 1
            $runtime = $container->get('doyo.coverage.runtime');
60 1
            $dispatcher = new CodeCoverage($processor, $consoleIO, $runtime);
61 1
            return $dispatcher;
62 2
        });
63
64 2
        $container->define('doyo.coverage.listener',function($container){
65 1
            $coverage = $container->get('doyo.coverage.code_coverage');
66 1
            return new CoverageListener($coverage);
67 2
        }, ['event_dispatcher.listeners']);
68
69 2
        $container->define('doyo.coverage.report', function($container){
70
71 1
            $coverage = $container->get('doyo.coverage.code_coverage');
72 1
            $report = new Report();
73 1
            $coverage->addSubscriber($report);
74
75 1
            return $report;
76 2
        });
77
78
79 2
        $reportProcessors = $container->getByTag('doyo.coverage.reports');
80 2
        $report = $container->get('doyo.coverage.report');
81 2
        foreach($reportProcessors as $processor){
82 2
            $report->addProcessor($processor);
83
        }
84
    }
85
86 2
    private function loadDriver(ServiceContainer $container)
87
    {
88 2
        $container->define('doyo.coverage.runtime', function(){
89 1
            return new Runtime();
90 2
        });
91 2
        $container->define('doyo.coverage.driver', function($container){
92 1
            $driverClass = $container->get('doyo.coverage.runtime')->getDriverClass();
93 1
            return new $driverClass;
94 2
        });
95
    }
96
97 2
    private function loadFilter(ServiceContainer $container, array $params)
98
    {
99 2
        $container->define('doyo.coverage.filter', function() use ($params){
100 1
            $filters = $params['filters'] ?:[];
101 1
            $whitelist = isset($filters['whitelist']) ? $filters['whitelist']:[];
102 1
            $blacklist = isset($filters['blacklist']) ? $filters['blacklist']:[];
103 1
            $filter = new Filter();
104
105 1
            foreach($whitelist as $dir){
106 1
                $filter->addDirectoryToWhitelist($dir);
107
            }
108
109 1
            foreach($blacklist as $dir){
110 1
                $filter->removeDirectoryFromWhitelist($dir);
111
            }
112
113 1
            return $filter;
114 2
        });
115
    }
116
117 2
    private function loadProcessor(ServiceContainer $container, array $params)
118
    {
119 2
        $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...
120 1
            $driver = $container->get('doyo.coverage.driver');
121 1
            $filter = $container->get('doyo.coverage.filter');
122 1
            $processor = new Processor($driver, $filter);
123
124 1
            return $processor;
125 2
        });
126
    }
127
128 2
    private function loadReports(ServiceContainer $container, array $params)
129
    {
130
        $reports = [
131 2
            'html' => Html::class,
132
            'php' => PHP::class
133
        ];
134
135 2
        $reportConfig = isset($params['reports']) ? $params['reports']:[];
136 2
        foreach($reports as $type => $class){
137 2
            $this->configureReport($container, $reportConfig, $type, $class);
138
        }
139
    }
140
141 2
    private function configureReport(ServiceContainer $container, array $reportConfig, $type, $class)
142
    {
143 2
        if(!isset($reportConfig[$type])){
144
            return;
145
        }
146
147 2
        $options = [];
148
149 2
        if(is_string($reportConfig[$type])){
150 2
            $options['target'] = $reportConfig[$type];
151
        }else{
152
            $options = $reportConfig[$type];
153
        }
154 2
        $id = 'doyo.coverage.reports.'.$type;
155 2
        $container->define($id, function() use ($class, $options){
156 1
            return new $class($options);
157 2
        },['doyo.coverage.reports']);
158
    }
159
}