Skip to content

Commit 37045e3

Browse files
authored
Merge pull request #241 from wmde/T178651
Fix SnakDeserializer causing "Undefined index" errors
2 parents 269d574 + 4d62b63 commit 37045e3

3 files changed

Lines changed: 23 additions & 31 deletions

File tree

src/DeserializerFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public function newSnakListDeserializer() {
169169
* @return Deserializer
170170
*/
171171
public function newSnakDeserializer() {
172-
return new SnakDeserializer( $this->dataValueDeserializer, $this->newEntityIdDeserializer() );
172+
return new SnakDeserializer( $this->dataValueDeserializer );
173173
}
174174

175175
/**

src/Deserializers/SnakDeserializer.php

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace Wikibase\DataModel\Deserializers;
44

5+
use DataValues\DataValue;
6+
use DataValues\Deserializers\DataValueDeserializer;
57
use DataValues\UnDeserializableValue;
68
use Deserializers\Deserializer;
79
use Deserializers\DispatchableDeserializer;
@@ -10,6 +12,7 @@
1012
use Deserializers\Exceptions\MissingAttributeException;
1113
use Deserializers\Exceptions\MissingTypeException;
1214
use Deserializers\Exceptions\UnsupportedTypeException;
15+
use InvalidArgumentException;
1316
use Wikibase\DataModel\Entity\PropertyId;
1417
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
1518
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
@@ -29,17 +32,8 @@ class SnakDeserializer implements DispatchableDeserializer {
2932
*/
3033
private $dataValueDeserializer;
3134

32-
/**
33-
* @var Deserializer
34-
*/
35-
private $entityIdDeserializer;
36-
37-
public function __construct(
38-
Deserializer $dataValueDeserializer,
39-
Deserializer $entityIdDeserializer
40-
) {
35+
public function __construct( Deserializer $dataValueDeserializer ) {
4136
$this->dataValueDeserializer = $dataValueDeserializer;
42-
$this->entityIdDeserializer = $entityIdDeserializer;
4337
}
4438

4539
/**
@@ -114,12 +108,24 @@ private function newValueSnak( array $serialization ) {
114108
);
115109
}
116110

111+
/**
112+
* @param array $serialization
113+
*
114+
* @return DataValue
115+
*/
117116
private function deserializeDataValue( $serialization ) {
118117
try {
119118
return $this->dataValueDeserializer->deserialize( $serialization );
120119
} catch ( DeserializationException $ex ) {
120+
$value = isset( $serialization[DataValueDeserializer::VALUE_KEY] )
121+
? $serialization[DataValueDeserializer::VALUE_KEY]
122+
: null;
123+
$type = isset( $serialization[DataValueDeserializer::TYPE_KEY] )
124+
? $serialization[DataValueDeserializer::TYPE_KEY]
125+
: null;
121126
$error = isset( $serialization['error'] ) ? $serialization['error'] : $ex->getMessage();
122-
return new UnDeserializableValue( $serialization['value'], $serialization['type'], $error );
127+
128+
return new UnDeserializableValue( $value, $type, $error );
123129
}
124130
}
125131

@@ -130,17 +136,15 @@ private function deserializeDataValue( $serialization ) {
130136
* @return PropertyId
131137
*/
132138
private function deserializePropertyId( $serialization ) {
133-
$propertyId = $this->entityIdDeserializer->deserialize( $serialization );
134-
135-
if ( !( $propertyId instanceof PropertyId ) ) {
139+
try {
140+
return new PropertyId( $serialization );
141+
} catch ( InvalidArgumentException $ex ) {
136142
throw new InvalidAttributeException(
137143
'property',
138144
$serialization,
139145
"'$serialization' is not a valid property ID"
140146
);
141147
}
142-
143-
return $propertyId;
144148
}
145149

146150
private function assertCanDeserialize( $serialization ) {

tests/unit/Deserializers/SnakDeserializerTest.php

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,10 @@
2424
class SnakDeserializerTest extends DispatchableDeserializerTest {
2525

2626
protected function buildDeserializer() {
27-
$entityIdDeserializerMock = $this->getMock( Deserializer::class );
28-
$entityIdDeserializerMock->expects( $this->any() )
29-
->method( 'deserialize' )
30-
->with( $this->equalTo( 'P42' ) )
31-
->will( $this->returnValue( new PropertyId( 'P42' ) ) );
32-
3327
return new SnakDeserializer(
3428
new DataValueDeserializer( [
3529
'string' => StringValue::class,
36-
] ),
37-
$entityIdDeserializerMock
30+
] )
3831
);
3932
}
4033

@@ -150,12 +143,7 @@ public function invalidDeserializationProvider() {
150143
}
151144

152145
public function testDeserializePropertyIdFilterItemId() {
153-
$entityIdDeserializerMock = $this->getMock( Deserializer::class );
154-
$entityIdDeserializerMock->expects( $this->any() )
155-
->method( 'deserialize' )
156-
->with( $this->equalTo( 'Q42' ) )
157-
->will( $this->returnValue( new ItemId( 'Q42' ) ) );
158-
$deserializer = new SnakDeserializer( new DataValueDeserializer(), $entityIdDeserializerMock );
146+
$deserializer = new SnakDeserializer( new DataValueDeserializer() );
159147

160148
$this->setExpectedException( InvalidAttributeException::class );
161149
$deserializer->deserialize( [

0 commit comments

Comments
 (0)