From 71f0d2b3e6338441950b95059c7c9d647ffeea88 Mon Sep 17 00:00:00 2001 From: mikolaj Date: Mon, 30 Mar 2026 10:04:23 +0200 Subject: [PATCH 1/6] Stabilized ordered imports defaults across fixer versions --- src/lib/PhpCsFixer/Sets/AbstractIbexaRuleSet.php | 5 ++++- .../Sets/expected_rules/4_6_rule_set/local_rules.php | 5 ++++- .../Sets/expected_rules/4_6_rule_set/php_cs_fixer_rules.php | 5 ++++- .../Sets/expected_rules/5_0_rule_set/local_rules.php | 5 ++++- .../Sets/expected_rules/5_0_rule_set/php_cs_fixer_rules.php | 5 ++++- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/lib/PhpCsFixer/Sets/AbstractIbexaRuleSet.php b/src/lib/PhpCsFixer/Sets/AbstractIbexaRuleSet.php index f85aad0..a217d8e 100644 --- a/src/lib/PhpCsFixer/Sets/AbstractIbexaRuleSet.php +++ b/src/lib/PhpCsFixer/Sets/AbstractIbexaRuleSet.php @@ -130,7 +130,10 @@ public function getRules(): array 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, - 'ordered_imports' => true, + 'ordered_imports' => [ + 'imports_order' => null, + 'sort_algorithm' => 'alpha', + ], 'php_unit_construct' => true, 'php_unit_fqcn_annotation' => true, 'php_unit_mock_short_will_return' => false, diff --git a/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/local_rules.php b/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/local_rules.php index 076043f..9ca1e7e 100644 --- a/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/local_rules.php +++ b/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/local_rules.php @@ -131,7 +131,10 @@ 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, - 'ordered_imports' => true, + 'ordered_imports' => [ + 'imports_order' => null, + 'sort_algorithm' => 'alpha', + ], 'php_unit_construct' => true, 'php_unit_fqcn_annotation' => true, 'php_unit_mock_short_will_return' => false, diff --git a/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/php_cs_fixer_rules.php b/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/php_cs_fixer_rules.php index b5f4b39..1923dd0 100644 --- a/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/php_cs_fixer_rules.php +++ b/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/php_cs_fixer_rules.php @@ -15,7 +15,10 @@ 'no_blank_lines_after_class_opening' => true, 'no_leading_import_slash' => true, 'no_whitespace_in_blank_line' => true, - 'ordered_imports' => true, + 'ordered_imports' => [ + 'imports_order' => null, + 'sort_algorithm' => 'alpha', + ], 'return_type_declaration' => true, 'short_scalar_cast' => true, 'single_import_per_statement' => true, diff --git a/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/local_rules.php b/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/local_rules.php index b254e30..80be15f 100644 --- a/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/local_rules.php +++ b/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/local_rules.php @@ -132,7 +132,10 @@ 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, - 'ordered_imports' => true, + 'ordered_imports' => [ + 'imports_order' => null, + 'sort_algorithm' => 'alpha', + ], 'php_unit_construct' => true, 'php_unit_fqcn_annotation' => true, 'php_unit_mock_short_will_return' => false, diff --git a/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/php_cs_fixer_rules.php b/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/php_cs_fixer_rules.php index 3232db4..91a7823 100644 --- a/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/php_cs_fixer_rules.php +++ b/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/php_cs_fixer_rules.php @@ -24,7 +24,10 @@ 'no_blank_lines_after_class_opening' => true, 'no_leading_import_slash' => true, 'no_whitespace_in_blank_line' => true, - 'ordered_imports' => true, + 'ordered_imports' => [ + 'imports_order' => null, + 'sort_algorithm' => 'alpha', + ], 'return_type_declaration' => true, 'short_scalar_cast' => true, 'single_import_per_statement' => true, From 61097d6725f4d68efdefed31b567ebe586a7d6d5 Mon Sep 17 00:00:00 2001 From: mikolaj Date: Mon, 30 Mar 2026 10:09:18 +0200 Subject: [PATCH 2/6] Added ordered imports regression test for function imports --- .../Rule/OrderedImportsFixerTest.php | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php diff --git a/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php new file mode 100644 index 0000000..bd8d215 --- /dev/null +++ b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php @@ -0,0 +1,95 @@ +fixer = new OrderedImportsFixer(); + + $orderedImportsRule = (new Ibexa50RuleSet())->getRules()['ordered_imports']; + self::assertIsArray($orderedImportsRule); + $this->fixer->configure($orderedImportsRule); + } + + /** + * @dataProvider provideFixCases + */ + public function testFixDoesNotSplitImportTypesIntoSeparateGroups( + string $input, + string $expected + ): void { + $tokens = Tokens::fromCode($input); + $this->fixer->fix(new SplFileInfo(__FILE__), $tokens); + + self::assertSame($expected, $tokens->generateCode()); + } + + /** + * @return iterable + */ + public static function provideFixCases(): iterable + { + yield 'function import stays in the same block as class imports' => [ + <<<'PHP' + [ + <<<'PHP' + [ + <<<'PHP' + Date: Mon, 30 Mar 2026 11:00:14 +0200 Subject: [PATCH 3/6] Made ordered imports grouping explicit in preset --- .../PhpCsFixer/Sets/AbstractIbexaRuleSet.php | 2 +- .../Rule/OrderedImportsFixerTest.php | 45 +++++++++++++------ .../4_6_rule_set/local_rules.php | 2 +- .../4_6_rule_set/php_cs_fixer_rules.php | 2 +- .../5_0_rule_set/local_rules.php | 2 +- .../5_0_rule_set/php_cs_fixer_rules.php | 2 +- 6 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/lib/PhpCsFixer/Sets/AbstractIbexaRuleSet.php b/src/lib/PhpCsFixer/Sets/AbstractIbexaRuleSet.php index a217d8e..7e9be6e 100644 --- a/src/lib/PhpCsFixer/Sets/AbstractIbexaRuleSet.php +++ b/src/lib/PhpCsFixer/Sets/AbstractIbexaRuleSet.php @@ -131,7 +131,7 @@ public function getRules(): array 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_imports' => [ - 'imports_order' => null, + 'imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha', ], 'php_unit_construct' => true, diff --git a/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php index bd8d215..b4b66f1 100644 --- a/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php +++ b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php @@ -9,33 +9,48 @@ namespace Ibexa\Tests\CodeStyle\PhpCsFixer\Rule; use Ibexa\CodeStyle\PhpCsFixer\Sets\Ibexa50RuleSet; +use PhpCsFixer\Fixer\FixerInterface; use PhpCsFixer\Fixer\Import\OrderedImportsFixer; +use PhpCsFixer\Fixer\Whitespace\BlankLineBetweenImportGroupsFixer; use PhpCsFixer\Tokenizer\Tokens; use PHPUnit\Framework\TestCase; use SplFileInfo; final class OrderedImportsFixerTest extends TestCase { - private OrderedImportsFixer $fixer; + /** @var list */ + private array $fixers; protected function setUp(): void { - $this->fixer = new OrderedImportsFixer(); - $orderedImportsRule = (new Ibexa50RuleSet())->getRules()['ordered_imports']; self::assertIsArray($orderedImportsRule); - $this->fixer->configure($orderedImportsRule); + + $orderedImportsFixer = new OrderedImportsFixer(); + $orderedImportsFixer->configure($orderedImportsRule); + + $this->fixers = [ + $orderedImportsFixer, + new BlankLineBetweenImportGroupsFixer(), + ]; } /** * @dataProvider provideFixCases */ - public function testFixDoesNotSplitImportTypesIntoSeparateGroups( + public function testFixGroupsAndSortsImportsByType( string $input, string $expected ): void { $tokens = Tokens::fromCode($input); - $this->fixer->fix(new SplFileInfo(__FILE__), $tokens); + + foreach ($this->fixers as $fixer) { + if (!$fixer->isCandidate($tokens)) { + continue; + } + + $fixer->fix(new SplFileInfo(__FILE__), $tokens); + } self::assertSame($expected, $tokens->generateCode()); } @@ -45,7 +60,7 @@ public function testFixDoesNotSplitImportTypesIntoSeparateGroups( */ public static function provideFixCases(): iterable { - yield 'function import stays in the same block as class imports' => [ + yield 'function import is moved to its own group after class imports' => [ <<<'PHP' [ + yield 'const import is moved to its own group after function imports' => [ <<<'PHP' [ + yield 'mixed import types are sorted alphabetically within separate groups' => [ <<<'PHP' true, 'object_operator_without_whitespace' => true, 'ordered_imports' => [ - 'imports_order' => null, + 'imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha', ], 'php_unit_construct' => true, diff --git a/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/php_cs_fixer_rules.php b/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/php_cs_fixer_rules.php index 1923dd0..eed8e65 100644 --- a/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/php_cs_fixer_rules.php +++ b/tests/lib/PhpCsFixer/Sets/expected_rules/4_6_rule_set/php_cs_fixer_rules.php @@ -16,7 +16,7 @@ 'no_leading_import_slash' => true, 'no_whitespace_in_blank_line' => true, 'ordered_imports' => [ - 'imports_order' => null, + 'imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha', ], 'return_type_declaration' => true, diff --git a/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/local_rules.php b/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/local_rules.php index 80be15f..37b7b1c 100644 --- a/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/local_rules.php +++ b/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/local_rules.php @@ -133,7 +133,7 @@ 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_imports' => [ - 'imports_order' => null, + 'imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha', ], 'php_unit_construct' => true, diff --git a/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/php_cs_fixer_rules.php b/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/php_cs_fixer_rules.php index 91a7823..8592751 100644 --- a/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/php_cs_fixer_rules.php +++ b/tests/lib/PhpCsFixer/Sets/expected_rules/5_0_rule_set/php_cs_fixer_rules.php @@ -25,7 +25,7 @@ 'no_leading_import_slash' => true, 'no_whitespace_in_blank_line' => true, 'ordered_imports' => [ - 'imports_order' => null, + 'imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha', ], 'return_type_declaration' => true, From bd0d95809b84e5df7c591288500ffddb2a901211 Mon Sep 17 00:00:00 2001 From: mikolaj Date: Mon, 30 Mar 2026 11:05:32 +0200 Subject: [PATCH 4/6] Extended ordered imports test to both Ibexa rule sets --- .../Rule/OrderedImportsFixerTest.php | 138 +++++++++--------- 1 file changed, 73 insertions(+), 65 deletions(-) diff --git a/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php index b4b66f1..3f33714 100644 --- a/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php +++ b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php @@ -8,7 +8,9 @@ namespace Ibexa\Tests\CodeStyle\PhpCsFixer\Rule; +use Ibexa\CodeStyle\PhpCsFixer\Sets\Ibexa46RuleSet; use Ibexa\CodeStyle\PhpCsFixer\Sets\Ibexa50RuleSet; +use Ibexa\CodeStyle\PhpCsFixer\Sets\RuleSetInterface; use PhpCsFixer\Fixer\FixerInterface; use PhpCsFixer\Fixer\Import\OrderedImportsFixer; use PhpCsFixer\Fixer\Whitespace\BlankLineBetweenImportGroupsFixer; @@ -18,33 +20,29 @@ final class OrderedImportsFixerTest extends TestCase { - /** @var list */ - private array $fixers; - - protected function setUp(): void - { - $orderedImportsRule = (new Ibexa50RuleSet())->getRules()['ordered_imports']; + /** + * @dataProvider provideFixCases + */ + public function testFixGroupsAndSortsImportsByType( + RuleSetInterface $ruleSet, + string $input, + string $expected + ): void { + $orderedImportsRule = $ruleSet->getRules()['ordered_imports']; self::assertIsArray($orderedImportsRule); $orderedImportsFixer = new OrderedImportsFixer(); $orderedImportsFixer->configure($orderedImportsRule); - $this->fixers = [ + /** @var list $fixers */ + $fixers = [ $orderedImportsFixer, new BlankLineBetweenImportGroupsFixer(), ]; - } - /** - * @dataProvider provideFixCases - */ - public function testFixGroupsAndSortsImportsByType( - string $input, - string $expected - ): void { $tokens = Tokens::fromCode($input); - foreach ($this->fixers as $fixer) { + foreach ($fixers as $fixer) { if (!$fixer->isCandidate($tokens)) { continue; } @@ -56,59 +54,69 @@ public function testFixGroupsAndSortsImportsByType( } /** - * @return iterable + * @return iterable */ public static function provideFixCases(): iterable { - yield 'function import is moved to its own group after class imports' => [ - <<<'PHP' - [ - <<<'PHP' - new Ibexa50RuleSet(), + '46 ruleset' => new Ibexa46RuleSet(), ]; - yield 'mixed import types are sorted alphabetically within separate groups' => [ - <<<'PHP' - $ruleSet) { + yield $ruleSetName . ' function import is moved to its own group after class imports' => [ + $ruleSet, + <<<'PHP' + [ + $ruleSet, + <<<'PHP' + [ + $ruleSet, + <<<'PHP' + Date: Mon, 30 Mar 2026 11:22:49 +0200 Subject: [PATCH 5/6] Adjusted ordered imports test docblock type --- tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php index 3f33714..47f118e 100644 --- a/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php +++ b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php @@ -34,7 +34,7 @@ public function testFixGroupsAndSortsImportsByType( $orderedImportsFixer = new OrderedImportsFixer(); $orderedImportsFixer->configure($orderedImportsRule); - /** @var list $fixers */ + /** @var array $fixers */ $fixers = [ $orderedImportsFixer, new BlankLineBetweenImportGroupsFixer(), From 3b302029f6afb64f6da43b42d03aeeb5f4134bea Mon Sep 17 00:00:00 2001 From: mikolaj Date: Mon, 30 Mar 2026 11:39:46 +0200 Subject: [PATCH 6/6] Clarified ordered imports test case name --- tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php index 47f118e..07432ec 100644 --- a/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php +++ b/tests/lib/PhpCsFixer/Rule/OrderedImportsFixerTest.php @@ -81,7 +81,7 @@ public static function provideFixCases(): iterable PHP, ]; - yield $ruleSetName . ' const import is moved to its own group after function imports' => [ + yield $ruleSetName . ' const import is moved to its own group after class imports' => [ $ruleSet, <<<'PHP'