Thiemo Mättig (WMDE) has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/328374 )
Change subject: Rewrite ItemId patching in LexemePatcher
......................................................................
Rewrite ItemId patching in LexemePatcher
This avoids calling methods dynamically.
Bug: T153675
Change-Id: Ib504a2cb302d298fec6c76174a03fe1a6ddb25b4
---
M src/DataModel/Lexeme.php
M src/DataModel/Services/Diff/LexemePatcher.php
M tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php
3 files changed, 49 insertions(+), 43 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseLexeme
refs/changes/74/328374/1
diff --git a/src/DataModel/Lexeme.php b/src/DataModel/Lexeme.php
index 6b04cd7..3cf81f0 100644
--- a/src/DataModel/Lexeme.php
+++ b/src/DataModel/Lexeme.php
@@ -238,7 +238,7 @@
/**
* @param ItemId|null $lexicalCategory
*/
- public function setLexicalCategory( $lexicalCategory ) {
+ public function setLexicalCategory( ItemId $lexicalCategory = null ) {
$this->lexicalCategory = $lexicalCategory;
}
@@ -252,7 +252,7 @@
/**
* @param ItemId|null $language
*/
- public function setLanguage( $language ) {
+ public function setLanguage( ItemId $language = null ) {
$this->language = $language;
}
diff --git a/src/DataModel/Services/Diff/LexemePatcher.php
b/src/DataModel/Services/Diff/LexemePatcher.php
index f36279d..d2a4571 100644
--- a/src/DataModel/Services/Diff/LexemePatcher.php
+++ b/src/DataModel/Services/Diff/LexemePatcher.php
@@ -3,7 +3,6 @@
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;
@@ -22,6 +21,7 @@
/**
* @license GPL-2.0+
* @author Amir Sarabadani <[email protected]>
+ * @author Thiemo Mättig
*/
class LexemePatcher implements EntityPatcherStrategy {
@@ -72,50 +72,44 @@
$patch->getClaimsDiff()
);
- $this->patchItemId(
- $entity,
- $patch->getLexicalCategoryDiff(),
- 'setLexicalCategory',
- 'lexical category'
- );
+ $itemId = $this->getPatchedItemId(
$patch->getLexicalCategoryDiff() );
+ if ( $itemId !== false ) {
+ $entity->setLexicalCategory( $itemId );
+ }
- $this->patchItemId(
- $entity,
- $patch->getLanguageDiff(),
- 'setLanguage',
- 'language'
- );
+ $itemId = $this->getPatchedItemId( $patch->getLanguageDiff() );
+ if ( $itemId !== false ) {
+ $entity->setLanguage( $itemId );
+ }
}
- private function patchItemId( Lexeme $lexeme, Diff $patch, $setMethod,
$attrName ) {
- /** @var DiffOp $diffOp */
- foreach ( $patch as $diffOp ) {
- switch ( true ) {
- case $diffOp instanceof DiffOpAdd:
- /** @var DiffOpAdd $diffOp */
- call_user_func(
- [ $lexeme, $setMethod ],
- new ItemId(
$diffOp->getNewValue() )
- );
- break;
-
- case $diffOp instanceof DiffOpChange:
- /** @var DiffOpAdd $diffOp */
- call_user_func(
- [ $lexeme, $setMethod ],
- new ItemId(
$diffOp->getNewValue() )
- );
- break;
-
- case $diffOp instanceof DiffOpRemove:
- /** @var DiffOpRemove $diffOp */
- $lexeme->setLanguage( null );
- break;
-
- default:
- throw new PatcherException( "Invalid
$attrName diff" );
- }
+ /**
+ * @param Diff $patch
+ *
+ * @throws PatcherException
+ * @return ItemId|null|false False in case the diff is valid, but does
not contain a change.
+ */
+ private function getPatchedItemId( Diff $patch ) {
+ if ( $patch->isEmpty() ) {
+ return false;
}
+
+ $diffOp = reset( $patch );
+
+ switch ( true ) {
+ case $diffOp instanceof DiffOpAdd:
+ /** @var DiffOpAdd $diffOp */
+ return new ItemId( $diffOp->getNewValue() );
+
+ case $diffOp instanceof DiffOpChange:
+ /** @var DiffOpChange $diffOp */
+ return new ItemId( $diffOp->getNewValue() );
+
+ case $diffOp instanceof DiffOpRemove:
+ return null;
+ }
+
+ throw new PatcherException( 'Invalid ItemId diff' );
}
}
diff --git
a/tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php
b/tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php
index af534d8..13f019a 100644
--- a/tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php
+++ b/tests/phpunit/composer/DataModel/Services/Diff/LexemePatcherTest.php
@@ -144,4 +144,16 @@
$this->assertTrue( $expected->equals( $lexeme ) );
}
+ public function testElementsNotInDiffAreNotRemoved() {
+ $lexeme = new Lexeme();
+ $lexeme->setLexicalCategory( new ItemId( 'Q1' ) );
+ $lexeme->setLanguage( new ItemId( 'Q2' ) );
+
+ $patcher = new LexemePatcher();
+ $patcher->patchEntity( $lexeme, new LexemeDiff() );
+
+ $this->assertNotNull( $lexeme->getLexicalCategory() );
+ $this->assertNotNull( $lexeme->getLanguage() );
+ }
+
}
--
To view, visit https://gerrit.wikimedia.org/r/328374
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib504a2cb302d298fec6c76174a03fe1a6ddb25b4
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikibaseLexeme
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits