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 < tobias.gritschac...@wikimedia.de > + * @author Katie Filbert < aude.w...@gmail.com > */ 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 < tobias.gritschac...@wikimedia.de > */ 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 <aude.w...@gmail.com> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits