Passed
Pull Request — master (#69)
by Dave
01:56
created

TableOutputFormatter::getName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DaveLiddament\StaticAnalysisResultsBaseliner\Plugins\OutputFormatters;
6
7
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\FileName;
8
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\OutputFormatter\OutputFormatter;
9
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\OutputFormatter\SummaryStats;
10
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\ResultsParser\AnalysisResult;
11
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\ResultsParser\AnalysisResults;
12
use Symfony\Component\Console\Helper\Table;
13
use Symfony\Component\Console\Output\BufferedOutput;
14
use Webmozart\Assert\Assert;
15
16
class TableOutputFormatter implements OutputFormatter
17
{
18
    public function outputResults(SummaryStats $summaryStats, AnalysisResults $analysisResults): string
19
    {
20
        $output = <<<EOF
21
Latest issue count: {$summaryStats->getLatestAnalysisResultsCount()}
22
Baseline issue count: {$summaryStats->getBaseLineCount()}
23
Issues count with baseline removed: {$analysisResults->getCount()}
24
EOF;
25
26
        if ($analysisResults->hasNoIssues()) {
27
            return $output;
28
        }
29
30
        $bufferedOutput = new BufferedOutput();
31
        $this->addIssuesInTable($bufferedOutput, $analysisResults);
32
33
        $output .= PHP_EOL;
34
        $output .= $bufferedOutput->fetch();
35
36
        return $output;
37
    }
38
39
    public function getName(): string
40
    {
41
        return 'table';
42
    }
43
44
    private function addIssuesInTable(BufferedOutput $output, AnalysisResults $analysisResults): void
45
    {
46
        /** @var string[] $headings */
47
        $headings = [
48
            'Line',
49
            'Description',
50
        ];
51
52
        /** @var FileName $currentFileName */
53
        $currentFileName = null;
54
        /** @var Table|null $currentTable */
55
        $currentTable = null;
56
        foreach ($analysisResults->getOrderedAnalysisResults() as $analysisResult) {
57
            $fileName = $analysisResult->getLocation()->getFileName();
58
59
            if (!$fileName->isEqual($currentFileName)) {
60
                $this->renderTable($currentTable);
61
62
                $output->writeln("\nFILE: {$fileName->getFileName()}");
63
                $currentFileName = $fileName;
64
                $currentTable = new Table($output);
65
                $currentTable->setHeaders($headings);
66
            }
67
68
            Assert::notNull($currentTable);
69
            $currentTable->addRow([
70
                $analysisResult->getLocation()->getLineNumber()->getLineNumber(),
71
                $analysisResult->getMessage(),
72
            ]);
73
        }
74
75
        $this->renderTable($currentTable);
76
    }
77
78
    private function renderTable(?Table $table): void
79
    {
80
        if (null !== $table) {
81
            $table->render();
82
        }
83
    }
84
}
85