Passed
Pull Request — master (#59)
by Peter
11:55
created

YamlStandardConfigDefinition   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 108
Duplicated Lines 0 %

Test Coverage

Coverage 96.61%

Importance

Changes 5
Bugs 1 Features 0
Metric Value
wmc 7
eloc 76
c 5
b 1
f 0
dl 0
loc 108
ccs 57
cts 59
cp 0.9661
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
B buildItemsNode() 0 61 5
A getConfigTreeBuilder() 0 16 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace YamlStandards\Model\Config;
6
7
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
8
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
9
use Symfony\Component\Config\Definition\ConfigurationInterface;
10
use Symfony\Component\HttpKernel\Kernel;
11
12
class YamlStandardConfigDefinition implements ConfigurationInterface
13
{
14
    public const CONFIG_PATHS_TO_CHECK = 'pathsToCheck';
15
    public const CONFIG_EXCLUDED_PATHS = 'excludedPaths';
16
    public const CONFIG_CHECKERS = 'checkers';
17
    public const CONFIG_PATH_TO_CHECKER = 'pathToChecker';
18
    public const CONFIG_PARAMETERS_FOR_CHECKER = 'parameters';
19
    public const CONFIG_PARAMETERS_DEPTH = 'depth';
20
    public const CONFIG_PARAMETERS_INDENTS = 'indents';
21
    public const CONFIG_PARAMETERS_LEVEL = 'level';
22
    public const CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE = 'serviceAliasingType';
23
    public const CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT = 'indentsCommentsWithoutParent';
24
    public const CONFIG_PARAMETERS_ALPHABETICAL_PRIORITIZED_KEYS = 'prioritizedKeys';
25
26
    public const CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_SHORT = 'short';
27
    public const CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_LONG = 'long';
28
29
    public const CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_DEFAULT = 'default';
30
    public const CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_PRESERVED = 'preserved';
31
32
    private const REGEX_FILE_EXTENSION = '/\..+$/';
33
34
    /**
35
     * @inheritDoc
36
     */
37 10
    public function getConfigTreeBuilder(): TreeBuilder
38
    {
39
        // fix for Symfony 4.2 and newer versions
40 10
        if (Kernel::VERSION_ID >= 40200) {
41 10
            $treeBuilder = new TreeBuilder('yaml_standards_config');
42
            /** @var \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition $rootNode */
43 10
            $rootNode = $treeBuilder->getRootNode();
44
        } else {
45
            $treeBuilder = new TreeBuilder();
46
            /** @var \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition $rootNode */
47
            $rootNode = /** @scrutinizer ignore-deprecated */ $treeBuilder->root('yaml_standards_config');
48
        }
49
50 10
        $this->buildItemsNode($rootNode->arrayPrototype());
51
52 10
        return $treeBuilder;
53
    }
54
55
    /**
56
     * @param \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition $node
57
     * @return \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition
58
     */
59 10
    private function buildItemsNode(ArrayNodeDefinition $node): ArrayNodeDefinition
60
    {
61
        return $node
62 10
            ->children()
63 10
                ->arrayNode(self::CONFIG_PATHS_TO_CHECK)->isRequired()->cannotBeEmpty()
64 10
                    ->validate()
65
                        ->ifTrue(function (array $patterns) {
66 10
                            foreach ($patterns as $pattern) {
67 10
                                if (preg_match(self::REGEX_FILE_EXTENSION, $pattern) === 0) {
68 10
                                    return true;
69
                                }
70
                            }
71
72 9
                            return false;
73 10
                        })
74 10
                        ->thenInvalid('Invalid pattern: %s. Pattern must have to suffix defined.')
75 10
                    ->end()
76 10
                    ->/** @scrutinizer ignore-call */prototype('scalar')->end()
77 10
                ->/** @scrutinizer ignore-call */end()
78 10
                ->arrayNode(self::CONFIG_EXCLUDED_PATHS)
79 10
                    ->validate()
80
                        ->ifTrue(function (array $patterns) {
81 5
                            foreach ($patterns as $pattern) {
82 5
                                if (preg_match(self::REGEX_FILE_EXTENSION, $pattern) === 0) {
83 5
                                    return true;
84
                                }
85
                            }
86
87 5
                            return false;
88 10
                        })
89 10
                        ->thenInvalid('Invalid pattern: %s. Pattern must have to suffix defined.')
90 10
                    ->end()
91 10
                    ->prototype('scalar')->end()
92 10
                ->end()
93 10
                ->arrayNode(self::CONFIG_CHECKERS)
94 10
                    ->isRequired()
95 10
                    ->arrayPrototype()
96 10
                        ->children()
97 10
                            ->scalarNode(self::CONFIG_PATH_TO_CHECKER)->defaultNull()->end()
98 10
                            ->arrayNode(self::CONFIG_PARAMETERS_FOR_CHECKER)
99 10
                                ->addDefaultsIfNotSet()
100 10
                                    ->children()
101 10
                                        ->scalarNode(self::CONFIG_PARAMETERS_DEPTH)->defaultValue(4)->end()
102 10
                                        ->scalarNode(self::CONFIG_PARAMETERS_INDENTS)->defaultValue(4)->end()
103 10
                                        ->scalarNode(self::CONFIG_PARAMETERS_LEVEL)->defaultValue(2)->end()
104 10
                                        ->enumNode(self::CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE)->defaultValue(self::CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_SHORT)->values([
105 10
                                            self::CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_SHORT,
106 10
                                            self::CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_LONG,
107 10
                                        ])->end()
108 10
                                        ->enumNode(self::CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT)->defaultValue(self::CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_DEFAULT)->values([
109 10
                                            self::CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_DEFAULT,
110 10
                                            self::CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_PRESERVED,
111 10
                                        ])->end()
112 10
                                        ->arrayNode(self::CONFIG_PARAMETERS_ALPHABETICAL_PRIORITIZED_KEYS)->prototype('scalar')->end()
113 10
                                    ->end()
114 10
                                ->end()
115 10
                            ->end()
116 10
                        ->end()
117 10
                    ->end()
118 10
                ->end()
119 10
            ->end();
120
    }
121
}
122