Skip to content

Commit 3007b7f

Browse files
committed
add some colors
1 parent 85361af commit 3007b7f

File tree

13 files changed

+262
-178
lines changed

13 files changed

+262
-178
lines changed

.github/workflows/test.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ jobs:
99
matrix:
1010
operating-system: [ubuntu-latest]
1111
php-versions:
12+
- '5.3'
1213
- '5.4'
1314
- '5.5'
1415
- '5.6'
@@ -17,15 +18,13 @@ jobs:
1718
- '7.2'
1819
- '7.3'
1920
- '7.4'
21+
- '8.0'
2022
include:
2123
- php-versions: '5.3'
2224
composer-flags: '--prefer-lowest'
2325
operating-system: ubuntu-latest
24-
- php-versions: '7.4'
25-
operating-system: windows-latest
2626
- php-versions: '8.0'
27-
composer-flags: '--ignore-platform-reqs'
28-
operating-system: ubuntu-latest
27+
operating-system: windows-latest
2928
steps:
3029
- name: Checkout
3130
uses: actions/checkout@v2
@@ -34,6 +33,7 @@ jobs:
3433
with:
3534
php-version: ${{ matrix.php-versions }}
3635
extensions: json
36+
coverage: xdebug
3737
- name: Get composer cache directory
3838
id: composer-cache
3939
run: echo "::set-output name=dir::$(composer config cache-files-dir)"

README.md

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,41 +10,41 @@
1010

1111
Generates packages changes report in Markdown format by comparing `composer.lock` files. Compares with last-commited changes by default.
1212

13-
![preview](preview.gif)
13+
![preview](preview.png)
1414

1515
## Example output
1616

17-
| Prod Packages | Base | Target |
18-
|------------------------------------|---------|---------|
19-
| psr/event-dispatcher | New | 1.0.0 |
20-
| symfony/deprecation-contracts | New | v2.1.2 |
21-
| symfony/event-dispatcher | v2.8.52 | v5.1.2 |
22-
| symfony/event-dispatcher-contracts | New | v2.1.2 |
23-
| symfony/polyfill-php80 | New | v1.17.1 |
24-
| php | New | >=5.3 |
17+
| Prod Packages | Action | Base | Target |
18+
|------------------------------------|----------|---------|---------|
19+
| psr/event-dispatcher | New | - | 1.0.0 |
20+
| symfony/deprecation-contracts | New | - | v2.1.2 |
21+
| symfony/event-dispatcher | Upgraded | v2.8.52 | v5.1.2 |
22+
| symfony/event-dispatcher-contracts | New | - | v2.1.2 |
23+
| symfony/polyfill-php80 | New | - | v1.17.1 |
24+
| php | New | - | >=5.3 |
2525

26-
| Dev Packages | Base | Target |
27-
|------------------------------------|-------|---------|
28-
| phpunit/php-code-coverage | 8.0.2 | 7.0.10 |
29-
| phpunit/php-file-iterator | 3.0.2 | 2.0.2 |
30-
| phpunit/php-text-template | 2.0.1 | 1.2.1 |
31-
| phpunit/php-timer | 5.0.0 | 2.1.2 |
32-
| phpunit/php-token-stream | 4.0.2 | 3.1.1 |
33-
| phpunit/phpunit | 9.2.5 | 8.5.8 |
34-
| sebastian/code-unit-reverse-lookup | 2.0.1 | 1.0.1 |
35-
| sebastian/comparator | 4.0.2 | 3.0.2 |
36-
| sebastian/diff | 4.0.1 | 3.0.2 |
37-
| sebastian/environment | 5.1.1 | 4.2.3 |
38-
| sebastian/exporter | 4.0.1 | 3.1.2 |
39-
| sebastian/global-state | 4.0.0 | 3.0.0 |
40-
| sebastian/object-enumerator | 4.0.1 | 3.0.3 |
41-
| sebastian/object-reflector | 2.0.1 | 1.1.1 |
42-
| sebastian/recursion-context | 4.0.1 | 3.0.0 |
43-
| sebastian/resource-operations | 3.0.1 | 2.0.1 |
44-
| sebastian/type | 2.1.0 | 1.1.3 |
45-
| sebastian/version | 3.0.0 | 2.0.1 |
46-
| phpunit/php-invoker | 3.0.1 | Removed |
47-
| sebastian/code-unit | 1.0.3 | Removed |
26+
| Dev Packages | Action | Base | Target |
27+
|------------------------------------|------------|-------|--------|
28+
| phpunit/php-code-coverage | Downgraded | 8.0.2 | 7.0.10 |
29+
| phpunit/php-file-iterator | Downgraded | 3.0.2 | 2.0.2 |
30+
| phpunit/php-text-template | Downgraded | 2.0.1 | 1.2.1 |
31+
| phpunit/php-timer | Downgraded | 5.0.0 | 2.1.2 |
32+
| phpunit/php-token-stream | Downgraded | 4.0.2 | 3.1.1 |
33+
| phpunit/phpunit | Downgraded | 9.2.5 | 8.5.8 |
34+
| sebastian/code-unit-reverse-lookup | Downgraded | 2.0.1 | 1.0.1 |
35+
| sebastian/comparator | Downgraded | 4.0.2 | 3.0.2 |
36+
| sebastian/diff | Downgraded | 4.0.1 | 3.0.2 |
37+
| sebastian/environment | Downgraded | 5.1.1 | 4.2.3 |
38+
| sebastian/exporter | Downgraded | 4.0.1 | 3.1.2 |
39+
| sebastian/global-state | Downgraded | 4.0.0 | 3.0.0 |
40+
| sebastian/object-enumerator | Downgraded | 4.0.1 | 3.0.3 |
41+
| sebastian/object-reflector | Downgraded | 2.0.1 | 1.1.1 |
42+
| sebastian/recursion-context | Downgraded | 4.0.1 | 3.0.0 |
43+
| sebastian/resource-operations | Downgraded | 3.0.1 | 2.0.1 |
44+
| sebastian/type | Downgraded | 2.1.0 | 1.1.3 |
45+
| sebastian/version | Downgraded | 3.0.0 | 2.0.1 |
46+
| phpunit/php-invoker | Removed | 3.0.1 | - |
47+
| sebastian/code-unit | Removed | 1.0.3 | - |
4848

4949
# Installation
5050

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"composer-plugin-api": "^1.1 || ^2.0"
2626
},
2727
"require-dev": {
28-
"composer/composer": "^1.1 || ^2.0@dev",
28+
"composer/composer": "^1.1 || ^2.0",
2929
"symfony/console": "^2.3 || ^3.0 || ^4.0 || ^5.0",
3030
"symfony/phpunit-bridge": "^4.2 || ^5.0"
3131
},

preview.gif

-213 KB
Binary file not shown.

preview.png

93.9 KB
Loading

src/Command/DiffCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ private function getFormatter(InputInterface $input, OutputInterface $output)
8989
switch ($input->getOption('format')) {
9090
case 'mdlist':
9191
return new MarkdownListFormatter($output, $urlGenerators);
92-
case 'mdtable':
92+
// case 'mdtable':
9393
default:
9494
return new MarkdownTableFormatter($output, $urlGenerators);
9595
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace IonBazan\ComposerDiff\Formatter\Helper;
4+
5+
use Symfony\Component\Console\Formatter\OutputFormatterInterface;
6+
7+
class OutputHelper
8+
{
9+
/**
10+
* @param string $string
11+
*
12+
* @return int
13+
*/
14+
public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, $string)
15+
{
16+
return strlen(static::removeDecoration($formatter, $string));
17+
}
18+
19+
/**
20+
* @param string $string
21+
*
22+
* @return string
23+
*/
24+
public static function removeDecoration(OutputFormatterInterface $formatter, $string)
25+
{
26+
$isDecorated = $formatter->isDecorated();
27+
$formatter->setDecorated(false);
28+
$string = preg_replace("/\033\[[^m]*m/", '', $formatter->format($string));
29+
$formatter->setDecorated($isDecorated);
30+
31+
return $string;
32+
}
33+
}
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Symfony\Component\Console\Output\OutputInterface;
66

7-
class MarkdownTable
7+
class Table
88
{
99
/**
1010
* @var OutputInterface
@@ -122,7 +122,9 @@ private function renderHorizontalLine()
122122
*/
123123
private function prepareCell(array $row, $column)
124124
{
125-
return str_pad($row[$column], $this->getColumnWidth($column));
125+
$cleanLength = OutputHelper::strlenWithoutDecoration($this->output->getFormatter(), $row[$column]);
126+
127+
return sprintf('%s%s', $row[$column], str_repeat(' ', $this->getColumnWidth($column) - $cleanLength));
126128
}
127129

128130
/**
@@ -139,7 +141,7 @@ private function getColumnWidth($column)
139141
$lengths = array();
140142

141143
foreach (array_merge(array($this->headers), $this->rows) as $row) {
142-
$lengths[] = strlen($row[$column]);
144+
$lengths[] = OutputHelper::strlenWithoutDecoration($this->output->getFormatter(), $row[$column]);
143145
}
144146

145147
return $this->columnWidths[$column] = max($lengths);

src/Formatter/MarkdownTableFormatter.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Composer\DependencyResolver\Operation\OperationInterface;
77
use Composer\DependencyResolver\Operation\UninstallOperation;
88
use Composer\DependencyResolver\Operation\UpdateOperation;
9-
use IonBazan\ComposerDiff\Formatter\Helper\MarkdownTable;
9+
use IonBazan\ComposerDiff\Formatter\Helper\Table;
1010

1111
class MarkdownTableFormatter extends MarkdownFormatter
1212
{
@@ -31,8 +31,8 @@ public function render(array $operations, $title, $withUrls)
3131
$rows[] = $row;
3232
}
3333

34-
$table = new MarkdownTable($this->output);
35-
$headers = array($title, 'Base', 'Target');
34+
$table = new Table($this->output);
35+
$headers = array($title, 'Action', 'Base', 'Target');
3636

3737
if ($withUrls) {
3838
$headers[] = 'Link';
@@ -50,14 +50,16 @@ private function getTableRow(OperationInterface $operation)
5050
if ($operation instanceof InstallOperation) {
5151
return array(
5252
$operation->getPackage()->getName(),
53-
'New',
53+
'<fg=green>New</>',
54+
'-',
5455
$operation->getPackage()->getFullPrettyVersion(),
5556
);
5657
}
5758

5859
if ($operation instanceof UpdateOperation) {
5960
return array(
6061
$operation->getInitialPackage()->getName(),
62+
self::isUpgrade($operation) ? '<fg=cyan>Upgraded</>' : '<fg=yellow>Downgraded</>',
6163
$operation->getInitialPackage()->getFullPrettyVersion(),
6264
$operation->getTargetPackage()->getFullPrettyVersion(),
6365
);
@@ -66,8 +68,9 @@ private function getTableRow(OperationInterface $operation)
6668
if ($operation instanceof UninstallOperation) {
6769
return array(
6870
$operation->getPackage()->getName(),
71+
'<fg=red>Removed</>',
6972
$operation->getPackage()->getFullPrettyVersion(),
70-
'Removed',
73+
'-',
7174
);
7275
}
7376

tests/Command/DiffCommandTest.php

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,51 +42,53 @@ public function outputDataProvider()
4242
return array(
4343
'Markdown table' => array(
4444
<<<OUTPUT
45-
| Prod Packages | Base | Target |
46-
|---------------|-------|---------|
47-
| a/package-1 | New | 1.0.0 |
48-
| a/package-2 | 1.0.0 | 1.2.0 |
49-
| a/package-3 | 0.1.1 | Removed |
50-
| a/package-4 | 0.1.1 | Removed |
51-
| a/package-5 | 0.1.1 | Removed |
52-
| a/package-6 | 0.1.1 | Removed |
45+
| Prod Packages | Action | Base | Target |
46+
|---------------|----------|-------|--------|
47+
| a/package-1 | New | - | 1.0.0 |
48+
| a/package-2 | Upgraded | 1.0.0 | 1.2.0 |
49+
| a/package-3 | Removed | 0.1.1 | - |
50+
| a/package-4 | Removed | 0.1.1 | - |
51+
| a/package-5 | Removed | 0.1.1 | - |
52+
| a/package-6 | Removed | 0.1.1 | - |
5353
5454
5555
OUTPUT
5656
,
5757
array(
5858
'--no-dev' => null,
59+
'-f' => 'mdtable',
5960
),
6061
),
6162
'Markdown with URLs' => array(
6263
<<<OUTPUT
63-
| Prod Packages | Base | Target | Link |
64-
|---------------|-------|---------|--------------------------------------------|
65-
| a/package-1 | New | 1.0.0 | [Compare](github.com/releases/tag/1.0.0) |
66-
| a/package-2 | 1.0.0 | 1.2.0 | [Compare](github.com/compare/1.0.0..1.2.0) |
67-
| a/package-3 | 0.1.1 | Removed | [Compare](github.com/releases/tag/0.1.1) |
68-
| a/package-4 | 0.1.1 | Removed | [Compare](gitlab.org/tags/0.1.1) |
69-
| a/package-5 | 0.1.1 | Removed | [Compare](gitlab2.org/tags/0.1.1) |
70-
| a/package-6 | 0.1.1 | Removed | |
64+
| Prod Packages | Action | Base | Target | Link |
65+
|---------------|----------|-------|--------|--------------------------------------------|
66+
| a/package-1 | New | - | 1.0.0 | [Compare](github.com/releases/tag/1.0.0) |
67+
| a/package-2 | Upgraded | 1.0.0 | 1.2.0 | [Compare](github.com/compare/1.0.0..1.2.0) |
68+
| a/package-3 | Removed | 0.1.1 | - | [Compare](github.com/releases/tag/0.1.1) |
69+
| a/package-4 | Removed | 0.1.1 | - | [Compare](gitlab.org/tags/0.1.1) |
70+
| a/package-5 | Removed | 0.1.1 | - | [Compare](gitlab2.org/tags/0.1.1) |
71+
| a/package-6 | Removed | 0.1.1 | - | |
7172
7273
7374
OUTPUT
7475
,
7576
array(
7677
'--no-dev' => null,
7778
'-l' => null,
79+
'-f' => 'anything',
7880
),
7981
),
8082
'Markdown with URLs and custom gitlab domains' => array(
8183
<<<OUTPUT
82-
| Prod Packages | Base | Target | Link |
83-
|---------------|-------|---------|--------------------------------------------|
84-
| a/package-1 | New | 1.0.0 | [Compare](github.com/releases/tag/1.0.0) |
85-
| a/package-2 | 1.0.0 | 1.2.0 | [Compare](github.com/compare/1.0.0..1.2.0) |
86-
| a/package-3 | 0.1.1 | Removed | [Compare](github.com/releases/tag/0.1.1) |
87-
| a/package-4 | 0.1.1 | Removed | [Compare](gitlab.org/tags/0.1.1) |
88-
| a/package-5 | 0.1.1 | Removed | [Compare](gitlab2.org/tags/0.1.1) |
89-
| a/package-6 | 0.1.1 | Removed | [Compare](gitlab3.org/tags/0.1.1) |
84+
| Prod Packages | Action | Base | Target | Link |
85+
|---------------|----------|-------|--------|--------------------------------------------|
86+
| a/package-1 | New | - | 1.0.0 | [Compare](github.com/releases/tag/1.0.0) |
87+
| a/package-2 | Upgraded | 1.0.0 | 1.2.0 | [Compare](github.com/compare/1.0.0..1.2.0) |
88+
| a/package-3 | Removed | 0.1.1 | - | [Compare](github.com/releases/tag/0.1.1) |
89+
| a/package-4 | Removed | 0.1.1 | - | [Compare](gitlab.org/tags/0.1.1) |
90+
| a/package-5 | Removed | 0.1.1 | - | [Compare](gitlab2.org/tags/0.1.1) |
91+
| a/package-6 | Removed | 0.1.1 | - | [Compare](gitlab3.org/tags/0.1.1) |
9092
9193
9294
OUTPUT

0 commit comments

Comments
 (0)