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

Reply via email to