Skip to content

Commit 94c7d58

Browse files
committed
make assert rule configurable
1 parent 084fd1f commit 94c7d58

7 files changed

Lines changed: 136 additions & 20 deletions

File tree

config/set/php85.php

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,7 @@
203203
);
204204

205205
// https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_filter_default_constant
206-
$rectorConfig->ruleWithConfiguration(
207-
RenameConstantRector::class,
208-
[
209-
'FILTER_DEFAULT' => 'FILTER_UNSAFE_RAW',
210-
]
211-
);
206+
$rectorConfig->ruleWithConfiguration(RenameConstantRector::class, [
207+
'FILTER_DEFAULT' => 'FILTER_UNSAFE_RAW',
208+
]);
212209
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Assert\Rector\ClassMethod\AddAssertArrayFromClassMethodDocblockRector;
6+
7+
use Iterator;
8+
use PHPUnit\Framework\Attributes\DataProvider;
9+
use Rector\Testing\PHPUnit\AbstractRectorTestCase;
10+
11+
final class BeberleiTest extends AbstractRectorTestCase
12+
{
13+
#[DataProvider('provideData')]
14+
public function test(string $filePath): void
15+
{
16+
$this->doTestFile($filePath);
17+
}
18+
19+
public static function provideData(): Iterator
20+
{
21+
return self::yieldFilesFromDirectory(__DIR__ . '/FixtureBeberlei');
22+
}
23+
24+
public function provideConfigFilePath(): string
25+
{
26+
return __DIR__ . '/config/beberlei_assert.php';
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace Rector\Tests\Assert\Rector\ClassMethod\AddAssertArrayFromClassMethodDocblockRector\FixtureBeberlei;
4+
5+
final class FloatIntBool
6+
{
7+
/**
8+
* @param int[] $items
9+
* @param float[] $numbers
10+
* @param bool[] $options
11+
*/
12+
public function run(array $items, array $numbers, array $options)
13+
{
14+
15+
}
16+
}
17+
18+
?>
19+
-----
20+
<?php
21+
22+
namespace Rector\Tests\Assert\Rector\ClassMethod\AddAssertArrayFromClassMethodDocblockRector\FixtureBeberlei;
23+
24+
final class FloatIntBool
25+
{
26+
/**
27+
* @param int[] $items
28+
* @param float[] $numbers
29+
* @param bool[] $options
30+
*/
31+
public function run(array $items, array $numbers, array $options)
32+
{
33+
\Assert\Assertion::allInteger($items);
34+
\Assert\Assertion::allFloat($numbers);
35+
\Assert\Assertion::allBoolean($options);
36+
}
37+
}
38+
39+
?>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Rector\Assert\Enum\AssertClassName;
6+
use Rector\Assert\Rector\ClassMethod\AddAssertArrayFromClassMethodDocblockRector;
7+
use Rector\Config\RectorConfig;
8+
9+
return static function (RectorConfig $rectorConfig): void {
10+
$rectorConfig->ruleWithConfiguration(AddAssertArrayFromClassMethodDocblockRector::class, [
11+
AssertClassName::BEBERLEI,
12+
]);
13+
};

rules/Assert/Enum/AssertClassName.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,10 @@ final class AssertClassName
99
/**
1010
* @var string
1111
*/
12-
public const ASSERT = 'Webmozart\Assert\Assert';
12+
public const WEBMOZART = 'Webmozart\Assert\Assert';
13+
14+
/**
15+
* @var string
16+
*/
17+
public const BEBERLEI = 'Assert\Assertion';
1318
}

rules/Assert/NodeAnalyzer/ExistingAssertStaticCallResolver.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,11 @@ public function resolve(ClassMethod $classMethod): array
3939
continue;
4040
}
4141

42-
if ($staticCall->class->toString() !== AssertClassName::ASSERT) {
42+
if (! in_array(
43+
$staticCall->class->toString(),
44+
[AssertClassName::WEBMOZART, AssertClassName::BEBERLEI],
45+
true
46+
)) {
4347
continue;
4448
}
4549

rules/Assert/Rector/ClassMethod/AddAssertArrayFromClassMethodDocblockRector.php

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,22 @@
2626
use Rector\Assert\NodeAnalyzer\ExistingAssertStaticCallResolver;
2727
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
2828
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
29+
use Rector\Contract\Rector\ConfigurableRectorInterface;
2930
use Rector\PHPStan\ScopeFetcher;
3031
use Rector\Rector\AbstractRector;
31-
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
32+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
3233
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
34+
use Webmozart\Assert\Assert;
3335

3436
/**
3537
* @experimental Check generic array key/value types in runtime with assert. Generics for impatient people.
3638
*
3739
* @see \Rector\Tests\Assert\Rector\ClassMethod\AddAssertArrayFromClassMethodDocblockRector\AddAssertArrayFromClassMethodDocblockRectorTest
3840
*/
39-
final class AddAssertArrayFromClassMethodDocblockRector extends AbstractRector
41+
final class AddAssertArrayFromClassMethodDocblockRector extends AbstractRector implements ConfigurableRectorInterface
4042
{
43+
private string $assertClass = AssertClassName::WEBMOZART;
44+
4145
public function __construct(
4246
private readonly PhpDocInfoFactory $phpDocInfoFactory,
4347
private readonly ExistingAssertStaticCallResolver $existingAssertStaticCallResolver
@@ -46,9 +50,11 @@ public function __construct(
4650

4751
public function getRuleDefinition(): RuleDefinition
4852
{
49-
return new RuleDefinition('Add key and value assert based on docblock @param type declarations', [
50-
new CodeSample(
51-
<<<'CODE_SAMPLE'
53+
return new RuleDefinition(
54+
'Add key and value assert based on docblock @param type declarations (pick from "webmozart" or "beberlei" asserts)',
55+
[
56+
new ConfiguredCodeSample(
57+
<<<'CODE_SAMPLE'
5258
<?php
5359
5460
class SomeClass
@@ -62,11 +68,13 @@ public function run(array $items)
6268
}
6369

6470
CODE_SAMPLE
65-
,
66-
<<<'CODE_SAMPLE'
71+
,
72+
<<<'CODE_SAMPLE'
6773
<?php
6874
69-
use Webmozart\Assert\Assert;class SomeClass
75+
use Webmozart\Assert\Assert;
76+
77+
class SomeClass
7078
{
7179
/**
7280
* @param int[] $items
@@ -77,8 +85,12 @@ public function run(array $items)
7785
}
7886
}
7987
CODE_SAMPLE
80-
),
81-
]);
88+
,
89+
[AssertClassName::WEBMOZART]
90+
),
91+
92+
]
93+
);
8294
}
8395

8496
public function getNodeTypes(): array
@@ -118,7 +130,7 @@ public function refactor(Node $node): ?ClassMethod
118130
}
119131

120132
// handle arrays only
121-
if ($param->type->name !== 'array') {
133+
if (! $this->isName($param->type, 'array')) {
122134
continue;
123135
}
124136

@@ -168,9 +180,27 @@ public function refactor(Node $node): ?ClassMethod
168180
return $node;
169181
}
170182

183+
/**
184+
* @param array<string> $configuration
185+
*/
186+
public function configure(array $configuration): void
187+
{
188+
if ($configuration === []) {
189+
// default
190+
return;
191+
}
192+
193+
Assert::count($configuration, 1);
194+
Assert::inArray($configuration[0], [AssertClassName::BEBERLEI, AssertClassName::WEBMOZART]);
195+
196+
$this->assertClass = $configuration[0];
197+
}
198+
171199
private function createAssertExpression(Expr $expr, string $methodName): Expression
172200
{
173-
$staticCall = new StaticCall(new FullyQualified(AssertClassName::ASSERT), $methodName, [new Arg($expr)]);
201+
$assertFullyQualified = new FullyQualified($this->assertClass);
202+
203+
$staticCall = new StaticCall($assertFullyQualified, $methodName, [new Arg($expr)]);
174204

175205
return new Expression($staticCall);
176206
}

0 commit comments

Comments
 (0)