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
Push — master ( 327507...d10f4d )
by SignpostMarv
02:40
created

NudgePropertyValue()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 9
nc 4
nop 2
dl 0
loc 15
ccs 9
cts 9
cp 1
crap 4
rs 9.2
c 0
b 0
f 0
1
<?php
2
/**
3
* Base daft objects.
4
*
5
* @author SignpostMarv
6
*/
7
declare(strict_types=1);
8
9
namespace SignpostMarv\DaftObject;
10
11
use Closure;
12
13
/**
14
* Array-backed daft objects.
15
*/
16
abstract class AbstractArrayBackedDaftObject extends AbstractDaftObject implements DaftObjectCreatedByArray
17
{
18
    /**
19
    * data for this instance.
20
    *
21
    * @var array<string, mixed>
22
    */
23
    private $data = [];
24
25
    /**
26
    * List of changed properties.
27
    *
28
    * @var array<string, bool>
29
    */
30
    private $changedProperties = [];
31
32
    /**
33
    * List of changed properties, for write-once read-many.
34
    *
35
    * @var array<string, bool>
36
    */
37
    private $wormProperties = [];
38
39 376
    public function __construct(array $data = [], bool $writeAll = false)
40
    {
41 376
        parent::__construct();
42
43 372
        if (true === $writeAll) {
44 122
            foreach ($data as $k => $v) {
45 122
                $this->__set($k, $v);
46
            }
47
        } else {
48 254
            foreach ($data as $k => $v) {
49 132
                $this->data[$k] = $v;
50
            }
51
        }
52 368
    }
53
54 62
    public function __isset(string $property) : bool
55
    {
56
        return
57 62
            in_array($property, static::PROPERTIES, true) &&
58 62
            isset($this->data, $this->data[$property]);
59
    }
60
61 58
    public function ChangedProperties() : array
62
    {
63 58
        return array_keys($this->changedProperties);
64
    }
65
66 66
    public function MakePropertiesUnchanged(string ...$properties) : void
67
    {
68 66
        foreach ($properties as $property) {
69 66
            unset($this->changedProperties[$property]);
70
        }
71 66
    }
72
73 200
    public function HasPropertyChanged(string $property) : bool
74
    {
75
        return
76 200
            isset($this->changedProperties[$property]) &&
77 200
            true === $this->changedProperties[$property];
78
    }
79
80 44
    public function jsonSerialize() : array
81
    {
82 44
        JsonTypeUtilities::ThrowIfNotDaftJson(static::class);
83
84 12
        $out = [];
85
86 12
        foreach (static::DaftObjectJsonPropertyNames() as $property) {
87 12
            $val = $this->DoGetSet($property, false);
88
89 12
            if (false === is_null($val)) {
90 12
                $out[$property] = $val;
91
            }
92
        }
93
94 12
        return $out;
95
    }
96
97 56
    final public static function DaftObjectFromJsonArray(
98
        array $array,
99
        bool $writeAll = false
100
    ) : DaftJson {
101 56
        $array = JsonTypeUtilities::ThrowIfJsonDefNotValid(static::class, $array);
102 18
        $props = array_keys($array);
103 18
        $mapper = static::DaftJsonClosure($array, $writeAll);
104
105
        /**
106
        * @var DaftJson $out
107
        */
108 18
        $out = new static(array_combine($props, array_map($mapper, $props)), $writeAll);
109
110 14
        return $out;
111
    }
112
113 44
    public static function DaftObjectFromJsonString(string $string) : DaftJson
114
    {
115 44
        JsonTypeUtilities::ThrowIfNotDaftJson(static::class);
116
117 12
        return static::DaftObjectFromJsonArray(json_decode($string, true));
118
    }
119
120 266
    public function DaftObjectWormPropertyWritten(string $property) : bool
121
    {
122 266
        $wormProperties = $this->wormProperties;
123
124
        return
125 266
            ($this instanceof DaftObjectWorm) &&
126
            (
127 136
                $this->HasPropertyChanged($property) ||
128 266
                false === empty($wormProperties[$property])
129
            );
130
    }
131
132 18
    final protected static function DaftJsonClosure(array $array, bool $writeAll) : Closure
133
    {
134 18
        $jsonDef = static::DaftObjectJsonProperties();
135
136
        return
137
            /**
138
            * @return mixed
139
            */
140
            function (string $prop) use ($array, $jsonDef, $writeAll) {
141 16
                $jsonType = $jsonDef[$prop] ?? null;
142
143 16
                if ( ! is_string($jsonType)) {
144 12
                    return $array[$prop];
145
                }
146
147 10
                return JsonTypeUtilities::DaftJsonFromJsonType($jsonType, $prop, $array[$prop], $writeAll);
148 18
            };
149
    }
150
151
    /**
152
    * Retrieve a property from data.
153
    *
154
    * @param string $property the property being retrieved
155
    *
156
    * @throws PropertyNotNullableException if value is not set and $property is not listed as nullabe
157
    *
158
    * @return mixed the property value
159
    */
160 90
    protected function RetrievePropertyValueFromData(string $property)
161
    {
162
        if (
163 90
            false === array_key_exists($property, $this->data) &&
164 90
            false === in_array($property, static::NULLABLE_PROPERTIES, true)
165
        ) {
166 4
            throw new PropertyNotNullableException(static::class, $property);
167
        } elseif (
168 86
            in_array($property, static::NULLABLE_PROPERTIES, true)
169
        ) {
170 66
            return $this->data[$property] ?? null;
171
        }
172
173 86
        return $this->data[$property];
174
    }
175
176 268
    protected function NudgePropertyValue(string $property, $value) : void
177
    {
178 268
        $this->MaybeThrowForPropertyOnNudge($property);
179 266
        $this->MaybeThrowOnNudge($property, $value, static::NULLABLE_PROPERTIES);
180
181
        $isChanged = (
182 150
            false === array_key_exists($property, $this->data) ||
183 150
            $this->data[$property] !== $value
184
        );
185
186 150
        $this->data[$property] = $value;
187
188 150
        if ($isChanged && true !== isset($this->changedProperties[$property])) {
189 150
            $this->changedProperties[$property] = true;
190 150
            $this->wormProperties[$property] = true;
191
        }
192 150
    }
193
194
    /**
195
    * @see AbstractArrayBackedDaftObject::NudgePropertyValue()
196
    */
197 268
    private function MaybeThrowForPropertyOnNudge(string $property) : void
198
    {
199 268
        if (true !== in_array($property, static::PROPERTIES, true)) {
200 2
            throw new UndefinedPropertyException(static::class, $property);
201 266
        } elseif ($this->DaftObjectWormPropertyWritten($property)) {
202 100
            throw new PropertyNotRewriteableException(static::class, $property);
203
        }
204 266
    }
205
206
    /**
207
    * @param mixed $value
208
    *
209
    * @see AbstractArrayBackedDaftObject::NudgePropertyValue()
210
    */
211 266
    private function MaybeThrowOnNudge(string $property, $value, array $properties) : void
212
    {
213 266
        if (true === is_null($value) && true !== in_array($property, $properties, true)) {
214 116
            throw new PropertyNotNullableException(static::class, $property);
215
        }
216 150
    }
217
}
218