8000 Add a compact formatter · composer-unused/composer-unused@da5212b · GitHub
[go: up one dir, main page]

Skip to content

Commit da5212b

Browse files
gisostallenbergicanhazstring
authored andcommitted
Add a compact formatter
Add a compact formatter, that only prints single lines with errors
1 parent 61b965d commit da5212b

File tree

4 files changed

+145
-1
lines changed

4 files changed

+145
-1
lines changed

src/Console/Command/UnusedCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ protected function configure(): void
8585
'output-format',
8686
'o',
8787
InputOption::VALUE_REQUIRED,
88-
'Change output style (default, github, json, junit, gitlab)'
88+
'Change output style (default, compact, github, json, junit, gitlab)'
8989
);
9090

9191
$this->addOption(
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ComposerUnused\ComposerUnused\OutputFormatter;
6+
7+
use ComposerUnused\ComposerUnused\Dependency\DependencyCollection;
8+
use ComposerUnused\ComposerUnused\Filter\FilterCollection;
9+
use ComposerUnused\Contracts\PackageInterface;
10+
use Symfony\Component\Console\Style\OutputStyle;
11+
12+
/**
13+
* Only write a line with unused packages and a line with zombie exclusions if applicable
14+
* The formatter thus only prints errors and in a compact manner
15+
*/
16+
final class CompactFormatter implements OutputFormatterInterface
17+
{
18+
public function formatOutput(
19+
PackageInterface $rootPackage,
20+
string $composerJsonPath,
21+
DependencyCollection $usedDependencyCollection,
22+
DependencyCollection $unusedDependencyCollection,
23+
DependencyCollection $ignoredDependencyCollection,
24+
FilterCollection $filterCollection,
25+
OutputStyle $output
26+
): int {
27+
$unused = [];
28+
foreach ($unusedDependencyCollection as $dependency) {
29+
$unused[] = $dependency->getName();
30+
}
31+
if (count($unused) > 0) {
32+
$output->text(sprintf('Unused packages: %s', implode(', ', $unused)));
33+
}
34+
35+
$zombies = [];
36+
foreach ($filterCollection->getUnused() as $filter) {
37+
$zombies[] = $filter->toString();
38+
}
39+
if (count($zombies) > 0) {
40+
$output->text(sprintf('Zombie exclusions: %s', implode(' / ', $zombies)));
41+
}
42+
43+
if ($unusedDependencyCollection->count() > 0 || count($filterCollection->getUnused()) > 0) {
44+
return 1;
45+
}
46+
47+
return 0;
48+
}
49+
}

src/OutputFormatter/FormatterFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public function create(?string $type): OutputFormatterInterface
3333
}
3434

3535
switch ($type) {
36+
case 'compact':
37+
return new CompactFormatter();
3638
case 'github':
3739
return new GithubFormatter();
3840
case 'json':
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ComposerUnused\ComposerUnused\Test\Unit\OutputFormatter\CompactFormatter;
6+
7+
use ComposerUnused\ComposerUnused\Composer\Package;
8+
use ComposerUnused\ComposerUnused\Configuration\NamedFilter;
9+
use ComposerUnused\ComposerUnused\Dependency\DependencyCollection;
10+
use ComposerUnused\ComposerUnused\Dependency\RequiredDependency;
11+
use ComposerUnused\ComposerUnused\Filter\FilterCollection;
12+
use ComposerUnused\ComposerUnused\OutputFormatter\CompactFormatter;
13+
use ComposerUnused\ComposerUnused\Test\Stubs\TestDependency;
14+
use ComposerUnused\Contracts\PackageInterface;
15+
use PHPUnit\Framework\TestCase;
16+
use Symfony\Component\Console\Input\ArgvInput;
17+
use Symfony\Component\Console\Output\BufferedOutput;
18+
use Symfony\Component\Console\Style\SymfonyStyle;
19+
20+
final class CompactFormatterTest extends TestCase
21+
{
22+
private CompactFormatter $compactFormatter;
23+
24+
protected function setUp(): void
25+
{
26+
$this->compactFormatter = new CompactFormatter();
27+
}
28+
29+
/**
30+
* @test
31+
*/
32+
public function itPrints(): void
33+
{
34+
$symfonyStringRequiredDependency = new RequiredDependency(
35+
new Package('symfony/string'),
36+
);
37+
$symfonyStringRequiredDependency->requiredBy(new TestDependency('symfony/event-dispatcher'));
38+
$usedDependencyCollection = new DependencyCollection([$symfonyStringRequiredDependency]);
39+
40+
$unusedDependencyCollection = new DependencyCollection([
41+
new RequiredDependency(new Package('symfony/console'))
42+
]);
43+
44+
$bufferedOutput = new BufferedOutput();
45+
$outputStyle = new SymfonyStyle(new ArgvInput(), $bufferedOutput);
46+
47+
$returnStatus = $this->compactFormatter->formatOutput(
48+
$this->createMock(PackageInterface::class),
49+
'composer.json',
50+
$usedDependencyCollection,
51+
$unusedDependencyCollection,
52+
new DependencyCollection(),
53+
new FilterCollection([NamedFilter::fromString('symfony/zombie')], []),
54+
$outputStyle
55+
);
56+
$consoleOutput = $bufferedOutput->fetch();
57+
58+
self::assertSame(1, $returnStatus);
59+
$lines = \explode(PHP_EOL, trim($consoleOutput));
60+
self::assertSame('Unused packages: symfony/console', trim($lines[0]));
61+
self::assertSame('Zombie exclusions: NamedFilter(userProvided: true, string: symfony/zombie)', trim($lines[1]));
62+
}
63+
64+
65+
/**
66+
* @test
67+
*/
68+
public function itPrintsNothingWhenNoErrors(): void
69+
{
70+
$symfonyStringRequiredDependency = new RequiredDependency(
71+
new Package('symfony/string'),
72+
);
73+
$symfonyStringRequiredDependency->requiredBy(new TestDependency('symfony/event-dispatcher'));
74+
$usedDependencyCollection = new DependencyCollection([$symfonyStringRequiredDependency]);
75+
76+
$bufferedOutput = new BufferedOutput();
77+
$outputStyle = new SymfonyStyle(new ArgvInput(), $bufferedOutput);
78+
79+
$returnStatus = $this->compactFormatter->formatOutput(
80+
$this->createMock(PackageInterface::class),
81+
'composer.json',
82+
$usedDependencyCollection,
83+
new DependencyCollection([]),
84+
new DependencyCollection(),
85+
new FilterCollection([], []),
86+
$outputStyle
87+
);
88+
$consoleOutput = $bufferedOutput->fetch();
89+
90+
self::assertSame(0, $returnStatus);
91+
self::assertSame('', $consoleOutput);
92+
}
93+
}

0 commit comments

Comments
 (0)
0