[DX] Various config merge, improve RectorConfig methods (#2371)

This commit is contained in:
Tomas Votruba 2022-05-27 15:30:05 +02:00 committed by GitHub
parent a2d6da8b4e
commit 45eef47f27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 106 additions and 92 deletions

View File

@ -2,14 +2,65 @@
declare(strict_types=1);
use OndraM\CiDetector\CiDetector;
use Rector\Caching\ValueObject\Storage\MemoryCacheStorage;
use Rector\Config\RectorConfig;
use Rector\Core\Bootstrap\ExtensionConfigResolver;
use Symplify\EasyParallel\ValueObject\EasyParallelConfig;
use Symplify\PackageBuilder\Yaml\ParametersMerger;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->import(__DIR__ . '/services.php');
$rectorConfig->import(__DIR__ . '/services-rules.php');
$rectorConfig->import(__DIR__ . '/services-packages.php');
$rectorConfig->import(__DIR__ . '/parameters.php');
// make use of https://github.com/symplify/easy-parallel
$rectorConfig->import(EasyParallelConfig::FILE_PATH);
$rectorConfig->paths([]);
$rectorConfig->skip([]);
$rectorConfig->autoloadPaths([]);
$rectorConfig->bootstrapFiles([]);
$rectorConfig->parallel(seconds: 120, maxNumberOfProcess: 16, jobSize: 20);
$rectorConfig->disableImportNames();
$rectorConfig->importShortClasses();
$rectorConfig->fileExtensions(['php']);
$rectorConfig->nestedChainMethodCallLimit(60);
$rectorConfig->cacheDirectory(sys_get_temp_dir() . '/rector_cached_files');
$services = $rectorConfig->services();
$services->defaults()
->public()
->autowire()
->autoconfigure();
$services->load('Rector\\', __DIR__ . '/../packages')
->exclude([
__DIR__ . '/../packages/Config/RectorConfig.php',
__DIR__ . '/../packages/*/{ValueObject,Contract,Exception}',
__DIR__ . '/../packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php',
__DIR__ . '/../packages/Testing/PHPUnit',
__DIR__ . '/../packages/BetterPhpDocParser/PhpDoc',
__DIR__ . '/../packages/PHPStanStaticTypeMapper/Enum',
__DIR__ . '/../packages/Caching/Cache.php',
// used in PHPStan
__DIR__ . '/../packages/NodeTypeResolver/Reflection/BetterReflection/RectorBetterReflectionSourceLocatorFactory.php',
__DIR__ . '/../packages/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php',
]);
// parallel
$services->set(ParametersMerger::class);
// use faster in-memory cache in CI.
// CI always starts from scratch, therefore IO intensive caching is not worth it
$ciDetector = new CiDetector();
if ($ciDetector->isCiDetected()) {
$rectorConfig->cacheClass(MemoryCacheStorage::class);
}
$extensionConfigResolver = new ExtensionConfigResolver();
$extensionConfigFiles = $extensionConfigResolver->provide();

View File

@ -1,49 +0,0 @@
<?php
declare(strict_types=1);
use OndraM\CiDetector\CiDetector;
use Rector\Caching\ValueObject\Storage\MemoryCacheStorage;
use Rector\Config\RectorConfig;
use Rector\Core\Configuration\Option;
return static function (RectorConfig $rectorConfig): void {
// paths and extensions
$rectorConfig->paths([]);
$parameters = $rectorConfig->parameters();
$parameters->set(Option::FILE_EXTENSIONS, ['php']);
$rectorConfig->autoloadPaths([]);
// these files will be executed, useful e.g. for constant definitions
$rectorConfig->bootstrapFiles([]);
// parallel
$rectorConfig->disableParallel();
$parameters->set(Option::PARALLEL_MAX_NUMBER_OF_PROCESSES, 16);
$parameters->set(Option::PARALLEL_JOB_SIZE, 20);
$parameters->set(Option::PARALLEL_TIMEOUT_IN_SECONDS, 120);
// FQN class importing
$rectorConfig->disableImportNames();
$rectorConfig->importShortClasses();
$parameters->set(Option::NESTED_CHAIN_METHOD_CALL_LIMIT, 60);
$rectorConfig->skip([]);
$parameters->set(Option::PHPSTAN_FOR_RECTOR_PATH, null);
// cache
$parameters->set(Option::CACHE_DIR, sys_get_temp_dir() . '/rector_cached_files');
// use faster in-memory cache in CI.
// CI always starts from scratch, therefore IO intensive caching is not worth it
$ciDetector = new CiDetector();
if ($ciDetector->isCiDetected()) {
$parameters->set(Option::CACHE_CLASS, MemoryCacheStorage::class);
}
};

View File

@ -1,38 +0,0 @@
<?php
declare(strict_types=1);
use Rector\Config\RectorConfig;
use Symplify\EasyParallel\ValueObject\EasyParallelConfig;
use Symplify\PackageBuilder\Yaml\ParametersMerger;
return static function (RectorConfig $rectorConfig): void {
// make use of https://github.com/symplify/easy-parallel
$rectorConfig->import(EasyParallelConfig::FILE_PATH);
$services = $rectorConfig->services();
$services->defaults()
->public()
->autowire()
->autoconfigure();
$services->load('Rector\\', __DIR__ . '/../packages')
->exclude([
__DIR__ . '/../packages/Config/RectorConfig.php',
__DIR__ . '/../packages/*/{ValueObject,Contract,Exception}',
__DIR__ . '/../packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php',
__DIR__ . '/../packages/Testing/PHPUnit',
__DIR__ . '/../packages/BetterPhpDocParser/PhpDoc',
__DIR__ . '/../packages/PHPStanStaticTypeMapper/Enum',
__DIR__ . '/../packages/Caching/Cache.php',
// used in PHPStan
__DIR__ . '/../packages/NodeTypeResolver/Reflection/BetterReflection/RectorBetterReflectionSourceLocatorFactory.php',
__DIR__ . '/../packages/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php',
]);
// parallel
$services->set(ParametersMerger::class);
};

View File

@ -3,7 +3,6 @@
declare(strict_types=1);
use Composer\Semver\VersionParser;
use Doctrine\Inflector\Inflector;
use Doctrine\Inflector\Rules\English\InflectorFactory;
use Ergebnis\Json\Printer\Printer;

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace Rector\Config;
use Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface;
use Rector\Core\Configuration\Option;
use Rector\Core\Configuration\ValueObjectInliner;
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
@ -193,4 +194,38 @@ final class RectorConfig extends ContainerConfigurator
$parameters = $this->parameters();
$parameters->set(Option::SYMFONY_CONTAINER_PHP_PATH_PARAMETER, $filePath);
}
/**
* @param string[] $extensions
*/
public function fileExtensions(array $extensions): void
{
Assert::allString($extensions);
$parameters = $this->parameters();
$parameters->set(Option::FILE_EXTENSIONS, $extensions);
}
public function nestedChainMethodCallLimit(int $limit): void
{
$parameters = $this->parameters();
$parameters->set(Option::NESTED_CHAIN_METHOD_CALL_LIMIT, $limit);
}
public function cacheDirectory(string $directoryPath): void
{
$parameters = $this->parameters();
$parameters->set(Option::CACHE_DIR, $directoryPath);
}
/**
* @param class-string<CacheStorageInterface> $cacheClass
*/
public function cacheClass(string $cacheClass): void
{
Assert::isAOf($cacheClass, CacheStorageInterface::class);
$parameters = $this->parameters();
$parameters->set(Option::CACHE_CLASS, $cacheClass);
}
}

View File

@ -34,7 +34,10 @@ final class PHPStanServicesFactory
$additionalConfigFiles = [];
$additionalConfigFiles[] = $parameterProvider->provideStringParameter(Option::PHPSTAN_FOR_RECTOR_PATH);
if ($parameterProvider->hasParameter(Option::PHPSTAN_FOR_RECTOR_PATH)) {
$additionalConfigFiles[] = $parameterProvider->provideStringParameter(Option::PHPSTAN_FOR_RECTOR_PATH);
}
$additionalConfigFiles[] = __DIR__ . '/../../../config/phpstan/static-reflection.neon';
$additionalConfigFiles[] = __DIR__ . '/../../../config/phpstan/better-infer.neon';
$additionalConfigFiles[] = __DIR__ . '/../../../config/phpstan/parser.neon';

View File

@ -692,3 +692,6 @@ parameters:
# list() function accepts null arguments
- '#Parameter \#2 \$args of class PhpParser\\Node\\Expr\\FuncCall constructor expects array<PhpParser\\Node\\Arg\|PhpParser\\Node\\VariadicPlaceholder>, array<int, PhpParser\\Node\\Arg\|null> given#'
# validate class-string input
- '#Call to static method Webmozart\\Assert\\Assert\:\:isInstanceOf\(\) with class\-string<Rector\\Caching\\Contract\\ValueObject\\Storage\\CacheStorageInterface> and (.*?) will always evaluate to false#'

View File

@ -41,6 +41,12 @@ final class UpgradeRectorConfigRector extends AbstractRector
Option::PARALLEL => 'parallel',
Option::PHPSTAN_FOR_RECTOR_PATH => 'phpstanConfig',
Option::PHP_VERSION_FEATURES => 'phpVersion',
Option::CACHE_CLASS => 'cacheClass',
Option::CACHE_DIR => 'cacheDirectory',
Option::NESTED_CHAIN_METHOD_CALL_LIMIT => 'nestedChainMethodCallLimit',
Option::FILE_EXTENSIONS => 'fileExtensions',
Option::SYMFONY_CONTAINER_PHP_PATH_PARAMETER => 'symfonyContainerPhp',
Option::SYMFONY_CONTAINER_XML_PATH_PARAMETER => 'symfonyContainerXml',
];
/**

View File

@ -73,7 +73,7 @@ final class Option
public const SYMFONY_CONTAINER_XML_PATH_PARAMETER = 'symfony_container_xml_path';
/**
* @internal Use @see \Rector\Config\RectorConfig::symfonyContainerPhp()
* @deprecated Use @see \Rector\Config\RectorConfig::symfonyContainerPhp()
* @var string
*/
public const SYMFONY_CONTAINER_PHP_PATH_PARAMETER = 'symfony_container_php_path';
@ -113,22 +113,26 @@ final class Option
public const SKIP = SkipperOption::SKIP;
/**
* @deprecated Use RectorConfig::fileExtensions() instead
* @var string
*/
public const FILE_EXTENSIONS = 'file_extensions';
/**
* @deprecated Use RectorConfig::nestedChainMethodCallLimit() instead
* @var string
*/
public const NESTED_CHAIN_METHOD_CALL_LIMIT = 'nested_chain_method_call_limit';
/**
* @deprecated Use RectorConfig::cacheDirectory() instead
* @var string
*/
public const CACHE_DIR = 'cache_dir';
/**
* Cache backend. Most of the time we cache in files, but in ephemeral environment (e.g. CI), a faster `MemoryCacheStorage` can be usefull.
* @deprecated Use RectorConfig::cacheClass() instead
*
* @var class-string<CacheStorageInterface>
* @internal