Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Completed
Pull Request — annotations (#407)
by Vincent
22:42 queued 11:44
created

Configuration::errorsHandlerSection()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 34

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 29
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 34
c 0
b 0
f 0
ccs 29
cts 29
cp 1
rs 9.376
cc 1
nc 1
nop 0
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Overblog\GraphQLBundle\DependencyInjection;
6
7
use GraphQL\Validator\Rules\QueryComplexity;
8
use GraphQL\Validator\Rules\QueryDepth;
9
use Overblog\GraphQLBundle\Error\ErrorHandler;
10
use Overblog\GraphQLBundle\EventListener\ErrorLoggerListener;
11
use Overblog\GraphQLBundle\Resolver\Resolver;
12
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
13
use Symfony\Component\Config\Definition\Builder\EnumNodeDefinition;
14
use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition;
15
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
16
use Symfony\Component\Config\Definition\ConfigurationInterface;
17
18
class Configuration implements ConfigurationInterface
19
{
20
    public const NAME = 'overblog_graphql';
21
22
    /** bool */
23
    private $debug;
24
25
    /** null|string */
26
    private $cacheDir;
27
28
    /**
29
     * Constructor.
30
     *
31
     * @param bool        $debug    Whether to use the debug mode
32
     * @param null|string $cacheDir
33
     */
34 33
    public function __construct(bool $debug, string $cacheDir = null)
35
    {
36 33
        $this->debug = (bool) $debug;
37 33
        $this->cacheDir = $cacheDir;
38 33
    }
39
40 33
    public function getConfigTreeBuilder()
41
    {
42 33
        $treeBuilder = new TreeBuilder();
43 33
        $rootNode = $treeBuilder->root(self::NAME);
44
45
        $rootNode
46 33
            ->children()
47 33
                ->append($this->batchingMethodSection())
48 33
                ->append($this->definitionsSection())
49 33
                ->append($this->errorsHandlerSection())
50 33
                ->append($this->servicesSection())
51 33
                ->append($this->securitySection())
52 33
                ->append($this->doctrineSection())
53 33
            ->end();
54
55 33
        return $treeBuilder;
56
    }
57
58 33
    private function batchingMethodSection()
59
    {
60 33
        $builder = new TreeBuilder();
61
        /** @var EnumNodeDefinition $node */
62 33
        $node = $builder->root('batching_method', 'enum');
63
64
        $node
65 33
            ->values(['relay', 'apollo'])
66 33
            ->defaultValue('relay')
67 33
        ->end();
68
69 33
        return $node;
70
    }
71
72 33
    private function errorsHandlerSection()
73
    {
74 33
        $builder = new TreeBuilder();
75
        /** @var ArrayNodeDefinition $node */
76 33
        $node = $builder->root('errors_handler');
77
        $node
78 33
            ->treatFalseLike(['enabled' => false])
79 33
            ->treatTrueLike(['enabled' => true])
80 33
            ->treatNullLike(['enabled' => true])
81 33
            ->addDefaultsIfNotSet()
82 33
            ->children()
83 33
                ->booleanNode('enabled')->defaultTrue()->end()
84 33
                ->scalarNode('internal_error_message')->defaultValue(ErrorHandler::DEFAULT_ERROR_MESSAGE)->end()
85 33
                ->booleanNode('rethrow_internal_exceptions')->defaultFalse()->end()
86 33
                ->booleanNode('debug')->defaultValue($this->debug)->end()
87 33
                ->booleanNode('log')->defaultTrue()->end()
88 33
                ->scalarNode('logger_service')->defaultValue(ErrorLoggerListener::DEFAULT_LOGGER_SERVICE)->end()
89 33
                ->booleanNode('map_exceptions_to_parent')->defaultFalse()->end()
90 33
                ->arrayNode('exceptions')
91 33
                    ->addDefaultsIfNotSet()
92 33
                    ->children()
93 33
                        ->arrayNode('warnings')
94 33
                            ->treatNullLike([])
95 33
                            ->prototype('scalar')->end()
96 33
                        ->end()
97 33
                        ->arrayNode('errors')
98 33
                            ->treatNullLike([])
99 33
                            ->prototype('scalar')->end()
100 33
                    ->end()
101 33
                ->end()
102 33
            ->end();
103
104 33
        return $node;
105
    }
106
107 33
    private function definitionsSection()
108
    {
109 33
        $builder = new TreeBuilder();
110
        /** @var ArrayNodeDefinition $node */
111 33
        $node = $builder->root('definitions');
112
        $node
113 33
            ->addDefaultsIfNotSet()
114 33
            ->children()
115 33
                ->variableNode('default_resolver')->defaultValue([Resolver::class, 'defaultResolveFn'])->end()
116 33
                ->scalarNode('class_namespace')->defaultValue('Overblog\\GraphQLBundle\\__DEFINITIONS__')->end()
117 33
                ->scalarNode('cache_dir')->defaultNull()->end()
118 33
                ->booleanNode('use_classloader_listener')->defaultTrue()->end()
119 33
                ->booleanNode('auto_compile')->defaultTrue()->end()
120 33
                ->booleanNode('show_debug_info')->info('Show some performance stats in extensions')->defaultFalse()->end()
121 33
                ->booleanNode('config_validation')->defaultValue($this->debug)->end()
122 33
                ->append($this->definitionsSchemaSection())
123 33
                ->append($this->definitionsMappingsSection())
124 33
                ->arrayNode('builders')
125 33
                    ->children()
126 33
                        ->append($this->builderSection('field'))
127 33
                        ->append($this->builderSection('args'))
128 33
                    ->end()
129 33
                ->end()
130
131 33
            ->end()
132 33
        ->end();
133
134 33
        return $node;
135
    }
136
137 33
    private function servicesSection()
138
    {
139 33
        $builder = new TreeBuilder();
140
        /** @var ArrayNodeDefinition $node */
141 33
        $node = $builder->root('services');
142
        $node
143 33
            ->addDefaultsIfNotSet()
144 33
            ->children()
145 33
                ->scalarNode('executor')
146 33
                    ->defaultValue(self::NAME.'.executor.default')
147 33
                ->end()
148 33
                ->scalarNode('promise_adapter')
149 33
                    ->defaultValue(self::NAME.'.promise_adapter.default')
150 33
                ->end()
151 33
                ->scalarNode('expression_language')
152 33
                    ->defaultValue(self::NAME.'.expression_language.default')
153 33
                ->end()
154 33
                ->scalarNode('cache_expression_language_parser')->end()
155 33
            ->end()
156 33
        ->end();
157
158 33
        return $node;
159
    }
160
161 33
    private function securitySection()
162
    {
163 33
        $builder = new TreeBuilder();
164
        /** @var ArrayNodeDefinition $node */
165 33
        $node = $builder->root('security');
166
        $node
167 33
            ->addDefaultsIfNotSet()
168 33
            ->children()
169 33
                ->append($this->securityQuerySection('query_max_depth', QueryDepth::DISABLED))
170 33
                ->append($this->securityQuerySection('query_max_complexity', QueryComplexity::DISABLED))
171 33
                ->booleanNode('enable_introspection')->defaultTrue()->end()
172 33
                ->booleanNode('handle_cors')->defaultFalse()->end()
173 33
            ->end()
174 33
        ->end();
175
176 33
        return $node;
177
    }
178
179 33
    private function definitionsSchemaSection()
180
    {
181 33
        $builder = new TreeBuilder();
182
        /** @var ArrayNodeDefinition $node */
183 33
        $node = $builder->root('schema');
184
        $node
185 33
            ->beforeNormalization()
186
                ->ifTrue(function ($v) {
187 29
                    return isset($v['query']) && \is_string($v['query']) || isset($v['mutation']) && \is_string($v['mutation']);
188 33
                })
189
                ->then(function ($v) {
190 28
                    return ['default' => $v];
191 33
                })
192 33
            ->end()
193 33
            ->useAttributeAsKey('name')
194 33
            ->prototype('array')
195 33
                ->addDefaultsIfNotSet()
196 33
                ->children()
197 33
                    ->scalarNode('query')->defaultNull()->end()
198 33
                    ->scalarNode('mutation')->defaultNull()->end()
199 33
                    ->scalarNode('subscription')->defaultNull()->end()
200 33
                    ->arrayNode('resolver_maps')
201 33
                        ->defaultValue([])
202 33
                        ->prototype('scalar')->end()
203 33
                    ->end()
204 33
                    ->arrayNode('types')
205 33
                        ->defaultValue([])
206 33
                        ->prototype('scalar')->end()
207 33
                    ->end()
208 33
                ->end()
209 33
            ->end()
210 33
        ->end();
211
212 33
        return $node;
213
    }
214
215 33
    private function definitionsMappingsSection()
216
    {
217 33
        $builder = new TreeBuilder();
218 33
        $node = $builder->root('mappings');
219
        $node
220 33
            ->children()
221 33
                ->arrayNode('auto_discover')
222 33
                    ->treatFalseLike(['bundles' => false, 'root_dir' => false])
223 33
                    ->treatTrueLike(['bundles' => true, 'root_dir' => true])
224 33
                    ->treatNullLike(['bundles' => true, 'root_dir' => true])
225 33
                    ->addDefaultsIfNotSet()
226 33
                    ->children()
227 33
                        ->booleanNode('bundles')->defaultTrue()->end()
228 33
                        ->booleanNode('root_dir')->defaultTrue()->end()
229 33
                    ->end()
230 33
                ->end()
231 33
                ->arrayNode('types')
232 33
                    ->prototype('array')
233 33
                        ->addDefaultsIfNotSet()
234 33
                        ->beforeNormalization()
235
                            ->ifTrue(function ($v) {
236 29
                                return isset($v['type']) && \is_string($v['type']);
237 33
                            })
238
                            ->then(function ($v) {
239 28
                                if ('yml' === $v['type']) {
240 7
                                    $v['types'] = ['yaml'];
241
                                } else {
242 21
                                    $v['types'] = [$v['type']];
243
                                }
244 28
                                unset($v['type']);
245
246 28
                                return $v;
247 33
                            })
248 33
                        ->end()
249 33
                        ->children()
250 33
                            ->arrayNode('types')
251 33
                                ->prototype('enum')->values(\array_keys(OverblogGraphQLTypesExtension::SUPPORTED_TYPES_EXTENSIONS))->isRequired()->end()
252 33
                            ->end()
253 33
                            ->scalarNode('dir')->defaultNull()->end()
254 33
                            ->scalarNode('suffix')->defaultValue(OverblogGraphQLTypesExtension::DEFAULT_TYPES_SUFFIX)->end()
255 33
                        ->end()
256 33
                    ->end()
257 33
                ->end()
258 33
            ->end()
259
        ;
260
261 33
        return $node;
262
    }
263
264 33
    private function doctrineSection()
265
    {
266 33
        $builder = new TreeBuilder();
267 33
        $node = $builder->root('doctrine');
268
        $node
269 33
            ->addDefaultsIfNotSet()
270 33
            ->children()
271 33
                ->arrayNode('types_mapping')
272 33
                    ->defaultValue([])
273 33
                    ->prototype('scalar')->end()
274 33
                ->end()
275 33
            ->end()
276
        ;
277
278 33
        return $node;
279
    }
280
281
    /**
282
     * @param string $name
283
     *
284
     * @return ArrayNodeDefinition
285
     */
286 33
    private function builderSection($name)
287
    {
288 33
        $builder = new TreeBuilder();
289
        /** @var ArrayNodeDefinition $node */
290 33
        $node = $builder->root($name);
291 33
        $node->beforeNormalization()
292
            ->ifTrue(function ($v) {
293 1
                return \is_array($v) && !empty($v);
294 33
            })
295
            ->then(function ($v) {
296 1
                foreach ($v as $key => &$config) {
297 1
                    if (\is_string($config)) {
298
                        $config = [
299 1
                            'alias' => $key,
300 1
                            'class' => $config,
301
                        ];
302
                    }
303
                }
304
305 1
                return $v;
306 33
            })
307 33
        ->end();
308
309 33
        $node->prototype('array')
310 33
            ->children()
311 33
                ->scalarNode('alias')->isRequired()->end()
312 33
                ->scalarNode('class')->isRequired()->end()
313 33
            ->end()
314 33
        ->end()
315
        ;
316
317 33
        return $node;
318
    }
319
320
    /**
321
     * @param string $name
322
     * @param bool   $disabledValue
323
     *
324
     * @return ScalarNodeDefinition
325
     */
326 33
    private function securityQuerySection($name, $disabledValue)
327
    {
328 33
        $builder = new TreeBuilder();
329
        /** @var ScalarNodeDefinition $node */
330 33
        $node = $builder->root($name, 'scalar');
331 33
        $node->beforeNormalization()
332
                ->ifTrue(function ($v) {
333 31
                    return \is_string($v) && \is_numeric($v);
334 33
                })
335
                ->then(function ($v) {
336 4
                    return (int) $v;
337 33
                })
338 33
            ->end();
339
340
        $node
341 33
            ->info('Disabled if equal to false.')
342 33
            ->beforeNormalization()
343
                ->ifTrue(function ($v) {
344 31
                    return false === $v;
345 33
                })
346
                ->then(function () use ($disabledValue) {
347 31
                    return $disabledValue;
348 33
                })
349 33
            ->end()
350 33
            ->defaultFalse()
351 33
            ->validate()
352
                ->ifTrue(function ($v) {
353 31
                    return \is_int($v) && $v < 0;
354 33
                })
355 33
                ->thenInvalid(\sprintf('"%s.security.%s" must be greater or equal to 0.', self::NAME, $name))
356 33
            ->end()
357
        ;
358
359 33
        return $node;
360
    }
361
}
362