Passed
Pull Request — master (#7)
by Yonel Ceruto
07:02
created

QueryAnnotationParser::parse()   D

Complexity

Conditions 15
Paths 304

Size

Total Lines 72
Code Lines 43

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 31
CRAP Score 16.9411

Importance

Changes 0
Metric Value
dl 0
loc 72
ccs 31
cts 39
cp 0.7949
rs 4.1144
c 0
b 0
f 0
cc 15
eloc 43
nc 304
nop 3
crap 16.9411

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/*******************************************************************************
3
 *  This file is part of the GraphQL Bundle package.
4
 *
5
 *  (c) YnloUltratech <[email protected]>
6
 *
7
 *  For the full copyright and license information, please view the LICENSE
8
 *  file that was distributed with this source code.
9
 ******************************************************************************/
10
11
namespace Ynlo\GraphQLBundle\Definition\Loader\Annotation;
12
13
use Ynlo\GraphQLBundle\Annotation;
14
use Ynlo\GraphQLBundle\Definition\ArgumentAwareInterface;
15
use Ynlo\GraphQLBundle\Definition\ArgumentDefinition;
16
use Ynlo\GraphQLBundle\Definition\QueryDefinition;
17
use Ynlo\GraphQLBundle\Definition\Registry\Endpoint;
18
use Ynlo\GraphQLBundle\Util\ClassUtils;
19
use Ynlo\GraphQLBundle\Util\TypeUtil;
20
21
/**
22
 * Parse Query annotation to fetch queries
23
 */
24
class QueryAnnotationParser implements AnnotationParserInterface
25
{
26
    use AnnotationReaderAwareTrait;
27
28
    /**
29
     * {@inheritdoc}
30
     */
31 22
    public function supports($annotation): bool
32
    {
33 22
        return $annotation instanceof Annotation\Query;
34
    }
35
36
    /**
37
     * {@inheritdoc}
38
     */
39 22
    public function parse($annotation, \ReflectionClass $refClass, Endpoint $endpoint)
40
    {
41
        /** @var Annotation\Query $annotation */
42 22
        $query = new QueryDefinition();
43
44 22
        if ($annotation->name) {
45 22
            $query->setName($annotation->name);
46
        } else {
47 22
            $query->setName(lcfirst(ClassUtils::getDefaultName($refClass->getName())));
48
        }
49
50 22
        $endpoint->addQuery($query);
51
52 22
        if ($annotation->type) {
53 22
            $query->setNode(TypeUtil::normalize($annotation->type));
54 22
            $query->setType(TypeUtil::normalize($annotation->type));
55
        }
56
57 22
        $query->setList(TypeUtil::isTypeList($annotation->type));
58 22
        $query->setNonNull(TypeUtil::isTypeNonNull($annotation->type));
59 22
        $query->setNonNullList(TypeUtil::isTypeNonNullList($annotation->type));
60
61 22
        if (!$query->getType()) {
62 22
            $nodeType = ClassUtils::getNodeFromClass($refClass->getName());
63 22
            $objectDefinition = null;
64 22
            if ($nodeType && $endpoint->hasType($nodeType)) {
65 22
                $objectDefinition = $endpoint->getType($nodeType);
66
            }
67 22
            if ($objectDefinition) {
68 22
                $query->setType($objectDefinition->getName());
69 22
                $query->setNode($objectDefinition->getName());
70
            } else {
71
                //avoid throw Exception when the schema is empty
72
                //when the schema is empty the NodeInterface has not been loaded
73
                //then the node(id) and nodes(ids) queries fails
74
                if ('Node' === $nodeType) {
75
                    $endpoint->removeQuery($query->getName());
76
77
                    return;
78
                }
79
80
                $error = sprintf('Does not exist any valid type for class "%s"', $refClass->getName());
81
                throw new \RuntimeException($error);
82
            }
83
        }
84
85 22
        if ($annotation->arguments) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $annotation->arguments of type Ynlo\GraphQLBundle\Annotation\Argument[] is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
86
            foreach ($annotation->arguments as $argAnnotation) {
87
                if ($argAnnotation instanceof Annotation\Argument) {
88
                    $this->resolveArgument($query, $argAnnotation);
89
                }
90
            }
91
        } else {
92 22
            $argAnnotations = $this->reader->getClassAnnotations($refClass);
93 22
            foreach ($argAnnotations as $argAnnotation) {
94 22
                if ($argAnnotation instanceof Annotation\Argument) {
95 22
                    $this->resolveArgument($query, $argAnnotation);
96
                }
97
            }
98
        }
99
100 22
        $query->setResolver($annotation->resolver ?? $refClass->getName());
101 22
        $query->setDeprecationReason($annotation->deprecationReason);
102 22
        $query->setDescription($annotation->description);
103
        $query->setRoles((array) $annotation->roles);
104 22
105 22
        if ($annotation->roles) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $annotation->roles of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
106
            $annotation->options['roles'] = (array) $annotation->roles;
107 22
        }
108
109
        foreach ($annotation->options as $option => $value) {
110
            $query->setMeta($option, $value);
111
        }
112
    }
113 22
114
    /**
115 22
     * @param ArgumentAwareInterface $argumentAware
116 22
     * @param object                 $argAnnotation
117 22
     */
118 22
    public function resolveArgument(ArgumentAwareInterface $argumentAware, $argAnnotation)
119 22
    {
120 22
        $arg = new ArgumentDefinition();
121 22
        $arg->setName($argAnnotation->name);
122 22
        $arg->setDescription($argAnnotation->description);
123 22
        $arg->setInternalName($argAnnotation->internalName);
124 22
        $arg->setDefaultValue($argAnnotation->defaultValue);
125 22
        $arg->setType(TypeUtil::normalize($argAnnotation->type));
126
        $arg->setList(TypeUtil::isTypeList($argAnnotation->type));
127
        $arg->setNonNullList(TypeUtil::isTypeNonNullList($argAnnotation->type));
128
        $arg->setNonNull(TypeUtil::isTypeNonNull($argAnnotation->type));
129
        $argumentAware->addArgument($arg);
130
    }
131
}
132