Completed
Push — master ( 109027...065f8e )
by Jonathan
11s
created

IssueGrouper::groupIssuesByLabels()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 7
nc 3
nop 1
dl 0
loc 15
ccs 8
cts 8
cp 1
crap 3
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ChangelogGenerator;
6
7
use function array_filter;
8
use function implode;
9
use function strpos;
10
11
class IssueGrouper
12
{
13
    /**
14
     * @param Issue[] $issues
15
     *
16
     * @return IssueGroup[]
17
     */
18 1
    public function groupIssues(array $issues) : array
19
    {
20 1
        $this->linkIssues($issues);
21
22 1
        return $this->groupIssuesByLabels($issues);
23
    }
24
25
    /**
26
     * @param Issue[] $issues
27
     *
28
     * @return IssueGroup[]
29
     */
30 1
    private function groupIssuesByLabels(array $issues) : array
31
    {
32 1
        $issueGroups = [];
33
34 1
        foreach ($this->getIssuesToGroup($issues) as $issue) {
35 1
            $groupName = implode(',', $issue->getLabels());
36
37 1
            if (! isset($issueGroups[$groupName])) {
38 1
                $issueGroups[$groupName] = new IssueGroup($groupName);
39
            }
40
41 1
            $issueGroups[$groupName]->addIssue($issue);
42
        }
43
44 1
        return $issueGroups;
45
    }
46
47
    /**
48
     * @param Issue[] $issues
49
     *
50
     * @return Issue[]
51
     */
52 1
    private function getIssuesToGroup(array $issues) : array
53
    {
54
        return array_filter($issues, function (Issue $issue) : bool {
55 1
            return (! $issue->isPullRequest() && $issue->getLinkedPullRequest() !== null) === false;
56 1
        });
57
    }
58
59
    /**
60
     * @param Issue[] $issues
61
     */
62 1
    private function linkIssues(array $issues) : void
63
    {
64 1
        foreach ($issues as $issue) {
65 1
            if (! $issue->isPullRequest()) {
66 1
                continue;
67
            }
68
69 1
            foreach ($issues as $i) {
70 1
                if ($i->isPullRequest() || strpos($issue->getBody(), '#' . $i->getNumber()) === false) {
71 1
                    continue;
72
                }
73
74 1
                $i->setLinkedPullRequest($issue);
75 1
                $issue->setLinkedIssue($i);
76
            }
77
        }
78 1
    }
79
}
80