WMDE-leszek has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/405316 )
Change subject: Set summary when editing form elements with the UI-dedicated API. ...................................................................... Set summary when editing form elements with the UI-dedicated API. Bug: T184702 Change-Id: Iccb01836d871789be64c29c42d6edfff7ba0b0b1 --- A src/Api/AddGrammaticalFeatureSummary.php A src/Api/AddRepresentationSummary.php M src/Api/EditFormElements.php D src/Api/EditFormElementsSummary.php A src/Api/EditFormElementsSummaryFormatter.php A src/Api/RemoveGrammaticalFeatureSummary.php A src/Api/RemoveRepresentationSummary.php A src/Api/SetRepresentationSummary.php M src/ChangeOp/ChangeOpEditFormElements.php M tests/phpunit/mediawiki/Api/EditFormElementsTest.php 10 files changed, 632 insertions(+), 45 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseLexeme refs/changes/16/405316/1 diff --git a/src/Api/AddGrammaticalFeatureSummary.php b/src/Api/AddGrammaticalFeatureSummary.php new file mode 100644 index 0000000..884d1a5 --- /dev/null +++ b/src/Api/AddGrammaticalFeatureSummary.php @@ -0,0 +1,58 @@ +<?php + +namespace Wikibase\Lexeme\Api; + +use Wikibase\DataModel\Entity\ItemId; +use Wikibase\Lexeme\DataModel\FormId; +use Wikibase\Lib\FormatableSummary; + +/** + * @license GPL-2.0+ + */ +class AddGrammaticalFeatureSummary implements FormatableSummary { + + /** + * @var FormId + */ + private $formId; + + /** + * @var ItemId[] + */ + private $addedFeatures; + + public function __construct( FormId $formId, array $addedFeatures ) { + $this->formId = $formId; + $this->addedFeatures = $addedFeatures; + } + + public function getUserSummary() { + return null; + } + + public function getLanguageCode() { + return null; + } + + public function getMessageKey() { + /** @see "wikibase-lexeme-summary-add-form-grammatical-feature" message */ + return 'add-form-grammatical-feature'; + } + + public function getCommentArgs() { + return array_merge( + [ $this->formId->getSerialization() ], + array_map( + function ( ItemId $feature ) { + return $feature->getSerialization(); + }, + $this->addedFeatures + ) + ); + } + + public function getAutoSummaryArgs() { + return []; + } + +} diff --git a/src/Api/AddRepresentationSummary.php b/src/Api/AddRepresentationSummary.php new file mode 100644 index 0000000..781b09c --- /dev/null +++ b/src/Api/AddRepresentationSummary.php @@ -0,0 +1,50 @@ +<?php + +namespace Wikibase\Lexeme\Api; + +use Wikibase\DataModel\Term\Term; +use Wikibase\Lexeme\DataModel\FormId; +use Wikibase\Lib\FormatableSummary; + +/** + * @license GPL-2.0+ + */ +class AddRepresentationSummary implements FormatableSummary { + + /** + * @var FormId + */ + private $formId; + + /** + * @var Term + */ + private $addedRepresentation; + + public function __construct( FormId $formId, Term $addedRepresentation ) { + $this->formId = $formId; + $this->addedRepresentation = $addedRepresentation; + } + + public function getUserSummary() { + return null; + } + + public function getLanguageCode() { + return $this->addedRepresentation->getLanguageCode(); // TODO: ???? + } + + public function getMessageKey() { + /** @see "wikibase-lexeme-summary-add-form-representation" message */ + return 'add-form-representation'; + } + + public function getCommentArgs() { + return [ $this->formId->getSerialization() ]; + } + + public function getAutoSummaryArgs() { + return [ $this->addedRepresentation->getText() ]; + } + +} diff --git a/src/Api/EditFormElements.php b/src/Api/EditFormElements.php index 5eb2068..40866b1 100644 --- a/src/Api/EditFormElements.php +++ b/src/Api/EditFormElements.php @@ -7,6 +7,7 @@ use Wikibase\Lexeme\Api\Error\FormNotFound; use Wikibase\Lexeme\DataModel\Form; use Wikibase\Lexeme\DataModel\Serialization\FormSerializer; +use Wikibase\Lib\FormatableSummary; use Wikibase\Lib\Store\EntityRevisionLookup; use Wikibase\Repo\WikibaseRepo; use Wikibase\SummaryFormatter; @@ -32,7 +33,7 @@ private $requestParser; /** - * @var SummaryFormatter + * @var EditFormElementsSummaryFormatter */ private $summaryFormatter; @@ -57,7 +58,7 @@ $wikibaseRepo->getEntityRevisionLookup( 'uncached' ), $wikibaseRepo->newEditEntityFactory( $mainModule->getContext() ), new EditFormElementsRequestParser( $wikibaseRepo->getEntityIdParser() ), - $wikibaseRepo->getSummaryFormatter(), + new EditFormElementsSummaryFormatter( $wikibaseRepo->getSummaryFormatter() ), $formSerializer ); } @@ -68,7 +69,7 @@ EntityRevisionLookup $entityRevisionLookup, EditEntityFactory $editEntityFactory, EditFormElementsRequestParser $requestParser, - SummaryFormatter $summaryFormatter, + EditFormElementsSummaryFormatter $summaryFormatter, FormSerializer $formSerializer ) { parent::__construct( $mainModule, $moduleName ); @@ -107,11 +108,12 @@ $form = $formRevision->getEntity(); $changeOp = $request->getChangeOp(); - $summary = new EditFormElementsSummary(); - // TODO: We can not use summary in the changeop, we should + // TODO: We can not use Summary, as the summary of this action is incompatible + // with logic encoded in Summary + $summaryParts = $changeOp->generateSummaryWhenAppliedToForm( $form ); $changeOp->apply( $form ); - $status = $this->saveForm( $form, $summary, $formRevision->getRevisionId(), $params ); + $status = $this->saveForm( $form, $summaryParts, $formRevision->getRevisionId(), $params ); if ( !$status->isGood() ) { $this->dieStatus( $status ); @@ -122,14 +124,14 @@ /** * @param Form $form - * @param EditFormElementsSummary $summary + * @param FormatableSummary[] $summaryParts * @param int $baseRevisionId * @param array $params * @return \Status */ private function saveForm( Form $form, - EditFormElementsSummary $summary, + array $summaryParts, $baseRevisionId, array $params ) { @@ -148,7 +150,7 @@ $tokenThatDoesNotNeedChecking = false; return $editEntity->attemptSave( $form, - $this->summaryFormatter->formatSummary( $summary ), + $this->summaryFormatter->format( $summaryParts ), $flags, $tokenThatDoesNotNeedChecking ); diff --git a/src/Api/EditFormElementsSummary.php b/src/Api/EditFormElementsSummary.php deleted file mode 100644 index 134d886..0000000 --- a/src/Api/EditFormElementsSummary.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -namespace Wikibase\Lexeme\Api; - -use Wikibase\Lib\FormatableSummary; - -/** - * @license GPL-2.0+ - */ -class EditFormElementsSummary implements FormatableSummary { - - public function getUserSummary() { - return null; - } - - public function getLanguageCode() { - return null; - } - - public function getMessageKey() { - /** @see "wikibase-lexeme-summary-set-form" message */ - return 'set-form'; - } - - public function getCommentArgs() { - return []; - } - - public function getAutoSummaryArgs() { - return []; - } - -} diff --git a/src/Api/EditFormElementsSummaryFormatter.php b/src/Api/EditFormElementsSummaryFormatter.php new file mode 100644 index 0000000..8717bc3 --- /dev/null +++ b/src/Api/EditFormElementsSummaryFormatter.php @@ -0,0 +1,35 @@ +<?php + +namespace Wikibase\Lexeme\Api; + +use Wikibase\Lib\FormatableSummary; +use Wikibase\SummaryFormatter; + +/** + * @license GPL-2.0+ + */ +class EditFormElementsSummaryFormatter { + + private $formatter; + + public function __construct( SummaryFormatter $formatter ) { + $this->formatter = $formatter; + } + + /** + * @param FormatableSummary[] $summaryParts + * @return string + */ + public function format( array $summaryParts ) { + $summary = ''; + + foreach ( $summaryParts as $part ) { + if ( $summary ) { + $summary .= ' '; + } + $summary .= $this->formatter->formatSummary( $part ); + } + return $summary; + } + +} diff --git a/src/Api/RemoveGrammaticalFeatureSummary.php b/src/Api/RemoveGrammaticalFeatureSummary.php new file mode 100644 index 0000000..2a5825a --- /dev/null +++ b/src/Api/RemoveGrammaticalFeatureSummary.php @@ -0,0 +1,58 @@ +<?php + +namespace Wikibase\Lexeme\Api; + +use Wikibase\DataModel\Entity\ItemId; +use Wikibase\Lexeme\DataModel\FormId; +use Wikibase\Lib\FormatableSummary; + +/** + * @license GPL-2.0+ + */ +class RemoveGrammaticalFeatureSummary implements FormatableSummary { + + /** + * @var FormId + */ + private $formId; + + /** + * @var ItemId[] + */ + private $removedFeatures; + + public function __construct( FormId $formId, array $removedFeatures ) { + $this->formId = $formId; + $this->removedFeatures = $removedFeatures; + } + + public function getUserSummary() { + return null; + } + + public function getLanguageCode() { + return null; + } + + public function getMessageKey() { + /** @see "wikibase-lexeme-summary-remove-form-grammatical-feature" message */ + return 'remove-form-grammatical-feature'; + } + + public function getCommentArgs() { + return array_merge( + [ $this->formId->getSerialization() ], + array_map( + function ( ItemId $feature ) { + return $feature->getSerialization(); + }, + $this->removedFeatures + ) + ); + } + + public function getAutoSummaryArgs() { + return []; + } + +} diff --git a/src/Api/RemoveRepresentationSummary.php b/src/Api/RemoveRepresentationSummary.php new file mode 100644 index 0000000..8293c68 --- /dev/null +++ b/src/Api/RemoveRepresentationSummary.php @@ -0,0 +1,50 @@ +<?php + +namespace Wikibase\Lexeme\Api; + +use Wikibase\DataModel\Term\Term; +use Wikibase\Lexeme\DataModel\FormId; +use Wikibase\Lib\FormatableSummary; + +/** + * @license GPL-2.0+ + */ +class RemoveRepresentationSummary implements FormatableSummary { + + /** + * @var FormId + */ + private $formId; + + /** + * @var Term + */ + private $removedRepresentation; + + public function __construct( FormId $formId, Term $removedRepresentation ) { + $this->formId = $formId; + $this->removedRepresentation = $removedRepresentation; + } + + public function getUserSummary() { + return null; + } + + public function getLanguageCode() { + return $this->removedRepresentation->getLanguageCode(); // TODO: ???? + } + + public function getMessageKey() { + /** @see "wikibase-lexeme-summary-remove-form-representation" message */ + return 'remove-form-representation'; + } + + public function getCommentArgs() { + return [ $this->formId->getSerialization() ]; + } + + public function getAutoSummaryArgs() { + return [ $this->removedRepresentation->getText() ]; + } + +} diff --git a/src/Api/SetRepresentationSummary.php b/src/Api/SetRepresentationSummary.php new file mode 100644 index 0000000..c855d3d --- /dev/null +++ b/src/Api/SetRepresentationSummary.php @@ -0,0 +1,60 @@ +<?php + +namespace Wikibase\Lexeme\Api; + +use Wikibase\Lexeme\DataModel\FormId; +use Wikibase\Lib\FormatableSummary; + +/** + * @license GPL-2.0+ + */ +class SetRepresentationSummary implements FormatableSummary { + + /** + * @var FormId + */ + private $formId; + + /** + * @var string + */ + private $languageCode; + + /** + * @var string + */ + private $representation; + + /** + * @param FormId $formId + * @param string $languageCode + * @param string $representation + */ + public function __construct( FormId $formId, $languageCode, $representation ) { + $this->formId = $formId; + $this->languageCode = $languageCode; + $this->representation = $representation; + } + + public function getUserSummary() { + return null; + } + + public function getLanguageCode() { + return $this->languageCode; // TODO: ???? + } + + public function getMessageKey() { + /** @see "wikibase-lexeme-summary-set-form-representation" message */ + return 'set-form-representation'; + } + + public function getCommentArgs() { + return [ $this->formId->getSerialization() ]; + } + + public function getAutoSummaryArgs() { + return [ $this->representation ]; + } + +} diff --git a/src/ChangeOp/ChangeOpEditFormElements.php b/src/ChangeOp/ChangeOpEditFormElements.php index b31ed8a..21b73c6 100644 --- a/src/ChangeOp/ChangeOpEditFormElements.php +++ b/src/ChangeOp/ChangeOpEditFormElements.php @@ -5,8 +5,15 @@ use ValueValidators\Result; use Wikibase\DataModel\Entity\EntityDocument; use Wikibase\DataModel\Entity\ItemId; +use Wikibase\DataModel\Term\Term; use Wikibase\DataModel\Term\TermList; +use Wikibase\Lexeme\Api\AddGrammaticalFeatureSummary; +use Wikibase\Lexeme\Api\AddRepresentationSummary; +use Wikibase\Lexeme\Api\RemoveGrammaticalFeatureSummary; +use Wikibase\Lexeme\Api\RemoveRepresentationSummary; +use Wikibase\Lexeme\Api\SetRepresentationSummary; use Wikibase\Lexeme\DataModel\Form; +use Wikibase\Lib\FormatableSummary; use Wikibase\Repo\ChangeOp\ChangeOp; use Wikibase\Repo\Store\EntityPermissionChecker; use Wikibase\Summary; @@ -54,4 +61,84 @@ return [ EntityPermissionChecker::ACTION_EDIT ]; } + public function generateSummaryWhenAppliedToForm( Form $form ) { + return array_merge( + $this->getRepresentationSummaries( $form ), + $this->getGrammaticalFeatureSummaries( $form ) + ); + } + + /** + * @param Form $form + * @return FormatableSummary[] + */ + private function getRepresentationSummaries( Form $form ) { + $summaries = []; + + $addedRepresentations = []; + $changedRepresentations = []; + $removedRepresentations = []; + + $existingRepresentations = $form->getRepresentations(); + foreach ( $this->representations->getIterator() as $representation ) { + if ( !$existingRepresentations->hasTermForLanguage( $representation->getLanguageCode() ) ) { + $addedRepresentations[] = $representation; + continue; + } + + if ( !$existingRepresentations->getByLanguage( $representation->getLanguageCode() )->equals( + $representation + ) ) { + $changedRepresentations[] = $representation; + } + } + foreach ( $existingRepresentations->getIterator() as $representation ) { + if ( !$this->representations->hasTermForLanguage( $representation->getLanguageCode() ) ) { + $removedRepresentations[] = $representation; + } + } + + $formId = $form->getId(); + + foreach ( $addedRepresentations as $representation ) { + $summaries[] = new AddRepresentationSummary( $formId, $representation ); + } + foreach ( $changedRepresentations as $representation ) { + /** @var Term $representation */ + $summaries[] = new SetRepresentationSummary( + $formId, + $representation->getLanguageCode(), + $representation->getText() + ); + } + foreach ( $removedRepresentations as $representation ) { + $summaries[] = new RemoveRepresentationSummary( $formId, $representation ); + } + return $summaries; + } + + /** + * @param Form $form + * @return FormatableSummary[] + */ + private function getGrammaticalFeatureSummaries( Form $form ) { + + $existingFeatures = $form->getGrammaticalFeatures(); + + $addedFeatures = array_diff( $this->grammaticalFeatures, $existingFeatures ); + $removedFeatures = array_diff( $existingFeatures, $this->grammaticalFeatures ); + + $formId = $form->getId(); + + $summaries = []; + if ( $addedFeatures ) { + $summaries[] = new AddGrammaticalFeatureSummary( $formId, $addedFeatures ); + } + if ( $removedFeatures ) { + $summaries[] = new RemoveGrammaticalFeatureSummary( $formId, $removedFeatures ); + } + + return $summaries; + } + } diff --git a/tests/phpunit/mediawiki/Api/EditFormElementsTest.php b/tests/phpunit/mediawiki/Api/EditFormElementsTest.php index b6e3fb7..0ba8675 100644 --- a/tests/phpunit/mediawiki/Api/EditFormElementsTest.php +++ b/tests/phpunit/mediawiki/Api/EditFormElementsTest.php @@ -4,12 +4,14 @@ use ApiMessage; use ApiUsageException; +use MediaWiki\MediaWikiServices; use Wikibase\DataModel\Entity\ItemId; use Wikibase\Lexeme\DataModel\FormId; use Wikibase\Lexeme\DataModel\Lexeme; use Wikibase\Lexeme\DataModel\LexemeId; use Wikibase\Lexeme\Tests\DataModel\NewForm; use Wikibase\Lexeme\Tests\DataModel\NewLexeme; +use Wikibase\Lib\Store\EntityRevision; use Wikibase\Repo\Tests\Api\WikibaseApiTestCase; use Wikibase\Repo\WikibaseRepo; @@ -22,6 +24,13 @@ * @group medium */ class EditFormElementsTest extends WikibaseApiTestCase { + + public function setUp() { + parent::setUp(); + + $this->tablesUsed[] = 'page'; + $this->tablesUsed[] = 'revision'; + } /** * @dataProvider provideInvalidParams @@ -297,7 +306,209 @@ $this->assertEmpty( $form->getGrammaticalFeatures() ); } - // TODO: test summary once its set! + public function testGivenChangedRepresentation_summarySetAccordingly() { + $form = NewForm::havingId( 'F1' )->andRepresentation( 'en', 'goat' )->build(); + $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form )->build(); + + $this->saveLexeme( $lexeme ); + + $params = [ + 'action' => 'wblexemeeditformelements', + 'formId' => 'L1-F1', + 'data' => json_encode( [ + 'representations' => [ + [ 'language' => 'en', 'representation' => 'goadth' ], + ], + 'grammaticalFeatures' => [], + ] ), + ]; + + $this->doApiRequestWithToken( $params ); + + $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' ); + + $revision = MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById( + $formRevision->getRevisionId() + ); + + $this->assertEquals( + '/* set-form-representation:1|en|L1-F1 */ goadth', + $revision->getComment()->text + ); + } + + public function testGivenAddedRepresentationInNewLanguage_summarySetAccordingly() { + $form = NewForm::havingId( 'F1' ) + ->andRepresentation( 'en', 'colour' ) + ->build(); + $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form )->build(); + + $this->saveLexeme( $lexeme ); + + $params = [ + 'action' => 'wblexemeeditformelements', + 'formId' => 'L1-F1', + 'data' => json_encode( [ + 'representations' => [ + [ 'language' => 'en', 'representation' => 'colour' ], + [ 'language' => 'en-us', 'representation' => 'color' ], + ], + 'grammaticalFeatures' => [], + ] ), + ]; + + $this->doApiRequestWithToken( $params ); + + $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' ); + + $revision = MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById( + $formRevision->getRevisionId() + ); + + $this->assertEquals( + '/* add-form-representation:1|en-us|L1-F1 */ color', + $revision->getComment()->text + ); + } + + public function testGivenRemovedRepresentation_summarySetAccordingly() { + $form = NewForm::havingId( 'F1' ) + ->andRepresentation( 'en', 'colour' ) + ->andRepresentation( 'en-us', 'color' ) + ->build(); + $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form )->build(); + + $this->saveLexeme( $lexeme ); + + $params = [ + 'action' => 'wblexemeeditformelements', + 'formId' => 'L1-F1', + 'data' => json_encode( [ + 'representations' => [ + [ 'language' => 'en', 'representation' => 'colour' ], + ], + 'grammaticalFeatures' => [], + ] ), + ]; + + $this->doApiRequestWithToken( $params ); + + $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' ); + + $revision = MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById( + $formRevision->getRevisionId() + ); + + $this->assertEquals( + '/* remove-form-representation:1|en-us|L1-F1 */ color', + $revision->getComment()->text + ); + } + + public function testGivenAddedGrammaticalFeature_summarySetAccordingly() { + $form = NewForm::havingId( 'F1' ) + ->andGrammaticalFeature( 'Q123' ) + ->andRepresentation( 'en', 'goat' ) + ->build(); + $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form )->build(); + + $this->saveLexeme( $lexeme ); + + $params = [ + 'action' => 'wblexemeeditformelements', + 'formId' => 'L1-F1', + 'data' => json_encode( [ + 'representations' => [ + [ 'language' => 'en', 'representation' => 'goat' ], + ], + 'grammaticalFeatures' => [ 'Q123', 'Q678' ], + ] ), + ]; + + $this->doApiRequestWithToken( $params ); + + $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' ); + + $revision = MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById( + $formRevision->getRevisionId() + ); + + $this->assertEquals( + '/* add-form-grammatical-feature:0||L1-F1|Q678 */', + $revision->getComment()->text + ); + } + + public function testGivenRemovedGrammaticalFeature_summarySetAccordingly() { + $form = NewForm::havingId( 'F1' ) + ->andGrammaticalFeature( 'Q123' ) + ->andRepresentation( 'en', 'goat' ) + ->build(); + $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form )->build(); + + $this->saveLexeme( $lexeme ); + + $params = [ + 'action' => 'wblexemeeditformelements', + 'formId' => 'L1-F1', + 'data' => json_encode( [ + 'representations' => [ + [ 'language' => 'en', 'representation' => 'goat' ], + ], + 'grammaticalFeatures' => [], + ] ), + ]; + + $this->doApiRequestWithToken( $params ); + + $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' ); + + $revision = MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById( + $formRevision->getRevisionId() + ); + + $this->assertEquals( + '/* remove-form-grammatical-feature:0||L1-F1|Q123 */', + $revision->getComment()->text + ); + } + + public function testGivenSeveralPartsChanges_summaryContainsAllChanges() { + $form = NewForm::havingId( 'F1' ) + ->andRepresentation( 'en', 'colour' ) + ->andGrammaticalFeature( 'Q123' ) + ->build(); + $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form )->build(); + + $this->saveLexeme( $lexeme ); + + $params = [ + 'action' => 'wblexemeeditformelements', + 'formId' => 'L1-F1', + 'data' => json_encode( [ + 'representations' => [ + [ 'language' => 'en', 'representation' => 'colour' ], + [ 'language' => 'en-us', 'representation' => 'color' ], + ], + 'grammaticalFeatures' => [ 'Q678' ], + ] ), + ]; + + $this->doApiRequestWithToken( $params ); + + $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' ); + + $revision = MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById( + $formRevision->getRevisionId() + ); + + $this->assertEquals( + '/* add-form-representation:1|en-us|L1-F1 */ color ' . + '/* add-form-grammatical-feature:0||L1-F1|Q678 */ ' . + '/* remove-form-grammatical-feature:0||L1-F1|Q123 */', + $revision->getComment()->text + ); + } public function testGivenFormEdited_responseContainsSuccessMarker() { $form = NewForm::havingId( 'F1' ) @@ -354,8 +565,6 @@ ); } - // TODO: test API response contains the revision ID - private function saveLexeme( Lexeme $lexeme ) { $store = WikibaseRepo::getDefaultInstance()->getEntityStore(); @@ -372,4 +581,15 @@ return $lookup->getEntity( new LexemeId( $id ) ); } + /** + * @param string $id + * + * @return EntityRevision|null + */ + private function getCurrentRevisionForForm( $id ) { + $lookup = WikibaseRepo::getDefaultInstance()->getEntityRevisionLookup(); + + return $lookup->getEntityRevision( new FormId( $id ) ); + } + } -- To view, visit https://gerrit.wikimedia.org/r/405316 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iccb01836d871789be64c29c42d6edfff7ba0b0b1 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/WikibaseLexeme Gerrit-Branch: master Gerrit-Owner: WMDE-leszek <leszek.mani...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits