Completed
Push — master ( d35fc1...fe5f39 )
by Tomáš
7s
created

PhpCsFixerFactory::getAllFixerFiles()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 9
ccs 6
cts 6
cp 1
rs 9.6666
cc 1
eloc 6
nc 1
nop 0
crap 1
1
<?php
2
3
/*
4
 * This file is part of Symplify
5
 * Copyright (c) 2016 Tomas Votruba (http://tomasvotruba.cz).
6
 */
7
8
namespace Symplify\MultiCodingStandard\PhpCsFixer;
9
10
use ReflectionClass;
11
use Symfony\Component\Finder\Finder;
12
use Symfony\Component\Finder\SplFileInfo;
13
use Symfony\CS\Config\Config;
14
use Symfony\CS\ConfigurationResolver;
15
use Symfony\CS\Fixer;
16
use Symfony\CS\FixerInterface;
17
use Symplify\MultiCodingStandard\Contract\Configuration\ConfigurationInterface;
18
19
final class PhpCsFixerFactory
20
{
21
    /**
22
     * @var ConfigurationInterface
23
     */
24
    private $configuration;
25
26 1
    public function __construct(ConfigurationInterface $configuration)
27
    {
28 1
        $this->configuration = $configuration;
29 1
    }
30
    
31
    /**
32
     * @return Fixer
33
     */
34 1
    public function create()
35
    {
36
        // 1. find fixers classes
37 1
        $allFixerFiles = $this->getAllFixerFiles();
38 1
        $allFixerObjects = $this->createObjectsFromFixerFiles(iterator_to_array($allFixerFiles));
39
40 1
        $configurationResolver = new ConfigurationResolver();
41 1
        $configurationResolver->setAllFixers($allFixerObjects);
42
43
        // 2. filter fixers in by level
44 1
        $finalFiltersToBeRegistered = [];
45
46
        // filter out custom ones
47 1
        $excludedFixers = '';
48 1
        if (count($this->configuration->getExcludedFixers())) {
49 1
            $excludedFixers .= '-'.implode(',-', $this->configuration->getExcludedFixers());
50
        }
51
52 1
        foreach ($this->configuration->getActiveFixerLevels() as $level) {
53 1
            $currentConfigurationResolver = clone $configurationResolver;
54 1
            if ($excludedFixers) {
55 1
                $currentConfigurationResolver->setOption('fixers', $excludedFixers);
56
            }
57 1
            $currentConfigurationResolver->setOption('level', $level);
58 1
            $currentConfigurationResolver->resolve();
59
60 1
            $finalFiltersToBeRegistered += $currentConfigurationResolver->getFixers();
61
        }
62
63
        // 3. filter in custom ones
64 1
        $fixers = '';
65 1
        if (count($this->configuration->getActiveFixers())) {
66 1
            $fixers .= implode(',', $this->configuration->getActiveFixers());
67
        }
68
69 1
        if ($fixers) {
70 1
            $currentConfigurationResolver = clone $configurationResolver;
71 1
            $currentConfigurationResolver->setOption('level', 'none');
72 1
            $currentConfigurationResolver->setOption('fixers', $fixers);
73 1
            $currentConfigurationResolver->resolve();
74
75 1
            $finalFiltersToBeRegistered = array_merge(
76
                $finalFiltersToBeRegistered,
77 1
                $currentConfigurationResolver->getFixers()
78
            );
79
        }
80
81
        // 4. register final filters
82 1
        $phpCsFixer = new Fixer();
83 1
        $phpCsFixer->registerCustomFixers($finalFiltersToBeRegistered);
84
85 1
        return $phpCsFixer;
86
    }
87
88
    /**
89
     * @return Finder|SplFileInfo[]
90
     */
91 1
    private function getAllFixerFiles()
92
    {
93 1
        $phpCsFixerReflection = new ReflectionClass(Fixer::class);
94 1
        $directoryWithFixers = dirname($phpCsFixerReflection->getFileName()) . '/Fixer';
95
96 1
        return Finder::create()
97 1
            ->files()
98 1
            ->in($directoryWithFixers);
99
    }
100
101
    /**
102
     * @return object[]
103
     */
104 1
    private function createObjectsFromFixerFiles(array $fixerFiles)
105
    {
106 1
        $fixerObjects = [];
107 1
        foreach ($fixerFiles as $file) {
108 1
            $relativeNamespace = $file->getRelativePath();
109 1
            $class = 'Symfony\\CS\\Fixer\\' . ($relativeNamespace ? $relativeNamespace . '\\' : '') . $file->getBasename('.php');
110 1
            $fixerObjects[] = new $class;
111
        }
112
113 1
        return $fixerObjects;
114
    }
115
}
116