Addshore has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/92873


Change subject: Implement List Serializer and Unserializer
......................................................................

Implement List Serializer and Unserializer

Needed to allow claims references and qualifiers
to be optionally serialized by propoerty of just
in a list!

Change-Id: I07626d07670f6cd6a2ae3d7370dea6ba32c5c366
---
M lib/WikibaseLib.classes.php
A lib/includes/serializers/ListSerializer.php
A lib/includes/serializers/ListUnserializer.php
A lib/tests/phpunit/serializers/ListSerializerTest.php
A lib/tests/phpunit/serializers/ListUnserializerTest.php
5 files changed, 316 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/73/92873/1

diff --git a/lib/WikibaseLib.classes.php b/lib/WikibaseLib.classes.php
index 024a707..b6adec4 100644
--- a/lib/WikibaseLib.classes.php
+++ b/lib/WikibaseLib.classes.php
@@ -145,6 +145,8 @@
                'Wikibase\Lib\Serializers\SerializerObject' => 
'includes/serializers/SerializerObject.php',
                'Wikibase\Lib\Serializers\SnakSerializer' => 
'includes/serializers/SnakSerializer.php',
                'Wikibase\Lib\Serializers\Unserializer' => 
'includes/serializers/Unserializer.php',
+               'Wikibase\Lib\Serializers\ListSerializer' => 
'includes/serializers/ListSerializer.php',
+               'Wikibase\Lib\Serializers\ListUnserializer' => 
'includes/serializers/ListUnserializer.php',
 
                // includes/sites
                'SiteMatrixParser' => 'includes/sites/SiteMatrixParser.php',
diff --git a/lib/includes/serializers/ListSerializer.php 
b/lib/includes/serializers/ListSerializer.php
new file mode 100644
index 0000000..02bedc8
--- /dev/null
+++ b/lib/includes/serializers/ListSerializer.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Wikibase\Lib\Serializers;
+
+use Traversable;
+use InvalidArgumentException;
+
+/**
+ * Serializer for Traversable objects
+ *
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class ListSerializer extends SerializerObject {
+
+       /**
+        * @var Serializer
+        */
+       protected $elementSerializer;
+
+       /**
+        * Constructor.
+        *
+        * @param Serializer $elementSerializer
+        * @param SerializationOptions|null $options
+        */
+       public function __construct( Serializer $elementSerializer, 
SerializationOptions $options = null ) {
+               parent::__construct( $options );
+
+               $this->elementSerializer = $elementSerializer;
+       }
+
+       /**
+        * @since 0.5
+        *
+        * @param mixed $objects
+        *
+        * @return array
+        * @throws InvalidArgumentException
+        */
+       public function getSerialized( $objects ) {
+               if ( !( $objects instanceof Traversable ) ) {
+                       throw new InvalidArgumentException( 'ListSerializer can 
only serialize Traversable objects' );
+               }
+
+               //NOTE: when changing the serialization structure, update 
docs/json.wiki too!
+
+               $serialization = array();
+
+               foreach( $objects as $object ){
+                       $serializedObject = 
$this->elementSerializer->getSerialized( $object );
+                       $serialization[] = $serializedObject;
+               }
+
+               return $serialization;
+       }
+
+}
diff --git a/lib/includes/serializers/ListUnserializer.php 
b/lib/includes/serializers/ListUnserializer.php
new file mode 100644
index 0000000..fb9557d
--- /dev/null
+++ b/lib/includes/serializers/ListUnserializer.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Wikibase\Lib\Serializers;
+
+/**
+ * Unserializer for Traversable objects
+ *
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class ListUnserializer implements Unserializer {
+
+       /**
+        * @var Unserializer
+        */
+       protected $elementUnserializer;
+
+       /**
+        * Constructor.
+        *
+        * @param Unserializer $elementUnserializer
+        */
+       public function __construct( Unserializer $elementUnserializer ) {
+               $this->elementUnserializer = $elementUnserializer;
+       }
+
+       /**
+        * @see Unserializer::newFromSerialization
+        *
+        * @since 0.5
+        *
+        * @param array $serialization
+        *
+        * @return array
+        */
+       public function newFromSerialization( array $serialization ) {
+               $elements = array();
+
+               foreach ( $serialization as $serializedElement ) {
+                       $element = 
$this->elementUnserializer->newFromSerialization( $serializedElement );
+                       $elements[] = $element;
+               }
+
+               return $elements;
+       }
+
+}
diff --git a/lib/tests/phpunit/serializers/ListSerializerTest.php 
b/lib/tests/phpunit/serializers/ListSerializerTest.php
new file mode 100644
index 0000000..a5c1fbf
--- /dev/null
+++ b/lib/tests/phpunit/serializers/ListSerializerTest.php
@@ -0,0 +1,93 @@
+<?php
+
+namespace Wikibase\Test;
+
+use DataValues\StringValue;
+use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\Lib\Serializers\ListSerializer;
+use Wikibase\Lib\Serializers\SnakSerializer;
+use Wikibase\PropertyNoValueSnak;
+use Wikibase\PropertySomeValueSnak;
+use Wikibase\PropertyValueSnak;
+use Wikibase\SnakList;
+
+/**
+ * @covers Wikibase\Lib\Serializers\ListSerializer
+ *
+ * @group WikibaseLib
+ * @group Wikibase
+ * @group WikibaseSerialization
+ *
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class ListSerializerTest extends SerializerBaseTest {
+
+       /**
+        * @see SerializerBaseTest::getClass
+        *
+        * @return string
+        */
+       protected function getClass() {
+               return '\Wikibase\Lib\Serializers\ListSerializer';
+       }
+
+       /**
+        * @return ListSerializer
+        */
+       protected function getInstance() {
+               $snakSerializer = new SnakSerializer();
+               return new ListSerializer( $snakSerializer );
+       }
+
+       /**
+        * @see SerializerBaseTest::validProvider
+        *
+        * @since 0.2
+        *
+        * @return array
+        */
+       public function validProvider() {
+               $validArgs = array();
+
+               $dataValue0 = new StringValue( 'ohi' );
+
+               $id42 = new PropertyId( 'p42' );
+               $id2 = new PropertyId( 'p2' );
+
+               $snak0 = new PropertyNoValueSnak( $id42 );
+               $snak1 = new PropertySomeValueSnak( $id2 );
+               $snak2 = new PropertyValueSnak( $id2, $dataValue0 );
+
+               $validArgs[] = new SnakList( array( $snak0, $snak1, $snak2 ) );
+
+               $validArgs = $this->arrayWrap( $validArgs );
+
+               $validArgs[ 'Empty' ] = array(
+                       new SnakList(),
+                       array(),
+               );
+
+               $validArgs[ 'AList' ] = array(
+                       new SnakList( array( $snak0, $snak1, $snak2 ) ),
+                       array(
+                               0 => array(
+                                       'snaktype' => 'novalue',
+                                       'property' => 'P42',
+                               ),
+                               1 => array(
+                                       'snaktype' => 'somevalue',
+                                       'property' => 'P2',
+                               ),
+                               2 => array(
+                                       'snaktype' => 'value',
+                                       'property' => 'P2',
+                                       'datavalue' => $dataValue0->toArray(),
+                               ),
+                       ),
+               );
+
+               return $validArgs;
+       }
+
+} 
\ No newline at end of file
diff --git a/lib/tests/phpunit/serializers/ListUnserializerTest.php 
b/lib/tests/phpunit/serializers/ListUnserializerTest.php
new file mode 100644
index 0000000..551ad3c
--- /dev/null
+++ b/lib/tests/phpunit/serializers/ListUnserializerTest.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace Wikibase\Test;
+
+use DataValues\StringValue;
+use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\Lib\Serializers\ListUnserializer;
+use Wikibase\Lib\Serializers\SnakSerializer;
+use Wikibase\PropertyNoValueSnak;
+use Wikibase\PropertySomeValueSnak;
+use Wikibase\PropertyValueSnak;
+
+/**
+ * @covers Wikibase\Lib\Serializers\ListUnserializer
+ *
+ * @group WikibaseLib
+ * @group Wikibase
+ * @group WikibaseSerialization
+ *
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class ListUnserializerTest extends \MediaWikiTestCase {
+
+       /**
+        * @return string
+        */
+       protected function getClass() {
+               return '\Wikibase\Lib\Serializers\ListUnserializer';
+       }
+
+       /**
+        * @return ListUnserializer
+        */
+       protected function getInstance() {
+               $snakSerializer = new SnakSerializer();
+               return new ListUnserializer( $snakSerializer );
+       }
+
+       /**
+        * @dataProvider validProvider
+        */
+       public function testGetUnserializedValid( array $input, $expected ) {
+               $unserializer = $this->getInstance();
+               $unserialized = $unserializer->newFromSerialization( $input );
+               $this->assertEquals( $expected, $unserialized );
+       }
+
+       public function validProvider() {
+               $validArgs = array();
+
+               $dataValue0 = new StringValue( 'ohi' );
+
+               $id42 = new PropertyId( 'P42' );
+               $id2 = new PropertyId( 'P2' );
+
+               $snak0 = new PropertyNoValueSnak( $id42 );
+               $snak1 = new PropertySomeValueSnak( $id2 );
+               $snak2 = new PropertyValueSnak( $id2, $dataValue0 );
+
+               //0 empty serialization 1
+               $validArgs[] = array(
+                       array(),
+                       array(),
+               );
+
+               //1 serialization
+               $validArgs[] = array(
+                       array(
+                               0 => array(
+                                       'snaktype' => 'novalue',
+                                       'property' => 'P42',
+                               ),
+                               1 => array(
+                                       'snaktype' => 'somevalue',
+                                       'property' => 'P2',
+                               ),
+                               2 => array(
+                                       'snaktype' => 'value',
+                                       'property' => 'P2',
+                                       'datavalue' => $dataValue0->toArray(),
+                               ),
+                       ),
+                       array( $snak0, $snak1, $snak2 ),
+               );
+
+               return $validArgs;
+       }
+
+       public function invalidProvider() {
+               $invalid = array(
+                       false,
+                       true,
+                       null,
+                       42,
+                       4.2,
+                       '',
+                       'foo bar baz',
+               );
+
+               return $this->arrayWrap( $this->arrayWrap( $invalid ) );
+       }
+
+       /**
+        * @dataProvider invalidProvider
+        */
+       public function testNewFromSerializationInvalid( $input ) {
+               $serializer = $this->getInstance();
+               $this->assertException( function() use ( $serializer, $input ) 
{ $serializer->newFromSerialization( $input ); } );
+       }
+
+} 
\ No newline at end of file

-- 
To view, visit https://gerrit.wikimedia.org/r/92873
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I07626d07670f6cd6a2ae3d7370dea6ba32c5c366
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to