jenkins-bot has submitted this change and it was merged.

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


Implement List Serializer and Unserializer

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

Change-Id: I07626d07670f6cd6a2ae3d7370dea6ba32c5c366
---
M lib/WikibaseLib.classes.php
A lib/includes/serializers/ListSerializer.php
A lib/includes/serializers/ListUnserializer.php
M lib/tests/phpunit/serializers/ByPropertyListSerializerTest.php
M lib/tests/phpunit/serializers/ByPropertyListUnserializerTest.php
A lib/tests/phpunit/serializers/ListSerializerTest.php
A lib/tests/phpunit/serializers/ListUnserializerTest.php
7 files changed, 321 insertions(+), 2 deletions(-)

Approvals:
  Daniel Kinzler: Looks good to me, approved
  jenkins-bot: Verified



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..4db1449
--- /dev/null
+++ b/lib/includes/serializers/ListSerializer.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Wikibase\Lib\Serializers;
+
+use InvalidArgumentException;
+use Traversable;
+
+/**
+ * Serializer for Traversable objects
+ *
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class ListSerializer extends SerializerObject {
+
+       /**
+        * @var Serializer
+        */
+       protected $elementSerializer;
+
+       /**
+        * Constructor.
+        *
+        * @param string $elementName
+        * @param Serializer $elementSerializer
+        * @param SerializationOptions|null $options
+        */
+       public function __construct( $elementName, Serializer 
$elementSerializer, SerializationOptions $options = null ) {
+               parent::__construct( $options );
+
+               $this->elementName = $elementName;
+               $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;
+               }
+
+               $this->setIndexedTagName( $serialization, $this->elementName );
+
+               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/ByPropertyListSerializerTest.php 
b/lib/tests/phpunit/serializers/ByPropertyListSerializerTest.php
index 0753015..f182d70 100644
--- a/lib/tests/phpunit/serializers/ByPropertyListSerializerTest.php
+++ b/lib/tests/phpunit/serializers/ByPropertyListSerializerTest.php
@@ -2,7 +2,6 @@
 
 namespace Wikibase\Test;
 
-use ArrayObject;
 use DataValues\StringValue;
 use Wikibase\DataModel\Entity\PropertyId;
 use Wikibase\Lib\Serializers\ByPropertyListSerializer;
diff --git a/lib/tests/phpunit/serializers/ByPropertyListUnserializerTest.php 
b/lib/tests/phpunit/serializers/ByPropertyListUnserializerTest.php
index fcfe2d0..fc93a83 100644
--- a/lib/tests/phpunit/serializers/ByPropertyListUnserializerTest.php
+++ b/lib/tests/phpunit/serializers/ByPropertyListUnserializerTest.php
@@ -171,8 +171,9 @@
         * @dataProvider invalidProvider
         */
        public function testNewFromSerializationInvalid( $input ) {
+               $this->setExpectedException( 'Exception' );
                $serializer = $this->getInstance();
-               $this->assertException( function() use ( $serializer, $input ) 
{ $serializer->newFromSerialization( $input ); } );
+               $serializer->newFromSerialization( $input );
        }
 
 }
diff --git a/lib/tests/phpunit/serializers/ListSerializerTest.php 
b/lib/tests/phpunit/serializers/ListSerializerTest.php
new file mode 100644
index 0000000..5ee17b3
--- /dev/null
+++ b/lib/tests/phpunit/serializers/ListSerializerTest.php
@@ -0,0 +1,91 @@
+<?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( 'foo' ,$snakSerializer );
+       }
+
+       /**
+        * @see SerializerBaseTest::validProvider
+        *
+        * @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..4101cc6
--- /dev/null
+++ b/lib/tests/phpunit/serializers/ListUnserializerTest.php
@@ -0,0 +1,113 @@
+<?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(
+                       array( false ),
+                       array( true ),
+                       array( null ),
+                       array( 42 ),
+                       array( 4.2 ),
+                       array( '' ),
+                       array( 'foo bar baz' ),
+               );
+
+               return $this->arrayWrap( $this->arrayWrap( $invalid ) );
+       }
+
+       /**
+        * @dataProvider invalidProvider
+        */
+       public function testNewFromSerializationInvalid( $input ) {
+               $this->setExpectedException( 'Exception' );
+               $serializer = $this->getInstance();
+               $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: merged
Gerrit-Change-Id: I07626d07670f6cd6a2ae3d7370dea6ba32c5c366
Gerrit-PatchSet: 11
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>
Gerrit-Reviewer: Addshore <[email protected]>
Gerrit-Reviewer: Aude <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: Jeroen De Dauw <[email protected]>
Gerrit-Reviewer: Tobias Gritschacher <[email protected]>
Gerrit-Reviewer: jenkins-bot

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

Reply via email to