Completed
Push — master ( e1173d...cdf0e4 )
by Oskar
05:16 queued 03:02
created

PackageDependencies::increaseDependencies()   B

Complexity

Conditions 6
Paths 5

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 12
nc 5
nop 2
dl 0
loc 20
rs 8.8571
c 0
b 0
f 0
1
<?php
2
3
namespace Hal\Metric\Package;
4
5
use Hal\Metric\ClassMetric;
6
use Hal\Metric\InterfaceMetric;
7
use Hal\Metric\Metric;
8
use Hal\Metric\Metrics;
9
use Hal\Metric\PackageMetric;
10
11
class PackageDependencies
12
{
13
    public function calculate(Metrics $metrics)
14
    {
15
        $classes = array_filter($metrics->all(), function (Metric $metric) {
16
            return $metric instanceof ClassMetric || $metric instanceof InterfaceMetric;
17
        });
18
19
        foreach ($classes as $each) {
20
            $this->increaseDependencies($each, $metrics);
21
        }
22
    }
23
24
    /**
25
     * @param ClassMetric|InterfaceMetric|Metric $class
26
     * @param Metrics $metrics
27
     */
28
    private function increaseDependencies(Metric $class, Metrics $metrics)
29
    {
30
        if (! $class->has('package') || ! $class->has('externals')) {
31
            return;
32
        }
33
        $incomingPackage = $metrics->get($class->get('package')); /* @var $incomingPackage PackageMetric */
34
        foreach ($class->get('externals') as $outgoingClassName) {
35
            // same package?
36
            if (in_array($outgoingClassName, $incomingPackage->getClasses())) {
37
                continue;
38
            }
39
            $outgoingPackageName = $this->getPackageOfClass($outgoingClassName, $metrics);
40
            $incomingPackage->addOutgoingClassDependency($outgoingClassName, $outgoingPackageName);
41
            $outgoingPackage = $metrics->get($outgoingPackageName);
42
43
            if ($outgoingPackage instanceof PackageMetric) {
44
                $outgoingPackage->addIncomingClassDependency($class->getName(), $incomingPackage->getName());
45
            }
46
        }
47
    }
48
49
    private function getPackageOfClass($className, Metrics $metrics)
50
    {
51
        if ($metrics->has($className) && $metrics->get($className)->has('package')) {
52
            return $metrics->get($className)->get('package');
53
        }
54
        if (strpos($className, '\\') === false) {
55
            return '\\';
56
        }
57
        $parts = explode('\\', $className);
58
        array_pop($parts);
59
        return implode('\\', $parts) . '\\';
60
    }
61
}
62