Skip to content

Commit c31455b

Browse files
committed
decouple open logic to OpenVersionsComposerProcessor
1 parent 969a506 commit c31455b

File tree

9 files changed

+171
-44
lines changed

9 files changed

+171
-44
lines changed

src/Command/OpenVersionsCommand.php

Lines changed: 21 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
use Nette\Utils\FileSystem;
88
use Nette\Utils\Json;
99
use Rector\Jack\Composer\ComposerOutdatedResponseProvider;
10-
use Rector\Jack\Composer\NextVersionResolver;
10+
use Rector\Jack\ComposerProcessor\OpenVersionsComposerProcessor;
1111
use Rector\Jack\Enum\ComposerKey;
12-
use Rector\Jack\FileSystem\ComposerJsonPackageVersionUpdater;
1312
use Rector\Jack\OutdatedComposerFactory;
1413
use Symfony\Component\Console\Command\Command;
1514
use Symfony\Component\Console\Input\InputInterface;
@@ -20,9 +19,9 @@
2019
final class OpenVersionsCommand extends Command
2120
{
2221
public function __construct(
23-
private readonly NextVersionResolver $nextVersionResolver,
2422
private readonly OutdatedComposerFactory $outdatedComposerFactory,
2523
private readonly ComposerOutdatedResponseProvider $composerOutdatedResponseProvider,
24+
private readonly OpenVersionsComposerProcessor $openVersionsComposerProcessor,
2625
) {
2726
parent::__construct();
2827
}
@@ -93,56 +92,40 @@ protected function execute(InputInterface $input, OutputInterface $output): int
9392

9493
$composerJsonContents = FileSystem::read($composerJsonFilePath);
9594

96-
$outdatedPackages = $outdatedComposer->getPackagesShuffled($onlyDev, $packagePrefix);
97-
98-
$openedPackageCount = 0;
99-
foreach ($outdatedPackages as $outdatedPackage) {
100-
$composerVersion = $outdatedPackage->getComposerVersion();
101-
102-
// already filled with open version
103-
if (str_contains($composerVersion, '|')) {
104-
continue;
105-
}
106-
107-
// convert composer version to next version
108-
$nextVersion = $this->nextVersionResolver->resolve($outdatedPackage->getName(), $composerVersion);
109-
$openedVersion = $composerVersion . '|' . $nextVersion;
110-
111-
// replace using regex, to keep original composer.json format
112-
$composerJsonContents = ComposerJsonPackageVersionUpdater::update(
113-
$composerJsonContents,
114-
$outdatedPackage->getName(),
115-
$openedVersion
116-
);
117-
118-
$symfonyStyle->writeln(sprintf(
119-
' * Opened "<fg=green>%s</>" package to "<fg=yellow>%s</>" version',
120-
$outdatedPackage->getName(),
121-
$openedVersion
122-
));
95+
$changedPackageVersionsResult = $this->openVersionsComposerProcessor->process(
96+
$composerJsonContents,
97+
$outdatedComposer,
98+
$limit,
99+
$onlyDev,
100+
$packagePrefix
101+
);
123102

124-
++$openedPackageCount;
125-
if ($openedPackageCount >= $limit) {
126-
// we've reached the limit, so we can stop
127-
break;
128-
}
129-
}
103+
$openedPackages = $changedPackageVersionsResult->getChangedPackageVersions();
104+
$changedComposerJson = $changedPackageVersionsResult->getComposerJsonContents();
130105

131106
if ($isDryRun === false) {
132107
// update composer.json file, only if no --dry-run
133-
FileSystem::write($composerJsonFilePath, $composerJsonContents . PHP_EOL, null);
108+
FileSystem::write($composerJsonFilePath, $changedComposerJson . PHP_EOL, null);
134109
}
135110

136111
$symfonyStyle->success(
137112
sprintf(
138113
'%d packages %s opened up to the next nearest version.%s%s "composer update" to push versions up',
139-
$openedPackageCount,
114+
count($openedPackages),
140115
$isDryRun ? 'would be (is "--dry-run")' : 'were',
141116
PHP_EOL,
142117
$isDryRun ? 'Then you would run' : 'Now run'
143118
)
144119
);
145120

121+
foreach ($openedPackages as $openedPackage) {
122+
$symfonyStyle->writeln(sprintf(
123+
' * Opened "<fg=green>%s</>" package to "<fg=yellow>%s</>" version',
124+
$openedPackage->getPackageName(),
125+
$openedPackage->getNewVersion()
126+
));
127+
}
128+
146129
return self::SUCCESS;
147130
}
148131
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Jack\ComposerProcessor;
6+
7+
use Rector\Jack\Composer\NextVersionResolver;
8+
use Rector\Jack\FileSystem\ComposerJsonPackageVersionUpdater;
9+
use Rector\Jack\ValueObject\ChangedPackageVersion;
10+
use Rector\Jack\ValueObject\ComposerProcessorResult\ChangedPackageVersionsResult;
11+
use Rector\Jack\ValueObject\OutdatedComposer;
12+
13+
/**
14+
* @see \Rector\Jack\Tests\ComposerProcessor\OpenVersionsComposerProcessor\OpenVersionsComposerProcessorTest
15+
*/
16+
final class OpenVersionsComposerProcessor
17+
{
18+
public function __construct(
19+
private NextVersionResolver $nextVersionResolver
20+
) {
21+
}
22+
23+
public function process(
24+
string $composerJsonContents,
25+
OutdatedComposer $outdatedComposer,
26+
int $limit,
27+
bool $onlyDev,
28+
?string $packagePrefix
29+
): ChangedPackageVersionsResult {
30+
$outdatedPackages = $outdatedComposer->getPackagesShuffled($onlyDev, $packagePrefix);
31+
32+
$openedPackages = [];
33+
34+
foreach ($outdatedPackages as $outdatedPackage) {
35+
$composerVersion = $outdatedPackage->getComposerVersion();
36+
37+
// already filled with open version
38+
if (str_contains($composerVersion, '|')) {
39+
continue;
40+
}
41+
42+
// convert composer version to next version
43+
$nextVersion = $this->nextVersionResolver->resolve($outdatedPackage->getName(), $composerVersion);
44+
$openedVersion = $composerVersion . '|' . $nextVersion;
45+
46+
// replace using regex, to keep original composer.json format
47+
$composerJsonContents = ComposerJsonPackageVersionUpdater::update(
48+
$composerJsonContents,
49+
$outdatedPackage->getName(),
50+
$openedVersion
51+
);
52+
53+
$openedPackages[] = new ChangedPackageVersion(
54+
$outdatedPackage->getName(),
55+
$composerVersion,
56+
$openedVersion,
57+
);
58+
59+
if (count($openedPackages) >= $limit) {
60+
// we've reached the limit, so we can stop
61+
break;
62+
}
63+
}
64+
65+
return new ChangedPackageVersionsResult($composerJsonContents, $openedPackages);
66+
}
67+
}

src/ComposerProcessor/RaiseToInstalledComposerProcessor.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?php
22

3+
declare(strict_types=1);
4+
35
namespace Rector\Jack\ComposerProcessor;
46

57
use Composer\Semver\Comparator;
@@ -9,7 +11,7 @@
911
use Rector\Jack\Composer\VersionComparator;
1012
use Rector\Jack\FileSystem\ComposerJsonPackageVersionUpdater;
1113
use Rector\Jack\ValueObject\ChangedPackageVersion;
12-
use Rector\Jack\ValueObject\ComposerProcessorResult\RaiseToInstalledResult;
14+
use Rector\Jack\ValueObject\ComposerProcessorResult\ChangedPackageVersionsResult;
1315

1416
/**
1517
* @see \Rector\Jack\Tests\ComposerProcessor\RaiseToInstalledComposerProcessor\RaiseToInstalledComposerProcessorTest
@@ -22,7 +24,7 @@ public function __construct(
2224
) {
2325
}
2426

25-
public function process(string $composerJsonContents): RaiseToInstalledResult
27+
public function process(string $composerJsonContents): ChangedPackageVersionsResult
2628
{
2729
$installedPackagesToVersions = $this->installedVersionResolver->resolve();
2830

@@ -115,6 +117,6 @@ public function process(string $composerJsonContents): RaiseToInstalledResult
115117
$changedPackageVersions[] = new ChangedPackageVersion($packageName, $packageVersion, $newRequiredVersion);
116118
}
117119

118-
return new RaiseToInstalledResult($composerJsonContents, $changedPackageVersions);
120+
return new ChangedPackageVersionsResult($composerJsonContents, $changedPackageVersions);
119121
}
120122
}

src/ValueObject/ComposerProcessorResult/RaiseToInstalledResult.php renamed to src/ValueObject/ComposerProcessorResult/ChangedPackageVersionsResult.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use Rector\Jack\ValueObject\ChangedPackageVersion;
88
use Webmozart\Assert\Assert;
99

10-
final class RaiseToInstalledResult
10+
final class ChangedPackageVersionsResult
1111
{
1212
/**
1313
* @param ChangedPackageVersion[] $changedPackageVersions

src/ValueObject/OutdatedComposer.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Rector\Jack\ValueObject;
66

7+
use Webmozart\Assert\Assert;
8+
79
final readonly class OutdatedComposer
810
{
911
/**
@@ -12,6 +14,7 @@
1214
public function __construct(
1315
private array $outdatedPackages
1416
) {
17+
Assert::allIsInstanceOf($outdatedPackages, OutdatedPackage::class);
1518
}
1619

1720
public function getProdPackagesCount(): int
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"require": {
3+
"symfony/console": "^5.4|6.0.*"
4+
}
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"require": {
3+
"symfony/console": "^5.4"
4+
}
5+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Jack\Tests\ComposerProcessor\OpenVersionsComposerProcessor;
6+
7+
use Nette\Utils\FileSystem;
8+
use Rector\Jack\ComposerProcessor\OpenVersionsComposerProcessor;
9+
use Rector\Jack\Tests\AbstractTestCase;
10+
use Rector\Jack\ValueObject\ChangedPackageVersion;
11+
use Rector\Jack\ValueObject\OutdatedComposer;
12+
use Rector\Jack\ValueObject\OutdatedPackage;
13+
14+
final class OpenVersionsComposerProcessorTest extends AbstractTestCase
15+
{
16+
private OpenVersionsComposerProcessor $openVersionsComposerProcessor;
17+
18+
protected function setUp(): void
19+
{
20+
parent::setUp();
21+
22+
$this->openVersionsComposerProcessor = $this->make(OpenVersionsComposerProcessor::class);
23+
}
24+
25+
public function test(): void
26+
{
27+
$composerJsonContents = FileSystem::read(__DIR__ . '/Fixture/some-closed-composer.json');
28+
29+
$outdatedComposer = new OutdatedComposer([
30+
new OutdatedPackage('symfony/console', '5.4.0', '^5.4', true, '6.4.0', '1 year'),
31+
]);
32+
33+
$changedPackageVersionsResult = $this->openVersionsComposerProcessor->process(
34+
$composerJsonContents,
35+
$outdatedComposer,
36+
10,
37+
false,
38+
null
39+
);
40+
41+
$this->assertCount(1, $changedPackageVersionsResult->getChangedPackageVersions());
42+
$this->assertContainsOnlyInstancesOf(
43+
ChangedPackageVersion::class,
44+
$changedPackageVersionsResult->getChangedPackageVersions()
45+
);
46+
47+
$this->assertStringEqualsFile(
48+
__DIR__ . '/Fixture/expected-opened-composer.json',
49+
$changedPackageVersionsResult->getComposerJsonContents()
50+
);
51+
}
52+
}

tests/ComposerProcessor/RaiseToInstalledComposerProcessor/RaiseToInstalledComposerProcessorTest.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,20 @@
1111

1212
final class RaiseToInstalledComposerProcessorTest extends AbstractTestCase
1313
{
14+
private RaiseToInstalledComposerProcessor $raiseToInstalledComposerProcessor;
15+
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
$this->raiseToInstalledComposerProcessor = $this->make(RaiseToInstalledComposerProcessor::class);
21+
}
22+
1423
public function test(): void
1524
{
1625
$composerJsonContents = FileSystem::read(__DIR__ . '/Fixture/some-outdated-composer.json');
1726

18-
$raiseToInstalledComposerProcessor = $this->make(RaiseToInstalledComposerProcessor::class);
19-
$raiseToInstalledResult = $raiseToInstalledComposerProcessor->process($composerJsonContents);
27+
$raiseToInstalledResult = $this->raiseToInstalledComposerProcessor->process($composerJsonContents);
2028

2129
$this->assertCount(1, $raiseToInstalledResult->getChangedPackageVersions());
2230
$this->assertContainsOnlyInstancesOf(
@@ -28,6 +36,8 @@ public function test(): void
2836

2937
$this->assertSame('illuminate/container', $changedPackageVersion->getPackageName());
3038
$this->assertSame('^9.0', $changedPackageVersion->getOldVersion());
39+
40+
// note: this might change in near future; improve to dynamic soon
3141
$this->assertSame('^12.14', $changedPackageVersion->getNewVersion());
3242
}
3343
}

0 commit comments

Comments
 (0)