Ladsgroup has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/326024 )

Change subject: Second pass on Lexical Category
......................................................................

Second pass on Lexical Category

 - Add to content as part of isstub
 - Add to serializer
 - Add to deserializer
 - Add to patcher
 - Add to differ

Bug: T149495
Change-Id: If16e1fdc56fcfdf4c3e326e99ad64706f14ef532
---
M WikibaseLexeme.entitytypes.php
M src/Content/LexemeContent.php
M src/DataModel/Lexeme.php
M src/DataModel/Serialization/LexemeDeserializer.php
M src/DataModel/Serialization/LexemeSerializer.php
M src/DataModel/Services/Diff/LexemeDiff.php
M src/DataModel/Services/Diff/LexemeDiffer.php
M src/DataModel/Services/Diff/LexemePatcher.php
M tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
M tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
M tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferTest.php
M tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php
12 files changed, 218 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseLexeme 
refs/changes/24/326024/1

diff --git a/WikibaseLexeme.entitytypes.php b/WikibaseLexeme.entitytypes.php
index 45ef211..c699b78 100644
--- a/WikibaseLexeme.entitytypes.php
+++ b/WikibaseLexeme.entitytypes.php
@@ -43,6 +43,7 @@
                },
                'deserializer-factory-callback' => function( 
DeserializerFactory $deserializerFactory ) {
                        return new LexemeDeserializer(
+                               $deserializerFactory->newEntityIdDeserializer(),
                                $deserializerFactory->newTermListDeserializer(),
                                
$deserializerFactory->newStatementListDeserializer()
                        );
diff --git a/src/Content/LexemeContent.php b/src/Content/LexemeContent.php
index c3eaa79..02d511b 100644
--- a/src/Content/LexemeContent.php
+++ b/src/Content/LexemeContent.php
@@ -76,6 +76,8 @@
                        && !$this->getEntity()->isEmpty()
                        && ( is_null( $this->getEntity()->getLemmas() )
                                || !$this->getEntity()->getLemmas()->isEmpty() )
+                       && ( is_null( $this->getEntity()->getLexicalCategory() )
+                       || !$this->getEntity()->getLexicalCategory()->isEmpty() 
)
                        && $this->getEntity()->getStatements()->isEmpty();
        }
 
diff --git a/src/DataModel/Lexeme.php b/src/DataModel/Lexeme.php
index 6b8fe6c..df30238 100644
--- a/src/DataModel/Lexeme.php
+++ b/src/DataModel/Lexeme.php
@@ -5,7 +5,6 @@
 use InvalidArgumentException;
 use Wikibase\DataModel\Entity\EntityDocument;
 use Wikibase\DataModel\Entity\EntityId;
-use Wikibase\DataModel\Entity\Item;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Statement\StatementList;
 use Wikibase\DataModel\Statement\StatementListProvider;
@@ -223,9 +222,9 @@
        }
 
        /**
-        * @param ItemId $lexicalCategory
+        * @param ItemId|null $lexicalCategory
         */
-       public function setLexicalCategory( ItemId $lexicalCategory ) {
+       public function setLexicalCategory( $lexicalCategory ) {
                $this->lexicalCategory = $lexicalCategory;
        }
 
diff --git a/src/DataModel/Serialization/LexemeDeserializer.php 
b/src/DataModel/Serialization/LexemeDeserializer.php
index 03f6e1a..e8978a1 100644
--- a/src/DataModel/Serialization/LexemeDeserializer.php
+++ b/src/DataModel/Serialization/LexemeDeserializer.php
@@ -4,8 +4,10 @@
 
 use Deserializers\Exceptions\DeserializationException;
 use Deserializers\TypedObjectDeserializer;
+use Wikibase\DataModel\Deserializers\EntityIdDeserializer;
 use Wikibase\DataModel\Deserializers\StatementListDeserializer;
 use Wikibase\DataModel\Deserializers\TermListDeserializer;
+use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Statement\StatementList;
 use Wikibase\DataModel\Term\TermList;
 use Wikibase\Lexeme\DataModel\Lexeme;
@@ -16,6 +18,11 @@
  * @author Amir Sarabadani <ladsgr...@gmail.com>
  */
 class LexemeDeserializer extends TypedObjectDeserializer {
+
+       /**
+        * @var EntityIdDeserializer
+        */
+       private $entityIdDeserializer;
 
        /**
         * @var TermListDeserializer
@@ -32,12 +39,14 @@
         * @param StatementListDeserializer $statementListDeserializer
         */
        public function __construct(
+               EntityIdDeserializer $entityIdDeserializer,
                TermListDeserializer $termListDeserializer,
                StatementListDeserializer $statementListDeserializer
        ) {
                parent::__construct( 'lexeme', 'type' );
                $this->termListDeserializer = $termListDeserializer;
                $this->statementListDeserializer = $statementListDeserializer;
+               $this->entityIdDeserializer = $entityIdDeserializer;
        }
 
        /**
@@ -52,7 +61,7 @@
                return new Lexeme(
                        $this->deserializeId( $serialization ),
                        $this->deserializeLemmas( $serialization ),
-                       null,
+                       $this->deserializeLexicalCategory( $serialization ),
                        $this->deserializeStatements( $serialization )
                );
        }
@@ -96,4 +105,17 @@
                return null;
        }
 
+       /**
+        * @param array $serialization
+        *
+        * @return ItemId|null
+        */
+       private function deserializeLexicalCategory( array $serialization ) {
+               if ( array_key_exists( 'lexicalCategory', $serialization ) ) {
+                       return $this->entityIdDeserializer->deserialize( 
$serialization['lexicalCategory'] );
+               }
+
+               return null;
+       }
+
 }
diff --git a/src/DataModel/Serialization/LexemeSerializer.php 
b/src/DataModel/Serialization/LexemeSerializer.php
index 818d22d..5de6356 100644
--- a/src/DataModel/Serialization/LexemeSerializer.php
+++ b/src/DataModel/Serialization/LexemeSerializer.php
@@ -86,6 +86,10 @@
                        );
                }
 
+               if ( $lexeme->getLexicalCategory() !== null ) {
+                       $serialization['lexicalCategory'] = 
$lexeme->getLexicalCategory()->getSerialization();
+               }
+
                $serialization['claims'] = 
$this->statementListSerializer->serialize(
                        $lexeme->getStatements()
                );
diff --git a/src/DataModel/Services/Diff/LexemeDiff.php 
b/src/DataModel/Services/Diff/LexemeDiff.php
index 492ad84..98a9ae7 100644
--- a/src/DataModel/Services/Diff/LexemeDiff.php
+++ b/src/DataModel/Services/Diff/LexemeDiff.php
@@ -21,6 +21,7 @@
         */
        public function __construct( array $operations = [] ) {
                $this->fixSubstructureDiff( $operations, 'lemmas' );
+               $this->fixSubstructureDiff( $operations, 'lexicalCategory' );
                $this->fixSubstructureDiff( $operations, 'claim' );
 
                parent::__construct( $operations, true );
@@ -36,6 +37,15 @@
        }
 
        /**
+        * Returns a Diff object with the lemma differences.
+        *
+        * @return Diff
+        */
+       public function getLexicalCategoryDiff() {
+               return isset( $this['lexicalCategory'] ) ? 
$this['lexicalCategory'] : new Diff( [], true );
+       }
+
+       /**
         * Returns if there are any changes (equivalent to: any differences 
between the entities).
         *
         * @return bool
diff --git a/src/DataModel/Services/Diff/LexemeDiffer.php 
b/src/DataModel/Services/Diff/LexemeDiffer.php
index 52a7e51..7bf41e5 100644
--- a/src/DataModel/Services/Diff/LexemeDiffer.php
+++ b/src/DataModel/Services/Diff/LexemeDiffer.php
@@ -93,6 +93,11 @@
                        $array['lemmas'] = $lemmas->toTextArray();
                }
 
+               $lexicalCategory = $lexeme->getLexicalCategory();
+               if ( !is_null( $lexicalCategory ) ) {
+                       $array['lexicalCategory'] = [ 'id' => 
$lexicalCategory->getNumericId() ];
+               }
+
                return $array;
        }
 
diff --git a/src/DataModel/Services/Diff/LexemePatcher.php 
b/src/DataModel/Services/Diff/LexemePatcher.php
index 866a706..358c08d 100644
--- a/src/DataModel/Services/Diff/LexemePatcher.php
+++ b/src/DataModel/Services/Diff/LexemePatcher.php
@@ -2,8 +2,15 @@
 
 namespace Wikibase\Lexeme\DataModel\Services\Diff;
 
+use Diff\DiffOp\Diff\Diff;
+use Diff\DiffOp\DiffOp;
+use Diff\DiffOp\DiffOpAdd;
+use Diff\DiffOp\DiffOpChange;
+use Diff\DiffOp\DiffOpRemove;
+use Diff\Patcher\PatcherException;
 use InvalidArgumentException;
 use Wikibase\DataModel\Entity\EntityDocument;
+use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Services\Diff\EntityDiff;
 use Wikibase\DataModel\Services\Diff\EntityPatcherStrategy;
 use Wikibase\DataModel\Services\Diff\StatementListPatcher;
@@ -64,6 +71,36 @@
                        $entity->getStatements(),
                        $patch->getClaimsDiff()
                );
+
+               $this->patchLexicalCategory(
+                       $entity,
+                       $patch->getLexicalCategoryDiff()
+               );
+       }
+
+       private function patchLexicalCategory( Lexeme $lexeme, Diff $patch ) {
+               /** @var DiffOp $diffOp */
+               foreach ( $patch as $diffOp ) {
+                       switch ( true ) {
+                               case $diffOp instanceof DiffOpAdd:
+                                       /** @var DiffOpAdd $diffOp */
+                                       $lexeme->setLexicalCategory( new 
ItemId( $diffOp->getNewValue() ) );
+                                       break;
+
+                               case $diffOp instanceof DiffOpChange:
+                                       /** @var DiffOpChange $diffOp */
+                                       $lexeme->setLexicalCategory( new 
ItemId( $diffOp->getNewValue() ) );
+                                       break;
+
+                               case $diffOp instanceof DiffOpRemove:
+                                       /** @var DiffOpRemove $diffOp */
+                                       $lexeme->setLexicalCategory( null );
+                                       break;
+
+                               default:
+                                       throw new PatcherException( 'Invalid 
lexical category diff' );
+                       }
+               }
        }
 
 }
diff --git 
a/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php 
b/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
index 9c22bb0..e5a0e00 100644
--- a/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
+++ b/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
@@ -4,8 +4,10 @@
 
 use Deserializers\Exceptions\DeserializationException;
 use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Deserializers\EntityIdDeserializer;
 use Wikibase\DataModel\Deserializers\StatementListDeserializer;
 use Wikibase\DataModel\Deserializers\TermListDeserializer;
+use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Snak\PropertyNoValueSnak;
 use Wikibase\DataModel\Statement\StatementList;
 use Wikibase\DataModel\Term\Term;
@@ -25,6 +27,16 @@
 class LexemeDeserializerTest extends PHPUnit_Framework_TestCase {
 
        private function newDeserializer() {
+
+               $entityIdDeserializer = $this->getMockBuilder( 
EntityIdDeserializer::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $entityIdDeserializer->expects( $this->any() )
+                       ->method( 'deserialize' )
+                       ->will( $this->returnCallback( function( $serialization 
) {
+                               return new ItemId( $serialization );
+                       } ) );
+
                $statementListDeserializer = $this->getMockBuilder( 
StatementListDeserializer::class )
                        ->disableOriginalConstructor()
                        ->getMock();
@@ -53,7 +65,11 @@
                                return new TermList( $terms );
                        } ) );
 
-               return new LexemeDeserializer( $termListDeserializer, 
$statementListDeserializer );
+               return new LexemeDeserializer(
+                       $entityIdDeserializer,
+                       $termListDeserializer,
+                       $statementListDeserializer
+               );
        }
 
        public function provideObjectSerializations() {
@@ -124,6 +140,17 @@
                        $lexeme
                ];
 
+               $lexeme = new Lexeme( new LexemeId( 'l2' ) );
+               $lexeme->setLexicalCategory( new ItemId( 'Q33' ) );
+               $serializations['with lexical category and id'] = [
+                       [
+                               'type' => 'lexeme',
+                               'id' => 'L2',
+                               'lexicalCategory' => 'Q33'
+                       ],
+                       $lexeme
+               ];
+
                return $serializations;
        }
 
diff --git 
a/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php 
b/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
index 0c5fe0b..00ee144 100644
--- a/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
+++ b/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
@@ -5,10 +5,12 @@
 use PHPUnit_Framework_TestCase;
 use Serializers\Exceptions\SerializationException;
 use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Serializers\StatementListSerializer;
 use Wikibase\DataModel\Serializers\TermListSerializer;
 use Wikibase\DataModel\Snak\PropertyNoValueSnak;
 use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\DataModel\Term\Term;
 use Wikibase\DataModel\Term\TermList;
 use Wikibase\Lexeme\DataModel\Lexeme;
 use Wikibase\Lexeme\DataModel\LexemeId;
@@ -93,6 +95,31 @@
                        ]
                ];
 
+               $lexeme = new Lexeme( new LexemeId( 'l2' ) );
+               $lexeme->setLemmas( new TermList( [ new Term( 'ja', 'Tokyo' ) ] 
) );
+
+               $serializations['with lemmas and id'] = [
+                       $lexeme,
+                       [
+                               'type' => 'lexeme',
+                               'id' => 'L2',
+                               'lemmas' => [ 'ja' => 'Tokyo' ],
+                               'claims' => '',
+                       ]
+               ];
+
+               $lexeme = new Lexeme( new LexemeId( 'l2' ) );
+               $lexeme->setLexicalCategory( new ItemId( 'Q32' ) );
+
+               $serializations['with lexical category and id'] = [
+                       $lexeme,
+                       [
+                               'type' => 'lexeme',
+                               'id' => 'L2',
+                               'lexicalCategory' => 'Q32',
+                               'claims' => '',
+                       ]
+               ];
                return $serializations;
        }
 
diff --git 
a/tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferTest.php 
b/tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferTest.php
index 8ffeeca..6be766e 100644
--- a/tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferTest.php
+++ b/tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferTest.php
@@ -4,10 +4,14 @@
 
 use PHPUnit_Framework_TestCase;
 use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Entity\Property;
 use Wikibase\DataModel\Services\Diff\EntityDiff;
 use Wikibase\DataModel\Snak\PropertySomeValueSnak;
+use Wikibase\DataModel\Term\Term;
+use Wikibase\DataModel\Term\TermList;
 use Wikibase\Lexeme\DataModel\Lexeme;
+use Wikibase\Lexeme\DataModel\Services\Diff\LexemeDiff;
 use Wikibase\Lexeme\DataModel\Services\Diff\LexemeDiffer;
 
 /**
@@ -43,6 +47,32 @@
                $this->assertCount( 1, $diff->getClaimsDiff()->getAdditions() );
        }
 
+       public function testLemmasAreDiffed() {
+               $firstLexeme = new Lexeme();
+
+               $secondLexeme = new Lexeme();
+               $secondLexeme->setLemmas( new TermList( [ new Term( 'es', 
'Mexico city' ) ] ) );
+
+               $differ = new LexemeDiffer();
+               $diff = $differ->diffLexemes( $firstLexeme, $secondLexeme );
+
+               /** @var LexemeDiff $diff */
+               $this->assertCount( 1, $diff->getLemmasDiff()->getAdditions() );
+       }
+
+       public function testLexicalCategoryIsDiffed() {
+               $firstLexeme = new Lexeme();
+
+               $secondLexeme = new Lexeme();
+               $secondLexeme->setLexicalCategory( new ItemId( 'Q33' ) );
+
+               $differ = new LexemeDiffer();
+               $diff = $differ->diffLexemes( $firstLexeme, $secondLexeme );
+
+               /** @var LexemeDiff $diff */
+               $this->assertCount( 1, 
$diff->getLexicalCategoryDiff()->getAdditions() );
+       }
+
        public function testGivenEmptyLexeme_constructionDiffIsEmpty() {
                $differ = new LexemeDiffer();
                $this->assertTrue( $differ->getConstructionDiff( new Lexeme() 
)->isEmpty() );
diff --git 
a/tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php 
b/tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php
index 8f38d90..81475c0 100644
--- a/tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php
+++ b/tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php
@@ -4,13 +4,16 @@
 
 use Diff\DiffOp\Diff\Diff;
 use Diff\DiffOp\DiffOpAdd;
+use Diff\DiffOp\DiffOpChange;
 use Diff\DiffOp\DiffOpRemove;
 use InvalidArgumentException;
 use PHPUnit_Framework_TestCase;
 use Wikibase\DataModel\Entity\Item;
-use Wikibase\DataModel\Services\Diff\EntityDiff;
+use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Snak\PropertyNoValueSnak;
 use Wikibase\DataModel\Statement\Statement;
+use Wikibase\DataModel\Term\Term;
+use Wikibase\DataModel\Term\TermList;
 use Wikibase\Lexeme\DataModel\Lexeme;
 use Wikibase\Lexeme\DataModel\Services\Diff\LexemeDiff;
 use Wikibase\Lexeme\DataModel\Services\Diff\LexemePatcher;
@@ -74,4 +77,49 @@
                $this->assertTrue( $expected->equals( $lexeme ) );
        }
 
+       public function testLemmasArePatched() {
+               $removedLemma = new Term( 'en', 'Alan Turing' );
+               $addedLemma = new Term( 'fa', 'آلن تورینگ' );
+
+               $lexeme = new Lexeme();
+               $lexeme->setLemmas( new TermList( [ $removedLemma ] ) );
+
+               $patch = new LexemeDiff( [
+                       'lemmas' => new Diff( [
+                               'en' => new DiffOpRemove( 'Alan Turing' ),
+                               'fa' => new DiffOpAdd( 'آلن تورینگ' ),
+                       ] ),
+               ] );
+
+               $expected = new Lexeme();
+               $expected->setLemmas( new TermList( [ $addedLemma ] ) );
+
+               $patcher = new LexemePatcher();
+               $patcher->patchEntity( $lexeme, $patch );
+               $this->assertEquals( $expected->getLemmas(), 
$lexeme->getLemmas() );
+               $this->assertTrue( $expected->equals( $lexeme ) );
+       }
+
+       public function testLexicalCategoryIsPatched() {
+               $removedLexicalCategory = new ItemId( 'Q11' );
+               $addedLexicalCategory = new ItemId( 'Q22' );
+
+               $lexeme = new Lexeme();
+               $lexeme->setLexicalCategory( $removedLexicalCategory );
+
+               $patch = new LexemeDiff( [
+                       'lexicalCategory' => new Diff( [
+                               'id' => new DiffOpChange( 'Q11', 'Q22' ),
+                       ] ),
+               ] );
+
+               $expected = new Lexeme();
+               $expected->setLexicalCategory( $addedLexicalCategory );
+
+               $patcher = new LexemePatcher();
+               $patcher->patchEntity( $lexeme, $patch );
+               $this->assertEquals( $expected->getLexicalCategory(), 
$lexeme->getLexicalCategory() );
+               $this->assertTrue( $expected->equals( $lexeme ) );
+       }
+
 }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: If16e1fdc56fcfdf4c3e326e99ad64706f14ef532
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikibaseLexeme
Gerrit-Branch: master
Gerrit-Owner: Ladsgroup <ladsgr...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to