Completed
Pull Request — master (#301)
by personal
02:13
created

Reporter::generate()   D

Complexity

Conditions 9
Paths 25

Size

Total Lines 95
Code Lines 61

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
eloc 61
c 0
b 0
f 0
nc 25
nop 1
dl 0
loc 95
rs 4.9931

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
namespace Hal\Report\Cli;
3
4
use Hal\Application\Config\Config;
5
use Hal\Component\Output\Output;
6
use Hal\Metric\Consolidated;
7
use Hal\Metric\Metrics;
8
9
class Reporter
10
{
11
12
    /**
13
     * @var Config
14
     */
15
    private $config;
16
17
    /**
18
     * @var OutputInterface
19
     */
20
    private $output;
21
22
    /**
23
     * Reporter constructor.
24
     * @param Config $config
25
     * @param OutputInterface $output
26
     */
27
    public function __construct(Config $config, Output $output)
28
    {
29
        $this->config = $config;
30
        $this->output = $output;
0 ignored issues
show
Documentation Bug introduced by
It seems like $output of type object<Hal\Component\Output\Output> is incompatible with the declared type object<Hal\Report\Cli\OutputInterface> of property $output.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
31
    }
32
33
34
    public function generate(Metrics $metrics)
35
    {
36
        if ($this->config->has('quiet')) {
37
            return;
38
        }
39
40
        // grouping results
41
        $consolidated = new Consolidated($metrics);
42
        $sum = $consolidated->getSum();
43
        $avg = $consolidated->getAvg();
44
45
46
        $methodsByClass = $locByClass = $locByMethod = 0;
47
        if ($sum->nbClasses > 0) {
48
            $methodsByClass = round($sum->nbMethods / $sum->nbClasses, 2);
49
            $locByClass = round($sum->lloc / $sum->nbClasses);
50
        }
51
        if ($sum->nbMethods > 0) {
52
            $locByMethod = round($sum->lloc / $sum->nbMethods);
53
        }
54
55
        $out = <<<EOT
56
LOC
57
    Lines of code                               {$sum->loc}
58
    Logical lines of code                       {$sum->lloc}
59
    Comment lines of code                       {$sum->cloc}
60
    Average volume                              {$avg->volume}
61
    Average comment weight                      {$avg->commentWeight}
62
    Average intelligent content                 {$avg->commentWeight}
63
    Logical lines of code by class              {$locByClass}
64
    Logical lines of code by method             {$locByMethod}
65
66
Object oriented programming
67
    Classes                                     {$sum->nbClasses}
68
    Interface                                   {$sum->nbInterfaces}
69
    Methods                                     {$sum->nbMethods}
70
    Methods by class                            {$methodsByClass}
71
    Lack of cohesion of methods                 {$avg->lcom}
72
    
73
Coupling
74
    Average afferent coupling                   {$avg->afferentCoupling}
75
    Average efferent coupling                   {$avg->efferentCoupling}
76
    Average instability                         {$avg->instability}
77
    Depth of Inheritance Tree                   {$metrics->get('tree')->get('depthOfInheritanceTree')}
0 ignored issues
show
Bug introduced by
The method get cannot be called on $metrics->get('tree') (of type null).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
78
79
Complexity
80
    Average Cyclomatic complexity by class      {$avg->ccn}
81
    Average Relative system complexity          {$avg->relativeSystemComplexity}
82
    Average Difficulty                          {$avg->difficulty}
83
    
84
Bugs
85
    Average bugs by class                       {$avg->bugs}
86
    Average defects by class (Kan)              {$avg->kanDefect}
87
88
Violations
89
    Critical                                    {$sum->violations->critical}
90
    Error                                       {$sum->violations->error}
91
    Warning                                     {$sum->violations->warning}
92
    Information                                 {$sum->violations->information}
93
94
EOT;
95
96
        // git
97
        if ($this->config->has('git')) {
98
            $commits = [];
99
            foreach ($consolidated->getFiles() as $name => $file) {
100
                $commits[$name] = $file['gitChanges'];
101
            }
102
            arsort($commits);
103
            $commits = array_slice($commits, 0, 10);
104
105
            $out .= "\nTop 10 committed files";
106
            foreach ($commits as $file => $nb) {
107
                $out .= sprintf("\n    %d    %s", $nb, $file);
108
            }
109
            if (0 === sizeof($commits)) {
110
                $out .= "\n    NA";
111
            }
112
        }
113
114
        // Junit
115
        if ($this->config->has('junit')) {
116
            $out .= <<<EOT
117
            
118
Unit testing
119
    Number of unit tests                        {$metrics->get('unitTesting')->get('nbTests')}
0 ignored issues
show
Bug introduced by
The method get cannot be called on $metrics->get('unitTesting') (of type null).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
120
    Classes called by tests                     {$metrics->get('unitTesting')->get('nbCoveredClasses')}
0 ignored issues
show
Bug introduced by
The method get cannot be called on $metrics->get('unitTesting') (of type null).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
121
    Classes called by tests (percent)           {$metrics->get('unitTesting')->get('percentCoveredClasses')} %
0 ignored issues
show
Bug introduced by
The method get cannot be called on $metrics->get('unitTesting') (of type null).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
122
EOT;
123
        }
124
125
        $out .= "\n\n";
126
        $this->output->write($out);
127
128
    }
129
130
}
131