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 (#762)
by
unknown
18:07
created

Configuration::servicesSection()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 25
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 18
c 0
b 0
f 0
dl 0
loc 25
ccs 18
cts 18
cp 1
rs 9.6666
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\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\BaseNode;
18
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
19
use Symfony\Component\Config\Definition\Builder\EnumNodeDefinition;
20
use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition;
21
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
22
use Symfony\Component\Config\Definition\ConfigurationInterface;
23
use function array_keys;
24
use function is_array;
25
use function is_int;
26
use function is_numeric;
27
use function is_string;
28
use function sprintf;
29
30
class Configuration implements ConfigurationInterface
31
{
32
    public const NAME = 'overblog_graphql';
33
34
    private bool $debug;
35
    private ?string $cacheDir;
36
37
    /**
38
     * @param bool $debug Whether to use the debug mode
39
     */
40 43
    public function __construct(bool $debug, string $cacheDir = null)
41
    {
42 43
        $this->debug = (bool) $debug;
43 43
        $this->cacheDir = $cacheDir;
44 43
    }
45
46 43
    public function getConfigTreeBuilder(): TreeBuilder
47
    {
48 43
        $treeBuilder = new TreeBuilder(self::NAME);
49
50 43
        $rootNode = $treeBuilder->getRootNode();
51
52
        // @phpstan-ignore-next-line
53
        $rootNode
54 43
            ->children()
55 43
                ->append($this->batchingMethodSection())
56 43
                ->append($this->definitionsSection())
57 43
                ->append($this->errorsHandlerSection())
58 43
                ->append($this->servicesSection())
59 43
                ->append($this->securitySection())
60 43
                ->append($this->doctrineSection())
61 43
                ->append($this->profilerSection())
62 43
            ->end();
63
64 43
        return $treeBuilder;
65
    }
66
67 43
    private function batchingMethodSection(): EnumNodeDefinition
68
    {
69 43
        $builder = new TreeBuilder('batching_method', 'enum');
70
71
        /** @var EnumNodeDefinition $node */
72 43
        $node = $builder->getRootNode();
73
74
        $node
75 43
            ->values(['relay', 'apollo'])
76 43
            ->defaultValue('relay')
77 43
        ->end();
78
79 43
        return $node;
80
    }
81
82 43
    private function errorsHandlerSection(): ArrayNodeDefinition
83
    {
84 43
        $builder = new TreeBuilder('errors_handler');
85
86
        /** @var ArrayNodeDefinition $node */
87 43
        $node = $builder->getRootNode();
88
89
        // @phpstan-ignore-next-line
90
        $node
91 43
            ->treatFalseLike(['enabled' => false])
92 43
            ->treatTrueLike(['enabled' => true])
93 43
            ->treatNullLike(['enabled' => true])
94 43
            ->addDefaultsIfNotSet()
95 43
            ->children()
96 43
                ->booleanNode('enabled')->defaultTrue()->end()
97 43
                ->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

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

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

217
            ->/** @scrutinizer ignore-call */ useAttributeAsKey('name')
Loading history...
218 43
            ->prototype('array')
219 43
                ->addDefaultsIfNotSet()
220 43
                ->children()
221 43
                    ->scalarNode('query')->defaultNull()->end()
222 43
                    ->scalarNode('mutation')->defaultNull()->end()
223 43
                    ->scalarNode('subscription')->defaultNull()->end()
224 43
                    ->arrayNode('resolver_maps')
225 43
                        ->defaultValue([])
226 43
                        ->prototype('scalar')->end()
227 43
                        ->setDeprecated(...$this->getDeprecationParameters('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.', '1.0'))
228 43
                    ->end()
229 43
                    ->arrayNode('types')
230 43
                        ->defaultValue([])
231 43
                        ->prototype('scalar')->end()
232 43
                    ->end()
233 43
                ->end()
234 43
            ->end()
235 43
        ->end();
236
237 43
        return $node;
238
    }
239
240 43
    private function definitionsMappingsSection(): ArrayNodeDefinition
241
    {
242 43
        $builder = new TreeBuilder('mappings');
243
244
        /** @var ArrayNodeDefinition $node */
245 43
        $node = $builder->getRootNode();
246
247
        // @phpstan-ignore-next-line
248
        $node
249 43
            ->children()
250 43
                ->arrayNode('auto_discover')
251 43
                    ->treatFalseLike(['bundles' => false, 'root_dir' => false, 'built_in' => true])
252 43
                    ->treatTrueLike(['bundles' => true, 'root_dir' => true, 'built_in' => true])
253 43
                    ->treatNullLike(['bundles' => true, 'root_dir' => true, 'built_in' => true])
254 43
                    ->addDefaultsIfNotSet()
255 43
                    ->children()
256 43
                        ->booleanNode('bundles')->defaultFalse()->end()
257 43
                        ->booleanNode('root_dir')->defaultFalse()->end()
258 43
                        ->booleanNode('built_in')->defaultTrue()->end()
259 43
                    ->end()
260 43
                ->end()
261 43
                ->arrayNode('types')
262 43
                    ->prototype('array')
263 43
                        ->addDefaultsIfNotSet()
264 43
                        ->beforeNormalization()
265 43
                            ->ifTrue(function ($v) {
266 33
                                return isset($v['type']) && is_string($v['type']);
267 43
                            })
268 43
                            ->then(function ($v) {
269 32
                                if ('yml' === $v['type']) {
270 7
                                    $v['types'] = ['yaml'];
271
                                } else {
272 25
                                    $v['types'] = [$v['type']];
273
                                }
274 32
                                unset($v['type']);
275
276 32
                                return $v;
277 43
                            })
278 43
                        ->end()
279 43
                        ->children()
280 43
                            ->arrayNode('types')
281 43
                                ->prototype('enum')->values(array_keys(ConfigParserPass::SUPPORTED_TYPES_EXTENSIONS))->isRequired()->end()
282 43
                            ->end()
283 43
                            ->scalarNode('dir')->defaultNull()->end()
284 43
                            ->scalarNode('suffix')->defaultValue(ConfigParserPass::DEFAULT_TYPES_SUFFIX)->end()
285 43
                        ->end()
286 43
                    ->end()
287 43
                ->end()
288 43
            ->end()
289
        ;
290
291 43
        return $node;
292
    }
293
294 43
    private function doctrineSection(): ArrayNodeDefinition
295
    {
296 43
        $builder = new TreeBuilder('doctrine');
297
298
        /** @var ArrayNodeDefinition $node */
299 43
        $node = $builder->getRootNode();
300
301
        // @phpstan-ignore-next-line
302
        $node
303 43
            ->addDefaultsIfNotSet()
304 43
            ->children()
305 43
                ->arrayNode('types_mapping')
306 43
                    ->defaultValue([])
307 43
                    ->prototype('scalar')->end()
308 43
                ->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

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