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