Passed
Branch master (e09f8d)
by Peter
26:53
created

YamlStandardConfigDefinition   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 104
Duplicated Lines 0 %

Test Coverage

Coverage 96.55%

Importance

Changes 4
Bugs 1 Features 0
Metric Value
eloc 73
c 4
b 1
f 0
dl 0
loc 104
ccs 56
cts 58
cp 0.9655
rs 10
wmc 7

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getConfigTreeBuilder() 0 16 2
B buildItemsNode() 0 60 5
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
25
    public const CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_SHORT = 'short';
26
    public const CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_LONG = 'long';
27
28
    public const CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_DEFAULT = 'default';
29
    public const CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_PRESERVED = 'preserved';
30
31
    /**
32
     * @inheritDoc
33
     */
34 10
    public function getConfigTreeBuilder(): TreeBuilder
35
    {
36
        // fix for Symfony 4.2 and newer versions
37 10
        if (Kernel::VERSION_ID >= 40200) {
38 10
            $treeBuilder = new TreeBuilder('yaml_standards_config');
39
            /** @var \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition $rootNode */
40 10
            $rootNode = $treeBuilder->getRootNode();
41
        } else {
42
            $treeBuilder = new TreeBuilder();
43
            /** @var \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition $rootNode */
44
            $rootNode = /** @scrutinizer ignore-deprecated */ $treeBuilder->root('yaml_standards_config');
45
        }
46
47 10
        $this->buildItemsNode($rootNode->arrayPrototype());
48
49 10
        return $treeBuilder;
50
    }
51
52
    /**
53
     * @param \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition $node
54
     * @return \Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition
55
     */
56 10
    private function buildItemsNode(ArrayNodeDefinition $node): ArrayNodeDefinition
57
    {
58
        return $node
59 10
            ->children()
60 10
                ->arrayNode(self::CONFIG_PATHS_TO_CHECK)->isRequired()->cannotBeEmpty()
61 10
                    ->validate()
62
                        ->ifTrue(function (array $patterns) {
63 10
                            foreach ($patterns as $pattern) {
64 10
                                if (preg_match('/\..+/', $pattern) === 0) {
65 10
                                    return true;
66
                                }
67
                            }
68
69 9
                            return false;
70 10
                        })
71 10
                        ->thenInvalid('Invalid pattern: %s. Pattern must have to suffix defined.')
72 10
                    ->end()
73 10
                    ->prototype('scalar')->end()
0 ignored issues
show
Bug introduced by
The method prototype() does not exist on Symfony\Component\Config...\Builder\NodeDefinition. It seems like you code against a sub-type of Symfony\Component\Config...\Builder\NodeDefinition such as Symfony\Component\Config...der\ArrayNodeDefinition. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

73
                    ->/** @scrutinizer ignore-call */ prototype('scalar')->end()
Loading history...
74 10
                ->/** @scrutinizer ignore-call */end()
75 10
                ->arrayNode(self::CONFIG_EXCLUDED_PATHS)
76 10
                    ->validate()
77
                        ->ifTrue(function (array $patterns) {
78 5
                            foreach ($patterns as $pattern) {
79 5
                                if (preg_match('/\..+/', $pattern) === 0) {
80 5
                                    return true;
81
                                }
82
                            }
83
84 5
                            return false;
85 10
                        })
86 10
                        ->thenInvalid('Invalid pattern: %s. Pattern must have to suffix defined.')
87 10
                    ->end()
88 10
                    ->prototype('scalar')->end()
89 10
                ->end()
90 10
                ->arrayNode(self::CONFIG_CHECKERS)
91 10
                    ->isRequired()
92 10
                    ->arrayPrototype()
93 10
                        ->children()
94 10
                            ->scalarNode(self::CONFIG_PATH_TO_CHECKER)->defaultNull()->end()
95 10
                            ->arrayNode(self::CONFIG_PARAMETERS_FOR_CHECKER)
96 10
                                ->addDefaultsIfNotSet()
97 10
                                    ->children()
98 10
                                        ->scalarNode(self::CONFIG_PARAMETERS_DEPTH)->defaultValue(4)->end()
99 10
                                        ->scalarNode(self::CONFIG_PARAMETERS_INDENTS)->defaultValue(4)->end()
100 10
                                        ->scalarNode(self::CONFIG_PARAMETERS_LEVEL)->defaultValue(2)->end()
101 10
                                        ->enumNode(self::CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE)->defaultValue(self::CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_SHORT)->values([
102 10
                                            self::CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_SHORT,
103 10
                                            self::CONFIG_PARAMETERS_SERVICE_ALIASING_TYPE_VALUE_LONG,
104 10
                                        ])->end()
105 10
                                        ->enumNode(self::CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT)->defaultValue(self::CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_DEFAULT)->values([
106 10
                                            self::CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_DEFAULT,
107 10
                                            self::CONFIG_PARAMETERS_INDENTS_COMMENTS_WITHOUT_PARENT_VALUE_PRESERVED,
108 10
                                        ])->end()
109 10
                                    ->end()
110 10
                                ->end()
111 10
                            ->end()
112 10
                        ->end()
113 10
                    ->end()
114 10
                ->end()
115 10
            ->end();
116
    }
117
}
118