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 — master (#438)
by Vincent
24:33
created

BuilderProcessor::process()   B

Complexity

Conditions 7
Paths 7

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 7

Importance

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