Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"require": {
"php": ">=7.4",
"friendsofphp/php-cs-fixer": "v3.75.0",
"adamwojs/php-cs-fixer-phpdoc-force-fqcn": "^2.0"
"adamwojs/php-cs-fixer-phpdoc-force-fqcn": "^2.0",
"composer-runtime-api": ">=2.0"
},
"require-dev": {
"roave/security-advisories": "dev-master",
Expand All @@ -29,7 +30,7 @@
},
"autoload-dev": {
"psr-4": {
"Ibexa\\Tests\\CodeStyle\\PhpCsFixer\\": "tests/lib/"
"Ibexa\\Tests\\CodeStyle\\": "tests/lib/"
}
},
"scripts": {
Expand Down
31 changes: 30 additions & 1 deletion src/lib/PhpCsFixer/InternalConfigFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

namespace Ibexa\CodeStyle\PhpCsFixer;

use Composer\InstalledVersions;
use Ibexa\CodeStyle\PhpCsFixer\Sets\RuleSetInterface;
use PhpCsFixer\ConfigInterface;

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

public function getRuleSet(): RuleSetInterface
{
return $this->ruleSet ??= new Sets\Ibexa46RuleSet();
if (isset($this->ruleSet)) {
return $this->ruleSet;
}

return $this->ruleSet = $this->createRuleSetFromPackage(InstalledVersions::getRootPackage());
}

/**
* @param array{name: string, version: string, pretty_version?: string} $package
*/
private function createRuleSetFromPackage(array $package): RuleSetInterface
{
if (!str_starts_with($package['name'], 'ibexa/')) {
return new Sets\Ibexa46RuleSet();
}

$version = $package['pretty_version'] ?? $package['version'];
if (str_starts_with($version, 'dev-') || $version === '*') {
return new Sets\Ibexa50RuleSet();
}

// Remove any suffix like -dev, -alpha, etc.
$version = (string)preg_replace('/-.*$/', '', $version);

if (version_compare($version, '5.0.0', '>=')) {
return new Sets\Ibexa50RuleSet();
}

return new Sets\Ibexa46RuleSet();
}

public function buildConfig(): ConfigInterface
Expand Down
93 changes: 93 additions & 0 deletions tests/lib/PhpCsFixer/InternalConfigFactoryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace Ibexa\Tests\CodeStyle\PhpCsFixer;

use Ibexa\CodeStyle\PhpCsFixer\InternalConfigFactory;
use Ibexa\CodeStyle\PhpCsFixer\Sets\Ibexa46RuleSet;
use Ibexa\CodeStyle\PhpCsFixer\Sets\Ibexa50RuleSet;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
use ReflectionMethod;

/**
* @covers \Ibexa\CodeStyle\PhpCsFixer\InternalConfigFactory
*/
class InternalConfigFactoryTest extends TestCase
{
private InternalConfigFactory $factory;

private ReflectionMethod $createRuleSetFromPackage;

protected function setUp(): void
{
$this->factory = new InternalConfigFactory();
$reflection = new ReflectionClass(InternalConfigFactory::class);

// This method is private because we don't want it to be part of the public API.
// We can't test getRuleSet since it internally uses InstalledVersions::getRootPackage(), which cannot be mocked.
$this->createRuleSetFromPackage = $reflection->getMethod('createRuleSetFromPackage');
$this->createRuleSetFromPackage->setAccessible(true);
}

/**
* @dataProvider provideRuleSetTestCases
*/
public function testVersionBasedRuleSetSelection(array $package, string $expectedRuleSetClass): void
{
$ruleSet = $this->createRuleSetFromPackage->invoke($this->factory, $package);

self::assertInstanceOf($expectedRuleSetClass, $ruleSet);
}

public function provideRuleSetTestCases(): array
{
return [
'non_ibexa_package' => [
['name' => 'vendor/package', 'version' => '1.0.0'],
Ibexa46RuleSet::class,
],
'ibexa_package_4_6' => [
['name' => 'ibexa/core', 'version' => '4.6.0'],
Ibexa46RuleSet::class,
],
'ibexa_package_5_0' => [
['name' => 'ibexa/core', 'version' => '5.0.0'],
Ibexa50RuleSet::class,
],
'ibexa_package_5_1' => [
['name' => 'ibexa/core', 'version' => '5.1.0'],
Ibexa50RuleSet::class,
],
'ibexa_package_dev_master' => [
['name' => 'ibexa/core', 'version' => 'dev-master'],
Ibexa50RuleSet::class,
],
'ibexa_package_with_pretty_version' => [
['name' => 'ibexa/core', 'version' => '5.0.0', 'pretty_version' => '5.0.0-alpha1'],
Ibexa50RuleSet::class,
],
'ibexa_package_wildcard' => [
['name' => 'ibexa/core', 'version' => '*'],
Ibexa50RuleSet::class,
],
'ibexa_package_4_6_with_suffix' => [
['name' => 'ibexa/core', 'version' => '4.6.0-beta1'],
Ibexa46RuleSet::class,
],
];
}

public function testWithRuleSet(): void
{
$customRuleSet = new Ibexa46RuleSet();
$this->factory->withRuleSet($customRuleSet);

self::assertSame($customRuleSet, $this->factory->getRuleSet());
}
}