Aude has uploaded a new change for review.
https://gerrit.wikimedia.org/r/54220
Change subject: Second iteration of property parser function [WIP]
......................................................................
Second iteration of property parser function [WIP]
* supports multiple values for a property
* returns empty string if there is some error (@todo nicer error
handling/feedback for editor)
* supports wikibase item, commons media and strings
@todo:
* tests
* caching and optimization
* use terms table for property id/label lookups
* generic value formatter for string, to put in ValueFormatters
Change-Id: I70a9ff2976940ecf601320ecece35943e89e94bc
---
M client/includes/parserhooks/ParserErrorMessageFormatter.php
M client/includes/parserhooks/PropertyParserFunction.php
M lib/WikibaseLib.php
A lib/includes/PropertyByLabelLookup.php
A lib/includes/PropertyIdLabelArray.php
A lib/includes/formatters/ItemFormatter.php
A lib/includes/formatters/StringFormatter.php
7 files changed, 483 insertions(+), 76 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/20/54220/1
diff --git a/client/includes/parserhooks/ParserErrorMessageFormatter.php
b/client/includes/parserhooks/ParserErrorMessageFormatter.php
index 108aab2..4a9e5d1 100644
--- a/client/includes/parserhooks/ParserErrorMessageFormatter.php
+++ b/client/includes/parserhooks/ParserErrorMessageFormatter.php
@@ -53,11 +53,13 @@
* @return string
*/
public function format( \Message $message ) {
- return \Html::rawElement(
+ return '';
+ /* return \Html::rawElement(
'span',
array( 'class' => 'error' ),
$message->inLanguage( $this->language )->text()
);
+ */
}
}
diff --git a/client/includes/parserhooks/PropertyParserFunction.php
b/client/includes/parserhooks/PropertyParserFunction.php
index 5f4798f..081e138 100644
--- a/client/includes/parserhooks/PropertyParserFunction.php
+++ b/client/includes/parserhooks/PropertyParserFunction.php
@@ -1,6 +1,8 @@
<?php
namespace Wikibase;
+use ValueFormatters\FormatterOptions;
+use DataValues\DataValue;
/**
* {{#property}} parser function
@@ -30,11 +32,8 @@
*/
class PropertyParserFunction {
- /* @var Site */
- protected $site;
-
- /* @var EntityId */
- protected $entityId;
+ /* @var Language */
+ protected $language;
/* @var WikiPageEntityLookup */
protected $entityLookup;
@@ -42,54 +41,25 @@
/* @var ParserErrorMessageFormatter */
protected $errorFormatter;
+ /* @var array */
+ protected $availableDataTypes;
+
/**
* @since 0.4
*
- * @param \Site $site
- * @param EntityId $entityId
+ * @param \Language $language
* @param WikiPageEntityLookup $entityLookup
+ * @param PropertyByLabelLookup $propertyByLabelLookup
+ * @param ParserErrorMessageFormatter $errorFormatter
+ * @param $dataTypes[]
*/
- public function __construct( \Site $site, EntityId $entityId,
- WikiPageEntityLookup $entityLookup, ParserErrorMessageFormatter
$errorFormatter ) {
- $this->site = $site;
- $this->entityId = $entityId;
+ public function __construct( \Language $language, WikiPageEntityLookup
$entityLookup,
+ PropertyByLabelLookup $propertyByLabelLookup,
ParserErrorMessageFormatter $errorFormatter, array $dataTypes ) {
+ $this->language = $language;
$this->entityLookup = $entityLookup;
+ $this->propertyByLabelLookup = $propertyByLabelLookup;
$this->errorFormatter = $errorFormatter;
- }
-
- /**
- * Get data value for a property of item associated with client wiki
page
- *
- * @since 0.4
- *
- * @param Entity $entity
- * @param string $propertyLabel
- *
- * @return Snak
- */
- public function getMainSnak( Entity $entity, $propertyLabel ) {
- $claimsByProperty = array();
-
- foreach( $entity->getClaims() as $claim ) {
- $propertyId = $claim->getMainSnak()->getPropertyId();
- $claimsByProperty[$propertyId->getNumericId()][] =
$claim;
- }
-
- if ( $claimsByProperty !== array() ) {
- foreach( $claimsByProperty as $id => $claims ) {
- foreach( $claims as $claim ) {
- $mainSnak = $claim->getMainSnak();
- $property =
$this->entityLookup->getEntity( $mainSnak->getPropertyId() );
-
- // @todo allow lookup by entity id, in
addition to label?
- if ( $property->getLabel(
$this->site->getLanguageCode() ) === $propertyLabel ) {
- return $mainSnak;
- }
- }
- }
- }
-
- return false;
+ $this->availableDataTypes = $dataTypes;
}
/**
@@ -103,21 +73,103 @@
*
* @return string
*/
- protected function getSnakValue( Snak $snak, $propertyLabel ) {
- $propertyValue = $snak->getDataValue();
+ protected function getSnakValue( Snak $snak ) {
+ wfProfileIn( __METHOD__ );
+ $snakValue = $snak->getDataValue();
- if ( $propertyValue instanceof \Wikibase\EntityId ) {
- $langCode = $this->site->getLanguageCode();
+ if ( $snakValue instanceof \Wikibase\EntityId ) {
// @todo we could use the terms table to lookup label
// we would need to have some store lookup code in
WikibaseLib
- $entity = $this->entityLookup->getEntity(
$propertyValue );
- $label = $entity->getLabel(
$this->site->getLanguageCode() );
+ $entity = $this->entityLookup->getEntity( $snakValue );
+ $label = $entity->getLabel( $this->language->getCode()
);
// @todo ick! handle when there is no label...
- return $label !== false ? $label :
$entity->getPrefixedId();
+ $labelValue = $label !== false ? $label : '';
+
+ wfProfileOut( __METHOD__ );
+ return $labelValue;
+ } else {
+ wfProfileOut( __METHOD__ );
+ return $snakValue;
}
+ wfProfileOut( __METHOD__ );
return null;
+ }
+
+ /**
+ * @since 0.4
+ *
+ * @param Snak $snak
+ *
+ * @return string
+ */
+ public function formatDataValue( DataValue $dataValue ) {
+ wfProfileIn( __METHOD__ );
+ $dataType = $dataValue->getType();
+
+ if ( !in_array( $dataType, $this->availableDataTypes ) ) {
+ // @todo error handling, data type not supported
+ return '';
+ }
+
+ $formatterOptions = new FormatterOptions( array( 'lang' =>
$this->language->getCode() ) );
+ $formattedValue = '';
+
+ switch ( $dataType ) {
+ case 'wikibase-entityid':
+ $valueFormatter = new ItemFormatter(
$formatterOptions, $this->entityLookup );
+ $formattedValue = $valueFormatter->format(
$dataValue );
+ break;
+ case 'commonsMedia':
+ $valueFormatter = new StringFormatter(
$formatterOptions );
+ $formattedValue = $valueFormatter->format(
$dataValue );
+ break;
+ case 'string':
+ $valueFormatter = new StringFormatter(
$formatterOptions );
+ $formattedValue = $valueFormatter->format(
$dataValue );
+ break;
+ default:
+ break;
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $formattedValue;
+ }
+
+ /**
+ * @since 0.4
+ *
+ * @param SnakList $snakList
+ *
+ * @return string - wikitext format
+ */
+ public function formatSnakList( SnakList $snakList, $propertyLabel ) {
+ wfProfileIn( __METHOD__ );
+ $values = array();
+
+ foreach( $snakList as $snak ) {
+ $values[] = $snak->getDataValue();
+ }
+
+ if ( $values !== array() ) {
+ wfProfileOut( __METHOD__ );
+ $formattedValues = array();
+
+ foreach( $values as $dataValue ) {
+ $formattedValues[] = $this->formatDataValue(
$dataValue );
+ }
+
+ return $this->language->commaList( $formattedValues );
+ }
+
+ if ( ! isset( $errorMessage ) ) {
+ // formatted as empty string
+ $errorMessage = new \Message(
'wikibase-property-notfound', array( wfEscapeWikiText( $propertyLabel ) ) );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $this->errorFormatter->format( $errorMessage );
}
/**
@@ -127,27 +179,17 @@
*
* @return string - wikitext format
*/
- public function evaluate( $propertyLabel ) {
- $snak = $this->getMainSnak(
- $this->entityLookup->getEntity( $this->entityId ),
- $propertyLabel
- );
+ public function evaluate( EntityId $entityId, $propertyLabel ) {
+ wfProfileIn( __METHOD__ );
+ $snakList =
$this->propertyByLabelLookup->getSnaksByPropertyLabel( $entityId,
$propertyLabel );
- if ( $snak instanceof \Wikibase\Snak ) {
- $snakValue = $this->getSnakValue( $snak, $propertyLabel
);
-
- if ( $snakValue !== null ) {
- return wfEscapeWikiText( $snakValue );
- }
-
- $errorMessage = new \Message(
'wikibase-property-notsupportedyet', array( wfEscapeWikiText( $propertyLabel )
) );
+ if ( $snakList->isEmpty() ) {
+ wfProfileOut( __METHOD__ );
+ return '';
}
- if ( ! isset( $errorMessage ) ) {
- $errorMessage = new \Message(
'wikibase-property-notfound', array( wfEscapeWikiText( $propertyLabel ) ) );
- }
-
- return $this->errorFormatter->format( $errorMessage );
+ wfProfileOut( __METHOD__ );
+ return $this->formatSnakList( $snakList, $propertyLabel );
}
/**
@@ -158,6 +200,7 @@
* @return string
*/
public static function render( \Parser $parser, $propertyLabel ) {
+ wfProfileIn( __METHOD__ );
$site = \Sites::singleton()->getSite( Settings::get(
'siteGlobalID' ) );
$siteLinkLookup =
ClientStoreFactory::getStore()->newSiteLinkTable();
@@ -167,19 +210,27 @@
// @todo handle when site link is not there, such as site link
/ entity has been deleted...
if ( $entityId === null ) {
+ wfProfileOut( __METHOD__ );
return '';
}
$entityLookup =
ClientStoreFactory::getStore()->newEntityLookup();
- $errorFormatter = new ParserErrorMessageFormatter(
$parser->getTargetLanguage() );
+ $targetLanguage = $parser->getTargetLanguage();
+ $errorFormatter = new ParserErrorMessageFormatter(
$targetLanguage );
- $instance = new self( $site, $entityId, $entityLookup,
$errorFormatter );
+ $propertyByLabelLookup = new PropertyByLabelLookup(
$targetLanguage, $entityId, $entityLookup );
- return array(
- $instance->evaluate( $propertyLabel ),
+ $instance = new self( $targetLanguage, $entityLookup,
$propertyByLabelLookup,
+ $errorFormatter, Settings::get( 'dataTypes' ) );
+
+ $result = array(
+ $instance->evaluate( $entityId, $propertyLabel ),
'noparse' => false
);
+
+ wfProfileOut( __METHOD__ );
+ return $result;
}
}
diff --git a/lib/WikibaseLib.php b/lib/WikibaseLib.php
index 10e8cba..2b11bc7 100644
--- a/lib/WikibaseLib.php
+++ b/lib/WikibaseLib.php
@@ -113,6 +113,8 @@
$wgAutoloadClasses['Wikibase\MapValueHasher'] = $dir .
'includes/MapValueHasher.php';
$wgAutoloadClasses['Wikibase\ReferencedEntitiesFinder'] = $dir .
'includes/ReferencedEntitiesFinder.php';
$wgAutoloadClasses['Wikibase\ObjectComparer'] = $dir .
'includes/ObjectComparer.php';
+$wgAutoloadClasses['Wikibase\PropertyIdLabelArray'] = $dir .
'includes/parserhooks/PropertyIdLabelArray.php';
+$wgAutoloadClasses['Wikibase\PropertyByLabelLookup'] = $dir .
'includes/parserhooks/PropertyByLabelLookup.php';
$wgAutoloadClasses['Wikibase\Settings'] = $dir
. 'includes/Settings.php';
$wgAutoloadClasses['Wikibase\SettingsArray'] = $dir .
'includes/SettingsArray.php';
$wgAutoloadClasses['Wikibase\SiteLink'] = $dir
. 'includes/SiteLink.php';
@@ -146,6 +148,10 @@
$wgAutoloadClasses['Wikibase\EntityId'] = $dir .
'includes/entity/EntityId.php';
$wgAutoloadClasses['Wikibase\Entity'] = $dir .
'includes/entity/Entity.php';
+// includes/formatters
+$wgAutoloadClasses['Wikibase\ItemFormatter'] = $dir .
'includes/formatters/ItemFormatter.php';
+$wgAutoloadClasses['Wikibase\StringFormatter'] = $dir .
'includes/formatters/StringFormatter.php';
+
// includes/item
$wgAutoloadClasses['Wikibase\Item'] = $dir .
'includes/item/Item.php';
$wgAutoloadClasses['Wikibase\ItemDiff'] = $dir .
'includes/item/ItemDiff.php';
diff --git a/lib/includes/PropertyByLabelLookup.php
b/lib/includes/PropertyByLabelLookup.php
new file mode 100644
index 0000000..d4c53cb
--- /dev/null
+++ b/lib/includes/PropertyByLabelLookup.php
@@ -0,0 +1,173 @@
+<?php
+
+namespace Wikibase;
+
+/**
+ * Property lookup by label
+ *
+ * @todo use terms table to do lookups, add caching and tests
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 0.4
+ *
+ * @file
+ * @ingroup WikibaseLib
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ */
+class PropertyByLabelLookup {
+
+ /* @var Language */
+ protected $language;
+
+ /* @var EntityId */
+ protected $entityId;
+
+ /* @var WikiPageEntityLookup */
+ protected $entityLookup;
+
+ /* @var $propertyIdLabelArray */
+ protected $propertyIdLabelArray;
+
+ /* @var array */
+ protected $statementsByProperty;
+
+ /**
+ * @since 0.4
+ *
+ * @param \Language $language
+ * @param EntityId $entityId
+ * @param WikiPageEntityLookup $entityLookup
+ */
+ public function __construct( \Language $language, EntityId $entityId,
WikiPageEntityLookup $entityLookup ) {
+ $this->language = $language;
+ $this->entityId = $entityId;
+ $this->entityLookup = $entityLookup;
+ }
+
+ /**
+ * @since 0.4
+ *
+ * @param Entity $entity
+ */
+ public function indexProperties( Entity $entity ) {
+ wfProfileIn( __METHOD__ );
+
+ $langCode = $this->language->getCode();
+ $propertyArray = new PropertyIdLabelArray( $langCode );
+ $statementsByProperty = array();
+
+ foreach( $entity->getClaims() as $statement ) {
+ $propertyId =
$statement->getMainSnak()->getPropertyId();
+
+ if ( $propertyId === null ) {
+ continue;
+ }
+
+ $statementsByProperty[$propertyId->getNumericId()][] =
$statement;
+
+ $property = $this->entityLookup->getEntity( $propertyId
);
+ $propertyLabel = $property->getLabel( $langCode );
+
+ if ( $propertyLabel !== false ) {
+ $propertyArray->setProperty(
+ $propertyId->getNumericId(),
+ $propertyLabel
+ );
+ }
+ }
+
+ $this->statementsByProperty = $statementsByProperty;
+ $this->propertyIdLabelArray = $propertyArray;
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * @since 0.4
+ *
+ * @param EntityId $propertyId
+ *
+ * @return string|false
+ */
+ public function getPropertyLabel( EntityId $propertyId ) {
+ wfProfileIn( __METHOD__ );
+ $property = $this->entityLookup->getEntity( $propertyId );
+ $propertyLabel = $property->getLabel(
$this->language->getCode() );
+
+ wfProfileOut( __METHOD__ );
+ return $propertyLabel;
+ }
+
+ /**
+ * @since 0.4
+ *
+ * @param EntityId $propertyId
+ *
+ * @return Statement[]
+ */
+ public function getStatementsByProperty( EntityId $propertyId ) {
+ wfProfileIn( __METHOD__ );
+ $numericId = $propertyId->getNumericId();
+
+ $statements = array_key_exists( $numericId,
$this->statementsByProperty )
+ ? $this->statementsByProperty[$numericId] : array();
+
+ wfProfileOut( __METHOD__ );
+ return $statements;
+ }
+
+ /**
+ * @since 0.4
+ *
+ * @param EntityId $entityId
+ * @param string $propertyLabel
+ *
+ * @return SnakList
+ */
+ public function getSnaksByPropertyLabel( EntityId $entityId,
$propertyLabel ) {
+ wfProfileIn( __METHOD__ );
+
+ if ( $this->propertyIdLabelArray === null ) {
+ $entity = $this->entityLookup->getEntity( $entityId );
+ $this->indexProperties( $entity );
+ }
+
+ $propertyIds = $this->propertyIdLabelArray->getByLabel(
$propertyLabel );
+
+ if ( ! $propertyIds ) {
+ // nothing found, return empty
+ $snakList = new SnakList();
+ } else if ( count( $propertyIds ) > 1 ) {
+ // @todo handle error! should not be duplicates, return
empty
+ $snakList = new SnakList();
+ } else {
+ $propertyId = new EntityId( Property::ENTITY_TYPE,
$propertyIds[0] );
+ $statements = $this->getStatementsByProperty(
$propertyId );
+ $snakList = new SnakList();
+
+ foreach( $statements as $statement ) {
+ $snakList->addSnak( $statement->getMainSnak() );
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $snakList;
+ }
+
+}
diff --git a/lib/includes/PropertyIdLabelArray.php
b/lib/includes/PropertyIdLabelArray.php
new file mode 100644
index 0000000..8408acd
--- /dev/null
+++ b/lib/includes/PropertyIdLabelArray.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Wikibase;
+
+/**
+ * Holds key => value data for property id (numeric) and labels;
+ * language code is specified in the constructor
+ *
+ * @todo integrate better with the terms table and add caching
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 0.4
+ *
+ * @file
+ * @ingroup WikibaseLib
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ */
+class PropertyIdLabelArray extends \ArrayObject {
+
+ protected $langCode;
+
+ public function __construct( $langCode ) {
+ $this->langCode = $langCode;
+ }
+
+ public function getLanguageCode() {
+ return $this->langCode;
+ }
+
+ public function setProperty( $numericId, $label ) {
+ $this[$numericId] = $label;
+ }
+
+ public function getPropertyById( $numericId ) {
+ if ( !$this->hasProperty( $numericId ) ) {
+ throw new MWException( 'Property not found' );
+ }
+
+ return $this[$numericId];
+ }
+
+ public function hasProperty( $numericId ) {
+ return $this->offsetExists( $numericId );
+ }
+
+ public function getByLabel( $label ) {
+ return array_keys( $this->getArrayCopy(), $label );
+ }
+
+}
diff --git a/lib/includes/formatters/ItemFormatter.php
b/lib/includes/formatters/ItemFormatter.php
new file mode 100644
index 0000000..09c184d
--- /dev/null
+++ b/lib/includes/formatters/ItemFormatter.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Wikibase;
+use ValueFormatters\FormatterOptions;
+
+/**
+ * Formatter for Wikibase Item values
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 0.1
+ *
+ * @file
+ * @ingroup ValueFormatters
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ */
+class ItemFormatter extends StringFormatter {
+
+ protected $entityLookup;
+
+ public function __construct( FormatterOptions $options, EntityLookup
$entityLookup ) {
+ parent::__construct( $options );
+ $this->entityLookup = $entityLookup;
+ }
+
+ public function format( $value ) {
+ if ( !$value instanceof EntityId ) {
+ // @todo: error!
+ return '';
+ }
+
+ $label = $this->lookupItemLabel( $value );
+
+ if ( is_string( $label ) ) {
+ return $this->formatString( $label );
+ }
+
+ // did not find label
+ return '';
+ }
+
+ protected function lookupItemLabel( $entityId ) {
+ $entity = $this->entityLookup->getEntity( $entityId );
+
+ // todo use lang options
+ return $entity->getLabel( 'en' );
+ }
+
+}
diff --git a/lib/includes/formatters/StringFormatter.php
b/lib/includes/formatters/StringFormatter.php
new file mode 100644
index 0000000..577fc67
--- /dev/null
+++ b/lib/includes/formatters/StringFormatter.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Wikibase;
+use ValueFormatters\ValueFormatterBase;
+
+/**
+ * Formatter for string values
+ *
+ * @todo generalize and put with ValueFormatters stuff
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 0.4
+ *
+ * @file
+ * @ingroup ValueFormatters
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ */
+class StringFormatter extends ValueFormatterBase {
+
+ public function format( $dataValue ) {
+ $string = $dataValue->getValue();
+ return $this->formatString( $string );
+ }
+
+ protected function formatString( $string ) {
+ return is_string( $string ) ? wfEscapeWikiText( $string ) : '';
+ }
+
+}
--
To view, visit https://gerrit.wikimedia.org/r/54220
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I70a9ff2976940ecf601320ecece35943e89e94bc
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Aude <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits