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

Passed
Pull Request — master (#590)
by Jérémiah
06:50
created

Configuration   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 384
Duplicated Lines 0 %

Test Coverage

Coverage 98.77%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 24
eloc 246
dl 0
loc 384
ccs 240
cts 243
cp 0.9877
rs 10
c 3
b 0
f 0

13 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A securitySection() 0 19 1
A definitionsSchemaSection() 0 34 4
A definitionsSection() 0 34 1
A errorsHandlerSection() 0 36 1
A servicesSection() 0 25 1
A batchingMethodSection() 0 13 1
A getConfigTreeBuilder() 0 19 1
A definitionsMappingsSection() 0 69 4
A builderSection() 0 33 4
A profilerSection() 0 16 1
A doctrineSection() 0 19 1
A securityQuerySection() 0 26 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Overblog\GraphQLBundle\DependencyInjection;
6
7
use GraphQL\Executor\Promise\Adapter\SyncPromiseAdapter;
8
use GraphQL\Validator\Rules\QueryComplexity;
9
use GraphQL\Validator\Rules\QueryDepth;
10
use Overblog\GraphQLBundle\Definition\Argument;
11
use Overblog\GraphQLBundle\DependencyInjection\Compiler\ConfigParserPass;
12
use Overblog\GraphQLBundle\Error\ErrorHandler;
13
use Overblog\GraphQLBundle\EventListener\ErrorLoggerListener;
14
use Overblog\GraphQLBundle\Executor\Executor;
15
use Overblog\GraphQLBundle\ExpressionLanguage\ExpressionLanguage;
16
use Overblog\GraphQLBundle\Resolver\FieldResolver;
17
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
18
use Symfony\Component\Config\Definition\Builder\EnumNodeDefinition;
19
use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition;
20
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
21
use Symfony\Component\Config\Definition\ConfigurationInterface;
22
use function array_keys;
23
use function is_array;
24
use function is_int;
25
use function is_numeric;
26
use function is_string;
27
use function sprintf;
28
29
class Configuration implements ConfigurationInterface
30
{
31
    public const NAME = 'overblog_graphql';
32
33
    private bool $debug;
34
    private ?string $cacheDir;
35
36
    /**
37
     * @param bool $debug Whether to use the debug mode
38
     */
39 42
    public function __construct(bool $debug, string $cacheDir = null)
40
    {
41 42
        $this->debug = (bool) $debug;
42 42
        $this->cacheDir = $cacheDir;
43 42
    }
44
45 42
    public function getConfigTreeBuilder(): TreeBuilder
46
    {
47 42
        $treeBuilder = new TreeBuilder(self::NAME);
48
49 42
        $rootNode = $treeBuilder->getRootNode();
50
51
        // @phpstan-ignore-next-line
52
        $rootNode
53 42
            ->children()
54 42
                ->append($this->batchingMethodSection())
55 42
                ->append($this->definitionsSection())
56 42
                ->append($this->errorsHandlerSection())
57 42
                ->append($this->servicesSection())
58 42
                ->append($this->securitySection())
59 42
                ->append($this->doctrineSection())
60 42
                ->append($this->profilerSection())
61 42
            ->end();
62
63 42
        return $treeBuilder;
64
    }
65
66 42
    private function batchingMethodSection(): EnumNodeDefinition
67
    {
68 42
        $builder = new TreeBuilder('batching_method', 'enum');
69
70
        /** @var EnumNodeDefinition $node */
71 42
        $node = $builder->getRootNode();
72
73
        $node
74 42
            ->values(['relay', 'apollo'])
75 42
            ->defaultValue('relay')
76 42
        ->end();
77
78 42
        return $node;
79
    }
80
81 42
    private function errorsHandlerSection(): ArrayNodeDefinition
82
    {
83 42
        $builder = new TreeBuilder('errors_handler');
84
85
        /** @var ArrayNodeDefinition $node */
86 42
        $node = $builder->getRootNode();
87
88
        // @phpstan-ignore-next-line
89
        $node
90 42
            ->treatFalseLike(['enabled' => false])
91 42
            ->treatTrueLike(['enabled' => true])
92 42
            ->treatNullLike(['enabled' => true])
93 42
            ->addDefaultsIfNotSet()
94 42
            ->children()
95 42
                ->booleanNode('enabled')->defaultTrue()->end()
96 42
                ->scalarNode('internal_error_message')->defaultValue(ErrorHandler::DEFAULT_ERROR_MESSAGE)->end()
0 ignored issues
show
Bug introduced by
The method scalarNode() does not exist on Symfony\Component\Config...der\NodeParentInterface. It seems like you code against a sub-type of Symfony\Component\Config...der\NodeParentInterface such as Symfony\Component\Config...ion\Builder\NodeBuilder. ( Ignorable by Annotation )

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

96
                ->/** @scrutinizer ignore-call */ scalarNode('internal_error_message')->defaultValue(ErrorHandler::DEFAULT_ERROR_MESSAGE)->end()
Loading history...
97 42
                ->booleanNode('rethrow_internal_exceptions')->defaultFalse()->end()
98 42
                ->booleanNode('debug')->defaultValue($this->debug)->end()
99 42
                ->booleanNode('log')->defaultTrue()->end()
100 42
                ->scalarNode('logger_service')->defaultValue(ErrorLoggerListener::DEFAULT_LOGGER_SERVICE)->end()
101 42
                ->booleanNode('map_exceptions_to_parent')->defaultFalse()->end()
102 42
                ->arrayNode('exceptions')
103 42
                    ->addDefaultsIfNotSet()
104 42
                    ->children()
105 42
                        ->arrayNode('warnings')
106 42
                            ->treatNullLike([])
107 42
                            ->prototype('scalar')->end()
108 42
                        ->end()
109 42
                        ->arrayNode('errors')
110 42
                            ->treatNullLike([])
111 42
                            ->prototype('scalar')->end()
112 42
                    ->end()
113 42
                ->end()
114 42
            ->end();
115
116 42
        return $node;
117
    }
118
119 42
    private function definitionsSection(): ArrayNodeDefinition
120
    {
121 42
        $builder = new TreeBuilder('definitions');
122
        /** @var ArrayNodeDefinition $node */
123 42
        $node = $builder->getRootNode();
124
125
        // @phpstan-ignore-next-line
126
        $node
127 42
            ->addDefaultsIfNotSet()
128 42
            ->children()
129 42
                ->scalarNode('argument_class')->defaultValue(Argument::class)->end()
130 42
                ->scalarNode('use_experimental_executor')->defaultFalse()->end()
131 42
                ->scalarNode('default_field_resolver')->defaultValue(FieldResolver::class)->end()
132 42
                ->scalarNode('class_namespace')->defaultValue('Overblog\\GraphQLBundle\\__DEFINITIONS__')->end()
133 42
                ->scalarNode('cache_dir')->defaultNull()->end()
134 42
                ->scalarNode('cache_dir_permissions')->defaultNull()->end()
135 42
                ->booleanNode('use_classloader_listener')->defaultTrue()->end()
136 42
                ->scalarNode('auto_compile')->defaultTrue()->end()
137 42
                ->booleanNode('show_debug_info')->info('Show some performance stats in extensions')->defaultFalse()->end()
138 42
                ->booleanNode('config_validation')->defaultValue($this->debug)->end()
139 42
                ->append($this->definitionsSchemaSection())
140 42
                ->append($this->definitionsMappingsSection())
141 42
                ->arrayNode('builders')
142 42
                    ->children()
143 42
                        ->append($this->builderSection('field'))
144 42
                        ->append($this->builderSection('fields'))
145 42
                        ->append($this->builderSection('args'))
146 42
                    ->end()
147 42
                ->end()
148
149 42
            ->end()
150 42
        ->end();
151
152 42
        return $node;
153
    }
154
155 42
    private function servicesSection(): ArrayNodeDefinition
156
    {
157 42
        $builder = new TreeBuilder('services');
158
159
        /** @var ArrayNodeDefinition $node */
160 42
        $node = $builder->getRootNode();
161
162
        // @phpstan-ignore-next-line
163
        $node
164 42
            ->addDefaultsIfNotSet()
165 42
            ->children()
166 42
                ->scalarNode('executor')
167 42
                    ->defaultValue(Executor::class)
168 42
                ->end()
169 42
                ->scalarNode('promise_adapter')
170 42
                    ->defaultValue(SyncPromiseAdapter::class)
171 42
                ->end()
172 42
                ->scalarNode('expression_language')
173 42
                    ->defaultValue(ExpressionLanguage::class)
174 42
                ->end()
175 42
                ->scalarNode('cache_expression_language_parser')->end()
176 42
            ->end()
177 42
        ->end();
178
179 42
        return $node;
180
    }
181
182 42
    private function securitySection(): ArrayNodeDefinition
183
    {
184 42
        $builder = new TreeBuilder('security');
185
186
        /** @var ArrayNodeDefinition $node */
187 42
        $node = $builder->getRootNode();
188
189
        // @phpstan-ignore-next-line
190
        $node
191 42
            ->addDefaultsIfNotSet()
192 42
            ->children()
193 42
                ->append($this->securityQuerySection('query_max_depth', QueryDepth::DISABLED))
194 42
                ->append($this->securityQuerySection('query_max_complexity', QueryComplexity::DISABLED))
195 42
                ->booleanNode('enable_introspection')->defaultTrue()->end()
196 42
                ->booleanNode('handle_cors')->defaultFalse()->end()
0 ignored issues
show
Bug introduced by
The method booleanNode() does not exist on Symfony\Component\Config...der\NodeParentInterface. It seems like you code against a sub-type of Symfony\Component\Config...der\NodeParentInterface such as Symfony\Component\Config...ion\Builder\NodeBuilder. ( Ignorable by Annotation )

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

196
                ->/** @scrutinizer ignore-call */ booleanNode('handle_cors')->defaultFalse()->end()
Loading history...
197 42
            ->end()
198 42
        ->end();
199
200 42
        return $node;
201
    }
202
203 42
    private function definitionsSchemaSection(): ArrayNodeDefinition
204
    {
205 42
        $builder = new TreeBuilder('schema');
206
207
        /** @var ArrayNodeDefinition $node */
208 42
        $node = $builder->getRootNode();
209
210
        // @phpstan-ignore-next-line
211
        $node
212 42
            ->beforeNormalization()
213 42
                ->ifTrue(fn ($v) => isset($v['query']) && is_string($v['query']) || isset($v['mutation']) && is_string($v['mutation']))
214 42
                ->then(fn ($v) => ['default' => $v])
215 42
            ->end()
216 42
            ->useAttributeAsKey('name')
0 ignored issues
show
Bug introduced by
The method useAttributeAsKey() 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

216
            ->/** @scrutinizer ignore-call */ useAttributeAsKey('name')
Loading history...
217 42
            ->prototype('array')
218 42
                ->addDefaultsIfNotSet()
219 42
                ->children()
220 42
                    ->scalarNode('query')->defaultNull()->end()
221 42
                    ->scalarNode('mutation')->defaultNull()->end()
222 42
                    ->scalarNode('subscription')->defaultNull()->end()
223 42
                    ->arrayNode('resolver_maps')
224 42
                        ->defaultValue([])
225 42
                        ->prototype('scalar')->end()
226 42
                        ->setDeprecated('The "%path%.%node%" configuration is deprecated since version 0.13 and will be removed in 1.0. Add the "overblog_graphql.resolver_map" tag to the services instead.')
227 42
                    ->end()
228 42
                    ->arrayNode('types')
229 42
                        ->defaultValue([])
230 42
                        ->prototype('scalar')->end()
231 42
                    ->end()
232 42
                ->end()
233 42
            ->end()
234 42
        ->end();
235
236 42
        return $node;
237
    }
238
239 42
    private function definitionsMappingsSection(): ArrayNodeDefinition
240
    {
241 42
        $builder = new TreeBuilder('mappings');
242
243
        /** @var ArrayNodeDefinition $node */
244 42
        $node = $builder->getRootNode();
245
246
        // @phpstan-ignore-next-line
247
        $node
248 42
            ->children()
249 42
                ->arrayNode('auto_discover')
250 42
                    ->treatFalseLike(['bundles' => false, 'root_dir' => false])
251 42
                    ->treatTrueLike(['bundles' => true, 'root_dir' => true])
252 42
                    ->treatNullLike(['bundles' => true, 'root_dir' => true])
253 42
                    ->addDefaultsIfNotSet()
254 42
                    ->children()
255 42
                        ->booleanNode('bundles')->defaultFalse()->end()
256 42
                        ->booleanNode('root_dir')->defaultFalse()->end()
257 42
                    ->end()
258 42
                ->end()
259 42
                ->scalarNode('types_callback')
260 42
                    ->defaultNull()
261 42
                    ->validate()
262
                        ->ifTrue(function ($callback) {
263
                            if (!empty($callback)) {
264
                                return !\is_subclass_of((string) $callback, TypesConfigurationCallbackInterface::class);
265
                            }
266
267
                            return false;
268 42
                        })
269 42
                        ->thenInvalid(
270 42
                            \sprintf(
271
                                'Types callback should be an instance of %s.',
272 42
                                TypesConfigurationCallbackInterface::class
273
                            )
274
                        )
275 42
                    ->end()
276 42
                ->end()
277 42
                ->arrayNode('types')
278 42
                    ->prototype('array')
279 42
                        ->addDefaultsIfNotSet()
280 42
                        ->beforeNormalization()
281
                            ->ifTrue(function ($v) {
282 33
                                return isset($v['type']) && is_string($v['type']);
283 42
                            })
284
                            ->then(function ($v) {
285 32
                                if ('yml' === $v['type']) {
286 7
                                    $v['types'] = ['yaml'];
287
                                } else {
288 25
                                    $v['types'] = [$v['type']];
289
                                }
290 32
                                unset($v['type']);
291
292 32
                                return $v;
293 42
                            })
294 42
                        ->end()
295 42
                        ->children()
296 42
                            ->arrayNode('types')
297 42
                                ->prototype('enum')->values(array_keys(ConfigParserPass::SUPPORTED_TYPES_EXTENSIONS))->isRequired()->end()
298 42
                            ->end()
299 42
                            ->scalarNode('dir')->defaultNull()->end()
300 42
                            ->scalarNode('suffix')->defaultValue(ConfigParserPass::DEFAULT_TYPES_SUFFIX)->end()
301 42
                        ->end()
302 42
                    ->end()
303 42
                ->end()
304 42
            ->end()
305
        ;
306
307 42
        return $node;
308
    }
309
310 42
    private function doctrineSection(): ArrayNodeDefinition
311
    {
312 42
        $builder = new TreeBuilder('doctrine');
313
314
        /** @var ArrayNodeDefinition $node */
315 42
        $node = $builder->getRootNode();
316
317
        // @phpstan-ignore-next-line
318
        $node
319 42
            ->addDefaultsIfNotSet()
320 42
            ->children()
321 42
                ->arrayNode('types_mapping')
322 42
                    ->defaultValue([])
323 42
                    ->prototype('scalar')->end()
324 42
                ->end()
0 ignored issues
show
Bug introduced by
The method end() does not exist on Symfony\Component\Config...der\NodeParentInterface. It seems like you code against a sub-type of said class. However, the method does not exist in Symfony\Component\Config...ion\Builder\TreeBuilder. Are you sure you never get one of those? ( Ignorable by Annotation )

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

324
                ->/** @scrutinizer ignore-call */ end()
Loading history...
325 42
            ->end()
326
        ;
327
328 42
        return $node;
329
    }
330
331 42
    private function profilerSection(): ArrayNodeDefinition
332
    {
333 42
        $builder = new TreeBuilder('profiler');
334
335
        /** @var ArrayNodeDefinition $node */
336 42
        $node = $builder->getRootNode();
337
338
        // @phpstan-ignore-next-line
339
        $node
340 42
            ->addDefaultsIfNotSet()
341 42
            ->children()
342 42
                ->scalarNode('query_match')->defaultNull()->end()
343 42
            ->end()
344
        ;
345
346 42
        return $node;
347
    }
348
349 42
    private function builderSection(string $name): ArrayNodeDefinition
350
    {
351 42
        $builder = new TreeBuilder($name);
352
353
        /** @var ArrayNodeDefinition $node */
354 42
        $node = $builder->getRootNode();
355
356 42
        $node->beforeNormalization()
357 42
            ->ifTrue(fn ($v) => is_array($v) && !empty($v))
358
            ->then(function ($v) {
359 5
                foreach ($v as $key => &$config) {
360 5
                    if (is_string($config)) {
361
                        $config = [
362 5
                            'alias' => $key,
363 5
                            'class' => $config,
364
                        ];
365
                    }
366
                }
367
368 5
                return $v;
369 42
            })
370 42
        ->end();
371
372
        // @phpstan-ignore-next-line
373 42
        $node->prototype('array')
374 42
            ->children()
375 42
                ->scalarNode('alias')->isRequired()->end()
376 42
                ->scalarNode('class')->isRequired()->end()
377 42
            ->end()
378 42
        ->end()
379
        ;
380
381 42
        return $node;
382
    }
383
384
    /**
385
     * @param mixed $disabledValue
386
     */
387 42
    private function securityQuerySection(string $name, $disabledValue): ScalarNodeDefinition
388
    {
389 42
        $builder = new TreeBuilder($name, 'scalar');
390
391
        /** @var ScalarNodeDefinition $node */
392 42
        $node = $builder->getRootNode();
393
394 42
        $node->beforeNormalization()
395 42
                ->ifTrue(fn ($v) => is_string($v) && is_numeric($v))
396 42
                ->then(fn ($v) => (int) $v)
397 42
            ->end();
398
399
        $node
400 42
            ->info('Disabled if equal to false.')
401 42
            ->beforeNormalization()
402 42
                ->ifTrue(fn ($v) => false === $v)
403 42
                ->then(fn () => $disabledValue)
404 42
            ->end()
405 42
            ->defaultValue($disabledValue)
406 42
            ->validate()
407 42
                ->ifTrue(fn ($v) => is_int($v) && $v < 0)
408 42
                ->thenInvalid(sprintf('"%s.security.%s" must be greater or equal to 0.', self::NAME, $name))
409 42
            ->end()
410
        ;
411
412 42
        return $node;
413
    }
414
}
415