Passed
Pull Request — master (#111)
by Artem
07:44
created

RedisConfiguration   A

Complexity

Total Complexity 33

Size/Duplication

Total Lines 188
Duplicated Lines 0 %

Test Coverage

Coverage 88.6%

Importance

Changes 0
Metric Value
eloc 119
dl 0
loc 188
ccs 101
cts 114
cp 0.886
rs 9.76
c 0
b 0
f 0
wmc 33

7 Methods

Rating   Name   Duplication   Size   Complexity  
B addPredisArgs() 0 41 6
A addRedis() 0 31 4
A addPhpRedisArgs() 0 30 4
A addPredis() 0 25 5
A checkSncPhpRedis() 0 8 3
B addSncRedis() 0 31 6
A checkPredis() 0 8 5
1
<?php
2
3
namespace Dtc\QueueBundle\DependencyInjection;
4
5
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
6
7
trait RedisConfiguration
8
{
9 9
    protected function addPredis()
10
    {
11 9
        $treeBuilder = new TreeBuilder('predis');
12
13 9
        if (method_exists($treeBuilder, 'getRootNode')) {
14 9
            $rootNode = $treeBuilder->getRootNode();
15
        } else {
16
            // BC layer for symfony/config 4.1 and older
17
            $rootNode = $treeBuilder->root('predis');
18
        }
19
20
        $rootNode
21 9
            ->children()
22 9
            ->scalarNode('dsn')->defaultNull()->end()
23 9
            ->append($this->addPredisArgs())
24 9
            ->end()
25 9
            ->validate()->ifTrue(function ($node) {
26 1
                if (isset($node['dsn']) && (isset($node['connection_parameters']['host']) || isset($node['connection_parameters']['port']))) {
27
                    return true;
28
                }
29
30 1
                return false;
31 9
            })->thenInvalid('if dsn is set, do not use connection_parameters for predis (and vice-versa)')->end();
32
33 9
        return $rootNode;
34
    }
35
36 4
    protected function checkPredis(array $node)
37
    {
38 4
        if ((isset($node['predis']['dsn']) || isset($node['predis']['connection_parameters']['host'])) &&
39 4
            (isset($node['snc_redis']['type']) || isset($node['phpredis']['host']))) {
40
            return true;
41
        }
42
43 4
        return false;
44
    }
45
46 4
    protected function checkSncPhpRedis(array $node)
47
    {
48 4
        if (isset($node['snc_redis']['type']) &&
49 4
            isset($node['phpredis']['host'])) {
50
            return true;
51
        }
52
53 4
        return false;
54
    }
55
56 9
    protected function addRedis()
57
    {
58 9
        $treeBuilder = new TreeBuilder('redis');
59
60 9
        if (method_exists($treeBuilder, 'getRootNode')) {
61 9
            $rootNode = $treeBuilder->getRootNode();
62
        } else {
63
            // BC layer for symfony/config 4.1 and older
64
            $rootNode = $treeBuilder->root('redis');
65
        }
66
67
        $rootNode
68 9
            ->addDefaultsIfNotSet()
0 ignored issues
show
Bug introduced by
The method addDefaultsIfNotSet() 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

68
            ->/** @scrutinizer ignore-call */ 
69
              addDefaultsIfNotSet()
Loading history...
69 9
            ->children()
70 9
            ->scalarNode('prefix')->defaultValue('dtc_queue_')->end()
71 9
            ->append($this->addSncRedis())
72 9
            ->append($this->addPredis())
73 9
            ->append($this->addPhpRedisArgs())
74 9
            ->end()
75 9
            ->validate()->ifTrue(function ($node) {
76 4
                if ($this->checkPredis($node)) {
77
                    return true;
78
                }
79 4
                if ($this->checkSncPhpRedis($node)) {
80
                    return true;
81
                }
82
83 4
                return false;
84 9
            })->thenInvalid('only one of [snc_redis | predis | phpredis] should be set')->end();
85
86 9
        return $rootNode;
87
    }
88
89 9
    protected function addPhpRedisArgs()
90
    {
91 9
        $treeBuilder = new TreeBuilder('phpredis');
92
93 9
        if (method_exists($treeBuilder, 'getRootNode')) {
94 9
            $rootNode = $treeBuilder->getRootNode();
95
        } else {
96
            // BC layer for symfony/config 4.1 and older
97
            $rootNode = $treeBuilder->root('phpredis');
98
        }
99
100
        $rootNode
101 9
            ->addDefaultsIfNotSet()
102 9
            ->children()
103 9
            ->scalarNode('host')->end()
104 9
            ->integerNode('port')->defaultValue(6379)->end()
105 9
            ->floatNode('timeout')->defaultValue(0)->end()
106 9
            ->integerNode('retry_interval')->defaultNull()->end()
107 9
            ->floatNode('read_timeout')->defaultValue(0)->end()
108 9
            ->scalarNode('auth')->end()
109 9
            ->end()
110 9
            ->validate()->ifTrue(function ($node) {
111 2
                if (!empty($node) && !isset($node['host'])) {
112
                    return true;
113
                }
114
115 2
                return false;
116 9
            })->thenInvalid('phpredis host should be set')->end();
117
118 9
        return $rootNode;
119
    }
120
121 9
    protected function addPredisArgs()
122
    {
123 9
        $treeBuilder = new TreeBuilder('connection_parameters');
124
125 9
        if (method_exists($treeBuilder, 'getRootNode')) {
126 9
            $rootNode = $treeBuilder->getRootNode();
127
        } else {
128
            // BC layer for symfony/config 4.1 and older
129
            $rootNode = $treeBuilder->root('connection_parameters');
130
        }
131
132
        $rootNode
133 9
            ->addDefaultsIfNotSet()
134 9
            ->children()
135 9
            ->scalarNode('scheme')->defaultValue('tcp')->end()
136 9
            ->scalarNode('host')->defaultNull()->end()
137 9
            ->integerNode('port')->defaultNull()->end()
138 9
            ->scalarNode('path')->defaultNull()->end()
139 9
            ->scalarNode('database')->defaultNull()->end()
140 9
            ->scalarNode('password')->defaultNull()->end()
141 9
            ->booleanNode('async')->defaultFalse()->end()
142 9
            ->booleanNode('persistent')->defaultFalse()->end()
143 9
            ->floatNode('timeout')->defaultValue(5.0)->end()
144 9
            ->floatNode('read_write_timeout')->defaultNull()->end()
145 9
            ->scalarNode('alias')->defaultNull()->end()
146 9
            ->integerNode('weight')->defaultNull()->end()
147 9
            ->booleanNode('iterable_multibulk')->defaultFalse()->end()
148 9
            ->booleanNode('throw_errors')->defaultTrue()->end()
149 9
            ->end()
150 9
            ->validate()->ifTrue(function ($node) {
151 1
                if (isset($node['host']) && !isset($node['port'])) {
152
                    return true;
153
                }
154 1
                if (isset($node['port']) && !isset($node['host'])) {
155
                    return true;
156
                }
157
158 1
                return false;
159 9
            })->thenInvalid('predis connection_parameters host and port should both be set')->end();
160
161 9
        return $rootNode;
162
    }
163
164 9
    protected function addSncRedis()
165
    {
166 9
        $treeBuilder = new TreeBuilder('snc_redis');
167
168 9
        if (method_exists($treeBuilder, 'getRootNode')) {
169 9
            $rootNode = $treeBuilder->getRootNode();
170
        } else {
171
            // BC layer for symfony/config 4.1 and older
172
            $rootNode = $treeBuilder->root('snc_redis');
173
        }
174
175
        $rootNode
176 9
            ->children()
177 9
            ->enumNode('type')
178 9
            ->values(['predis', 'phpredis'])
179 9
            ->defaultNull()->end()
180 9
            ->scalarNode('alias')
181 9
            ->defaultNull()->end()
182 9
            ->end()
183 9
            ->validate()->ifTrue(function ($node) {
184 1
                if (isset($node['type']) && !isset($node['alias'])) {
185 1
                    return true;
186
                }
187 1
                if (isset($node['alias']) && !isset($node['type'])) {
188 1
                    return true;
189
                }
190
191 1
                return false;
192 9
            })->thenInvalid('if alias or type is set, then both must be set')->end();
193
194
        return $rootNode;
195
    }
196
}
197