Refactor composer modifier to ComposerRector (#5198)

This commit is contained in:
Tomas Votruba 2021-01-16 13:23:37 +01:00 committed by GitHub
parent 35e83f75c6
commit 04db98620a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
76 changed files with 1648 additions and 1250 deletions

View File

@ -4,19 +4,11 @@ on:
pull_request: null
jobs:
matrix:
code_analysis:
strategy:
fail-fast: false
matrix:
actions:
-
name: 'PHPStan'
run: composer phpstan
-
name: 'PHPStan for config'
run: composer phpstan-config
-
name: 'Show command'
run: bin/rector show --ansi
@ -57,7 +49,7 @@ jobs:
-
name: 'PHP Linter'
run: vendor/bin/parallel-lint src bin/rector config tests packages rules --exclude packages/rector-generator/templates --colors --exclude rules/psr4/tests/Rector/Namespace_/MultipleClassFileToPsr4ClassesRector/Source --exclude rules/autodiscovery/tests/Rector/FileNode/MoveInterfacesToContractNamespaceDirectoryRector/Expected
run: vendor/bin/parallel-lint src bin/rector config tests packages rules --colors --exclude packages/rector-generator/templates --exclude rules/psr4/tests/Rector/Namespace_/MultipleClassFileToPsr4ClassesRector/Source --exclude rules/autodiscovery/tests/Rector/FileNode/MoveInterfacesToContractNamespaceDirectoryRector/Expected
name: ${{ matrix.actions.name }}
runs-on: ubuntu-latest
@ -71,7 +63,6 @@ jobs:
with:
php-version: 7.3
coverage: none
tools: composer:v2
- uses: "ramsey/composer-install@v1"

View File

@ -25,7 +25,7 @@ jobs:
with:
php-version: 7.4
coverage: none
tools: composer:v2
- run: composer install --no-progress --ansi

View File

@ -0,0 +1,35 @@
name: Code Analysis PHP 8.0
on:
pull_request: null
jobs:
code_analysis_php80:
strategy:
fail-fast: false
matrix:
actions:
-
name: 'PHPStan'
run: vendor/bin/phpstan analyse --ansi --error-format symplify
-
name: 'PHPStan for config'
run: composer phpstan-config
name: ${{ matrix.actions.name }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# see https://github.com/shivammathur/setup-php
-
uses: shivammathur/setup-php@v2
with:
php-version: 8.0
coverage: none
- uses: "ramsey/composer-install@v1"
- run: ${{ matrix.actions.run }}

View File

@ -37,7 +37,7 @@ jobs:
with:
php-version: 7.4
coverage: none
tools: composer:v2
-
run: composer install --no-progress --ansi

View File

@ -27,7 +27,7 @@ jobs:
with:
php-version: 7.4
coverage: none
tools: composer:v2
- run: ${{ matrix.actions.install }}

View File

@ -48,7 +48,7 @@ jobs:
# PHP 7.3 is required, so Rector's code is PHP 7.3 compatible even after refactoring
php-version: 7.3
coverage: none
tools: composer:v2
- run: composer install --no-progress --ansi

View File

@ -26,7 +26,7 @@ jobs:
# Coveralls.io
composer require --dev php-coveralls/php-coveralls:^2.4
vendor/bin/php-coveralls --coverage_clover=clover.xml -v
# clean up
git checkout .
git clean -xfd build
@ -47,7 +47,7 @@ jobs:
with:
php-version: 7.4
coverage: xdebug
tools: composer:v2
-
run: composer install --no-progress --ansi

View File

@ -41,7 +41,7 @@ jobs:
with:
php-version: 7.4
coverage: xdebug
tools: composer:v2
-
run: composer install --no-progress --ansi

View File

@ -0,0 +1,66 @@
<?php
declare(strict_types=1);
use Rector\Composer\Rector\ChangePackageVersionRector;
use Rector\Composer\Rector\RemovePackageRector;
use Rector\Composer\Rector\ReplacePackageAndVersionRector;
use Rector\Composer\ValueObject\PackageAndVersion;
use Rector\Composer\ValueObject\ReplacePackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(ChangePackageVersionRector::class)
->call('configure', [[
ChangePackageVersionRector::PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new PackageAndVersion('nette/nette', '^3.0'),
// https://github.com/nette/nette/blob/v2.4.0/composer.json vs https://github.com/nette/nette/blob/v3.0.0/composer.json
// older versions have security issues
new PackageAndVersion('nette/application', '^3.0.6'),
new PackageAndVersion('nette/bootstrap', '^3.0'),
new PackageAndVersion('nette/caching', '^3.0'),
new PackageAndVersion('nette/component-model', '^3.0'),
new PackageAndVersion('nette/database', '^3.0'),
new PackageAndVersion('nette/di', '^3.0'),
new PackageAndVersion('nette/finder', '^2.5'),
new PackageAndVersion('nette/forms', '^3.0'),
new PackageAndVersion('nette/http', '^3.0'),
new PackageAndVersion('nette/mail', '^3.0'),
new PackageAndVersion('nette/neon', '^3.0'),
new PackageAndVersion('nette/php-generator', '^3.0'),
new PackageAndVersion('nette/robot-loader', '^3.0'),
new PackageAndVersion('nette/safe-stream', '^2.4'),
new PackageAndVersion('nette/security', '^3.0'),
new PackageAndVersion('nette/tokenizer', '^3.0'),
new PackageAndVersion('nette/utils', '^3.0'),
new PackageAndVersion('latte/latte', '^2.5'),
new PackageAndVersion('tracy/tracy', '^2.6'),
// contributte packages
new PackageAndVersion('contributte/event-dispatcher-extra', '^0.8'),
new PackageAndVersion('contributte/forms-multiplier', '3.1.x-dev'),
// other packages
new PackageAndVersion('radekdostal/nette-datetimepicker', '^3.0'),
]),
]]);
$services->set(RemovePackageRector::class)
->call('configure', [[
RemovePackageRector::PACKAGE_NAMES => ['nette/deprecated', 'nette/reflection'],
]]);
$services->set(ReplacePackageAndVersionRector::class)
->call('configure', [[
ReplacePackageAndVersionRector::REPLACE_PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
// webchemistry to contributte
new ReplacePackageAndVersion(
'webchemistry/forms-multiplier',
'contributte/forms-multiplier',
'3.1.x-dev'
),
]),
]]);
};

View File

@ -2,10 +2,6 @@
declare(strict_types=1);
use Rector\Composer\Modifier\ComposerModifier;
use Rector\Composer\ValueObject\ComposerModifier\ChangePackageVersion;
use Rector\Composer\ValueObject\ComposerModifier\RemovePackage;
use Rector\Composer\ValueObject\ComposerModifier\ReplacePackage;
use Rector\DeadCode\Rector\StaticCall\RemoveParentCallWithoutParentRector;
use Rector\Generic\Rector\ClassMethod\ArgumentDefaultValueReplacerRector;
use Rector\Generic\Rector\MethodCall\FormerNullableArgumentToScalarTypedRector;
@ -29,6 +25,7 @@ use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigura
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$containerConfigurator->import(__DIR__ . '/nette-30-composer.php');
$containerConfigurator->import(__DIR__ . '/nette-30-dependency-injection.php');
$containerConfigurator->import(__DIR__ . '/nette-30-return-types.php');
$containerConfigurator->import(__DIR__ . '/nette-30-param-types.php');
@ -99,42 +96,4 @@ return static function (ContainerConfigurator $containerConfigurator): void {
$services->set(RemoveParentAndNameFromComponentConstructorRector::class);
$services->set(MoveFinalGetUserToCheckRequirementsClassMethodRector::class);
$services->set(ConvertAddUploadWithThirdArgumentTrueToAddMultiUploadRector::class);
$services->set(ComposerModifier::class)
->call('configure', [
ValueObjectInliner::inline([
// meta package
new ChangePackageVersion('nette/nette', '^3.0'),
// https://github.com/nette/nette/blob/v2.4.0/composer.json vs https://github.com/nette/nette/blob/v3.0.0/composer.json
// older versions have security issues
new ChangePackageVersion('nette/application', '^3.0.6'),
new ChangePackageVersion('nette/bootstrap', '^3.0'),
new ChangePackageVersion('nette/caching', '^3.0'),
new ChangePackageVersion('nette/component-model', '^3.0'),
new ChangePackageVersion('nette/database', '^3.0'),
new RemovePackage('nette/deprecated'),
new ChangePackageVersion('nette/di', '^3.0'),
new ChangePackageVersion('nette/finder', '^2.5'),
new ChangePackageVersion('nette/forms', '^3.0'),
new ChangePackageVersion('nette/http', '^3.0'),
new ChangePackageVersion('nette/mail', '^3.0'),
new ChangePackageVersion('nette/neon', '^3.0'),
new ChangePackageVersion('nette/php-generator', '^3.0'),
new RemovePackage('nette/reflection'),
new ChangePackageVersion('nette/robot-loader', '^3.0'),
new ChangePackageVersion('nette/safe-stream', '^2.4'),
new ChangePackageVersion('nette/security', '^3.0'),
new ChangePackageVersion('nette/tokenizer', '^3.0'),
new ChangePackageVersion('nette/utils', '^3.0'),
new ChangePackageVersion('latte/latte', '^2.5'),
new ChangePackageVersion('tracy/tracy', '^2.6'),
// webchemistry to contributte
new ReplacePackage('webchemistry/forms-multiplier', 'contributte/forms-multiplier', '3.1.x-dev'),
// contributte packages
new ChangePackageVersion('contributte/event-dispatcher-extra', '^0.8'),
new ChangePackageVersion('contributte/forms-multiplier', '3.1.x-dev'),
// other packages
new ChangePackageVersion('radekdostal/nette-datetimepicker', '^3.0'),
]),
]);
};

View File

@ -1,4 +1,4 @@
# 660 Rules Overview
# 668 Rules Overview
<br>
@ -18,7 +18,9 @@
- [CodingStyle](#codingstyle) (37)
- [DeadCode](#deadcode) (44)
- [Composer](#composer) (7)
- [DeadCode](#deadcode) (45)
- [DeadDocBlock](#deaddocblock) (3)
@ -311,12 +313,8 @@ return static function (ContainerConfigurator $containerConfigurator): void {
$services->set(MoveValueObjectsToValueObjectDirectoryRector::class)
->call('configure', [[
MoveValueObjectsToValueObjectDirectoryRector::TYPES => [
'ValueObjectInterfaceClassName',
],
MoveValueObjectsToValueObjectDirectoryRector::SUFFIXES => [
'Search',
],
MoveValueObjectsToValueObjectDirectoryRector::TYPES => ['ValueObjectInterfaceClassName'],
MoveValueObjectsToValueObjectDirectoryRector::SUFFIXES => ['Search'],
MoveValueObjectsToValueObjectDirectoryRector::ENABLE_VALUE_OBJECT_GUESSING => true,
]]);
};
@ -2470,7 +2468,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
### SplitDoubleAssignRector
Split multiple inline assigns to `each` own lines default value, to prevent undefined array issues
Split multiple inline assigns to each own lines default value, to prevent undefined array issues
- class: `Rector\CodingStyle\Rector\Assign\SplitDoubleAssignRector`
@ -2781,6 +2779,267 @@ return static function (ContainerConfigurator $containerConfigurator): void {
<br>
## Composer
### AddPackageToRequireDevRector
Add package to "require-dev" in `composer.json`
:wrench: **configure it!**
- class: `Rector\Composer\Rector\AddPackageToRequireDevRector`
```php
use Rector\Composer\Rector\AddPackageToRequireDevRector;
use Rector\Composer\ValueObject\PackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(AddPackageToRequireDevRector::class)
->call('configure', [[
AddPackageToRequireDevRector::PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new PackageAndVersion('symfony/console', '^3.4'),
]),
]]);
};
```
```diff
{
+ "require-dev": {
+ "symfony/console": "^3.4"
+ }
}
```
<br>
### AddPackageToRequireRector
Add package to "require" in `composer.json`
:wrench: **configure it!**
- class: `Rector\Composer\Rector\AddPackageToRequireRector`
```php
use Rector\Composer\Rector\AddPackageToRequireRector;
use Rector\Composer\ValueObject\PackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(AddPackageToRequireRector::class)
->call('configure', [[
AddPackageToRequireRector::PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new PackageAndVersion('symfony/console', '^3.4'),
]),
]]);
};
```
```diff
{
+ "require": {
+ "symfony/console": "^3.4"
+ }
}
```
<br>
### ChangePackageVersionRector
Change package version `composer.json`
:wrench: **configure it!**
- class: `Rector\Composer\Rector\ChangePackageVersionRector`
```php
use Rector\Composer\Rector\ChangePackageVersionRector;
use Rector\Composer\ValueObject\PackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(ChangePackageVersionRector::class)
->call('configure', [[
ChangePackageVersionRector::PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new PackageAndVersion('symfony/console', '^4.4'),
]),
]]);
};
```
```diff
{
- "require-dev": {
- "symfony/console": "^3.4"
+ "require": {
+ "symfony/console": "^4.4"
}
}
```
<br>
### MovePackageToRequireDevRector
Moves package from "require" to "require-dev" in `composer.json`
:wrench: **configure it!**
- class: `Rector\Composer\Rector\MovePackageToRequireDevRector`
```php
use Rector\Composer\Rector\MovePackageToRequireDevRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(MovePackageToRequireDevRector::class)
->call('configure', [[
MovePackageToRequireDevRector::PACKAGE_NAMES => ['symfony/console'],
]]);
};
```
```diff
{
- "require": {
+ "require-dev": {
"symfony/console": "^3.4"
}
}
```
<br>
### MovePackageToRequireRector
Moves package from "require-dev" to "require" in `composer.json`
:wrench: **configure it!**
- class: `Rector\Composer\Rector\MovePackageToRequireRector`
```php
use Rector\Composer\Rector\MovePackageToRequireRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(MovePackageToRequireRector::class)
->call('configure', [[
MovePackageToRequireRector::PACKAGE_NAMES => ['symfony/console'],
]]);
};
```
```diff
{
- "require-dev": {
+ "require": {
"symfony/console": "^3.4"
}
}
```
<br>
### RemovePackageRector
Remove package from "require" and "require-dev" in `composer.json`
:wrench: **configure it!**
- class: `Rector\Composer\Rector\RemovePackageRector`
```php
use Rector\Composer\Rector\RemovePackageRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(RemovePackageRector::class)
->call('configure', [[
RemovePackageRector::PACKAGE_NAMES => ['symfony/console'],
]]);
};
```
```diff
{
- "require": {
- "symfony/console": "^3.4"
- }
}
```
<br>
### ReplacePackageAndVersionRector
Change package name and version `composer.json`
:wrench: **configure it!**
- class: `Rector\Composer\Rector\ReplacePackageAndVersionRector`
```php
use Rector\Composer\Rector\ReplacePackageAndVersionRector;
use Rector\Composer\ValueObject\ReplacePackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(ReplacePackageAndVersionRector::class)
->call('configure', [[
ReplacePackageAndVersionRector::REPLACE_PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new ReplacePackageAndVersion('symfony/console', 'symfony/http-kernel', '^4.4'),
]),
]]);
};
```
```diff
{
"require-dev": {
- "symfony/console": "^3.4"
+ "symfony/http-kernel": "^4.4"
}
}
```
<br>
## DeadCode
### RecastingRemovalRector
@ -2904,6 +3163,28 @@ Remove (string) casting when it comes to concat, that does this by default
<br>
### RemoveDeadConditionAboveReturnRector
Remove dead condition above return
- class: `Rector\DeadCode\Rector\Return_\RemoveDeadConditionAboveReturnRector`
```diff
final class SomeClass
{
public function go()
{
- if (1 === 1) {
- return 'yes';
- }
-
return 'yes';
}
}
```
<br>
### RemoveDeadConstructorRector
Remove empty constructor
@ -6919,7 +7200,10 @@ return static function (ContainerConfigurator $containerConfigurator): void {
$services->set(InjectAnnotationClassRector::class)
->call('configure', [[
InjectAnnotationClassRector::ANNOTATION_CLASSES => ['DI\Annotation\Inject', 'JMS\DiExtraBundle\Annotation\Inject'],
InjectAnnotationClassRector::ANNOTATION_CLASSES => [
'DI\Annotation\Inject',
'JMS\DiExtraBundle\Annotation\Inject',
],
]]);
};
```
@ -7930,10 +8214,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
$services->set(AddTopIncludeRector::class)
->call('configure', [[
AddTopIncludeRector::AUTOLOAD_FILE_PATH => '/../autoloader.php',
AddTopIncludeRector::PATTERNS => [
'pat*/*/?ame.php',
'somepath/?ame.php',
],
AddTopIncludeRector::PATTERNS => ['pat*/*/?ame.php', 'somepath/?ame.php'],
]]);
};
```
@ -8202,8 +8483,8 @@ Changes mockery mock creation to Prophesize
- class: `Rector\MockeryToProphecy\Rector\ClassMethod\MockeryCreateMockToProphizeRector`
```diff
-$mock = \Mockery::mock(\'MyClass\');
+ $mock = $this->prophesize(\'MyClass\');
-$mock = \Mockery::mock('MyClass');
+ $mock = $this->prophesize('MyClass');
+
$service = new Service();
-$service->injectDependency($mock);
@ -14021,7 +14302,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
### PassFactoryToUniqueObjectRector
Convert new `X/Static::call()` to factories in entities, pass them via constructor to `each` other
Convert new `X/Static::call()` to factories in entities, pass them via constructor to each other
:wrench: **configure it!**
@ -15020,7 +15301,10 @@ return static function (ContainerConfigurator $containerConfigurator): void {
$services->set(GetToConstructorInjectionRector::class)
->call('configure', [[
GetToConstructorInjectionRector::GET_METHOD_AWARE_TYPES => ['SymfonyControllerClassName', 'GetTraitClassName'],
GetToConstructorInjectionRector::GET_METHOD_AWARE_TYPES => [
'SymfonyControllerClassName',
'GetTraitClassName',
],
]]);
};
```

View File

@ -41,7 +41,6 @@ use Rector\StaticTypeMapper\TypeFactory\TypeFactoryStaticHelper;
use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType;
use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType;
use Rector\TypeDeclaration\PHPStan\Type\ObjectTypeSpecifier;
use Webmozart\Assert\Assert;
final class NodeTypeResolver
{

View File

@ -13,5 +13,5 @@ return static function (ContainerConfigurator $containerConfigurator): void {
->autoconfigure();
$services->load('Rector\Composer\\', __DIR__ . '/../src')
->exclude([__DIR__ . '/../src/ValueObject']);
->exclude([__DIR__ . '/../src/Rector', __DIR__ . '/../src/ValueObject']);
};

View File

@ -1,12 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Contract\ComposerModifier;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
interface ComposerModifierInterface
{
public function modify(ComposerJson $composerJson): void;
}

View File

@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Contract\Rector;
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
use Rector\Core\Contract\Rector\RectorInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\RuleDocGenerator\Contract\ConfigurableRuleInterface;
interface ComposerRectorInterface extends RectorInterface, ConfigurableRuleInterface, ConfigurableRectorInterface
{
public function refactor(ComposerJson $composerJson): void;
}

View File

@ -4,72 +4,33 @@ declare(strict_types=1);
namespace Rector\Composer\Modifier;
use Rector\Composer\Contract\ComposerModifier\ComposerModifierInterface;
use Rector\Composer\Contract\Rector\ComposerRectorInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Webmozart\Assert\Assert;
/**
* @see \Rector\Composer\Tests\Modifier\ComposerModifierTest
*/
final class ComposerModifier
{
/**
* @var string|null
* @var ComposerRectorInterface[]
*/
private $filePath;
private $composerRectors = [];
/**
* @var string
* @param ComposerRectorInterface[] $composerRectors
*/
private $command = 'composer update';
/**
* @var ComposerModifierInterface[]
*/
private $configuration = [];
/**
* @param ComposerModifierInterface[] $configuration
*/
public function configure(array $configuration): void
public function __construct(array $composerRectors)
{
Assert::allIsInstanceOf($configuration, ComposerModifierInterface::class);
$this->configuration = array_merge($this->configuration, $configuration);
}
/**
* @param ComposerModifierInterface[] $configuration
*/
public function reconfigure(array $configuration): void
{
Assert::allIsInstanceOf($configuration, ComposerModifierInterface::class);
$this->configuration = $configuration;
}
public function setFilePath(string $filePath): void
{
$this->filePath = $filePath;
}
public function getFilePath(): string
{
return $this->filePath ?: getcwd() . '/composer.json';
}
public function setCommand(string $command): void
{
$this->command = $command;
}
public function getCommand(): string
{
return $this->command;
$this->composerRectors = $composerRectors;
}
public function modify(ComposerJson $composerJson): void
{
foreach ($this->configuration as $composerChanger) {
$composerChanger->modify($composerJson);
foreach ($this->composerRectors as $composerRector) {
$composerRector->refactor($composerJson);
}
}
public function enabled(): bool
{
return $this->composerRectors !== [];
}
}

View File

@ -10,14 +10,17 @@ use Rector\Core\Configuration\Configuration;
use Symfony\Component\Process\Process;
use Symplify\ComposerJsonManipulator\ComposerJsonFactory;
use Symplify\ComposerJsonManipulator\Printer\ComposerJsonPrinter;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\SmartFileSystem\SmartFileInfo;
use Symplify\SmartFileSystem\SmartFileSystem;
/**
* @see \Rector\Composer\Tests\Processor\ComposerProcessorTest
*/
final class ComposerProcessor
{
/**
* @var string
*/
private const COMPOSER_UPDATE = 'composer update';
/**
* @var ComposerJsonFactory
*/
@ -28,79 +31,90 @@ final class ComposerProcessor
*/
private $composerJsonPrinter;
/**
* @var ComposerModifier
*/
private $composerModifier;
/**
* @var Configuration
*/
private $configuration;
/**
* @var ErrorAndDiffCollector
*/
private $errorAndDiffCollector;
/**
* @var SmartFileSystem
*/
private $smartFileSystem;
/**
* @var ErrorAndDiffCollector
* @var ComposerModifier
*/
private $errorAndDiffCollector;
private $composerModifier;
public function __construct(
ComposerJsonFactory $composerJsonFactory,
ComposerJsonPrinter $composerJsonPrinter,
ComposerModifier $composerModifier,
Configuration $configuration,
ErrorAndDiffCollector $errorAndDiffCollector,
SmartFileSystem $smartFileSystem,
ErrorAndDiffCollector $errorAndDiffCollector
ComposerModifier $composerModifier
) {
$this->composerJsonFactory = $composerJsonFactory;
$this->composerJsonPrinter = $composerJsonPrinter;
$this->composerModifier = $composerModifier;
$this->configuration = $configuration;
$this->smartFileSystem = $smartFileSystem;
$this->errorAndDiffCollector = $errorAndDiffCollector;
$this->smartFileSystem = $smartFileSystem;
$this->composerModifier = $composerModifier;
}
public function process(): void
public function process(string $composerJsonFilePath): void
{
$composerJsonFilePath = $this->composerModifier->getFilePath();
if (! $this->smartFileSystem->exists($composerJsonFilePath)) {
return;
}
// to avoid modification of file
if (! $this->composerModifier->enabled()) {
return;
}
$smartFileInfo = new SmartFileInfo($composerJsonFilePath);
$composerJson = $this->composerJsonFactory->createFromFileInfo($smartFileInfo);
$oldContents = $smartFileInfo->getContents();
$oldComposerJson = clone $composerJson;
$this->composerModifier->modify($composerJson);
$newContents = $this->composerJsonPrinter->printToString($composerJson);
// nothing has changed
if ($oldContents === $newContents) {
if ($oldComposerJson->getJsonArray() === $composerJson->getJsonArray()) {
return;
}
$this->errorAndDiffCollector->addFileDiff($smartFileInfo, $newContents, $oldContents);
$this->reportFileContentChange($smartFileInfo, $newContents);
$this->addComposerJsonFileDiff($oldComposerJson, $composerJson, $smartFileInfo);
$this->reportFileContentChange($composerJson, $smartFileInfo);
}
private function reportFileContentChange(SmartFileInfo $smartFileInfo, string $newContent): void
private function reportFileContentChange(ComposerJson $composerJson, SmartFileInfo $smartFileInfo): void
{
if ($this->configuration->isDryRun()) {
return;
}
$this->smartFileSystem->dumpFile($smartFileInfo->getRealPath(), $newContent);
$this->smartFileSystem->chmod($smartFileInfo->getRealPath(), $smartFileInfo->getPerms());
$this->composerJsonPrinter->print($composerJson, $smartFileInfo);
$command = $this->composerModifier->getCommand();
$process = new Process(explode(' ', $command), getcwd());
$process = new Process(explode(' ', self::COMPOSER_UPDATE), getcwd());
$process->run(function (string $type, string $message): void {
// $type is always err https://github.com/composer/composer/issues/3795#issuecomment-76401013
echo $message;
});
}
private function addComposerJsonFileDiff(
ComposerJson $oldComposerJson,
ComposerJson $newComposerJson,
SmartFileInfo $smartFileInfo
): void {
$newContents = $this->composerJsonPrinter->printToString($newComposerJson);
$oldContents = $this->composerJsonPrinter->printToString($oldComposerJson);
$this->errorAndDiffCollector->addFileDiff($smartFileInfo, $newContents, $oldContents);
}
}

View File

@ -0,0 +1,67 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Rector;
use Rector\Composer\Contract\Rector\ComposerRectorInterface;
use Rector\Composer\ValueObject\PackageAndVersion;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Composer\Tests\Rector\AddPackageToRequireDevRector\AddPackageToRequireDevRectorTest
*/
final class AddPackageToRequireDevRector implements ComposerRectorInterface
{
/**
* @var string
*/
public const PACKAGES_AND_VERSIONS = 'packages_and_version';
/**
* @var PackageAndVersion[]
*/
private $packageAndVersions = [];
public function refactor(ComposerJson $composerJson): void
{
foreach ($this->packageAndVersions as $packageAndVersion) {
$composerJson->addRequiredDevPackage(
$packageAndVersion->getPackageName(),
$packageAndVersion->getVersion()
);
}
}
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Add package to "require-dev" in `composer.json`', [new ConfiguredCodeSample(
<<<'CODE_SAMPLE'
{
}
CODE_SAMPLE
,
<<<'CODE_SAMPLE'
{
"require-dev": {
"symfony/console": "^3.4"
}
}
CODE_SAMPLE
, [
self::PACKAGES_AND_VERSIONS => [new PackageAndVersion('symfony/console', '^3.4')],
]
),
]);
}
/**
* @param array<string, PackageAndVersion[]> $configuration
*/
public function configure(array $configuration): void
{
$this->packageAndVersions = $configuration[self::PACKAGES_AND_VERSIONS] ?? [];
}
}

View File

@ -0,0 +1,64 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Rector;
use Rector\Composer\Contract\Rector\ComposerRectorInterface;
use Rector\Composer\ValueObject\PackageAndVersion;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Composer\Tests\Rector\AddPackageToRequireRector\AddPackageToRequireRectorTest
*/
final class AddPackageToRequireRector implements ComposerRectorInterface
{
/**
* @var string
*/
public const PACKAGES_AND_VERSIONS = 'packages_and_versions';
/**
* @var PackageAndVersion[]
*/
private $packagesAndVersions = [];
public function refactor(ComposerJson $composerJson): void
{
foreach ($this->packagesAndVersions as $packageAndVersion) {
$composerJson->addRequiredPackage($packageAndVersion->getPackageName(), $packageAndVersion->getVersion());
}
}
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Add package to "require" in `composer.json`', [new ConfiguredCodeSample(
<<<'CODE_SAMPLE'
{
}
CODE_SAMPLE
,
<<<'CODE_SAMPLE'
{
"require": {
"symfony/console": "^3.4"
}
}
CODE_SAMPLE
, [
self::PACKAGES_AND_VERSIONS => [new PackageAndVersion('symfony/console', '^3.4')],
]
),
]);
}
/**
* @param array<string, PackageAndVersion[]> $configuration
*/
public function configure(array $configuration): void
{
$this->packagesAndVersions = $configuration[self::PACKAGES_AND_VERSIONS] ?? [];
}
}

View File

@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Rector;
use Rector\Composer\Contract\Rector\ComposerRectorInterface;
use Rector\Composer\ValueObject\PackageAndVersion;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Composer\Tests\Rector\ChangePackageVersionRector\ChangePackageVersionRectorTest
*/
final class ChangePackageVersionRector implements ComposerRectorInterface
{
/**
* @var string
*/
public const PACKAGES_AND_VERSIONS = 'packages_and_versions';
/**
* @var PackageAndVersion[]
*/
private $packagesAndVersions = [];
public function refactor(ComposerJson $composerJson): void
{
foreach ($this->packagesAndVersions as $packagesAndVersion) {
$composerJson->changePackageVersion(
$packagesAndVersion->getPackageName(),
$packagesAndVersion->getVersion()
);
}
}
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Change package version `composer.json`', [new ConfiguredCodeSample(
<<<'CODE_SAMPLE'
{
"require-dev": {
"symfony/console": "^3.4"
}
}
CODE_SAMPLE
,
<<<'CODE_SAMPLE'
{
"require": {
"symfony/console": "^4.4"
}
}
CODE_SAMPLE
, [
self::PACKAGES_AND_VERSIONS => [new PackageAndVersion('symfony/console', '^4.4')],
]
),
]);
}
/**
* @param array<string, PackageAndVersion[]> $configuration
*/
public function configure(array $configuration): void
{
$this->packagesAndVersions = $configuration[self::PACKAGES_AND_VERSIONS] ?? [];
}
}

View File

@ -0,0 +1,66 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Rector;
use Rector\Composer\Contract\Rector\ComposerRectorInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Composer\Tests\Rector\MovePackageToRequireDevRector\MovePackageToRequireDevRectorTest
*/
final class MovePackageToRequireDevRector implements ComposerRectorInterface
{
/**
* @var string
*/
public const PACKAGE_NAMES = 'package_names';
/**
* @var string[]
*/
private $packageNames = [];
public function refactor(ComposerJson $composerJson): void
{
foreach ($this->packageNames as $packageName) {
$composerJson->movePackageToRequireDev($packageName);
}
}
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Moves package from "require" to "require-dev" in `composer.json`', [new ConfiguredCodeSample(
<<<'CODE_SAMPLE'
{
"require": {
"symfony/console": "^3.4"
}
}
CODE_SAMPLE
,
<<<'CODE_SAMPLE'
{
"require-dev": {
"symfony/console": "^3.4"
}
}
CODE_SAMPLE
, [
self::PACKAGE_NAMES => ['symfony/console'],
]
),
]);
}
/**
* @param array<string, string[]> $configuration
*/
public function configure(array $configuration): void
{
$this->packageNames = $configuration[self::PACKAGE_NAMES] ?? [];
}
}

View File

@ -0,0 +1,66 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Rector;
use Rector\Composer\Contract\Rector\ComposerRectorInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Composer\Tests\Rector\MovePackageToRequireRector\MovePackageToRequireRectorTest
*/
final class MovePackageToRequireRector implements ComposerRectorInterface
{
/**
* @var string
*/
public const PACKAGE_NAMES = 'package_names';
/**
* @var string[]
*/
private $packageNames = [];
public function refactor(ComposerJson $composerJson): void
{
foreach ($this->packageNames as $packageName) {
$composerJson->movePackageToRequire($packageName);
}
}
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Moves package from "require-dev" to "require" in `composer.json`', [new ConfiguredCodeSample(
<<<'CODE_SAMPLE'
{
"require-dev": {
"symfony/console": "^3.4"
}
}
CODE_SAMPLE
,
<<<'CODE_SAMPLE'
{
"require": {
"symfony/console": "^3.4"
}
}
CODE_SAMPLE
, [
self::PACKAGE_NAMES => ['symfony/console'],
]
),
]);
}
/**
* @param array<string, string[]> $configuration
*/
public function configure(array $configuration): void
{
$this->packageNames = $configuration[self::PACKAGE_NAMES] ?? [];
}
}

View File

@ -0,0 +1,63 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Rector;
use Rector\Composer\Contract\Rector\ComposerRectorInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Composer\Tests\Rector\RemovePackageRector\RemovePackageRectorTest
*/
final class RemovePackageRector implements ComposerRectorInterface
{
/**
* @var string
*/
public const PACKAGE_NAMES = 'package_names';
/**
* @var string[]
*/
private $packageNames = [];
public function refactor(ComposerJson $composerJson): void
{
foreach ($this->packageNames as $packageName) {
$composerJson->removePackage($packageName);
}
}
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Remove package from "require" and "require-dev" in `composer.json`', [new ConfiguredCodeSample(
<<<'CODE_SAMPLE'
{
"require": {
"symfony/console": "^3.4"
}
}
CODE_SAMPLE
,
<<<'CODE_SAMPLE'
{
}
CODE_SAMPLE
, [
self::PACKAGE_NAMES => ['symfony/console'],
]
),
]);
}
/**
* @param array<string, string[]> $configuration
*/
public function configure(array $configuration): void
{
$this->packageNames = $configuration[self::PACKAGE_NAMES] ?? [];
}
}

View File

@ -0,0 +1,75 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Rector;
use Rector\Composer\Contract\Rector\ComposerRectorInterface;
use Rector\Composer\ValueObject\ReplacePackageAndVersion;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Composer\Tests\Rector\ReplacePackageAndVersionRector\ReplacePackageAndVersionRectorTest
*/
final class ReplacePackageAndVersionRector implements ComposerRectorInterface
{
/**
* @var string
*/
public const REPLACE_PACKAGES_AND_VERSIONS = 'replace_packages_and_versions';
/**
* @var ReplacePackageAndVersion[]
*/
private $replacePackagesAndVersions = [];
public function refactor(ComposerJson $composerJson): void
{
foreach ($this->replacePackagesAndVersions as $replacePackagesAndVersion) {
$composerJson->replacePackage(
$replacePackagesAndVersion->getOldPackageName(),
$replacePackagesAndVersion->getNewPackageName(),
$replacePackagesAndVersion->getTargetVersion()
);
}
}
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Change package name and version `composer.json`', [new ConfiguredCodeSample(
<<<'CODE_SAMPLE'
{
"require-dev": {
"symfony/console": "^3.4"
}
}
CODE_SAMPLE
,
<<<'CODE_SAMPLE'
{
"require-dev": {
"symfony/http-kernel": "^4.4"
}
}
CODE_SAMPLE
, [
self::REPLACE_PACKAGES_AND_VERSIONS => [new ReplacePackageAndVersion(
'symfony/console',
'symfony/http-kernel',
'^4.4'
)],
]
),
]);
}
/**
* @param array<string, ReplacePackageAndVersion[]> $configuration
*/
public function configure(array $configuration): void
{
$this->replacePackagesAndVersions = $configuration[self::REPLACE_PACKAGES_AND_VERSIONS] ?? [];
}
}

View File

@ -1,36 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\ValueObject\ComposerModifier;
use Rector\Composer\Contract\ComposerModifier\ComposerModifierInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
/**
* Only adds package to require section, if package is already in composer data, nothing happen
* @see \Rector\Composer\Tests\ValueObject\ComposerModifier\AddPackageToRequireTest
*/
final class AddPackageToRequire implements ComposerModifierInterface
{
/**
* @var string
*/
private $packageName;
/**
* @var string
*/
private $version;
public function __construct(string $packageName, string $version)
{
$this->packageName = $packageName;
$this->version = $version;
}
public function modify(ComposerJson $composerJson): void
{
$composerJson->addRequiredPackage($this->packageName, $this->version);
}
}

View File

@ -1,36 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\ValueObject\ComposerModifier;
use Rector\Composer\Contract\ComposerModifier\ComposerModifierInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
/**
* Only adds package to require-dev section, if package is already in composer data, nothing happen
* @see \Rector\Composer\Tests\ValueObject\ComposerModifier\AddPackageToRequireDevTest
*/
final class AddPackageToRequireDev implements ComposerModifierInterface
{
/**
* @var string
*/
private $packageName;
/**
* @var string
*/
private $version;
public function __construct(string $packageName, string $version)
{
$this->packageName = $packageName;
$this->version = $version;
}
public function modify(ComposerJson $composerJson): void
{
$composerJson->addRequiredDevPackage($this->packageName, $this->version);
}
}

View File

@ -1,35 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\ValueObject\ComposerModifier;
use Rector\Composer\Contract\ComposerModifier\ComposerModifierInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
/**
* @see \Rector\Composer\Tests\ValueObject\ComposerModifier\ChangePackageVersionTest
*/
final class ChangePackageVersion implements ComposerModifierInterface
{
/**
* @var string
*/
private $packageName;
/**
* @var string
*/
private $targetVersion;
public function __construct(string $packageName, string $targetVersion)
{
$this->packageName = $packageName;
$this->targetVersion = $targetVersion;
}
public function modify(ComposerJson $composerJson): void
{
$composerJson->changePackageVersion($this->packageName, $this->targetVersion);
}
}

View File

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\ValueObject\ComposerModifier;
use Rector\Composer\Contract\ComposerModifier\ComposerModifierInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
/**
* Moves package to require section, if package is not in composer data, nothing happen, also if package is already in require section
* @see \Rector\Composer\Tests\ValueObject\ComposerModifier\MovePackageToRequireTest
*/
final class MovePackageToRequire implements ComposerModifierInterface
{
/**
* @var string
*/
private $packageName;
public function __construct(string $packageName)
{
$this->packageName = $packageName;
}
public function modify(ComposerJson $composerJson): void
{
$composerJson->movePackageToRequire($this->packageName);
}
}

View File

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\ValueObject\ComposerModifier;
use Rector\Composer\Contract\ComposerModifier\ComposerModifierInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
/**
* Moves package to require-dev section, if package is not in composer data, nothing happen, also if package is already in require-dev section
* @see \Rector\Composer\Tests\ValueObject\ComposerModifier\MovePackageToRequireDevTest
*/
final class MovePackageToRequireDev implements ComposerModifierInterface
{
/**
* @var string
*/
private $packageName;
public function __construct(string $packageName)
{
$this->packageName = $packageName;
}
public function modify(ComposerJson $composerJson): void
{
$composerJson->movePackageToRequireDev($this->packageName);
}
}

View File

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\ValueObject\ComposerModifier;
use Rector\Composer\Contract\ComposerModifier\ComposerModifierInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
/**
* Removes package from composer data
* @see \Rector\Composer\Tests\ValueObject\ComposerModifier\RemovePackageTest
*/
final class RemovePackage implements ComposerModifierInterface
{
/**
* @var string
*/
private $packageName;
public function __construct(string $packageName)
{
$this->packageName = $packageName;
}
public function modify(ComposerJson $composerJson): void
{
$composerJson->removePackage($this->packageName);
}
}

View File

@ -1,49 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\ValueObject\ComposerModifier;
use Rector\Composer\Contract\ComposerModifier\ComposerModifierInterface;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Webmozart\Assert\Assert;
/**
* Replace one package for another
* @see \Rector\Composer\Tests\ValueObject\ComposerModifier\ReplacePackageTest
*/
final class ReplacePackage implements ComposerModifierInterface
{
/**
* @var string
*/
private $oldPackageName;
/**
* @var string
*/
private $newPackageName;
/**
* @var string
*/
private $targetVersion;
public function __construct(string $oldPackageName, string $newPackageName, string $targetVersion)
{
Assert::notSame(
$oldPackageName,
$newPackageName,
'$oldPackageName cannot be the same as $newPackageName. If you want to change version of package, use ' . ChangePackageVersion::class
);
$this->oldPackageName = $oldPackageName;
$this->newPackageName = $newPackageName;
$this->targetVersion = $targetVersion;
}
public function modify(ComposerJson $composerJson): void
{
$composerJson->replacePackage($this->oldPackageName, $this->newPackageName, $this->targetVersion);
}
}

View File

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\ValueObject;
final class PackageAndVersion
{
/**
* @var string
*/
private $packageName;
/**
* @var string
*/
private $version;
public function __construct(string $packageName, string $version)
{
$this->packageName = $packageName;
$this->version = $version;
}
public function getPackageName(): string
{
return $this->packageName;
}
public function getVersion(): string
{
return $this->version;
}
}

View File

@ -0,0 +1,54 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\ValueObject;
use Rector\Composer\Rector\ChangePackageVersionRector;
use Webmozart\Assert\Assert;
final class ReplacePackageAndVersion
{
/**
* @var string
*/
private $oldPackageName;
/**
* @var string
*/
private $newPackageName;
/**
* @var string
*/
private $targetVersion;
public function __construct(string $oldPackageName, string $newPackageName, string $targetVersion)
{
Assert::notSame(
$oldPackageName,
$newPackageName,
'Old and new package have to be different. If you want to only change package version, use ' . ChangePackageVersionRector::class
);
$this->oldPackageName = $oldPackageName;
$this->newPackageName = $newPackageName;
$this->targetVersion = $targetVersion;
}
public function getOldPackageName(): string
{
return $this->oldPackageName;
}
public function getNewPackageName(): string
{
return $this->newPackageName;
}
public function getTargetVersion(): string
{
return $this->targetVersion;
}
}

View File

@ -0,0 +1,10 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Contract;
interface ConfigFileAwareInterface
{
public function provideConfigFile(): string;
}

View File

@ -1,254 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Modifier;
use Rector\Composer\Modifier\ComposerModifier;
use Rector\Composer\ValueObject\ComposerModifier\AddPackageToRequire;
use Rector\Composer\ValueObject\ComposerModifier\ChangePackageVersion;
use Rector\Composer\ValueObject\ComposerModifier\MovePackageToRequireDev;
use Rector\Composer\ValueObject\ComposerModifier\RemovePackage;
use Rector\Composer\ValueObject\ComposerModifier\ReplacePackage;
use Rector\Core\HttpKernel\RectorKernel;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
use Symplify\PackageBuilder\Testing\AbstractKernelTestCase;
final class ComposerModifierTest extends AbstractKernelTestCase
{
protected function setUp(): void
{
$this->bootKernelWithConfigs(RectorKernel::class, []);
}
public function testRefactorWithOneAddedPackage(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$composerModifier->configure([new AddPackageToRequire('vendor1/package3', '^3.0')]);
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
'vendor1/package3' => '^3.0',
]);
$composerModifier->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testRefactorWithOneAddedAndOneRemovedPackage(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$composerModifier->configure([
new AddPackageToRequire('vendor1/package3', '^3.0'),
new RemovePackage('vendor1/package1'),
]);
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package2' => '^2.0',
'vendor1/package3' => '^3.0',
]);
$composerModifier->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testRefactorWithAddedAndRemovedSamePackage(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$composerModifier->configure([
new AddPackageToRequire('vendor1/package3', '^3.0'),
new RemovePackage('vendor1/package3'),
]);
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$composerModifier->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testRefactorWithRemovedAndAddedBackSamePackage(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$composerModifier->configure([
new RemovePackage('vendor1/package3'),
new AddPackageToRequire('vendor1/package3', '^3.0'),
]);
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
'vendor1/package3' => '^3.0',
]);
$composerModifier->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testRefactorWithMovedAndChangedPackages(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$composerModifier->configure([
new MovePackageToRequireDev('vendor1/package1'),
new ReplacePackage('vendor1/package2', 'vendor2/package1', '^3.0'),
new ChangePackageVersion('vendor1/package3', '~3.0.0'),
]);
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
'vendor1/package3' => '^3.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package3' => '~3.0.0',
'vendor2/package1' => '^3.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package1' => '^1.0',
]);
$composerModifier->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testRefactorWithMultipleConfiguration(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$composerModifier->configure([new MovePackageToRequireDev('vendor1/package1')]);
$composerModifier->configure([new ReplacePackage('vendor1/package2', 'vendor2/package1', '^3.0')]);
$composerModifier->configure([new ChangePackageVersion('vendor1/package3', '~3.0.0')]);
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
'vendor1/package3' => '^3.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package3' => '~3.0.0',
'vendor2/package1' => '^3.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package1' => '^1.0',
]);
$composerModifier->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testRefactorWithConfigurationAndReconfigurationAndConfiguration(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$composerModifier->configure([new MovePackageToRequireDev('vendor1/package1')]);
$composerModifier->reconfigure([new ReplacePackage('vendor1/package2', 'vendor2/package1', '^3.0')]);
$composerModifier->configure([new ChangePackageVersion('vendor1/package3', '~3.0.0')]);
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
'vendor1/package3' => '^3.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package3' => '~3.0.0',
'vendor2/package1' => '^3.0',
]);
$composerModifier->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testRefactorWithMovedAndChangedPackagesWithSortPackages(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$composerModifier->configure([
new MovePackageToRequireDev('vendor1/package1'),
new ReplacePackage('vendor1/package2', 'vendor1/package0', '^3.0'),
new ChangePackageVersion('vendor1/package3', '~3.0.0'),
]);
$composerJson = new ComposerJson();
$composerJson->setConfig([
'sort-packages' => true,
]);
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
'vendor1/package3' => '^3.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setConfig([
'sort-packages' => true,
]);
$expectedComposerJson->setRequire([
'vendor1/package0' => '^3.0',
'vendor1/package3' => '~3.0.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package1' => '^1.0',
]);
$composerModifier->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testFilePath(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$this->assertSame(getcwd() . '/composer.json', $composerModifier->getFilePath());
$composerModifier->setFilePath('test/composer.json');
$this->assertSame('test/composer.json', $composerModifier->getFilePath());
}
public function testCommand(): void
{
/** @var ComposerModifier $composerModifier */
$composerModifier = $this->getService(ComposerModifier::class);
$this->assertSame('composer update', $composerModifier->getCommand());
$composerModifier->setCommand('composer update --prefer-stable');
$this->assertSame('composer update --prefer-stable', $composerModifier->getCommand());
}
}

View File

@ -1,32 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Processor;
use Rector\Composer\Processor\ComposerProcessor;
use Rector\Core\HttpKernel\RectorKernel;
use Symplify\PackageBuilder\Testing\AbstractKernelTestCase;
final class ComposerProcessorTest extends AbstractKernelTestCase
{
/**
* @var ComposerProcessor
*/
private $composerProcessor;
protected function setUp(): void
{
$this->bootKernelWithConfigs(RectorKernel::class, [__DIR__ . '/config/configured_composer_processor.php']);
$this->composerProcessor = $this->getService(ComposerProcessor::class);
}
public function test(): void
{
$this->composerProcessor->process();
$this->assertFileEquals(
__DIR__ . '/Fixture/composer_after.json',
__DIR__ . '/Fixture/composer_before.json'
);
}
}

View File

@ -1,5 +0,0 @@
{
"require": {
"nette/nette": "^3.0"
}
}

View File

@ -1,5 +0,0 @@
{
"require": {
"nette/nette": "^3.0"
}
}

View File

@ -1,14 +0,0 @@
<?php declare(strict_types=1);
use Rector\Composer\Modifier\ComposerModifier;
use Rector\Composer\ValueObject\ComposerModifier\ChangePackageVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(ComposerModifier::class)
->call('setFilePath', [__DIR__ . '/../Fixture/composer_before.json'])
->call('configure', [ValueObjectInliner::inline([new ChangePackageVersion('nette/nette', '^3.0')])]);
};

View File

@ -0,0 +1,55 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Rector;
use Nette\Utils\Json;
use Rector\Composer\Modifier\ComposerModifier;
use Rector\Composer\Tests\Contract\ConfigFileAwareInterface;
use Rector\Core\HttpKernel\RectorKernel;
use Rector\Testing\Guard\FixtureGuard;
use Symplify\ComposerJsonManipulator\ComposerJsonFactory;
use Symplify\EasyTesting\StaticFixtureSplitter;
use Symplify\PackageBuilder\Testing\AbstractKernelTestCase;
use Symplify\SmartFileSystem\SmartFileInfo;
abstract class AbstractComposerRectorTestCase extends AbstractKernelTestCase implements ConfigFileAwareInterface
{
/**
* @var FixtureGuard
*/
private $fixtureGuard;
/**
* @var ComposerJsonFactory
*/
private $composerJsonFactory;
/**
* @var ComposerModifier
*/
private $composerModifier;
protected function setUp(): void
{
$this->bootKernelWithConfigs(RectorKernel::class, [$this->provideConfigFile()]);
$this->fixtureGuard = $this->getService(FixtureGuard::class);
$this->composerModifier = $this->getService(ComposerModifier::class);
$this->composerJsonFactory = $this->getService(ComposerJsonFactory::class);
}
protected function doTestFileInfo(SmartFileInfo $smartFileInfo): void
{
$this->fixtureGuard->ensureFileInfoHasDifferentBeforeAndAfterContent($smartFileInfo);
$inputFileInfoAndExpected = StaticFixtureSplitter::splitFileInfoToLocalInputAndExpected($smartFileInfo);
$composerJson = $this->composerJsonFactory->createFromFileInfo($inputFileInfoAndExpected->getInputFileInfo());
$this->composerModifier->modify($composerJson);
$changedComposerJson = Json::encode($composerJson->getJsonArray(), Json::PRETTY);
$this->assertJsonStringEqualsJsonString($inputFileInfoAndExpected->getExpected(), $changedComposerJson);
}
}

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Rector\AddPackageToRequireDevRector;
use Iterator;
use Rector\Composer\Tests\Rector\AbstractComposerRectorTestCase;
use Symplify\EasyTesting\DataProvider\StaticFixtureFinder;
use Symplify\SmartFileSystem\SmartFileInfo;
final class AddPackageToRequireDevRectorTest extends AbstractComposerRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
public function provideData(): Iterator
{
return StaticFixtureFinder::yieldDirectory(__DIR__ . '/Fixture', '*.json');
}
public function provideConfigFile(): string
{
return __DIR__ . '/config/some_config.php';
}
}

View File

@ -0,0 +1,16 @@
{
"require": {
"vendor1/package1": "^1.0",
"vendor1/package2": "^2.0"
}
}
-----
{
"require": {
"vendor1/package1": "^1.0",
"vendor1/package2": "^2.0"
},
"require-dev": {
"vendor1/package3": "^3.0"
}
}

View File

@ -0,0 +1,9 @@
{
"require": {
"vendor1/package1": "^1.0"
},
"require-dev": {
"vendor1/package2": "^2.0",
"vendor1/package3": "^3.0"
}
}

View File

@ -0,0 +1,9 @@
{
"require": {
"vendor1/package1": "^1.0",
"vendor1/package2": "^2.0"
},
"require-dev": {
"vendor1/package3": "^3.0"
}
}

View File

@ -0,0 +1,21 @@
<?php
declare(strict_types=1);
use Rector\Composer\Rector\AddPackageToRequireDevRector;
use Rector\Composer\ValueObject\PackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(AddPackageToRequireDevRector::class)
->call('configure', [[
AddPackageToRequireDevRector::PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new PackageAndVersion('vendor1/package3', '^3.0'),
new PackageAndVersion('vendor1/package1', '^3.0'),
new PackageAndVersion('vendor1/package2', '^3.0'),
]),
]]);
};

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Rector\AddPackageToRequireRector;
use Iterator;
use Rector\Composer\Tests\Rector\AbstractComposerRectorTestCase;
use Symplify\EasyTesting\DataProvider\StaticFixtureFinder;
use Symplify\SmartFileSystem\SmartFileInfo;
final class AddPackageToRequireRectorTest extends AbstractComposerRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
public function provideData(): Iterator
{
return StaticFixtureFinder::yieldDirectory(__DIR__ . '/Fixture', '*.json');
}
public function provideConfigFile(): string
{
return __DIR__ . '/config/some_config.php';
}
}

View File

@ -0,0 +1,16 @@
{
"require-dev": {
"vendor1/package1": "^1.0",
"vendor1/package2": "^2.0"
}
}
-----
{
"require": {
"vendor1/package3": "^3.0"
},
"require-dev": {
"vendor1/package1": "^1.0",
"vendor1/package2": "^2.0"
}
}

View File

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
use Rector\Composer\Rector\AddPackageToRequireRector;
use Rector\Composer\ValueObject\PackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(AddPackageToRequireRector::class)
->call('configure', [[
AddPackageToRequireRector::PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new PackageAndVersion('vendor1/package3', '^3.0'),
]),
]]);
};

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Rector\ChangePackageVersionRector;
use Iterator;
use Rector\Composer\Tests\Rector\AbstractComposerRectorTestCase;
use Symplify\EasyTesting\DataProvider\StaticFixtureFinder;
use Symplify\SmartFileSystem\SmartFileInfo;
final class ChangePackageVersionRectorTest extends AbstractComposerRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
public function provideData(): Iterator
{
return StaticFixtureFinder::yieldDirectory(__DIR__ . '/Fixture', '*.json');
}
public function provideConfigFile(): string
{
return __DIR__ . '/config/some_config.php';
}
}

View File

@ -0,0 +1,13 @@
{
"require-dev": {
"vendor1/package1": "^1.0",
"vendor1/package3": "^2.0"
}
}
-----
{
"require-dev": {
"vendor1/package1": "^1.0",
"vendor1/package3": "^15.0"
}
}

View File

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
use Rector\Composer\Rector\ChangePackageVersionRector;
use Rector\Composer\ValueObject\PackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(ChangePackageVersionRector::class)
->call('configure', [[
ChangePackageVersionRector::PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new PackageAndVersion('vendor1/package3', '^15.0'),
]),
]]);
};

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Rector\CombinationComposerRector;
use Iterator;
use Rector\Composer\Tests\Rector\AbstractComposerRectorTestCase;
use Symplify\EasyTesting\DataProvider\StaticFixtureFinder;
use Symplify\SmartFileSystem\SmartFileInfo;
final class CombinationComposerRectorTest extends AbstractComposerRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
public function provideData(): Iterator
{
return StaticFixtureFinder::yieldDirectory(__DIR__ . '/Fixture', '*.json');
}
public function provideConfigFile(): string
{
return __DIR__ . '/config/some_config.php';
}
}

View File

@ -0,0 +1,17 @@
{
"require": {
"vendor1/package1": "^1.0",
"vendor1/package2": "^2.0",
"vendor1/package3": "^3.0"
}
}
-----
{
"require": {
"vendor1/package3": "~3.0.0",
"vendor2/package1": "^3.0"
},
"require-dev": {
"vendor1/package1": "^1.0"
}
}

View File

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
use Rector\Composer\Rector\ChangePackageVersionRector;
use Rector\Composer\Rector\MovePackageToRequireDevRector;
use Rector\Composer\Rector\ReplacePackageAndVersionRector;
use Rector\Composer\ValueObject\PackageAndVersion;
use Rector\Composer\ValueObject\ReplacePackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(MovePackageToRequireDevRector::class)
->call('configure', [[
MovePackageToRequireDevRector::PACKAGE_NAMES => ['vendor1/package1'],
]]);
$services->set(ReplacePackageAndVersionRector::class)
->call('configure', [[
ReplacePackageAndVersionRector::REPLACE_PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new ReplacePackageAndVersion('vendor1/package2', 'vendor2/package1', '^3.0'),
]),
]]);
$services->set(ChangePackageVersionRector::class)
->call('configure', [[
ChangePackageVersionRector::PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new PackageAndVersion('vendor1/package3', '~3.0.0'),
]),
]]);
};

View File

@ -0,0 +1,15 @@
{
"require": {
"vendor1/package1": "^1.0",
"vendor1/package3": "^300.0"
}
}
-----
{
"require": {
"vendor1/package1": "^1.0"
},
"require-dev": {
"vendor1/package3": "^300.0"
}
}

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Rector\MovePackageToRequireDevRector;
use Iterator;
use Rector\Composer\Tests\Rector\AbstractComposerRectorTestCase;
use Symplify\EasyTesting\DataProvider\StaticFixtureFinder;
use Symplify\SmartFileSystem\SmartFileInfo;
final class MovePackageToRequireDevRectorTest extends AbstractComposerRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
public function provideData(): Iterator
{
return StaticFixtureFinder::yieldDirectory(__DIR__ . '/Fixture', '*.json');
}
public function provideConfigFile(): string
{
return __DIR__ . '/config/some_config.php';
}
}

View File

@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
use Rector\Composer\Rector\MovePackageToRequireDevRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(MovePackageToRequireDevRector::class)
->call('configure', [[
MovePackageToRequireDevRector::PACKAGE_NAMES => ['vendor1/package3'],
]]);
};

View File

@ -0,0 +1,15 @@
{
"require-dev": {
"vendor1/package1": "^1.0",
"vendor1/package3": "^300.0"
}
}
-----
{
"require": {
"vendor1/package1": "^1.0"
},
"require-dev": {
"vendor1/package3": "^300.0"
}
}

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Rector\MovePackageToRequireRector;
use Iterator;
use Rector\Composer\Tests\Rector\AbstractComposerRectorTestCase;
use Symplify\EasyTesting\DataProvider\StaticFixtureFinder;
use Symplify\SmartFileSystem\SmartFileInfo;
final class MovePackageToRequireRectorTest extends AbstractComposerRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
public function provideData(): Iterator
{
return StaticFixtureFinder::yieldDirectory(__DIR__ . '/Fixture', '*.json');
}
public function provideConfigFile(): string
{
return __DIR__ . '/config/some_config.php';
}
}

View File

@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
use Rector\Composer\Rector\MovePackageToRequireRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(MovePackageToRequireRector::class)
->call('configure', [[
MovePackageToRequireRector::PACKAGE_NAMES => ['vendor1/package1'],
]]);
};

View File

@ -0,0 +1,11 @@
{
"require": {
"vendor1/package1": "^1.0",
"vendor1/package2": "^2.0"
},
"require-dev": {
"vendor1/package3": "^3.0"
}
}
-----
[]

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Rector\RemovePackageRector;
use Iterator;
use Rector\Composer\Tests\Rector\AbstractComposerRectorTestCase;
use Symplify\EasyTesting\DataProvider\StaticFixtureFinder;
use Symplify\SmartFileSystem\SmartFileInfo;
final class RemovePackageRectorTest extends AbstractComposerRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
public function provideData(): Iterator
{
return StaticFixtureFinder::yieldDirectory(__DIR__ . '/Fixture', '*.json');
}
public function provideConfigFile(): string
{
return __DIR__ . '/config/some_config.php';
}
}

View File

@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
use Rector\Composer\Rector\RemovePackageRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(RemovePackageRector::class)
->call('configure', [[
RemovePackageRector::PACKAGE_NAMES => ['vendor1/package3', 'vendor1/package1', 'vendor1/package2'],
]]);
};

View File

@ -0,0 +1,11 @@
{
"require": {
"vendor1/package1": "^1.0"
}
}
-----
{
"require": {
"vendor1/package3": "^4.0"
}
}

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\Rector\ReplacePackageAndVersionRector;
use Iterator;
use Rector\Composer\Tests\Rector\AbstractComposerRectorTestCase;
use Symplify\EasyTesting\DataProvider\StaticFixtureFinder;
use Symplify\SmartFileSystem\SmartFileInfo;
final class ReplacePackageAndVersionRectorTest extends AbstractComposerRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
public function provideData(): Iterator
{
return StaticFixtureFinder::yieldDirectory(__DIR__ . '/Fixture', '*.json');
}
public function provideConfigFile(): string
{
return __DIR__ . '/config/some_config.php';
}
}

View File

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
use Rector\Composer\Rector\ReplacePackageAndVersionRector;
use Rector\Composer\ValueObject\ReplacePackageAndVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symplify\SymfonyPhpConfig\ValueObjectInliner;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set(ReplacePackageAndVersionRector::class)
->call('configure', [[
ReplacePackageAndVersionRector::REPLACE_PACKAGES_AND_VERSIONS => ValueObjectInliner::inline([
new ReplacePackageAndVersion('vendor1/package1', 'vendor1/package3', '^4.0'),
]),
]]);
};

View File

@ -1,79 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\ValueObject\ComposerModifier;
use PHPUnit\Framework\TestCase;
use Rector\Composer\ValueObject\ComposerModifier\AddPackageToRequireDev;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
final class AddPackageToRequireDevTest extends TestCase
{
public function testAddNonExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package3' => '^3.0',
]);
$addPackageToRequireDev = new AddPackageToRequireDev('vendor1/package3', '^3.0');
$addPackageToRequireDev->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testAddExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$addPackageToRequireDev = new AddPackageToRequireDev('vendor1/package1', '^3.0');
$addPackageToRequireDev->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $expectedComposerJson->getJsonArray());
}
public function testAddExistingDevPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$composerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$addPackageToRequireDev = new AddPackageToRequireDev('vendor1/package2', '^3.0');
$addPackageToRequireDev->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
}

View File

@ -1,74 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\ValueObject\ComposerModifier;
use PHPUnit\Framework\TestCase;
use Rector\Composer\ValueObject\ComposerModifier\AddPackageToRequire;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
final class AddPackageToRequireTest extends TestCase
{
public function testAddNonExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
'vendor1/package3' => '^3.0',
]);
$addPackageToRequire = new AddPackageToRequire('vendor1/package3', '^3.0');
$addPackageToRequire->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testAddExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$addPackageToRequire = new AddPackageToRequire('vendor1/package1', '^3.0');
$addPackageToRequire->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testAddExistingDevPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$composerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$addPackageToRequire = new AddPackageToRequire('vendor1/package2', '^3.0');
$addPackageToRequire->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
}

View File

@ -1,74 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\ValueObject\ComposerModifier;
use PHPUnit\Framework\TestCase;
use Rector\Composer\ValueObject\ComposerModifier\ChangePackageVersion;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
final class ChangePackageVersionTest extends TestCase
{
public function testChangeVersionNonExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$changePackageVersion = new ChangePackageVersion('vendor1/package3', '^3.0');
$changePackageVersion->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testChangeVersionExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^3.0',
'vendor1/package2' => '^2.0',
]);
$changePackageVersion = new ChangePackageVersion('vendor1/package1', '^3.0');
$changePackageVersion->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testChangeVersionExistingDevPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$composerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package2' => '^3.0',
]);
$changePackageVersion = new ChangePackageVersion('vendor1/package2', '^3.0');
$changePackageVersion->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
}

View File

@ -1,75 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\ValueObject\ComposerModifier;
use PHPUnit\Framework\TestCase;
use Rector\Composer\ValueObject\ComposerModifier\MovePackageToRequireDev;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
final class MovePackageToRequireDevTest extends TestCase
{
public function testMoveNonExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$movePackageToRequireDev = new MovePackageToRequireDev('vendor1/package3');
$movePackageToRequireDev->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testMoveExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package1' => '^1.0',
]);
$movePackageToRequireDev = new MovePackageToRequireDev('vendor1/package1');
$movePackageToRequireDev->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testMoveExistingDevPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$composerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$movePackageToRequireDev = new MovePackageToRequireDev('vendor1/package2');
$movePackageToRequireDev->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
}

View File

@ -1,75 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\ValueObject\ComposerModifier;
use PHPUnit\Framework\TestCase;
use Rector\Composer\ValueObject\ComposerModifier\MovePackageToRequire;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
final class MovePackageToRequireTest extends TestCase
{
public function testMoveNonExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$movePackageToRequire = new MovePackageToRequire('vendor1/package3');
$movePackageToRequire->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testMoveExistingDevPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequireDev([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$movePackageToRequire = new MovePackageToRequire('vendor1/package1');
$movePackageToRequire->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testMoveExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$composerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$movePackageToRequire = new MovePackageToRequire('vendor1/package1');
$movePackageToRequire->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
}

View File

@ -1,69 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\ValueObject\ComposerModifier;
use PHPUnit\Framework\TestCase;
use Rector\Composer\ValueObject\ComposerModifier\RemovePackage;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
final class RemovePackageTest extends TestCase
{
public function testRemoveNonExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$removePackage = new RemovePackage('vendor1/package3');
$removePackage->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testRemoveExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package2' => '^2.0',
]);
$removePackage = new RemovePackage('vendor1/package1');
$removePackage->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testRemoveExistingDevPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$composerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$removePackage = new RemovePackage('vendor1/package2');
$removePackage->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
}

View File

@ -1,72 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Composer\Tests\ValueObject\ComposerModifier;
use PHPUnit\Framework\TestCase;
use Rector\Composer\ValueObject\ComposerModifier\ReplacePackage;
use Symplify\ComposerJsonManipulator\ValueObject\ComposerJson;
final class ReplacePackageTest extends TestCase
{
public function testReplaceNonExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$replacePackage = new ReplacePackage('vendor1/package3', 'vendor1/package4', '^3.0');
$replacePackage->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testReplaceExistingPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package3' => '^3.0',
'vendor1/package2' => '^2.0',
]);
$replacePackage = new ReplacePackage('vendor1/package1', 'vendor1/package3', '^3.0');
$replacePackage->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
public function testReplaceExistingDevPackage(): void
{
$composerJson = new ComposerJson();
$composerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$composerJson->setRequireDev([
'vendor1/package2' => '^2.0',
]);
$expectedComposerJson = new ComposerJson();
$expectedComposerJson->setRequire([
'vendor1/package1' => '^1.0',
]);
$expectedComposerJson->setRequireDev([
'vendor1/package3' => '^3.0',
]);
$replacePackage = new ReplacePackage('vendor1/package2', 'vendor1/package3', '^3.0');
$replacePackage->modify($composerJson);
$this->assertSame($expectedComposerJson->getJsonArray(), $composerJson->getJsonArray());
}
}

View File

@ -4,8 +4,8 @@ declare(strict_types=1);
namespace Rector\DeadCode\Tests\Rector\Property\RemoveUnusedPrivatePropertyRector\Fixture;
use Rector\Composer\Modifier\ComposerModifier;
use Rector\Composer\Contract\ComposerModifier\ComposerModifierInterface;
use Rector\Composer\Rector\ComposerModifier;
use Rector\Composer\Contract\Rector\ComposerRectorInterface;
final class SkipUsedUnderIsset
{
@ -36,4 +36,4 @@ final class SkipUsedUnderIsset
return $composerData;
}
}
}

View File

@ -7,7 +7,6 @@ namespace Rector\Privatization\Rector\Class_;
use Nette\Utils\Strings;
use PhpParser\Node;
use PhpParser\Node\Expr\ClassConstFetch;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
@ -16,7 +15,6 @@ use Rector\Core\PhpParser\Node\Manipulator\ClassInsertManipulator;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Util\StaticRectorStrings;
use Rector\NodeNestingScope\NodeFinder\ScopeAwareNodeFinder;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;

View File

@ -222,7 +222,8 @@ final class ProcessCommand extends AbstractCommand
$this->nonPhpFileProcessor->runOnFileInfos($nonPhpFileInfos);
$this->composerProcessor->process();
$composerJsonFilePath = getcwd() . '/composer.json';
$this->composerProcessor->process($composerJsonFilePath);
$this->reportZeroCacheRectorsCondition();