diff --git a/.gitattributes b/.gitattributes index 2ee71f1..3d02405 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,4 +4,8 @@ LICENSE export-ignore phpunit.xml export-ignore *.md export-ignore -docs/ export-ignore \ No newline at end of file +docs/ export-ignore +/easy-ci.php export-ignore +/ecs.php export-ignore +/phpstan.neon export-ignore +/rector.php export-ignore diff --git a/.github/workflows/auto_closer.yaml b/.github/workflows/auto_closer.yaml deleted file mode 100644 index de9fca8..0000000 --- a/.github/workflows/auto_closer.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: Auto Closer PR - -on: - pull_request_target: - types: [opened] - -jobs: - run: - runs-on: ubuntu-latest - steps: - - uses: superbrothers/close-pull-request@v3 - with: - # Optional. Post a issue comment just before closing a pull request. - comment: | - Hi, thank you for your contribution. - - Unfortunately, this repository is read-only. It's a split from our main monorepo repository. - - We'd like to kindly ask you to move the contribution there - https://github.com/symplify/symplify. - - We'll check it, review it and give you feed back right way. - - Thank you. diff --git a/.github/workflows/code_analysis.yaml b/.github/workflows/code_analysis.yaml new file mode 100644 index 0000000..55c4b3b --- /dev/null +++ b/.github/workflows/code_analysis.yaml @@ -0,0 +1,65 @@ +name: Code Analysis + +on: + pull_request: null + push: + branches: + - main + +env: + # see https://github.com/composer/composer/issues/9368#issuecomment-718112361 + COMPOSER_ROOT_VERSION: "dev-main" + +jobs: + code_analysis: + strategy: + fail-fast: false + matrix: + actions: + - + name: 'PHPStan' + run: composer phpstan --ansi + + - + name: 'Composer Validate' + run: composer validate --ansi + + - + name: 'Rector' + run: composer rector --ansi + + - + name: 'Coding Standard' + run: composer fix-cs --ansi + + - + name: 'Tests' + run: vendor/bin/phpunit + + - + name: 'PHP Linter' + run: vendor/bin/parallel-lint src tests + + - + name: 'Check Commented Code' + run: vendor/bin/easy-ci check-commented-code src tests --ansi + + - + name: 'Check Active Classes' + run: vendor/bin/easy-ci check-active-class src --ansi + + name: ${{ matrix.actions.name }} + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + # see https://github.com/shivammathur/setup-php + - uses: shivammathur/setup-php@v2 + with: + php-version: 8.1 + coverage: none + + # composer install cache - https://github.com/ramsey/composer-install + - uses: "ramsey/composer-install@v2" + + - run: ${{ matrix.actions.run }} diff --git a/composer.json b/composer.json index 56f19c8..0933bcd 100644 --- a/composer.json +++ b/composer.json @@ -12,8 +12,16 @@ "symfony/finder": "^6.2" }, "require-dev": { - "symplify/symplify-kernel": "^11.2", - "phpunit/phpunit": "^9.5.26" + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.2", + "phpunit/phpunit": "^9.5.26", + "rector/rector": "^0.15.10", + "symplify/easy-ci": "^11.1", + "symplify/easy-coding-standard": "^11.1", + "symplify/phpstan-extensions": "^11.1", + "symplify/phpstan-rules": "11.2.3.72", + "symplify/symplify-kernel": "^11.1", + "tomasvotruba/unused-public": "^0.0.34" }, "autoload": { "psr-4": { @@ -30,23 +38,20 @@ "dev-main": "11.2-dev" } }, - "conflict": { - "symplify/phpstan-rules": "<11.1.24", - "symplify/rule-doc-generator-contracts": "<11.1.25", - "symplify/php-config-printer": "<11.1.25", - "symplify/autowire-array-parameter": "<11.1.25", - "symplify/phpstan-extensions": "<11.1.25", - "symplify/rule-doc-generator": "<11.1.25", - "symplify/smart-file-system": "<11.1.25", - "symplify/symfony-static-dumper": "<11.1.25", - "symplify/config-transformer": "<11.1.24", - "symplify/coding-standard": "<11.1.24", - "symplify/easy-parallel": "<11.1.25", - "symplify/easy-testing": "<11.1.25", - "symplify/symplify-kernel": "<11.1.25", - "symplify/easy-ci": "<11.1.24", - "symplify/monorepo-builder": "<11.1.24" + "scripts": { + "check-cs": "vendor/bin/ecs check --ansi", + "fix-cs": "vendor/bin/ecs check --fix --ansi", + "phpstan": "vendor/bin/phpstan analyse --ansi --error-format symplify", + "rector": "vendor/bin/rector process --dry-run --ansi" }, "minimum-stability": "dev", - "prefer-stable": true + "prefer-stable": true, + "config": { + "sort-packages": true, + "platform-check": false, + "allow-plugins": { + "cweagans/composer-patches": true, + "phpstan/extension-installer": true + } + } } diff --git a/easy-ci.php b/easy-ci.php new file mode 100644 index 0000000..60bf8b1 --- /dev/null +++ b/easy-ci.php @@ -0,0 +1,12 @@ +typesToSkip([ + AutowireInterfacesCompilerPass::class, + ]); +}; diff --git a/ecs.php b/ecs.php new file mode 100644 index 0000000..bb42212 --- /dev/null +++ b/ecs.php @@ -0,0 +1,21 @@ +paths([ + __DIR__ . '/ecs.php', + __DIR__ . '/rector.php', + __DIR__ . '/easy-ci.php', + __DIR__ . '/src', + __DIR__ . '/tests', + ]); + + $ecsConfig->sets([ + SetList::COMMON, + SetList::PSR_12, + ]); +}; diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon new file mode 100644 index 0000000..f652bbc --- /dev/null +++ b/phpstan-baseline.neon @@ -0,0 +1,46 @@ +parameters: + ignoreErrors: + - + message: "#^Parameter \\#1 \\$path of function dirname expects string, string\\|false given\\.$#" + count: 1 + path: src/Composer/VendorDirProvider.php + + - + message: "#^Call to an undefined method Symfony\\\\Component\\\\DependencyInjection\\\\ContainerInterface\\:\\:getParameterBag\\(\\)\\.$#" + count: 1 + path: src/Parameter/ParameterProvider.php + + - + message: "#^Parameter \\#1 \\$objectOrClass of class ReflectionClass constructor expects class\\-string\\\\|T of object, string given\\.$#" + count: 1 + path: src/Reflection/ClassLikeExistenceChecker.php + + - + message: "#^Parameter \\#1 \\$objectOrClass of class ReflectionClass constructor expects class\\-string\\\\|T of object, string given\\.$#" + count: 2 + path: src/Reflection/PrivatesCaller.php + + - + message: "#^Call to method setConfigs\\(\\) on an unknown class Symplify\\\\PackageBuilder\\\\Contract\\\\HttpKernel\\\\ExtraConfigAwareKernelInterface\\.$#" + count: 1 + path: src/Testing/AbstractKernelTestCase.php + + - + message: "#^Class Symplify\\\\PackageBuilder\\\\Contract\\\\HttpKernel\\\\ExtraConfigAwareKernelInterface not found\\.$#" + count: 2 + path: src/Testing/AbstractKernelTestCase.php + + - + message: "#^PHPDoc tag @var for variable \\$kernel contains unknown class Symplify\\\\PackageBuilder\\\\Contract\\\\HttpKernel\\\\ExtraConfigAwareKernelInterface\\.$#" + count: 1 + path: src/Testing/AbstractKernelTestCase.php + + - + message: "#^Parameter \\#1 \\$kernel of method Symplify\\\\PackageBuilder\\\\Testing\\\\AbstractKernelTestCase\\:\\:bootAndReturnKernel\\(\\) expects Symfony\\\\Component\\\\HttpKernel\\\\KernelInterface, Symplify\\\\PackageBuilder\\\\Contract\\\\HttpKernel\\\\ExtraConfigAwareKernelInterface given\\.$#" + count: 1 + path: src/Testing/AbstractKernelTestCase.php + + - + message: "#^Static property Symplify\\\\PackageBuilder\\\\Testing\\\\AbstractKernelTestCase\\:\\:\\$container \\(Symfony\\\\Component\\\\DependencyInjection\\\\ContainerInterface\\|null\\) does not accept Psr\\\\Container\\\\ContainerInterface\\.$#" + count: 2 + path: src/Testing/AbstractKernelTestCase.php diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..d74d40e --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,21 @@ +includes: + - phpstan-baseline.neon + +parameters: + level: 8 + + paths: + - src + - tests + + excludePaths: + - '*/tests/**/Source/*' + - '*/tests/**/Fixture/*' + - '*/tests/**/data/*' + + unused_public: + methods: true + properties: true + constants: true + + ignoreErrors: diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..8156100 --- /dev/null +++ b/rector.php @@ -0,0 +1,34 @@ +sets([ + SetList::CODE_QUALITY, + SetList::DEAD_CODE, + LevelSetList::UP_TO_PHP_81, + SetList::CODING_STYLE, + SetList::TYPE_DECLARATION, + SetList::NAMING, + SetList::PRIVATIZATION, + SetList::EARLY_RETURN, + PHPUnitSetList::PHPUNIT_CODE_QUALITY, + ]); + + $rectorConfig->paths([ + __DIR__ . '/src', + __DIR__ . '/tests', + ]); + + $rectorConfig->importNames(); + + $rectorConfig->skip([ + '*/Source/*', + '*/Fixture/*', + ]); +}; diff --git a/src/Console/Formatter/ColorConsoleDiffFormatter.php b/src/Console/Formatter/ColorConsoleDiffFormatter.php index 80783a3..71997e5 100644 --- a/src/Console/Formatter/ColorConsoleDiffFormatter.php +++ b/src/Console/Formatter/ColorConsoleDiffFormatter.php @@ -39,7 +39,7 @@ final class ColorConsoleDiffFormatter */ private const NEWLINES_REGEX = "#\n\r|\n#"; - private string $template; + private readonly string $template; public function __construct() { diff --git a/src/Console/Output/ConsoleDiffer.php b/src/Console/Output/ConsoleDiffer.php index 6821ae9..4c4736f 100644 --- a/src/Console/Output/ConsoleDiffer.php +++ b/src/Console/Output/ConsoleDiffer.php @@ -13,8 +13,8 @@ final class ConsoleDiffer { public function __construct( - private Differ $differ, - private ColorConsoleDiffFormatter $colorConsoleDiffFormatter + private readonly Differ $differ, + private readonly ColorConsoleDiffFormatter $colorConsoleDiffFormatter ) { } diff --git a/src/Console/Style/SymfonyStyleFactory.php b/src/Console/Style/SymfonyStyleFactory.php index 57d4fc1..5587042 100644 --- a/src/Console/Style/SymfonyStyleFactory.php +++ b/src/Console/Style/SymfonyStyleFactory.php @@ -16,7 +16,7 @@ */ final class SymfonyStyleFactory { - private PrivatesCaller $privatesCaller; + private readonly PrivatesCaller $privatesCaller; public function __construct() { diff --git a/src/DependencyInjection/CompilerPass/AutowireInterfacesCompilerPass.php b/src/DependencyInjection/CompilerPass/AutowireInterfacesCompilerPass.php index 79d606d..46cb7b1 100644 --- a/src/DependencyInjection/CompilerPass/AutowireInterfacesCompilerPass.php +++ b/src/DependencyInjection/CompilerPass/AutowireInterfacesCompilerPass.php @@ -13,7 +13,7 @@ final class AutowireInterfacesCompilerPass implements CompilerPassInterface * @param string[] $typesToAutowire */ public function __construct( - private array $typesToAutowire + private readonly array $typesToAutowire ) { } diff --git a/src/DependencyInjection/FileLoader/ParameterMergingPhpFileLoader.php b/src/DependencyInjection/FileLoader/ParameterMergingPhpFileLoader.php index c2115ba..61885ad 100644 --- a/src/DependencyInjection/FileLoader/ParameterMergingPhpFileLoader.php +++ b/src/DependencyInjection/FileLoader/ParameterMergingPhpFileLoader.php @@ -20,7 +20,7 @@ */ final class ParameterMergingPhpFileLoader extends PhpFileLoader { - private ParametersMerger $parametersMerger; + private readonly ParametersMerger $parametersMerger; public function __construct(ContainerBuilder $containerBuilder, FileLocatorInterface $fileLocator) { diff --git a/src/Diff/Output/CompleteUnifiedDiffOutputBuilderFactory.php b/src/Diff/Output/CompleteUnifiedDiffOutputBuilderFactory.php index 49a8d1b..1933543 100644 --- a/src/Diff/Output/CompleteUnifiedDiffOutputBuilderFactory.php +++ b/src/Diff/Output/CompleteUnifiedDiffOutputBuilderFactory.php @@ -14,7 +14,7 @@ final class CompleteUnifiedDiffOutputBuilderFactory { public function __construct( - private PrivatesAccessor $privatesAccessor + private readonly PrivatesAccessor $privatesAccessor ) { } diff --git a/src/Strings/StringFormatConverter.php b/src/Strings/StringFormatConverter.php index f74e762..d330644 100644 --- a/src/Strings/StringFormatConverter.php +++ b/src/Strings/StringFormatConverter.php @@ -66,7 +66,9 @@ private function camelCaseToGlue(string $input, string $glue): string $parts = []; foreach ($matches as $match) { - $parts[] = $match[0] === strtoupper($match[0]) ? strtolower($match[0]) : lcfirst($match[0]); + $parts[] = $match[0] === strtoupper((string) $match[0]) ? strtolower($match[0]) : lcfirst( + (string) $match[0] + ); } return implode($glue, $parts);