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 <[email protected]>
*/
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 <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits