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 (#438)
by Vincent
15:04
created

BuilderProcessor::processFieldsBuilders()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 8
dl 0
loc 13
ccs 9
cts 9
cp 1
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 1
crap 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Overblog\GraphQLBundle\Config\Processor;
6
7
use Overblog\GraphQLBundle\Definition\Builder\MappingInterface;
8
use Overblog\GraphQLBundle\Relay\Connection\BackwardConnectionArgsDefinition;
9
use Overblog\GraphQLBundle\Relay\Connection\ConnectionArgsDefinition;
10
use Overblog\GraphQLBundle\Relay\Connection\ForwardConnectionArgsDefinition;
11
use Overblog\GraphQLBundle\Relay\Mutation\MutationFieldDefinition;
12
use Overblog\GraphQLBundle\Relay\Node\GlobalIdFieldDefinition;
13
use Overblog\GraphQLBundle\Relay\Node\NodeFieldDefinition;
14
use Overblog\GraphQLBundle\Relay\Node\PluralIdentifyingRootFieldDefinition;
15
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
16
17
final class BuilderProcessor implements ProcessorInterface
18
{
19
    public const BUILDER_FIELD_TYPE = 'field';
20
    public const BUILDER_FIELDS_TYPE = 'fields';
21
    public const BUILDER_ARGS_TYPE = 'args';
22
23
    public const BUILDER_TYPES = [
24
        self::BUILDER_FIELD_TYPE,
25
        self::BUILDER_FIELDS_TYPE,
26
        self::BUILDER_ARGS_TYPE,
27
    ];
28
29
    /** @var MappingInterface[] */
30
    private static $builderClassMap = [
31
        self::BUILDER_ARGS_TYPE => [
32
            'Relay::ForwardConnection' => ForwardConnectionArgsDefinition::class,
33
            'Relay::BackwardConnection' => BackwardConnectionArgsDefinition::class,
34
            'Relay::Connection' => ConnectionArgsDefinition::class,
35
        ],
36
        self::BUILDER_FIELD_TYPE => [
37
            'Relay::Mutation' => MutationFieldDefinition::class,
38
            'Relay::GlobalId' => GlobalIdFieldDefinition::class,
39
            'Relay::Node' => NodeFieldDefinition::class,
40
            'Relay::PluralIdentifyingRoot' => PluralIdentifyingRootFieldDefinition::class,
41
        ],
42
        self::BUILDER_FIELDS_TYPE => [],
43
    ];
44
45
    /**
46
     * {@inheritdoc}
47
     */
48 40
    public static function process(array $configs): array
49
    {
50 40
        foreach ($configs as &$config) {
51 40
            if (isset($config['config']['builders']) && \is_array($config['config']['builders'])) {
52 1
                if (!isset($config['config']['fields'])) {
53
                    $config['config']['fields'] = [];
54
                }
55 1
                $config['config']['fields'] = \array_merge(self::processFieldsBuilders($config['config']['builders']), $config['config']['fields']);
56 1
                unset($config['config']['builders']);
57
            }
58
59 40
            if (isset($config['config']['fields']) && \is_array($config['config']['fields'])) {
60 40
                $config['config']['fields'] = self::processFieldBuilders($config['config']['fields']);
61
            }
62
        }
63
64 38
        return $configs;
65
    }
66
67 11
    public static function addBuilderClass($name, $type, $builderClass): void
68
    {
69 11
        self::checkBuilderClass($builderClass, $type);
70 1
        self::$builderClassMap[$type][$name] = $builderClass;
71 1
    }
72
73
    /**
74
     * @param string $builderClass
75
     * @param string $type
76
     */
77 11
    private static function checkBuilderClass($builderClass, $type): void
78
    {
79 11
        $interface = MappingInterface::class;
80
81 11
        if (!\is_string($builderClass)) {
0 ignored issues
show
introduced by
The condition is_string($builderClass) is always true.
Loading history...
82 5
            throw new \InvalidArgumentException(
83 5
                \sprintf('%s builder class should be string, but %s given.', \ucfirst($type), \gettype($builderClass))
84
            );
85
        }
86
87 6
        if (!\class_exists($builderClass)) {
88 2
            throw new \InvalidArgumentException(
89 2
                \sprintf('%s builder class "%s" not found.', \ucfirst($type), $builderClass)
90
            );
91
        }
92
93 4
        if (!\is_subclass_of($builderClass, $interface)) {
94 3
            throw new \InvalidArgumentException(
95 3
                \sprintf(
96 3
                    '%s builder class should implement "%s", but "%s" given.',
97 3
                    \ucfirst($type),
98 3
                    $interface,
99 3
                    $builderClass
100
                )
101
            );
102
        }
103 1
    }
104
105 34
    private static function processFieldBuilders(array $fields)
106
    {
107 34
        foreach ($fields as &$field) {
108 34
            $fieldBuilderName = null;
109
110 34
            if (isset($field['builder']) && \is_string($field['builder'])) {
111 9
                $fieldBuilderName = $field['builder'];
112 9
                unset($field['builder']);
113 33
            } elseif (\is_string($field)) {
114 2
                @\trigger_error(
115
                    'The builder short syntax (Field: Builder => Field: {builder: Builder}) is deprecated as of 0.7 and will be removed in 0.12. '.
116 2
                    'It will be replaced by the field type short syntax (Field: Type => Field: {type: Type})',
117 2
                    \E_USER_DEPRECATED
118
                );
119 2
                $fieldBuilderName = $field;
120
            }
121
122 34
            $builderConfig = [];
123 34
            if (isset($field['builderConfig'])) {
124 7
                if (\is_array($field['builderConfig'])) {
125 7
                    $builderConfig = $field['builderConfig'];
126
                }
127 7
                unset($field['builderConfig']);
128
            }
129
130 34
            if ($fieldBuilderName) {
131 9
                $buildField = self::getBuilder($fieldBuilderName, self::BUILDER_FIELD_TYPE)->toMappingDefinition($builderConfig);
132 8
                $field = \is_array($field) ? \array_merge($buildField, $field) : $buildField;
133
            }
134 33
            if (isset($field['argsBuilder'])) {
135 33
                $field = self::processFieldArgumentsBuilders($field);
136
            }
137
        }
138
139 32
        return $fields;
140
    }
141
142 1
    private static function processFieldsBuilders(array $builders)
143
    {
144 1
        $fields = [];
145 1
        foreach ($builders as $builder) {
146 1
            $builderName = $builder['builder'];
147 1
            $builderConfig = null;
148 1
            if (isset($builder['builderConfig'])) {
149 1
                $builderConfig = $builder['builderConfig'];
150
            }
151 1
            $fields = \array_merge($fields, self::getBuilder($builderName, self::BUILDER_FIELDS_TYPE)->toMappingDefinition($builderConfig));
152
        }
153
154 1
        return $fields;
155
    }
156
157
    /**
158
     * @param string $name
159
     * @param string $type
160
     *
161
     * @return MappingInterface
162
     *
163
     * @throws InvalidConfigurationException if builder class not define
164
     */
165 22
    private static function getBuilder($name, $type)
166
    {
167 22
        static $builders = [];
168 22
        if (isset($builders[$type][$name])) {
169 19
            return $builders[$type][$name];
170
        }
171
172 8
        $builderClassMap = self::$builderClassMap[$type];
173
174 8
        if (isset($builderClassMap[$name])) {
175 5
            return $builders[$type][$name] = new $builderClassMap[$name]();
176
        }
177
        // deprecated relay builder name ?
178 3
        $newName = 'Relay::'.\rtrim($name, 'Args');
179 3
        if (isset($builderClassMap[$newName])) {
180 1
            @\trigger_error(
181 1
                \sprintf('The "%s" %s builder is deprecated as of 0.7 and will be removed in 0.12. Use "%s" instead.', $name, $type, $newName),
182 1
                \E_USER_DEPRECATED
183
            );
184
185 1
            return $builders[$type][$newName] = new $builderClassMap[$newName]();
186
        }
187
188 2
        throw new InvalidConfigurationException(\sprintf('%s builder "%s" not found.', \ucfirst($type), $name));
189
    }
190
191 15
    private static function processFieldArgumentsBuilders(array $field)
192
    {
193 15
        $argsBuilderName = null;
194
195 15
        if (\is_string($field['argsBuilder'])) {
196 15
            $argsBuilderName = $field['argsBuilder'];
197 1
        } elseif (isset($field['argsBuilder']['builder']) && \is_string($field['argsBuilder']['builder'])) {
198 1
            $argsBuilderName = $field['argsBuilder']['builder'];
199
        }
200
201 15
        $builderConfig = [];
202 15
        if (isset($field['argsBuilder']['config']) && \is_array($field['argsBuilder']['config'])) {
203 1
            $builderConfig = $field['argsBuilder']['config'];
204
        }
205
206 15
        if ($argsBuilderName) {
207 15
            $args = self::getBuilder($argsBuilderName, self::BUILDER_ARGS_TYPE)->toMappingDefinition($builderConfig);
208 14
            $field['args'] = isset($field['args']) && \is_array($field['args']) ? \array_merge($args, $field['args']) : $args;
209
        }
210
211 14
        unset($field['argsBuilder']);
212
213 14
        return $field;
214
    }
215
}
216