GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Pull Request — master (#159)
by Roman
01:49
created

Alias   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 149
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
wmc 20
c 0
b 0
f 0
lcom 1
cbo 1
dl 0
loc 149
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A setObjectProperty() 0 11 2
A add() 0 11 3
A remove() 0 14 4
A getAliases() 0 8 1
A hasAliases() 0 4 1
B normalizePropertyValue() 0 16 7
A ensureClassName() 0 4 2
1
<?php declare(strict_types=1);
2
3
namespace OpenStack\Common\Resource;
4
5
/**
6
 * Represents a top-level abstraction of a remote API resource. Usually a resource represents a discrete
7
 * entity such as a Server, Container, Load Balancer. Apart from a representation of state, a resource can
8
 * also execute RESTFul operations on itself (updating, deleting, listing) or on other models.
9
 *
10
 * @package OpenStack\Common\Resource
11
 */
12
class Alias
13
{
14
    /**
15
     * An array of aliases that will be checked when the resource is being populated. For example,
16
     *
17
     * 'CLASS_NAME' => ['FOO_BAR' => 'fooBar']
18
     *
19
     * will extract FOO_BAR from the response, and save it as 'fooBar' in the resource.
20
     *
21
     * 'CLASS_NAME' => ['FOO_BAR' => ['fooBar', \DateTimeImmutable::class]]
22
     *
23
     * will extract FOO_BAR from the response, and save it as 'fooBar' with type \DateTimeImmutable in the resource.
24
     *
25
     * 'CLASS_NAME' => ['FOO_BAR' => ['fooBar', \DateTimeImmutable::class, true]]
26
     *
27
     * do the same as above plus indicates that target property is a list
28
     *
29
     * @var array
30
     */
31
    protected $aliases = [];
32
33
    /**
34
     * @param ResourceInterface $object
35
     * @param string            $key
36
     * @param mixed             $value
37
     *
38
     * @return void
39
     */
40
    public function setObjectProperty(ResourceInterface $object, $key, $value)
41
    {
42
        $alias = (array)($this->aliases[get_class($object)][$key] ?? $key);
43
44
        if (property_exists($object, $property = $alias[0])) {
45
            $class = $alias[1] ?? false;
46
            $isList = $alias[2] ?? false;
47
48
            $object->{$property} = $this->normalizePropertyValue($object, $value, $class, $isList);
49
        }
50
    }
51
52
    /**
53
     * Adds a new alias for class property
54
     *
55
     * @param string      $resourceClass
56
     * @param string      $alias
57
     * @param string      $property
58
     * @param string|null $class
59
     * @param bool        $isList
60
     *
61
     * @return $this
62
     */
63
    public function add($resourceClass, $alias, $property, $class = null, $isList = false)
64
    {
65
        $resourceClass = $this->ensureClassName($resourceClass);
66
67
        // make sure that target class exists
68
        $class = (($class && class_exists($class)) ? $class : false);
0 ignored issues
show
Bug Best Practice introduced by
The expression $class of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
69
70
        $this->aliases[$resourceClass][$alias] = [$property, $class, $isList];
71
72
        return $this;
73
    }
74
75
    /**
76
     * Removes an alias(es) for a class
77
     *
78
     * @param string      $resourceClass
79
     * @param string|null $alias
80
     *
81
     * @return $this
82
     */
83
    public function remove($resourceClass, $alias = null)
84
    {
85
        $resourceClass = $this->ensureClassName($resourceClass);
86
87
        if (isset($this->aliases[$resourceClass])) {
88
            if ($alias === null) {
89
                unset($this->aliases[$resourceClass]);
90
            } elseif (isset($this->aliases[$resourceClass][$alias])) {
91
                unset($this->aliases[$resourceClass][$alias]);
92
            }
93
        }
94
95
        return $this;
96
    }
97
98
    /**
99
     * Returns
100
     *
101
     * @param string $resourceClass
102
     *
103
     * @return array
104
     */
105
    public function getAliases($resourceClass)
106
    {
107
        $resourceClass = $this->ensureClassName($resourceClass);
108
109
        $aliases = $this->aliases[$resourceClass] ?? [];
110
111
        return array_map('array_shift', $aliases);
112
    }
113
114
    /**
115
     * Checks whether aliases added for a class or not
116
     *
117
     * @param string $resourceClass
118
     *
119
     * @return bool
120
     */
121
    public function hasAliases($resourceClass)
122
    {
123
        return isset($this->aliases[$resourceClass]);
124
    }
125
126
    /**
127
     * @param ResourceInterface $object
128
     * @param mixed             $value
129
     * @param string|false      $class
130
     * @param bool              $isList
131
     *
132
     * @return mixed
133
     */
134
    protected function normalizePropertyValue(ResourceInterface $object, $value, $class, $isList)
135
    {
136
        if ($value === null || !$class) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $class of type string|false is loosely compared to false; this is ambiguous if the string can be empty. You might want to explicitly use === false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
137
            return $value;
138
        } elseif ($isList && is_array($value)) {
139
            $array = [];
140
            foreach ($value as $subVal) {
141
                $array[] = $object->model($class, $subVal);
142
            }
143
            return $array;
144
        } elseif ($class === \DateTimeImmutable::class) {
145
            return new \DateTimeImmutable($value);
146
        }
147
148
        return $object->model($class, $value);
149
    }
150
151
    /**
152
     * @param mixed $object
153
     *
154
     * @return string
155
     */
156
    private function ensureClassName($object)
157
    {
158
        return is_object($object) ? get_class($object) : (string)$object;
159
    }
160
}
161