jenkins-bot has submitted this change and it was merged. ( 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, 222 insertions(+), 6 deletions(-) Approvals: WMDE-leszek: Looks good to me, approved jenkins-bot: Verified 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..52acb38 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..d024598 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->getSerialization() ]; + } + return $array; } diff --git a/src/DataModel/Services/Diff/LexemePatcher.php b/src/DataModel/Services/Diff/LexemePatcher.php index 866a706..7219950 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,40 @@ $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 DiffOpAdd $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: merged Gerrit-Change-Id: If16e1fdc56fcfdf4c3e326e99ad64706f14ef532 Gerrit-PatchSet: 5 Gerrit-Project: mediawiki/extensions/WikibaseLexeme Gerrit-Branch: master Gerrit-Owner: Ladsgroup <ladsgr...@gmail.com> Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de> Gerrit-Reviewer: Ladsgroup <ladsgr...@gmail.com> Gerrit-Reviewer: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de> Gerrit-Reviewer: WMDE-leszek <leszek.mani...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits