Skip to content

Commit 9b79a1e

Browse files
committed
Fixed code style set used based on package version
1 parent 53ba0ba commit 9b79a1e

File tree

3 files changed

+119
-2
lines changed

3 files changed

+119
-2
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"require": {
1616
"php": ">=7.4",
1717
"friendsofphp/php-cs-fixer": "v3.75.0",
18-
"adamwojs/php-cs-fixer-phpdoc-force-fqcn": "^2.0"
18+
"adamwojs/php-cs-fixer-phpdoc-force-fqcn": "^2.0",
19+
"composer-runtime-api": ">=2.0"
1920
},
2021
"require-dev": {
2122
"roave/security-advisories": "dev-master",

src/lib/PhpCsFixer/InternalConfigFactory.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace Ibexa\CodeStyle\PhpCsFixer;
1010

11+
use Composer\InstalledVersions;
1112
use Ibexa\CodeStyle\PhpCsFixer\Sets\RuleSetInterface;
1213
use PhpCsFixer\ConfigInterface;
1314

@@ -42,7 +43,35 @@ public function withRuleSet(RuleSetInterface $ruleSet): self
4243

4344
public function getRuleSet(): RuleSetInterface
4445
{
45-
return $this->ruleSet ??= new Sets\Ibexa46RuleSet();
46+
if (isset($this->ruleSet)) {
47+
return $this->ruleSet;
48+
}
49+
50+
return $this->ruleSet = $this->createRuleSetFromPackage(InstalledVersions::getRootPackage());
51+
}
52+
53+
/**
54+
* @param array{name: string, version: string, pretty_version?: string} $package
55+
*/
56+
private function createRuleSetFromPackage(array $package): RuleSetInterface
57+
{
58+
if (!str_starts_with($package['name'], 'ibexa/')) {
59+
return new Sets\Ibexa46RuleSet();
60+
}
61+
62+
$version = $package['pretty_version'] ?? $package['version'];
63+
if (str_starts_with($version, 'dev-') || $version === '*') {
64+
return new Sets\Ibexa50RuleSet();
65+
}
66+
67+
// Remove any suffix like -dev, -alpha, etc.
68+
$version = preg_replace('/-.*$/', '', $version);
69+
70+
if (version_compare($version, '5.0.0', '>=')) {
71+
return new Sets\Ibexa50RuleSet();
72+
}
73+
74+
return new Sets\Ibexa46RuleSet();
4675
}
4776

4877
public function buildConfig(): ConfigInterface
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Ibexa\Tests\CodeStyle\PhpCsFixer;
6+
7+
use Ibexa\CodeStyle\PhpCsFixer\InternalConfigFactory;
8+
use Ibexa\CodeStyle\PhpCsFixer\Sets\Ibexa46RuleSet;
9+
use Ibexa\CodeStyle\PhpCsFixer\Sets\Ibexa50RuleSet;
10+
use PHPUnit\Framework\TestCase;
11+
use ReflectionClass;
12+
13+
/**
14+
* @covers \Ibexa\CodeStyle\PhpCsFixer\InternalConfigFactory
15+
*/
16+
class InternalConfigFactoryTest extends TestCase
17+
{
18+
private InternalConfigFactory $factory;
19+
private \ReflectionMethod $createRuleSetFromPackage;
20+
21+
protected function setUp(): void
22+
{
23+
$this->factory = new InternalConfigFactory();
24+
$reflection = new ReflectionClass(InternalConfigFactory::class);
25+
26+
// This method is private because we don't want it to be part of the public API.
27+
// We can't test getRuleSet since it internally uses InstalledVersions::getRootPackage(), which cannot be mocked.
28+
$this->createRuleSetFromPackage = $reflection->getMethod('createRuleSetFromPackage');
29+
$this->createRuleSetFromPackage->setAccessible(true);
30+
}
31+
32+
/**
33+
* @dataProvider provideRuleSetTestCases
34+
*/
35+
public function testVersionBasedRuleSetSelection(array $package, string $expectedRuleSetClass): void
36+
{
37+
$ruleSet = $this->createRuleSetFromPackage->invoke($this->factory, $package);
38+
39+
$this->assertInstanceOf($expectedRuleSetClass, $ruleSet);
40+
}
41+
42+
public function provideRuleSetTestCases(): array
43+
{
44+
return [
45+
'non_ibexa_package' => [
46+
['name' => 'vendor/package', 'version' => '1.0.0'],
47+
Ibexa46RuleSet::class,
48+
],
49+
'ibexa_package_4_6' => [
50+
['name' => 'ibexa/core', 'version' => '4.6.0'],
51+
Ibexa46RuleSet::class,
52+
],
53+
'ibexa_package_5_0' => [
54+
['name' => 'ibexa/core', 'version' => '5.0.0'],
55+
Ibexa50RuleSet::class,
56+
],
57+
'ibexa_package_5_1' => [
58+
['name' => 'ibexa/core', 'version' => '5.1.0'],
59+
Ibexa50RuleSet::class,
60+
],
61+
'ibexa_package_dev_master' => [
62+
['name' => 'ibexa/core', 'version' => 'dev-master'],
63+
Ibexa50RuleSet::class,
64+
],
65+
'ibexa_package_with_pretty_version' => [
66+
['name' => 'ibexa/core', 'version' => '5.0.0', 'pretty_version' => '5.0.0-alpha1'],
67+
Ibexa50RuleSet::class,
68+
],
69+
'ibexa_package_wildcard' => [
70+
['name' => 'ibexa/core', 'version' => '*'],
71+
Ibexa50RuleSet::class,
72+
],
73+
'ibexa_package_4_6_with_suffix' => [
74+
['name' => 'ibexa/core', 'version' => '4.6.0-beta1'],
75+
Ibexa46RuleSet::class,
76+
],
77+
];
78+
}
79+
80+
public function testWithRuleSet(): void
81+
{
82+
$customRuleSet = new Ibexa46RuleSet();
83+
$this->factory->withRuleSet($customRuleSet);
84+
85+
$this->assertSame($customRuleSet, $this->factory->getRuleSet());
86+
}
87+
}

0 commit comments

Comments
 (0)