Completed
Push — master ( 5ef5a6...726f17 )
by Jonathan
02:41
created

ChunkRepository   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 87.18%

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 5
dl 0
loc 88
ccs 34
cts 39
cp 0.8718
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A getChunkedTests() 0 19 2
B findTestFiles() 0 35 5
A getNumChunks() 0 5 3
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace PHPChunkit;
6
7
use Symfony\Component\Console\Input\InputInterface;
8
9
class ChunkRepository
10
{
11
    /**
12
     * @var TestFinder
13
     */
14
    private $testFinder;
15
16
    /**
17
     * @var TestChunker
18
     */
19
    private $testChunker;
20
21
    /**
22
     * @var Configuration
23
     */
24
    private $configuration;
25
26 1
    public function __construct(TestFinder $testFinder, TestChunker $testChunker, Configuration $configuration)
27
    {
28 1
        $this->testFinder = $testFinder;
29 1
        $this->testChunker = $testChunker;
30 1
        $this->configuration = $configuration;
31 1
    }
32
33 1
    public function getChunkedTests(InputInterface $input) : ChunkedTests
34
    {
35 1
        $chunk = (int) $input->getOption('chunk');
36
37 1
        $testFiles = $this->findTestFiles($input);
38
39 1
        $chunkedTests = (new ChunkedTests())
40 1
            ->setNumChunks($this->getNumChunks($input))
41 1
            ->setChunk($chunk)
42
        ;
43
44 1
        if (empty($testFiles)) {
45
            return $chunkedTests;
46
        }
47
48 1
        $this->testChunker->chunkTestFiles($chunkedTests, $testFiles);
49
50 1
        return $chunkedTests;
51
    }
52
53 1
    private function findTestFiles(InputInterface $input)
54
    {
55 1
        $files = $input->getOption('file');
56
57 1
        if (!empty($files)) {
58
            return $files;
59
        }
60
61 1
        $groups = $input->getOption('group');
62 1
        $excludeGroups = $input->getOption('exclude-group');
63 1
        $changed = $input->getOption('changed');
64 1
        $filters = $input->getOption('filter');
65 1
        $contains = $input->getOption('contains');
66 1
        $notContains = $input->getOption('not-contains');
67
68 1
        $this->testFinder
69 1
            ->inGroups($groups)
70 1
            ->notInGroups($excludeGroups)
71 1
            ->changed($changed)
72
        ;
73
74 1
        foreach ($filters as $filter) {
75
            $this->testFinder->filter($filter);
76
        }
77
78 1
        foreach ($contains as $contain) {
79
            $this->testFinder->contains($contain);
80
        }
81
82 1
        foreach ($notContains as $notContain) {
83
            $this->testFinder->notContains($notContain);
84
        }
85
86 1
        return $this->testFinder->getFiles();
87
    }
88
89
90 1
    private function getNumChunks(InputInterface $input) : int
91
    {
92 1
        return (int) $input->getOption('num-chunks')
93 1
            ?: $this->configuration->getNumChunks() ?: 1;
94
    }
95
96
}
97