Skip to content

Commit cfb9396

Browse files
authored
Fixed ruleset versioning (#12)
1 parent 53ba0ba commit cfb9396

File tree

9 files changed

+122
-3
lines changed

9 files changed

+122
-3
lines changed

composer.json

Lines changed: 3 additions & 2 deletions
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",
@@ -29,7 +30,7 @@
2930
},
3031
"autoload-dev": {
3132
"psr-4": {
32-
"Ibexa\\Tests\\CodeStyle\\PhpCsFixer\\": "tests/lib/"
33+
"Ibexa\\Tests\\CodeStyle\\": "tests/lib/"
3334
}
3435
},
3536
"scripts": {

src/lib/PhpCsFixer/InternalConfigFactory.php

Lines changed: 26 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,31 @@ public function withRuleSet(RuleSetInterface $ruleSet): self
4243

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

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

0 commit comments

Comments
 (0)