jenkins-bot has submitted this change and it was merged.
Change subject: Introduce DispatchingEntityTypeStatementGrouper
......................................................................
Introduce DispatchingEntityTypeStatementGrouper
Bug: T120661
Change-Id: I18381d6d99d50b4d9cd1cdb6287464a658715bef
---
M repo/config/Wikibase.default.php
A repo/includes/DispatchingEntityTypeStatementGrouper.php
A repo/includes/StatementGrouperBuilder.php
D repo/includes/StatementGrouperFactory.php
M repo/includes/WikibaseRepo.php
A repo/tests/phpunit/includes/DispatchingEntityTypeStatementGrouperTest.php
A repo/tests/phpunit/includes/StatementGrouperBuilderTest.php
M view/src/EntityViewFactory.php
M view/tests/phpunit/EntityViewFactoryTest.php
9 files changed, 480 insertions(+), 42 deletions(-)
Approvals:
Jonas Kress (WMDE): Looks good to me, approved
jenkins-bot: Verified
diff --git a/repo/config/Wikibase.default.php b/repo/config/Wikibase.default.php
index fe30007..9ea5850 100644
--- a/repo/config/Wikibase.default.php
+++ b/repo/config/Wikibase.default.php
@@ -27,6 +27,9 @@
'entityNamespaces' => array(),
+ // See StatementGrouperBuilder for an example.
+ 'statementSections' => array(),
+
// Define constraints for multilingual terms (such as labels,
descriptions and aliases).
'multilang-limits' => array(
'length' => 250, // length constraint
diff --git a/repo/includes/DispatchingEntityTypeStatementGrouper.php
b/repo/includes/DispatchingEntityTypeStatementGrouper.php
new file mode 100644
index 0000000..558d25c
--- /dev/null
+++ b/repo/includes/DispatchingEntityTypeStatementGrouper.php
@@ -0,0 +1,93 @@
+<?php
+
+namespace Wikibase\Repo;
+
+use InvalidArgumentException;
+use Wikibase\DataModel\Entity\BasicEntityIdParser;
+use Wikibase\DataModel\Services\Statement\Grouper\NullStatementGrouper;
+use Wikibase\DataModel\Services\Statement\Grouper\StatementGrouper;
+use Wikibase\DataModel\Services\Statement\StatementGuidParser;
+use Wikibase\DataModel\Services\Statement\StatementGuidParsingException;
+use Wikibase\DataModel\Statement\Statement;
+use Wikibase\DataModel\Statement\StatementList;
+
+/**
+ * @since 0.5
+ *
+ * @license GNU GPL v2+
+ * @author Thiemo Mättig
+ */
+class DispatchingEntityTypeStatementGrouper implements StatementGrouper {
+
+ /**
+ * @var StatementGrouper[]
+ */
+ private $statementGroupers = array();
+
+ /**
+ * @var StatementGuidParser
+ */
+ private $guidParser;
+
+ /**
+ * @param StatementGrouper[] $statementGroupers An associative array,
mapping entity types
+ * (typically "item" and "property") to StatementGrouper objects.
+ *
+ * @throws InvalidArgumentException
+ */
+ public function __construct( array $statementGroupers ) {
+ foreach ( $statementGroupers as $key => $grouper ) {
+ if ( !is_string( $key ) || !( $grouper instanceof
StatementGrouper ) ) {
+ throw new InvalidArgumentException(
+ '$statementGroupers must map strings to
StatementGroupers'
+ );
+ }
+ $this->statementGroupers[$key] = $grouper;
+ }
+
+ // TODO: Inject?
+ $this->guidParser = new StatementGuidParser( new
BasicEntityIdParser() );
+ }
+
+ /**
+ * @param StatementList $statements
+ *
+ * @return StatementList[]
+ */
+ public function groupStatements( StatementList $statements ) {
+ return $this->getStatementGrouper( $statements
)->groupStatements( $statements );
+ }
+
+ /**
+ * @param StatementList $statements
+ *
+ * @return StatementGrouper
+ */
+ private function getStatementGrouper( StatementList $statements ) {
+ foreach ( $statements->toArray() as $statement ) {
+ $entityType = $this->getEntityType( $statement );
+
+ if ( array_key_exists( $entityType,
$this->statementGroupers ) ) {
+ return $this->statementGroupers[$entityType];
+ }
+ }
+
+ return new NullStatementGrouper();
+ }
+
+ /**
+ * @param Statement $statement
+ *
+ * @return string|null
+ */
+ private function getEntityType( Statement $statement ) {
+ try {
+ $guid = $this->guidParser->parse( $statement->getGuid()
);
+ } catch ( StatementGuidParsingException $ex ) {
+ return null;
+ }
+
+ return $guid->getEntityId()->getEntityType();
+ }
+
+}
diff --git a/repo/includes/StatementGrouperBuilder.php
b/repo/includes/StatementGrouperBuilder.php
new file mode 100644
index 0000000..b1da762
--- /dev/null
+++ b/repo/includes/StatementGrouperBuilder.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace Wikibase\Repo;
+
+use InvalidArgumentException;
+use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup;
+use Wikibase\DataModel\Services\Statement\Filter\DataTypeStatementFilter;
+use Wikibase\DataModel\Services\Statement\Filter\NullStatementFilter;
+use Wikibase\DataModel\Services\Statement\Filter\PropertySetStatementFilter;
+use Wikibase\DataModel\Services\Statement\Grouper\FilteringStatementGrouper;
+use Wikibase\DataModel\Services\Statement\Grouper\NullStatementGrouper;
+use Wikibase\DataModel\Services\Statement\Grouper\StatementGrouper;
+use Wikibase\DataModel\Statement\StatementFilter;
+
+/**
+ * Factory for a StatementGrouper. The grouper is instantiated based on a
specification array that
+ * has the following form:
+ *
+ * array(
+ * 'item' => array(
+ * 'statements' => null,
+ * 'example' => array(
+ * 'type' => 'propertySet',
+ * 'propertyIds' => array( 'P1' ),
+ * ),
+ * 'identifiers' => array(
+ * 'type' => 'dataType',
+ * 'dataTypes' => array( 'identifier' ),
+ * ),
+ * ),
+ * 'property' => array(
+ * ),
+ * ),
+ *
+ * @since 0.5
+ *
+ * @license GNU GPL v2+
+ * @author Daniel Kinzler
+ * @author Thiemo Mättig
+ */
+class StatementGrouperBuilder {
+
+ /**
+ * @var array[]
+ */
+ private $specifications;
+
+ /**
+ * @var PropertyDataTypeLookup
+ */
+ private $dataTypeLookup;
+
+ /**
+ * @param array[] $specifications See the class level documentation for
details.
+ * @param PropertyDataTypeLookup $dataTypeLookup
+ */
+ public function __construct( array $specifications,
PropertyDataTypeLookup $dataTypeLookup ) {
+ $this->specifications = $specifications;
+ $this->dataTypeLookup = $dataTypeLookup;
+ }
+
+ /**
+ * @throws InvalidArgumentException
+ * @return StatementGrouper
+ */
+ public function getStatementGrouper() {
+ $groupers = array();
+
+ foreach ( $this->specifications as $entityType => $filterSpecs
) {
+ $groupers[$entityType] = $filterSpecs === null
+ ? new NullStatementGrouper()
+ : $this->newFilteringStatementGrouper(
$filterSpecs );
+ }
+
+ return new DispatchingEntityTypeStatementGrouper( $groupers );
+ }
+
+ /**
+ * @param array[] $filterSpecs
+ *
+ * @throws InvalidArgumentException
+ * @return FilteringStatementGrouper
+ */
+ private function newFilteringStatementGrouper( array $filterSpecs ) {
+ $filters = array();
+
+ foreach ( $filterSpecs as $groupIdentifier => $spec ) {
+ $filters[$groupIdentifier] = $spec === null
+ ? null
+ : $this->newStatementFilter( $spec );
+ }
+
+ return new FilteringStatementGrouper( $filters );
+ }
+
+ /**
+ * @param array $spec
+ *
+ * @throws InvalidArgumentException
+ * @return StatementFilter
+ */
+ private function newStatementFilter( array $spec ) {
+ $this->requireField( $spec, 'type' );
+
+ switch ( $spec['type'] ) {
+ case null:
+ return new NullStatementFilter();
+ case 'dataType':
+ $this->requireField( $spec, 'dataTypes' );
+ return new DataTypeStatementFilter(
$this->dataTypeLookup, $spec['dataTypes'] );
+ case 'propertySet':
+ $this->requireField( $spec, 'propertyIds' );
+ return new PropertySetStatementFilter(
$spec['propertyIds'] );
+ }
+
+ throw new InvalidArgumentException( 'Unknown filter type: ' .
$spec['type'] );
+ }
+
+ /**
+ * @param array $spec
+ * @param string $field
+ *
+ * @throws InvalidArgumentException
+ */
+ private function requireField( array $spec, $field ) {
+ if ( !array_key_exists( $field, $spec ) ) {
+ throw new InvalidArgumentException(
+ "Statement group configuration misses required
field '$field'"
+ );
+ }
+ }
+
+}
diff --git a/repo/includes/StatementGrouperFactory.php
b/repo/includes/StatementGrouperFactory.php
deleted file mode 100644
index 2e614a6..0000000
--- a/repo/includes/StatementGrouperFactory.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace Wikibase\Repo;
-
-use Wikibase\DataModel\Services\Statement\Grouper\NullStatementGrouper;
-use Wikibase\DataModel\Services\Statement\Grouper\StatementGrouper;
-
-/**
- * Factory for StatementGrouper instances for different entity types.
- *
- * @since 0.5
- *
- * @license GNU GPL v2+
- * @author Daniel Kinzler
- */
-class StatementGrouperFactory {
-
- /**
- * @param string $entityType
- *
- * @return StatementGrouper
- */
- public function getStatementGrouper( $entityType ) {
- // TODO: Group statements into actual sections, including an
identifiers section.
- return new NullStatementGrouper();
- }
-
-}
diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php
index 64ac2bd..90073f1 100644
--- a/repo/includes/WikibaseRepo.php
+++ b/repo/includes/WikibaseRepo.php
@@ -18,6 +18,7 @@
use ValueFormatters\FormatterOptions;
use ValueFormatters\ValueFormatter;
use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\Services\Statement\Grouper\FilteringStatementGrouper;
use Wikibase\Lib\DataTypeDefinitions;
use Wikibase\ChangeOp\ChangeOpFactoryProvider;
use Wikibase\DataModel\DeserializerFactory;
@@ -1310,11 +1311,18 @@
*/
public function getEntityParserOutputGeneratorFactory() {
$templateFactory = TemplateFactory::getDefaultInstance();
+ $dataTypeLookup = $this->getPropertyDataTypeLookup();
+
+ $statementGrouperBuilder = new StatementGrouperBuilder(
+ $this->settings->getSetting( 'statementSections' ),
+ $dataTypeLookup
+ );
+
$entityViewFactory = new EntityViewFactory(
$this->getEntityIdHtmlLinkFormatterFactory(),
new EntityIdLabelFormatterFactory(),
$this->getHtmlSnakFormatterFactory(),
- new StatementGrouperFactory(),
+ $statementGrouperBuilder->getStatementGrouper(),
$this->getSiteStore(),
$this->getDataTypeFactory(),
$templateFactory,
@@ -1335,7 +1343,7 @@
$this->getLanguageFallbackChainFactory(),
$templateFactory,
$entityDataFormatProvider,
- $this->getPropertyDataTypeLookup(),
+ $dataTypeLookup,
$this->getLocalEntityUriParser(),
$this->settings->getSetting(
'preferredGeoDataProperties' ),
$this->settings->getSetting(
'preferredPageImagesProperties' ),
diff --git
a/repo/tests/phpunit/includes/DispatchingEntityTypeStatementGrouperTest.php
b/repo/tests/phpunit/includes/DispatchingEntityTypeStatementGrouperTest.php
new file mode 100644
index 0000000..d4db3ac
--- /dev/null
+++ b/repo/tests/phpunit/includes/DispatchingEntityTypeStatementGrouperTest.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Wikibase\Test;
+
+use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Services\Statement\Grouper\StatementGrouper;
+use Wikibase\DataModel\Snak\PropertyNoValueSnak;
+use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\Repo\DispatchingEntityTypeStatementGrouper;
+
+/**
+ * @covers Wikibase\Repo\DispatchingEntityTypeStatementGrouper
+ *
+ * @group Wikibase
+ *
+ * @licence GNU GPL v2+
+ * @author Thiemo Mättig
+ */
+class DispatchingEntityTypeStatementGrouperTest extends
PHPUnit_Framework_TestCase {
+
+ /**
+ * @param int $count
+ *
+ * @return StatementGrouper
+ */
+ private function newGrouper( $count ) {
+ $grouper = $this->getMock(
+
'Wikibase\DataModel\Services\Statement\Grouper\StatementGrouper'
+ );
+
+ $grouper->expects( $this->exactly( $count ) )
+ ->method( 'groupStatements' );
+
+ return $grouper;
+ }
+
+ /**
+ * @dataProvider invalidConstructorArgumentProvider
+ */
+ public function testInvalidConstructorArgument( array $groupers ) {
+ $this->setExpectedException( 'InvalidArgumentException' );
+ new DispatchingEntityTypeStatementGrouper( $groupers );
+ }
+
+ public function invalidConstructorArgumentProvider() {
+ return array(
+ array( array( $this->newGrouper( 0 ) ) ),
+ array( array( 'item' => 'invalid' ) ),
+ );
+ }
+
+ public function testFallsBackToNullGrouper() {
+ $statements = new StatementList();
+ $statements->addNewStatement( new PropertyNoValueSnak( 1 ),
null, null, 'Q1$' );
+
+ $grouper = new DispatchingEntityTypeStatementGrouper( array() );
+ $groups = $grouper->groupStatements( $statements );
+
+ $this->assertSame( array( 'statements' => $statements ),
$groups );
+ }
+
+ public function testUsesFirstStatementsGuid() {
+ $statements = new StatementList();
+ $statements->addNewStatement( new PropertyNoValueSnak( 1 ),
null, null, 'Q1$' );
+ $statements->addNewStatement( new PropertyNoValueSnak( 1 ),
null, null, 'P1$' );
+
+ $grouper = new DispatchingEntityTypeStatementGrouper( array(
+ 'item' => $this->newGrouper( 1 ),
+ 'property' => $this->newGrouper( 0 ),
+ ) );
+ $grouper->groupStatements( $statements );
+ }
+
+}
diff --git a/repo/tests/phpunit/includes/StatementGrouperBuilderTest.php
b/repo/tests/phpunit/includes/StatementGrouperBuilderTest.php
new file mode 100644
index 0000000..bfa54f5
--- /dev/null
+++ b/repo/tests/phpunit/includes/StatementGrouperBuilderTest.php
@@ -0,0 +1,157 @@
+<?php
+
+namespace Wikibase\Test;
+
+use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Snak\PropertyNoValueSnak;
+use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\Repo\StatementGrouperBuilder;
+
+/**
+ * @covers Wikibase\Repo\StatementGrouperBuilder
+ *
+ * @group Wikibase
+ *
+ * @licence GNU GPL v2+
+ * @author Thiemo Mättig
+ */
+class StatementGrouperBuilderTest extends PHPUnit_Framework_TestCase {
+
+ /**
+ * @param array[] $specifications
+ *
+ * @return StatementGrouperBuilder
+ */
+ private function newInstance( array $specifications ) {
+ $lookup = $this->getMock(
'Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup' );
+
+ $lookup->expects( $this->any() )
+ ->method( 'getDataTypeIdForProperty' )
+ ->will( $this->returnValue( true ) );
+
+ return new StatementGrouperBuilder( $specifications, $lookup );
+ }
+
+ /**
+ * @return StatementList
+ */
+ private function newStatementList() {
+ $statements = new StatementList();
+ $statements->addNewStatement( new PropertyNoValueSnak( 1 ),
null, null, 'Q1$' );
+ return $statements;
+ }
+
+ public function testAcceptsEmptyArray() {
+ $builder = $this->newInstance( array() );
+ $grouper = $builder->getStatementGrouper();
+ $this->assertInstanceOf(
'Wikibase\Repo\DispatchingEntityTypeStatementGrouper', $grouper );
+ }
+
+ public function testAcceptsNullGrouper() {
+ $statements = $this->newStatementList();
+
+ $builder = $this->newInstance( array(
+ 'item' => null,
+ ) );
+ $grouper = $builder->getStatementGrouper();
+ $groups = $grouper->groupStatements( $statements );
+
+ $this->assertSame( array( 'statements' => $statements ),
$groups );
+ }
+
+ public function testAcceptsDefaultFilter() {
+ $statements = $this->newStatementList();
+
+ $builder = $this->newInstance( array(
+ 'item' => array(
+ 'default' => null,
+ )
+ ) );
+ $grouper = $builder->getStatementGrouper();
+ $groups = $grouper->groupStatements( $statements );
+
+ $this->assertEquals( array( 'default' => $statements ), $groups
);
+ }
+
+ public function testAcceptsNullFilter() {
+ $statements = $this->newStatementList();
+
+ $builder = $this->newInstance( array(
+ 'item' => array(
+ 'custom' => array( 'type' => null ),
+ )
+ ) );
+ $grouper = $builder->getStatementGrouper();
+ $groups = $grouper->groupStatements( $statements );
+
+ $this->assertEquals( array(
+ 'custom' => $statements,
+ 'statements' => new StatementList(),
+ ), $groups );
+ }
+
+ public function testIncompleteDataTypeFilter() {
+ $builder = $this->newInstance( array(
+ 'item' => array(
+ 'custom' => array( 'type' => 'dataType' ),
+ )
+ ) );
+ $this->setExpectedException( 'InvalidArgumentException' );
+ $builder->getStatementGrouper();
+ }
+
+ public function testDataTypeFilter() {
+ $statements = $this->newStatementList();
+
+ $builder = $this->newInstance( array(
+ 'item' => array(
+ 'custom' => array( 'type' => 'dataType',
'dataTypes' => array( 'string' ) ),
+ )
+ ) );
+ $grouper = $builder->getStatementGrouper();
+ $groups = $grouper->groupStatements( $statements );
+
+ $this->assertEquals( array(
+ 'custom' => $statements,
+ 'statements' => new StatementList(),
+ ), $groups );
+ }
+
+ public function testIncompletePropertySetFilter() {
+ $builder = $this->newInstance( array(
+ 'item' => array(
+ 'custom' => array( 'type' => 'propertySet' ),
+ )
+ ) );
+ $this->setExpectedException( 'InvalidArgumentException' );
+ $builder->getStatementGrouper();
+ }
+
+ public function testPropertySetFilter() {
+ $statements = $this->newStatementList();
+
+ $builder = $this->newInstance( array(
+ 'item' => array(
+ 'custom' => array( 'type' => 'propertySet',
'propertyIds' => array( 'P1' ) ),
+ )
+ ) );
+ $grouper = $builder->getStatementGrouper();
+ $groups = $grouper->groupStatements( $statements );
+
+ $this->assertEquals( array(
+ 'custom' => $statements,
+ 'statements' => new StatementList(),
+ ), $groups );
+ }
+
+ public function testInvalidFilterType() {
+ $builder = $this->newInstance( array(
+ 'item' => array(
+ 'custom' => array( 'type' => 'invalid' ),
+ )
+ ) );
+ $this->setExpectedException( 'InvalidArgumentException' );
+ $builder->getStatementGrouper();
+ }
+
+}
diff --git a/view/src/EntityViewFactory.php b/view/src/EntityViewFactory.php
index a78ed1a..12c9d99 100644
--- a/view/src/EntityViewFactory.php
+++ b/view/src/EntityViewFactory.php
@@ -7,10 +7,10 @@
use Language;
use SiteStore;
use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
+use Wikibase\DataModel\Services\Statement\Grouper\StatementGrouper;
use Wikibase\LanguageFallbackChain;
use Wikibase\Lib\LanguageNameLookup;
use Wikibase\Lib\SnakFormatter;
-use Wikibase\Repo\StatementGrouperFactory;
use Wikibase\View\Template\TemplateFactory;
/**
@@ -38,9 +38,9 @@
private $plainTextIdFormatterFactory;
/**
- * @var StatementGrouperFactory
+ * @var StatementGrouper
*/
- private $statementGrouperFactory;
+ private $statementGrouper;
/**
* @var SiteStore
@@ -81,7 +81,7 @@
* @param EntityIdFormatterFactory $htmlIdFormatterFactory
* @param EntityIdFormatterFactory $plainTextIdFormatterFactory
* @param HtmlSnakFormatterFactory $htmlSnakFormatterFactory
- * @param StatementGrouperFactory $statementGrouperFactory,
+ * @param StatementGrouper $statementGrouper
* @param SiteStore $siteStore
* @param DataTypeFactory $dataTypeFactory
* @param TemplateFactory $templateFactory
@@ -96,7 +96,7 @@
EntityIdFormatterFactory $htmlIdFormatterFactory,
EntityIdFormatterFactory $plainTextIdFormatterFactory,
HtmlSnakFormatterFactory $htmlSnakFormatterFactory,
- StatementGrouperFactory $statementGrouperFactory,
+ StatementGrouper $statementGrouper,
SiteStore $siteStore,
DataTypeFactory $dataTypeFactory,
TemplateFactory $templateFactory,
@@ -114,7 +114,7 @@
$this->htmlIdFormatterFactory = $htmlIdFormatterFactory;
$this->plainTextIdFormatterFactory =
$plainTextIdFormatterFactory;
$this->htmlSnakFormatterFactory = $htmlSnakFormatterFactory;
- $this->statementGrouperFactory = $statementGrouperFactory;
+ $this->statementGrouper = $statementGrouper;
$this->siteStore = $siteStore;
$this->dataTypeFactory = $dataTypeFactory;
$this->templateFactory = $templateFactory;
@@ -165,8 +165,6 @@
) {
$entityTermsView = $this->newEntityTermsView( $languageCode,
$editSectionGenerator );
- $statementGrouper =
$this->statementGrouperFactory->getStatementGrouper( $entityType );
-
$statementSectionsView = $this->newStatementSectionsView(
$languageCode,
$fallbackChain,
@@ -193,7 +191,7 @@
return new ItemView(
$this->templateFactory,
$entityTermsView,
- $statementGrouper,
+ $this->statementGrouper,
$statementSectionsView,
$language,
$siteLinksView,
@@ -203,7 +201,7 @@
return new PropertyView(
$this->templateFactory,
$entityTermsView,
- $statementGrouper,
+ $this->statementGrouper,
$statementSectionsView,
$this->dataTypeFactory,
$language
diff --git a/view/tests/phpunit/EntityViewFactoryTest.php
b/view/tests/phpunit/EntityViewFactoryTest.php
index cdec272..611eea4 100644
--- a/view/tests/phpunit/EntityViewFactoryTest.php
+++ b/view/tests/phpunit/EntityViewFactoryTest.php
@@ -5,9 +5,9 @@
use DataTypes\DataTypeFactory;
use PHPUnit_Framework_TestCase;
use SiteList;
+use Wikibase\DataModel\Services\Statement\Grouper\NullStatementGrouper;
use Wikibase\LanguageFallbackChain;
use Wikibase\Lib\SnakFormatter;
-use Wikibase\Repo\StatementGrouperFactory;
use Wikibase\View\EntityIdFormatterFactory;
use Wikibase\View\EntityViewFactory;
use Wikibase\View\Template\TemplateFactory;
@@ -53,7 +53,7 @@
$htmlFactory ?: $this->getEntityIdFormatterFactory(
SnakFormatter::FORMAT_HTML ),
$plainFactory ?: $this->getEntityIdFormatterFactory(
SnakFormatter::FORMAT_PLAIN ),
$this->getSnakFormatterFactory(),
- new StatementGrouperFactory(),
+ new NullStatementGrouper(),
$this->getSiteStore(),
new DataTypeFactory( array() ),
$templateFactory,
--
To view, visit https://gerrit.wikimedia.org/r/257303
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I18381d6d99d50b4d9cd1cdb6287464a658715bef
Gerrit-PatchSet: 6
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: Adrian Lang <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits