Aude has uploaded a new change for review.
https://gerrit.wikimedia.org/r/80868
Change subject: register with data types and use value formatters for claim
autosummaries
......................................................................
register with data types and use value formatters for claim autosummaries
Change-Id: I60de6baddfe0e76815176e4bdf5832f2bf7ed3e8
---
M lib/includes/WikibaseDataTypeBuilders.php
M repo/includes/ClaimSummaryBuilder.php
M repo/tests/phpunit/includes/ClaimSummaryBuilderTest.php
3 files changed, 181 insertions(+), 26 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/68/80868/2
diff --git a/lib/includes/WikibaseDataTypeBuilders.php
b/lib/includes/WikibaseDataTypeBuilders.php
index 3e2e746..ac0e140 100644
--- a/lib/includes/WikibaseDataTypeBuilders.php
+++ b/lib/includes/WikibaseDataTypeBuilders.php
@@ -1,14 +1,19 @@
<?php
+
namespace Wikibase\Lib;
use DataTypes\DataType;
+use ValueFormatters\FormatterOptions;
+use ValueFormatters\GlobeCoordinateFormatter;
+use ValueFormatters\StringFormatter;
+use ValueFormatters\TimeFormatter;
use Parser;
use Wikibase\Client\WikibaseClient;
use Wikibase\EntityLookup;
use Wikibase\Item;
use Wikibase\Repo\WikibaseRepo;
-use Wikibase\SettingsArray;
+use Wikibase\Settings;
use Wikibase\Validators\CompositeValidator;
use Wikibase\Validators\DataFieldValidator;
use Wikibase\Validators\DataValueValidator;
@@ -103,7 +108,9 @@
$validators[] = new TypeValidator( 'Wikibase\EntityId' );
$validators[] = new EntityExistsValidator( $this->entityLookup
);
- return new DataType( $id, 'wikibase-entityid', array(),
array(), $validators );
+ $formatters = $this->getItemFormatters();
+
+ return new DataType( $id, 'wikibase-entityid', array(),
$formatters, $validators );
}
public function buildMediaType( $id ) {
@@ -122,7 +129,11 @@
new CompositeValidator( $validators, true ) //Note:
each validator is fatal
);
- return new DataType( $id, 'string', array(), array(), array(
new TypeValidator( 'DataValues\DataValue' ), $topValidator ) );
+ $formatters = array(
+ 'default' => new StringFormatter( new
FormatterOptions() )
+ );
+
+ return new DataType( $id, 'string', array(), $formatters,
array( new TypeValidator( 'DataValues\DataValue' ), $topValidator ) );
}
public function buildStringType( $id ) {
@@ -136,7 +147,11 @@
new CompositeValidator( $validators, true ) //Note:
each validator is fatal
);
- return new DataType( $id, 'string', array(), array(), array(
new TypeValidator( 'DataValues\DataValue' ), $topValidator ) );
+ $formatters = array(
+ 'default' => new StringFormatter( new
FormatterOptions() )
+ );
+
+ return new DataType( $id, 'string', array(), $formatters,
array( new TypeValidator( 'DataValues\DataValue' ), $topValidator ) );
}
public function buildTimeType( $id ) {
@@ -171,7 +186,12 @@
new CompositeValidator( $validators, true ) //Note:
each validator is fatal
);
- return new DataType( $id, 'time', array(), array(), array( new
TypeValidator( 'DataValues\DataValue' ), $topValidator ) );
+ $formatters = array(
+ 'default' => new TimeFormatter( new FormatterOptions() )
+ );
+
+ return new DataType( $id, 'time', array(), $formatters,
+ array( new TypeValidator( 'DataValues\DataValue' ),
$topValidator ) );
}
public function buildCoordinateType( $id ) {
@@ -195,7 +215,17 @@
new CompositeValidator( $validators, true ) //Note:
each validator is fatal
);
- return new DataType( $id, 'globecoordinate', array(), array(),
array( new TypeValidator( 'DataValues\DataValue' ), $topValidator ) );
+ $formatters = array(
+ 'default' => new GlobeCoordinateFormatter( new
FormatterOptions() )
+ );
+
+ return new DataType(
+ $id,
+ 'globecoordinate',
+ array(),
+ $formatters,
+ array( new TypeValidator( 'DataValues\DataValue' ),
$topValidator )
+ );
}
public function buildUrlType( $id ) {
@@ -215,7 +245,54 @@
new CompositeValidator( $validators, true ) //Note:
each validator is fatal
);
- return new DataType( $id, 'string', array(), array(), array(
new TypeValidator( 'DataValues\DataValue' ), $topValidator ) );
+ $formatters = array(
+ 'default' => new StringFormatter( new
FormatterOptions() )
+ );
+
+ return new DataType( $id, 'string', array(), $formatters,
+ array( new TypeValidator( 'DataValues\DataValue' ),
$topValidator ) );
+ }
+
+ /**
+ * @since 0.4
+ *
+ * @return ValueFormatter[]
+ */
+ protected function getItemFormatters() {
+ $idFormatter = $this->getEntityIdFormatter();
+
+ $labelFormatter = new EntityIdLabelFormatter(
+ new FormatterOptions(),
+ $this->entityLookup
+ );
+ $labelFormatter->setIdFormatter( $idFormatter );
+
+ $formatters = array(
+ 'default' => $idFormatter,
+ 'label' => $labelFormatter
+ );
+
+ return $formatters;
+ }
+
+ /**
+ * @since 0.4
+ *
+ * @return EntityIdFormatter
+ */
+ protected function getEntityIdFormatter() {
+ $prefixMap = array();
+
+ // @todo inject setting
+ foreach ( Settings::singleton()->getSetting( 'entityPrefixes' )
as $prefix => $entityType ) {
+ $prefixMap[$entityType] = $prefix;
+ }
+
+ $options = new FormatterOptions( array(
+ EntityIdFormatter::OPT_PREFIX_MAP => $prefixMap
+ ) );
+
+ return new EntityIdFormatter( $options );
}
}
diff --git a/repo/includes/ClaimSummaryBuilder.php
b/repo/includes/ClaimSummaryBuilder.php
index b1e2675..5cd3b55 100644
--- a/repo/includes/ClaimSummaryBuilder.php
+++ b/repo/includes/ClaimSummaryBuilder.php
@@ -5,6 +5,8 @@
use DataValues\TimeValue;
use InvalidArgumentException;
use Wikibase\Lib\EntityIdFormatter;
+use Wikibase\Lib\PropertyDataTypeLookup;
+use Wikibase\Repo\WikibaseRepo;
/**
* EditSummary-Builder for claim operations
@@ -16,6 +18,7 @@
*
* @licence GNU GPL v2+
* @author Tobias Gritschacher < [email protected] >
+ * @author Katie Filbert < [email protected] >
*/
class ClaimSummaryBuilder {
@@ -35,6 +38,11 @@
private $idFormatter;
/**
+ * @var PropertyDataTypeLookup
+ */
+ private $dataTypeLookup;
+
+ /**
* Constructs a new ClaimSummaryBuilder
*
* @since 0.4
@@ -42,10 +50,12 @@
* @param string $apiModuleName
* @param ClaimDiffer $claimDiffer
* @param EntityIdFormatter $idFormatter
+ * @param DataTypeLookup $dataTypeLookup
*
* @throws InvalidArgumentException
*/
- public function __construct( $apiModuleName, ClaimDiffer $claimDiffer,
EntityIdFormatter $idFormatter ) {
+ public function __construct( $apiModuleName, ClaimDiffer $claimDiffer,
+ EntityIdFormatter $idFormatter, PropertyDataTypeLookup
$dataTypeLookup = null ) {
if ( !is_string( $apiModuleName ) ) {
throw new InvalidArgumentException( '$apiModuleName
needs to be a string' );
}
@@ -53,6 +63,11 @@
$this->apiModuleName = $apiModuleName;
$this->claimDiffer = $claimDiffer;
$this->idFormatter = $idFormatter;
+
+ // todo: inject
+ $this->dataTypeLookup = ( $dataTypeLookup === null ) ?
+ $this->dataTypeLookup =
WikibaseRepo::getDefaultInstance()->getPropertyDataTypeLookup() :
+ $dataTypeLookup;
}
/**
@@ -128,20 +143,53 @@
$pairs[$key] = array();
}
- if ( $snak instanceof PropertyValueSnak ) {
- $value = $snak->getDataValue();
- // TODO: we should use value formatters
here!
- if ( $value instanceof TimeValue ) {
- $value = $value->getTime();
- }
- } else {
- $value = '-'; // todo handle no values
in general way (needed elsewhere)
- }
-
- $pairs[$key][] = $value;
+ $pairs[$key][] = $this->getFormattedSnakValue(
$snak );
}
}
return ( array( $pairs ) );
}
+
+ /**
+ * Format a snak for the summary
+ *
+ * @since 0.4
+ *
+ * @param Snak $snak
+ *
+ * @return string
+ */
+ protected function getFormattedSnakValue( Snak $snak ) {
+ if ( $snak instanceof PropertyValueSnak ) {
+ $formatter = $this->getValueFormatterForSnak( $snak );
+ $value = $snak->getDataValue();
+ $formattedValue = $formatter->format( $value );
+ } else {
+ $formattedValue = '-'; // todo handle no values in
general way (needed elsewhere)
+ }
+
+ return $formattedValue;
+ }
+
+ /**
+ * Get value formatter for a snak
+ *
+ * @todo put this in SnakFormatter and use snak formatter here
+ *
+ * @since 0.4
+ *
+ * @param Snak $snak
+ *
+ * @return ValueFormatter
+ */
+ protected function getValueFormatterForSnak( Snak $snak ) {
+ $propertyId = $snak->getPropertyId();
+
+ $dataTypeId = $this->dataTypeLookup->getDataTypeIdForProperty(
$propertyId );
+ $dataType =
WikibaseRepo::getDefaultInstance()->getDataTypeFactory()->getType( $dataTypeId
);
+
+ $valueFormatters = $dataType->getFormatters();
+
+ return $valueFormatters['default'];
+ }
}
diff --git a/repo/tests/phpunit/includes/ClaimSummaryBuilderTest.php
b/repo/tests/phpunit/includes/ClaimSummaryBuilderTest.php
index 33cc675..30de4c1 100644
--- a/repo/tests/phpunit/includes/ClaimSummaryBuilderTest.php
+++ b/repo/tests/phpunit/includes/ClaimSummaryBuilderTest.php
@@ -8,7 +8,11 @@
use Wikibase\Claim;
use Wikibase\Claims;
use Wikibase\ClaimSummaryBuilder;
+use Wikibase\EntityId;
+use Wikibase\Property;
use Wikibase\Lib\EntityIdFormatter;
+use Wikibase\Lib\InMemoryDataTypeLookup;
+use Wikibase\Lib\PropertyDataTypeLookup;
use Wikibase\Repo\WikibaseRepo;
/**
@@ -42,6 +46,30 @@
* @author Tobias Gritschacher < [email protected] >
*/
class ClaimSummaryBuilderTest extends \MediaWikiTestCase {
+
+ /**
+ * @var PropertyDataTypeLookup
+ */
+ protected $dataTypeLookup;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->dataTypeLookup = new InMemoryDataTypeLookup();
+ $this->setDataTypes();
+ }
+
+ protected function setDataTypes() {
+ $this->dataTypeLookup->setDataTypeForProperty(
+ new EntityId( Property::ENTITY_TYPE, 7201010 ),
+ 'string'
+ );
+
+ $this->dataTypeLookup->setDataTypeForProperty(
+ new EntityId( Property::ENTITY_TYPE, 112358 ),
+ 'string'
+ );
+ }
/**
* @return \Wikibase\Snak[]
@@ -88,7 +116,7 @@
return $statements;
}
- public function buildUpdateClaimSummaryPovider() {
+ public function buildUpdateClaimSummaryProvider() {
$arguments = array();
foreach ( $this->claimProvider() as $claim ) {
@@ -142,14 +170,15 @@
return $old->equals( $new );
};
+ $claims = new Claims();
+ $newClaims = $this->claimProvider();
+
$claimSummaryBuilder = new ClaimSummaryBuilder(
'wbsetclaim',
new ClaimDiffer( new CallbackListDiffer( $comparer ) ),
- $idFormatter
+ $idFormatter,
+ $this->dataTypeLookup
);
-
- $claims = new Claims();
- $newClaims = $this->claimProvider();
foreach ( $newClaims as $newClaim ) {
$summary = $claimSummaryBuilder->buildClaimSummary(
$claims, $newClaim );
@@ -160,7 +189,7 @@
}
/**
- * @dataProvider buildUpdateClaimSummaryPovider
+ * @dataProvider buildUpdateClaimSummaryProvider
*
* @param Claim $originalClaim
* @param Claim $modifiedClaim
@@ -180,7 +209,8 @@
$claimSummaryBuilder = new ClaimSummaryBuilder(
'wbsetclaim',
new ClaimDiffer( new CallbackListDiffer( $comparer ) ),
- $idFormatter
+ $idFormatter,
+ $this->dataTypeLookup
);
$claims = new Claims();
--
To view, visit https://gerrit.wikimedia.org/r/80868
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I60de6baddfe0e76815176e4bdf5832f2bf7ed3e8
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Aude <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits