An error occurred while loading the file. Please try again.
-
Guillaume Perréal authored43d5736b
<?php
declare(strict_types=1);
/*
* irstea/php-cs-fixer-config - Jeux de règles pour php-cs-fixer.
* Copyright (C) 2018-2021 IRSTEA
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Irstea\CS;
use Irstea\CS\Composer\ComposerPackage;
use Irstea\CS\Composer\ComposerPackageInterface;
use Irstea\CS\FileLocator\FileLocator;
use Irstea\CS\Git\GitRepository;
use Irstea\CS\HeaderComment\ChainTemplateProvider;
use Irstea\CS\HeaderComment\FormattedHeaderProvider;
use Irstea\CS\HeaderComment\HeaderProviderInterface;
use Irstea\CS\HeaderComment\LicenseTemplateProvider;
use Irstea\CS\HeaderComment\SPDXLicenseTemplateProvider;
use Irstea\CS\HeaderComment\TemplateFormatter;
use Irstea\CS\HeaderComment\UserDefinedTemplateProvider;
use PhpCsFixer\Config as PhpCsFixerConfig;
/**
* Class Config.
*/
final class Config extends PhpCsFixerConfig
{
/**
* @var ComposerPackageInterface
*/
private $composerPackage;
/**
* @var HeaderProviderInterface
*/
private $headerProvider;
/**
* @var array<string, mixed>
*/
private $ruleOverrides = [];
/**
* Config constructor.
*/
public function __construct(
ComposerPackageInterface $composerPackage,
HeaderProviderInterface $headerProvider,
string $name = 'default'
) {
parent::__construct($name);
$this->composerPackage = $composerPackage;
$this->headerProvider = $headerProvider;
}
/**
* {@inheritdoc}
*/
public function getRules(): array
{
$phpVersion = $this->composerPackage->getRequiredPHPVersion();
$risky = $this->getRiskyAllowed();
return array_replace(
$this->ruleSets($phpVersion, $risky),
$this->baseRules($phpVersion, $risky),
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
$this->ruleOverrides
);
}
private function ruleSets(float $phpVersion, bool $risky): array
{
$sets = [
'@PSR2' => true,
'@PSR12' => true,
'@Symfony' => true,
'@Symfony:risky' => $risky,
];
if ($phpVersion >= 8.0) {
$sets['@PHP80Migration'] = true;
} elseif ($phpVersion >= 7.4) {
$sets['@PHP74Migration'] = true;
$sets['@PHP74Migration:risky'] = $risky;
} elseif ($phpVersion >= 7.3) {
$sets['@PHP73Migration'] = true;
} elseif ($phpVersion >= 7.1) {
$sets['@PHP71Migration'] = true;
$sets['@PHP71Migration:risky'] = $risky;
} elseif ($phpVersion >= 7.0) {
$sets['@PHP70Migration'] = true;
$sets['@PHP70Migration:risky'] = $risky;
} elseif ($phpVersion >= 5.6) {
$sets['@PHP56Migration'] = true;
$sets['@PHP56Migration:risky'] = $risky;
} elseif ($phpVersion >= 5.4) {
$sets['@PHP54Migration'] = true;
}
return $sets;
}
public function baseRules(float $phpVersion, bool $risky): array
{
$rules = [
// Configuration && overrides
'binary_operator_spaces' => ['align_double_arrow' => true],
'blank_line_after_opening_tag' => false,
'concat_space' => ['spacing' => 'one'],
'method_argument_space' => ['ensure_fully_multiline' => true],
'declare_strict_types' => $phpVersion >= 7.0,
'blank_line_after_opening_tag' => false,
// Safe
'align_multiline_comment' => true,
'array_syntax' => ['syntax' => 'short'],
'general_phpdoc_annotation_remove' => ['annotations' => ['author', 'package']],
'no_multiline_whitespace_before_semicolons' => true,
'no_useless_else' => true,
'no_useless_return' => true,
'ordered_imports' => true,
'phpdoc_add_missing_param_annotation' => true,
'phpdoc_annotation_without_dot' => true,
'phpdoc_order' => true,
'semicolon_after_instruction' => true,
'yoda_style' => false,
];
$header = $this->headerProvider->getHeader();
if ($header) {
$rules['header_comment'] = [
'commentType' => 'comment',
'location' => 'after_declare_strict',
'separate' => 'bottom',
'header' => $header,
];
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
}
if ($risky) {
$rules['is_null'] = ['use_yoda_style' => false];
if ($phpVersion >= 7.0) {
$rules['non_printable_character'] = ['use_escape_sequences_in_strings' => true];
}
}
return $rules;
}
/**
* @param string $rule
* @param mixed $setting
*/
public function setRule($rule, $setting): void
{
$this->ruleOverrides[$rule] = $setting;
}
/**
* {@inheritdoc}
*/
public function setRules(array $rules): void
{
$this->ruleOverrides = array_replace($this->ruleOverrides, $rules);
}
/**
* {@inheritdoc}
*/
public static function create(): self
{
$stackTrace = debug_backtrace(1);
$callerPath = \dirname($stackTrace[0]['file']);
$fileLocator = new FileLocator($callerPath);
$composerPackage = new ComposerPackage($fileLocator);
$variables = self::getTemplateVariables($callerPath, $composerPackage);
$headerProvider = new FormattedHeaderProvider(
new ChainTemplateProvider(
[
new UserDefinedTemplateProvider($fileLocator),
new SPDXLicenseTemplateProvider($composerPackage),
new LicenseTemplateProvider($composerPackage),
]
),
new TemplateFormatter($variables)
);
return new self($composerPackage, $headerProvider);
}
private static function getTemplateVariables(string $path, ComposerPackage $composerPackage): array
{
$gitRepository = self::findGitRepository($path);
return [
'%copyrightHolder%' => 'INRAE',
'%package%' => $composerPackage->getName(),
'%description%' => $composerPackage->getDescription(),
'%yearRange%' => $gitRepository ? $gitRepository->getYearRange() : date('Y'),
];
}
private static function findGitRepository(string $path): ?GitRepository
211212213214215216217218219220221222223
{
while ($path !== '/') {
if (is_dir($path . '/.git')) {
return new GitRepository($path);
}
$path = \dirname($path);
}
return null;
}
}