Config.php 6.97 KiB
<?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; } }