Passed
Push — main ( c551fb...edb315 )
by Siad
06:32
created

StatisticsReport   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 141
Duplicated Lines 0 %

Test Coverage

Coverage 97.33%

Importance

Changes 0
Metric Value
wmc 18
eloc 77
dl 0
loc 141
ccs 73
cts 75
cp 0.9733
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A toString() 0 19 3
A create() 0 21 2
A __construct() 0 5 1
A calculateFixedLength() 0 9 2
A createTargetStatistics() 0 3 1
A updateTableWithPercentagesOfTotalTime() 0 7 2
A createTitleBarIfFirstRow() 0 7 2
A write() 0 19 3
A createTaskStatistics() 0 3 1
A push() 0 3 1
1
<?php
2
3
/**
4
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
5
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
6
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
7
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
11
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
13
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
14
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15
 *
16
 * This software consists of voluntary contributions made by many individuals
17
 * and is licensed under the LGPL. For more information please see
18
 * <http://phing.info>.
19
 */
20
21
namespace Phing\Util;
22
23
use Phing\Phing;
24
use SplStack;
25
26
/**
27
 * @author  Siad Ardroumli <[email protected]>
28
 */
29
class StatisticsReport
30
{
31
    private static $IDX_NAME = 0;
32
33
    private static $IDX_COUNT = 1;
34
35
    private static $IDX_AVERAGE = 2;
36
37
    private static $IDX_TOTAL = 3;
38
39
    private static $IDX_PERCENTAGE = 4;
40
41
    private static $HEADERS = [
42
        'name',
43
        'count',
44
        'average',
45
        'total',
46
        '%',
47
    ];
48
49
    private static $TIME_FORMATTER;
50
    private static $FORMATTER;
51
52
    private $stack;
53
54 1
    public function __construct()
55
    {
56 1
        self::$TIME_FORMATTER = new TimeFormatter();
57 1
        self::$FORMATTER = new StringFormatter();
58 1
        $this->stack = new SplStack();
59 1
    }
60
61 1
    public function create($title, SeriesMap $seriesMap)
62
    {
63 1
        $keys = $seriesMap->getNames();
64 1
        sort($keys);
65 1
        $table = new Table(self::$HEADERS, count($keys));
66
67 1
        $totalTimes = [];
68 1
        $runningTotalTime = 0;
69 1
        for ($i = 1; $i < $table->rows(); ++$i) {
70 1
            $series = $seriesMap->get($keys[$i - 1]);
71 1
            $table->put($i, self::$IDX_NAME, $keys[$i - 1]);
72 1
            $table->put($i, self::$IDX_COUNT, $series->size());
73 1
            $table->put($i, self::$IDX_AVERAGE, self::$TIME_FORMATTER->format($series->getAverageTime()));
74 1
            $table->put($i, self::$IDX_TOTAL, self::$TIME_FORMATTER->format($series->getTotalTime()));
75 1
            $totalTimes[$i - 1] = $series->getTotalTime();
76 1
            $runningTotalTime += $series->getTotalTime();
77
        }
78
79 1
        $this->updateTableWithPercentagesOfTotalTime($table, $totalTimes, $runningTotalTime);
80
81 1
        return $this->toString($title, $table);
82
    }
83
84 1
    public function push(ProjectTimer $projectTimer)
85
    {
86 1
        $this->stack->push($projectTimer);
87 1
    }
88
89 1
    public function write(ProjectTimer $projectTimer = null)
90
    {
91 1
        if (null !== $projectTimer) {
92
            $this->create('Target Statistics', $projectTimer->toTargetSeriesMap());
93
            $this->create('Task Statistics', $projectTimer->toTaskSeriesMap());
94
        } else {
95 1
            $projectSeriesMap = new SeriesMap();
96 1
            $sb = '';
97 1
            while (!$this->stack->isEmpty()) {
98 1
                $projectTimer = $this->stack->pop();
99 1
                $projectSeriesMap->put($projectTimer->getName(), $projectTimer->getSeries());
100 1
                $sb .= $this->createTargetStatistics($projectTimer);
101 1
                $sb .= PHP_EOL;
102 1
                $sb .= $this->createTaskStatistics($projectTimer);
103 1
                $sb .= PHP_EOL;
104
            }
105 1
            Phing::log(PHP_EOL);
106 1
            Phing::log($this->create('Project Statistics', $projectSeriesMap));
107 1
            Phing::log(PHP_EOL . $sb);
108
        }
109 1
    }
110
111 1
    private function updateTableWithPercentagesOfTotalTime(Table $table, array $totalTimes, $runningTotalTime)
112
    {
113 1
        $total = count($totalTimes);
114 1
        for ($i = 0; $i < $total; ++$i) {
115 1
            $totalTime = $totalTimes[$i];
116 1
            $round = round(100 * (float) $totalTime / $runningTotalTime);
117 1
            $table->put($i + 1, self::$IDX_PERCENTAGE, (string) $round);
118
        }
119 1
    }
120
121 1
    private function toString($title, Table $table)
122
    {
123 1
        $sb = '';
124 1
        $maxLengths = $table->getMaxLengths();
125 1
        $titleBarLength = $this->calculateFixedLength($maxLengths);
126 1
        $sb .= self::$FORMATTER->center($title, $titleBarLength);
127 1
        $sb .= PHP_EOL . PHP_EOL;
128
129 1
        for ($i = 0; $i < $table->rows(); ++$i) {
130 1
            for ($j = 0; $j < $table->columns(); ++$j) {
131 1
                $sb .= self::$FORMATTER->left($table->get($i, $j), $maxLengths[$j]);
132
            }
133 1
            $sb .= PHP_EOL;
134 1
            $sb .= $this->createTitleBarIfFirstRow($titleBarLength, $i);
135
        }
136
137 1
        $sb .= PHP_EOL;
138
139 1
        return $sb;
140
    }
141
142 1
    private function createTitleBarIfFirstRow($titleBarLength, $i)
143
    {
144 1
        if (0 !== $i) {
145 1
            return '';
146
        }
147
148 1
        return self::$FORMATTER->toChars('-', $titleBarLength) . PHP_EOL;
149
    }
150
151 1
    private function calculateFixedLength(array $maxLengths)
152
    {
153 1
        $fixedLength = 0;
154 1
        $total = count($maxLengths);
155 1
        for ($i = 0; $i < $total; ++$i) {
156 1
            $fixedLength += $maxLengths[$i] + 4;
157
        }
158
159 1
        return $fixedLength;
160
    }
161
162 1
    private function createTaskStatistics(ProjectTimer $projectTimer)
163
    {
164 1
        return $this->create('Task Statistics - ' . $projectTimer->getName(), $projectTimer->toTaskSeriesMap());
165
    }
166
167 1
    private function createTargetStatistics(ProjectTimer $projectTimer)
168
    {
169 1
        return $this->create('Target Statistics - ' . $projectTimer->getName(), $projectTimer->toTargetSeriesMap());
170
    }
171
}
172