Matěj Suchánek has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/364236 )

Change subject: Track usage of unit labels
......................................................................

Track usage of unit labels

Parser functions like #property: and dedicated Lua functions
did not track usage of labels, which are used for human-readable
representation of units.

Bug: T170167
Change-Id: I37b184b295c7d78e9ee17b2445f54b71271fa6f3
---
M client/includes/DataAccess/DataAccessSnakFormatterFactory.php
M client/includes/Usage/UsageTrackingSnakFormatter.php
M client/includes/WikibaseClient.php
M 
client/tests/phpunit/includes/DataAccess/DataAccessSnakFormatterFactoryTest.php
M 
client/tests/phpunit/includes/DataAccess/PropertyParserFunction/StatementGroupRendererFactoryTest.php
M client/tests/phpunit/includes/Usage/UsageTrackingSnakFormatterTest.php
6 files changed, 97 insertions(+), 12 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/36/364236/1

diff --git a/client/includes/DataAccess/DataAccessSnakFormatterFactory.php 
b/client/includes/DataAccess/DataAccessSnakFormatterFactory.php
index 309030d..971dea8 100644
--- a/client/includes/DataAccess/DataAccessSnakFormatterFactory.php
+++ b/client/includes/DataAccess/DataAccessSnakFormatterFactory.php
@@ -6,6 +6,7 @@
 use ValueFormatters\FormatterOptions;
 use Wikibase\Client\Usage\UsageAccumulator;
 use Wikibase\Client\Usage\UsageTrackingSnakFormatter;
+use Wikibase\DataModel\Entity\EntityIdParser;
 use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup;
 use Wikibase\LanguageFallbackChainFactory;
 use Wikibase\Lib\Formatters\BinaryOptionDispatchingSnakFormatter;
@@ -39,14 +40,21 @@
         */
        private $propertyDataTypeLookup;
 
+       /**
+        * @var EntityIdParser
+        */
+       private $repoItemUriParser;
+
        public function __construct(
                LanguageFallbackChainFactory $languageFallbackChainFactory,
                OutputFormatSnakFormatterFactory $snakFormatterFactory,
-               PropertyDataTypeLookup $propertyDataTypeLookup
+               PropertyDataTypeLookup $propertyDataTypeLookup,
+               EntityIdParser $repoItemUriParser
        ) {
                $this->languageFallbackChainFactory = 
$languageFallbackChainFactory;
                $this->snakFormatterFactory = $snakFormatterFactory;
                $this->propertyDataTypeLookup = $propertyDataTypeLookup;
+               $this->repoItemUriParser = $repoItemUriParser;
        }
 
        /**
@@ -83,7 +91,8 @@
                return new UsageTrackingSnakFormatter(
                        $snakFormatter,
                        $usageAccumulator,
-                       $fallbackChain->getFetchLanguageCodes()
+                       $fallbackChain->getFetchLanguageCodes(),
+                       $this->repoItemUriParser
                );
        }
 
diff --git a/client/includes/Usage/UsageTrackingSnakFormatter.php 
b/client/includes/Usage/UsageTrackingSnakFormatter.php
index 77bd4a4..88d2625 100644
--- a/client/includes/Usage/UsageTrackingSnakFormatter.php
+++ b/client/includes/Usage/UsageTrackingSnakFormatter.php
@@ -2,7 +2,10 @@
 
 namespace Wikibase\Client\Usage;
 
+use DataValues\UnboundedQuantityValue;
 use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\DataModel\Entity\EntityIdParsingException;
 use Wikibase\DataModel\Entity\EntityIdValue;
 use Wikibase\DataModel\Snak\PropertyValueSnak;
 use Wikibase\DataModel\Snak\Snak;
@@ -34,14 +37,26 @@
        private $languages;
 
        /**
+        * @var EntityIdParser
+        */
+       private $repoItemUriParser;
+
+       /**
         * @param SnakFormatter $snakFormatter
         * @param UsageAccumulator $usageAccumulator
         * @param string[] $languages language codes to consider used for 
formatting
+        * @param EntityIdParser $repoItemUriParser
         */
-       public function __construct( SnakFormatter $snakFormatter, 
UsageAccumulator $usageAccumulator, array $languages ) {
+       public function __construct(
+               SnakFormatter $snakFormatter,
+               UsageAccumulator $usageAccumulator,
+               array $languages,
+               EntityIdParser $repoItemUriParser
+       ) {
                $this->snakFormatter = $snakFormatter;
                $this->usageAccumulator = $usageAccumulator;
                $this->languages = $languages;
+               $this->repoItemUriParser = $repoItemUriParser;
        }
 
        /**
@@ -57,8 +72,18 @@
 
                        if ( $value instanceof EntityIdValue ) {
                                $entityId = $value->getEntityId();
-                               $this->addLabelUsage( $value->getEntityId() );
+                               $this->addLabelUsage( $entityId );
                                $this->usageAccumulator->addTitleUsage( 
$entityId );
+                       } elseif ( $value instanceof UnboundedQuantityValue ) {
+                               $unit = $value->getUnit();
+                               try {
+                                       $entityId = 
$this->repoItemUriParser->parse( $unit );
+                               } catch ( EntityIdParsingException $e ) {
+                                       $entityId = null;
+                               }
+                               if ( $entityId ) {
+                                       $this->addLabelUsage( $entityId );
+                               }
                        }
                }
 
diff --git a/client/includes/WikibaseClient.php 
b/client/includes/WikibaseClient.php
index 3ff5487..7ee4eaa 100644
--- a/client/includes/WikibaseClient.php
+++ b/client/includes/WikibaseClient.php
@@ -1107,7 +1107,8 @@
                return new DataAccessSnakFormatterFactory(
                        $this->getLanguageFallbackChainFactory(),
                        $this->getSnakFormatterFactory(),
-                       $this->getPropertyDataTypeLookup()
+                       $this->getPropertyDataTypeLookup(),
+                       $this->getRepoItemUriParser()
                );
        }
 
diff --git 
a/client/tests/phpunit/includes/DataAccess/DataAccessSnakFormatterFactoryTest.php
 
b/client/tests/phpunit/includes/DataAccess/DataAccessSnakFormatterFactoryTest.php
index c92b9f9..62937f3 100644
--- 
a/client/tests/phpunit/includes/DataAccess/DataAccessSnakFormatterFactoryTest.php
+++ 
b/client/tests/phpunit/includes/DataAccess/DataAccessSnakFormatterFactoryTest.php
@@ -8,6 +8,7 @@
 use ValueFormatters\FormatterOptions;
 use Wikibase\Client\DataAccess\DataAccessSnakFormatterFactory;
 use Wikibase\Client\Usage\UsageAccumulator;
+use Wikibase\DataModel\Entity\EntityIdParser;
 use Wikibase\DataModel\Entity\PropertyId;
 use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup;
 use Wikibase\DataModel\Snak\PropertyValueSnak;
@@ -34,7 +35,8 @@
                return new DataAccessSnakFormatterFactory(
                        $this->getLanguageFallbackChainFactory(),
                        $this->getOutputFormatSnakFormatterFactory( 
$expectedFormat ),
-                       $this->getMock( PropertyDataTypeLookup::class )
+                       $this->getMock( PropertyDataTypeLookup::class ),
+                       $this->getMock( EntityIdParser::class )
                );
        }
 
diff --git 
a/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/StatementGroupRendererFactoryTest.php
 
b/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/StatementGroupRendererFactoryTest.php
index 86951fe..98b34d5 100644
--- 
a/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/StatementGroupRendererFactoryTest.php
+++ 
b/client/tests/phpunit/includes/DataAccess/PropertyParserFunction/StatementGroupRendererFactoryTest.php
@@ -16,6 +16,7 @@
 use Wikibase\Client\DataAccess\SnaksFinder;
 use Wikibase\Client\Usage\ParserOutputUsageAccumulator;
 use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdParser;
 use Wikibase\DataModel\Entity\EntityIdValue;
 use Wikibase\DataModel\Entity\Item;
 use Wikibase\DataModel\Entity\ItemId;
@@ -167,7 +168,8 @@
                        new DataAccessSnakFormatterFactory(
                                $this->getLanguageFallbackChainFactory(),
                                $formatterFactory,
-                               $this->getMock( PropertyDataTypeLookup::class )
+                               $this->getMock( PropertyDataTypeLookup::class ),
+                               $this->getMock( EntityIdParser::class )
                        ),
                        $allowDataAccessInUserLanguage
                );
@@ -193,7 +195,8 @@
                        new DataAccessSnakFormatterFactory(
                                $this->getLanguageFallbackChainFactory(),
                                $this->getSnakFormatterFactory(),
-                               $this->getMock( PropertyDataTypeLookup::class )
+                               $this->getMock( PropertyDataTypeLookup::class ),
+                               $this->getMock( EntityIdParser::class )
                        ),
                        $allowDataAccessInUserLanguage
                );
diff --git 
a/client/tests/phpunit/includes/Usage/UsageTrackingSnakFormatterTest.php 
b/client/tests/phpunit/includes/Usage/UsageTrackingSnakFormatterTest.php
index 587a1b4..340db5c 100644
--- a/client/tests/phpunit/includes/Usage/UsageTrackingSnakFormatterTest.php
+++ b/client/tests/phpunit/includes/Usage/UsageTrackingSnakFormatterTest.php
@@ -3,8 +3,10 @@
 namespace Wikibase\Client\Tests\Usage;
 
 use DataValues\StringValue;
+use DataValues\UnboundedQuantityValue;
 use Wikibase\Client\Usage\HashUsageAccumulator;
 use Wikibase\Client\Usage\UsageTrackingSnakFormatter;
+use Wikibase\DataModel\Entity\EntityIdParser;
 use Wikibase\DataModel\Entity\EntityIdValue;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Entity\PropertyId;
@@ -47,7 +49,8 @@
 
                $mockFormatter = $this->getMockSnakFormatter( 'formatSnak', 
'test' );
                $acc = new HashUsageAccumulator();
-               $formatter = new UsageTrackingSnakFormatter( $mockFormatter, 
$acc, [ 'ru', 'en' ] );
+               $formatter = new UsageTrackingSnakFormatter(
+                       $mockFormatter, $acc, [ 'ru', 'en' ], new 
EntityIdParser() );
 
                $formatter->formatSnak( $itemSnak );
 
@@ -57,13 +60,53 @@
                $this->assertArrayHasKey( 'Q1#T', $usages );
        }
 
+       /**
+        * @return EntityIdParser
+        */
+       private function getRepoItemUriParser() {
+               $parser = $this->getMock( EntityIdParser::class );
+               $parser->expects( $this->once() )
+                       ->method( 'parse' )
+                       ->will( $this->returnCallback( function ( $id ) {
+                               return $unit === '1' ? null : new ItemId( $id );
+                       } ) );
+
+               return $parser;
+       }
+
+       private function formatSnakQuantityProvider() {
+               return [
+                       [ '1', [] ],
+                       [ 'Q1', [ 'Q1#L.ru', 'Q1#L.en' ] ],
+               ];
+       }
+
+       /**
+        * @dataProvider formatSnakQuantityProvider
+        */
+       public function testFormatSnak_quantity( $unit, array $usages ) {
+               $p1 = new PropertyId( 'P1' );
+               $itemSnak = new PropertyValueSnak(
+                       $p1, UnboundedQuantityValue::newFromNumber( '1', $unit 
) );
+
+               $mockFormatter = $this->getMockSnakFormatter( 'formatSnak', 
'test' );
+               $acc = new HashUsageAccumulator();
+               $formatter = new UsageTrackingSnakFormatter(
+                       $mockFormatter, $acc, [ 'ru', 'en' ], 
$this->getRepoItemUriParser() );
+
+               $formatter->formatSnak( $itemSnak );
+
+               $this->assertEquals( $usages, $acc->getUsages() );
+       }
+
        public function testFormatSnak_novalue() {
                $p1 = new PropertyId( 'P1' );
                $novalueSnak = new PropertyNoValueSnak( $p1 );
 
                $mockFormatter = $this->getMockSnakFormatter( 'formatSnak', 
'test' );
                $acc = new HashUsageAccumulator();
-               $formatter = new UsageTrackingSnakFormatter( $mockFormatter, 
$acc, [ 'ru', 'en' ] );
+               $formatter = new UsageTrackingSnakFormatter(
+                       $mockFormatter, $acc, [ 'ru', 'en' ], new 
EntityIdParser() );
 
                $formatter->formatSnak( $novalueSnak );
                $this->assertEmpty( $acc->getUsages(), 'novalue' );
@@ -75,7 +118,8 @@
 
                $mockFormatter = $this->getMockSnakFormatter( 'formatSnak', 
'test' );
                $acc = new HashUsageAccumulator();
-               $formatter = new UsageTrackingSnakFormatter( $mockFormatter, 
$acc, [ 'ru', 'en' ] );
+               $formatter = new UsageTrackingSnakFormatter(
+                       $mockFormatter, $acc, [ 'ru', 'en' ], new 
EntityIdParser() );
 
                $formatter->formatSnak( $stringSnak );
                $this->assertEmpty( $acc->getUsages(), 'string value' );
@@ -86,7 +130,8 @@
 
                $acc = new HashUsageAccumulator();
 
-               $formatter = new UsageTrackingSnakFormatter( $mockFormatter, 
$acc, [ 'ru', 'en' ] );
+               $formatter = new UsageTrackingSnakFormatter(
+                       $mockFormatter, $acc, [ 'ru', 'en' ], new 
EntityIdParser() );
 
                $this->assertEquals( 'TEST', $formatter->getFormat(), 
'getFormat' );
                $this->assertCount( 0, $acc->getUsages() );

-- 
To view, visit https://gerrit.wikimedia.org/r/364236
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I37b184b295c7d78e9ee17b2445f54b71271fa6f3
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Matěj Suchánek <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to