diff --git a/config/set/php85.php b/config/set/php85.php index 25951a3e5c7..a5a49624beb 100644 --- a/config/set/php85.php +++ b/config/set/php85.php @@ -203,10 +203,7 @@ ); // https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_filter_default_constant - $rectorConfig->ruleWithConfiguration( - RenameConstantRector::class, - [ - 'FILTER_DEFAULT' => 'FILTER_UNSAFE_RAW', - ] - ); + $rectorConfig->ruleWithConfiguration(RenameConstantRector::class, [ + 'FILTER_DEFAULT' => 'FILTER_UNSAFE_RAW', + ]); }; diff --git a/rules-tests/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector/BeberleiTest.php b/rules-tests/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector/BeberleiTest.php new file mode 100644 index 00000000000..5b013169cfa --- /dev/null +++ b/rules-tests/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector/BeberleiTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/FixtureBeberlei'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/beberlei_assert.php'; + } +} diff --git a/rules-tests/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector/FixtureBeberlei/beberlei_assert.php.inc b/rules-tests/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector/FixtureBeberlei/beberlei_assert.php.inc new file mode 100644 index 00000000000..bcc2cd5788e --- /dev/null +++ b/rules-tests/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector/FixtureBeberlei/beberlei_assert.php.inc @@ -0,0 +1,39 @@ + +----- + diff --git a/rules-tests/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector/config/beberlei_assert.php b/rules-tests/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector/config/beberlei_assert.php new file mode 100644 index 00000000000..3382248f654 --- /dev/null +++ b/rules-tests/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector/config/beberlei_assert.php @@ -0,0 +1,13 @@ +ruleWithConfiguration(AddAssertArrayFromClassMethodDocblockRector::class, [ + AssertClassName::BEBERLEI, + ]); +}; diff --git a/rules/Assert/Enum/AssertClassName.php b/rules/Assert/Enum/AssertClassName.php index 9a653249215..47160416bdf 100644 --- a/rules/Assert/Enum/AssertClassName.php +++ b/rules/Assert/Enum/AssertClassName.php @@ -9,5 +9,10 @@ final class AssertClassName /** * @var string */ - public const ASSERT = 'Webmozart\Assert\Assert'; + public const WEBMOZART = 'Webmozart\Assert\Assert'; + + /** + * @var string + */ + public const BEBERLEI = 'Assert\Assertion'; } diff --git a/rules/Assert/NodeAnalyzer/ExistingAssertStaticCallResolver.php b/rules/Assert/NodeAnalyzer/ExistingAssertStaticCallResolver.php index 9814d8eeacd..306bebbd8fa 100644 --- a/rules/Assert/NodeAnalyzer/ExistingAssertStaticCallResolver.php +++ b/rules/Assert/NodeAnalyzer/ExistingAssertStaticCallResolver.php @@ -39,7 +39,11 @@ public function resolve(ClassMethod $classMethod): array continue; } - if ($staticCall->class->toString() !== AssertClassName::ASSERT) { + if (! in_array( + $staticCall->class->toString(), + [AssertClassName::WEBMOZART, AssertClassName::BEBERLEI], + true + )) { continue; } diff --git a/rules/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector.php b/rules/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector.php index 748beb96613..34d769278b4 100644 --- a/rules/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector.php +++ b/rules/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector.php @@ -26,18 +26,22 @@ use Rector\Assert\NodeAnalyzer\ExistingAssertStaticCallResolver; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; +use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\PHPStan\ScopeFetcher; use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; +use Webmozart\Assert\Assert; /** * @experimental Check generic array key/value types in runtime with assert. Generics for impatient people. * * @see \Rector\Tests\Assert\Rector\ClassMethod\AddAssertArrayFromClassMethodDocblockRector\AddAssertArrayFromClassMethodDocblockRectorTest */ -final class AddAssertArrayFromClassMethodDocblockRector extends AbstractRector +final class AddAssertArrayFromClassMethodDocblockRector extends AbstractRector implements ConfigurableRectorInterface { + private string $assertClass = AssertClassName::WEBMOZART; + public function __construct( private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly ExistingAssertStaticCallResolver $existingAssertStaticCallResolver @@ -46,9 +50,11 @@ public function __construct( public function getRuleDefinition(): RuleDefinition { - return new RuleDefinition('Add key and value assert based on docblock @param type declarations', [ - new CodeSample( - <<<'CODE_SAMPLE' + return new RuleDefinition( + 'Add key and value assert based on docblock @param type declarations (pick from "webmozart" or "beberlei" asserts)', + [ + new ConfiguredCodeSample( + <<<'CODE_SAMPLE' type->name !== 'array') { + if (! $this->isName($param->type, 'array')) { continue; } @@ -168,9 +180,27 @@ public function refactor(Node $node): ?ClassMethod return $node; } + /** + * @param array $configuration + */ + public function configure(array $configuration): void + { + if ($configuration === []) { + // default + return; + } + + Assert::count($configuration, 1); + Assert::inArray($configuration[0], [AssertClassName::BEBERLEI, AssertClassName::WEBMOZART]); + + $this->assertClass = $configuration[0]; + } + private function createAssertExpression(Expr $expr, string $methodName): Expression { - $staticCall = new StaticCall(new FullyQualified(AssertClassName::ASSERT), $methodName, [new Arg($expr)]); + $assertFullyQualified = new FullyQualified($this->assertClass); + + $staticCall = new StaticCall($assertFullyQualified, $methodName, [new Arg($expr)]); return new Expression($staticCall); }