Daniel Kinzler has uploaded a new change for review.
https://gerrit.wikimedia.org/r/210051
Change subject: Track label usage with fallback from Lua.
......................................................................
Track label usage with fallback from Lua.
This change removed code that has become redundant by moving usage
tracking away from the rendering logic into decorators for the
lookup logic.
In addition, this change includes several modifications to test cases
to ensure that the SnakFormatter decorator is applied and configured
correctly.
Bug: T93056
Change-Id: I89abc34fe17d9be4377e65ef90f584836a47446f
---
M client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
M client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
M client/includes/DataAccess/Scribunto/SnakSerializationRenderer.php
M client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php
M client/includes/Usage/UsageAccumulator.php
M
client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
M
client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
M
client/tests/phpunit/includes/DataAccess/Scribunto/SnakSerializationRendererTest.php
M
client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php
M client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
10 files changed, 59 insertions(+), 136 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/51/210051/1
diff --git
a/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
b/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
index 1d6e1f9..9c99c4b 100644
---
a/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
+++
b/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibrary.php
@@ -1,13 +1,14 @@
<?php
use ValueFormatters\FormatterOptions;
+use Wikibase\Client\Usage\ParserOutputUsageAccumulator;
use Wikibase\Client\Usage\UsageTrackingSnakFormatter;
use Wikibase\DataAccess\StatementTransclusionInteractor;
use Wikibase\DataAccess\PropertyIdResolver;
use Wikibase\DataAccess\SnaksFinder;
use Wikibase\Client\DataAccess\Scribunto\WikibaseLuaEntityBindings;
-use Wikibase\Client\Usage\ParserOutputUsageAccumulator;
use Wikibase\Client\WikibaseClient;
+use Wikibase\LanguageFallbackChainFactory;
use Wikibase\Lib\SnakFormatter;
use Wikibase\Lib\PropertyLabelNotResolvedException;
@@ -42,15 +43,20 @@
$wikibaseClient = WikibaseClient::getDefaultInstance();
+ $languageFallbackChain =
$wikibaseClient->getLanguageFallbackChainFactory()->newFromLanguage(
+ $wgContLang,
+ LanguageFallbackChainFactory::FALLBACK_SELF |
LanguageFallbackChainFactory::FALLBACK_VARIANTS
+ );
+
$formatterOptions = new FormatterOptions( array(
SnakFormatter::OPT_LANG => $wgContLang->getCode() ) );
- $usageAccumulator = new ParserOutputUsageAccumulator(
$this->getParser()->getOutput() );
$snakFormatter = new UsageTrackingSnakFormatter(
$wikibaseClient->getSnakFormatterFactory()->getSnakFormatter(
- SnakFormatter::FORMAT_WIKI, $formatterOptions
+ SnakFormatter::FORMAT_WIKI,
+ $formatterOptions
),
- $usageAccumulator,
- array( $wgContLang->getCode() ) //FIXME: fallback
+ $this->getUsageAccumulator(),
+ $languageFallbackChain->getFetchLanguageCodes()
);
$entityLookup = $wikibaseClient->getStore()->getEntityLookup();
@@ -71,12 +77,18 @@
return new WikibaseLuaEntityBindings(
$entityStatementsRenderer,
$wikibaseClient->getEntityIdParser(),
- $usageAccumulator,
$wikibaseClient->getSettings()->getSetting(
'siteGlobalID' )
);
}
/**
+ * @return ParserOutputUsageAccumulator
+ */
+ public function getUsageAccumulator() {
+ return new ParserOutputUsageAccumulator(
$this->getParser()->getOutput() );
+ }
+
+ /**
* Register mw.wikibase.lua library
*
* @since 0.5
diff --git
a/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
b/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
index 153bfbe..2c69131 100644
--- a/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
+++ b/client/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibrary.php
@@ -2,6 +2,7 @@
use Deserializers\Exceptions\DeserializationException;
use ValueFormatters\FormatterOptions;
+use Wikibase\Client\Usage\UsageTrackingSnakFormatter;
use Wikibase\Client\Usage\UsageTrackingTermLookup;
use Wikibase\Lib\SnakFormatter;
use Wikibase\Client\DataAccess\Scribunto\EntityAccessor;
@@ -102,10 +103,16 @@
private function newSnakSerializationRenderer() {
$wikibaseClient = WikibaseClient::getDefaultInstance();
- $formatterOptions = new FormatterOptions( array( 'language' =>
$this->getLanguage() ) );
+ $formatterOptions = new FormatterOptions( array(
+ SnakFormatter::OPT_LANG =>
$this->getLanguage()->getCode()
+ ) );
- $snakFormatter =
$wikibaseClient->getSnakFormatterFactory()->getSnakFormatter(
- SnakFormatter::FORMAT_WIKI, $formatterOptions
+ $snakFormatter = new UsageTrackingSnakFormatter(
+
$wikibaseClient->getSnakFormatterFactory()->getSnakFormatter(
+ SnakFormatter::FORMAT_WIKI, $formatterOptions
+ ),
+ $this->getUsageAccumulator(),
+
$this->getLanguageFallbackChain()->getFetchLanguageCodes()
);
$snakDeserializer =
$wikibaseClient->getDeserializerFactory()->newSnakDeserializer();
@@ -115,8 +122,7 @@
$snakFormatter,
$snakDeserializer,
$this->getLanguage(),
- $snaksDeserializer,
- $this->getUsageAccumulator()
+ $snaksDeserializer
);
}
diff --git a/client/includes/DataAccess/Scribunto/SnakSerializationRenderer.php
b/client/includes/DataAccess/Scribunto/SnakSerializationRenderer.php
index e8a2617..d931db9 100644
--- a/client/includes/DataAccess/Scribunto/SnakSerializationRenderer.php
+++ b/client/includes/DataAccess/Scribunto/SnakSerializationRenderer.php
@@ -40,29 +40,21 @@
private $snakListDeserializer;
/**
- * @var UsageAccumulator
- */
- private $usageAccumulator;
-
- /**
* @param SnakFormatter $snakFormatter
* @param SnakDeserializer $snakDeserializer
* @param Language $language
* @param SnakListDeserializer $snakListDeserializer
- * @param UsageAccumulator $usageAccumulator
*/
public function __construct(
SnakFormatter $snakFormatter,
SnakDeserializer $snakDeserializer,
Language $language,
- SnakListDeserializer $snakListDeserializer,
- UsageAccumulator $usageAccumulator
+ SnakListDeserializer $snakListDeserializer
) {
$this->snakFormatter = $snakFormatter;
$this->snakDeserializer = $snakDeserializer;
$this->language = $language;
$this->snakListDeserializer = $snakListDeserializer;
- $this->usageAccumulator = $usageAccumulator;
}
/**
@@ -76,8 +68,6 @@
*/
public function renderSnak( array $snakSerialization ) {
$snak = $this->snakDeserializer->deserialize(
$snakSerialization );
-
- $this->usageAccumulator->addLabelUsageForSnak( $snak,
$this->language->getCode() );
return $this->snakFormatter->formatSnak( $snak );
}
@@ -99,9 +89,6 @@
}
$snaks = iterator_to_array( $snaks );
-
- $this->usageAccumulator->addLabelUsageForSnaks( $snaks,
$this->language->getCode() );
-
return $this->formatSnakList( $snaks );
}
diff --git a/client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php
b/client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php
index cda35c8..8b0c770 100644
--- a/client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php
+++ b/client/includes/DataAccess/Scribunto/WikibaseLuaEntityBindings.php
@@ -2,7 +2,6 @@
namespace Wikibase\Client\DataAccess\Scribunto;
-use Wikibase\Client\Usage\UsageAccumulator;
use Wikibase\DataAccess\StatementTransclusionInteractor;
use Wikibase\DataModel\Entity\EntityIdParser;
@@ -27,11 +26,6 @@
private $entityIdParser;
/**
- * @var UsageAccumulator
- */
- private $usageAccumulator;
-
- /**
* @var string
*/
private $siteId;
@@ -39,18 +33,15 @@
/**
* @param StatementTransclusionInteractor
$statementTransclusionInteractor
* @param EntityIdParser $entityIdParser
- * @param UsageAccumulator $usageAccumulator
* @param string $siteId
*/
public function __construct(
StatementTransclusionInteractor
$statementTransclusionInteractor,
EntityIdParser $entityIdParser,
- UsageAccumulator $usageAccumulator,
$siteId
) {
$this->statementTransclusionInteractor =
$statementTransclusionInteractor;
$this->entityIdParser = $entityIdParser;
- $this->usageAccumulator = $usageAccumulator;
$this->siteId = $siteId;
}
diff --git a/client/includes/Usage/UsageAccumulator.php
b/client/includes/Usage/UsageAccumulator.php
index 51c1f2a..44b7a98 100644
--- a/client/includes/Usage/UsageAccumulator.php
+++ b/client/includes/Usage/UsageAccumulator.php
@@ -41,27 +41,6 @@
}
/**
- * Registers the usage of an entity's label (in the given language), if
the provided
- * snak is a PropertyValueSnak that contains an EntityIdValue.
- *
- * @note We track any EntityIdValue as a label usage. This is making
assumptions about what the
- * respective formatter actually does. Ideally, the formatter itself
would perform the tracking,
- * but that seems nasty to model.
- *
- * @param Snak $snak
- * @param string|null $language
- */
- public function addLabelUsageForSnak( Snak $snak, $language = null ) {
- if ( $snak instanceof PropertyValueSnak ) {
- $value = $snak->getDataValue();
-
- if ( $value instanceof EntityIdValue ) {
- $this->addLabelUsage( $value->getEntityId(),
$language );
- }
- }
- }
-
- /**
* Registers the usage of an entity's label (in the given language).
*
* @param EntityId $id
diff --git
a/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
b/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
index ae0ab01..d3f8bad 100644
---
a/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
+++
b/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseEntityLibraryTest.php
@@ -72,6 +72,19 @@
);
}
+ public function testFormatPropertyValues_usage() {
+ $luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary();
+
+ $this->assertSame(
+ array( 'Q885588' ),
+ $luaWikibaseLibrary->formatPropertyValues( 'Q32488',
'P456', null )
+ );
+
+ $usages =
$luaWikibaseLibrary->getUsageAccumulator()->getUsages();
+ $this->assertArrayHasKey( 'Q885588#L.de', $usages );
+ $this->assertArrayHasKey( 'Q885588#T', $usages );
+ }
+
private function newScribuntoLuaWikibaseLibrary() {
$title = Title::newFromText( 'Whatever' );
$parser = new Parser();
diff --git
a/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
b/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
index 7749889..f96f2a4 100644
---
a/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
+++
b/client/tests/phpunit/includes/DataAccess/Scribunto/Scribunto_LuaWikibaseLibraryTest.php
@@ -116,13 +116,19 @@
public function testRenderSnak() {
$luaWikibaseLibrary = $this->newScribuntoLuaWikibaseLibrary();
- $entityArr = $luaWikibaseLibrary->getEntity( 'Q32487', false );
+ $entityArr = $luaWikibaseLibrary->getEntity( 'Q32488', false );
- $snak =
$entityArr[0]['claims']['P342'][1]['qualifiers']['P342'][1];
+ $snak = $entityArr[0]['claims']['P456'][1]['mainsnak'];
$this->assertSame(
- array( 'A qualifier Snak' ),
+ array( 'Q885588' ),
$luaWikibaseLibrary->renderSnak( $snak )
);
+
+ // When rendering the item reference in the snak,
+ // track table and title usage.
+ $usage =
$luaWikibaseLibrary->getUsageAccumulator()->getUsages();
+ $this->assertArrayHasKey( 'Q885588#L.de', $usage );
+ $this->assertArrayHasKey( 'Q885588#T', $usage );
}
public function testRenderSnak_invalidSerialization() {
diff --git
a/client/tests/phpunit/includes/DataAccess/Scribunto/SnakSerializationRendererTest.php
b/client/tests/phpunit/includes/DataAccess/Scribunto/SnakSerializationRendererTest.php
index 6d89f62..f9911c1 100644
---
a/client/tests/phpunit/includes/DataAccess/Scribunto/SnakSerializationRendererTest.php
+++
b/client/tests/phpunit/includes/DataAccess/Scribunto/SnakSerializationRendererTest.php
@@ -2,17 +2,13 @@
namespace Wikibase\Client\Tests\DataAccess\Scribunto;
+use DataValues\DataValue;
+use DataValues\StringValue;
use Language;
use PHPUnit_Framework_TestCase;
-use DataValues\StringValue;
-use DataValues\DataValue;
-use Wikibase\DataModel\Entity\EntityIdValue;
use Wikibase\Client\DataAccess\Scribunto\SnakSerializationRenderer;
-use Wikibase\Client\Usage\EntityUsage;
-use Wikibase\Client\Usage\HashUsageAccumulator;
-use Wikibase\Client\Usage\UsageAccumulator;
use Wikibase\Client\WikibaseClient;
-use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Entity\EntityIdValue;
use Wikibase\DataModel\Entity\PropertyId;
use Wikibase\DataModel\Snak\PropertyValueSnak;
use Wikibase\Lib\Serializers\SnakSerializer;
@@ -47,7 +43,7 @@
/**
* @return SnakSerializationRenderer
*/
- private function getSnakRenderer( UsageAccumulator $usageAccumulator ) {
+ private function getSnakRenderer() {
$wikibaseClient = WikibaseClient::getDefaultInstance();
$snakFormatter = $this->getMock( 'Wikibase\Lib\SnakFormatter' );
@@ -69,35 +65,15 @@
$snakFormatter,
$snakDeserializer,
Language::factory( 'en' ),
- $snaksDeserializer,
- $usageAccumulator
+ $snaksDeserializer
);
}
public function testRenderSnak() {
$snakSerialization = $this->getSnakSerialization( new
StringValue( 'foo bar foo' ) );
- $usageAccumulator = new HashUsageAccumulator();
- $snakRenderer = $this->getSnakRenderer( $usageAccumulator );
+ $snakRenderer = $this->getSnakRenderer();
$this->assertSame( 'foo bar foo', $snakRenderer->renderSnak(
$snakSerialization ) );
-
- $this->assertCount( 0, $usageAccumulator->getUsages() );
- }
-
- public function testRenderSnak_usage() {
- $Q42 = new ItemId( 'Q42' );
- $snakSerialization = $this->getSnakSerialization( new
EntityIdValue( $Q42 ) );
- $usageAccumulator = new HashUsageAccumulator();
- $snakRenderer = $this->getSnakRenderer( $usageAccumulator );
-
- $this->assertSame( 'Q42', $snakRenderer->renderSnak(
$snakSerialization ) );
- $usages = $usageAccumulator->getUsages();
-
- $this->assertCount( 1, $usages );
- $this->assertEquals(
- new EntityUsage( $Q42, EntityUsage::LABEL_USAGE, 'en' ),
- array_shift( $usages )
- );
}
public function provideRenderSnaks() {
@@ -121,35 +97,8 @@
* @dataProvider provideRenderSnaks
*/
public function testRenderSnaks( $expected, array $snaksSerialization )
{
- $usageAccumulator = new HashUsageAccumulator();
- $snakRenderer = $this->getSnakRenderer( $usageAccumulator );
+ $snakRenderer = $this->getSnakRenderer();
$this->assertSame( $expected, $snakRenderer->renderSnaks(
$snaksSerialization ) );
-
- $this->assertCount( 0, $usageAccumulator->getUsages() );
- }
-
- public function testRenderSnaks_usage() {
- $Q42 = new ItemId( 'Q42' );
- $Q43 = new ItemId( 'Q43' );
- $snaksSerialization = array( array() );
- $snaksSerialization[0][] = $this->getSnakSerialization( new
EntityIdValue( $Q42 ) );
- $snaksSerialization[0][] = $this->getSnakSerialization( new
EntityIdValue( $Q43 ) );
-
- $usageAccumulator = new HashUsageAccumulator();
- $snakRenderer = $this->getSnakRenderer( $usageAccumulator );
-
- $this->assertSame( 'Q42, Q43', $snakRenderer->renderSnaks(
$snaksSerialization ) );
- $usages = $usageAccumulator->getUsages();
-
- $this->assertCount( 2, $usages );
- $this->assertEquals(
- new EntityUsage( $Q42, EntityUsage::LABEL_USAGE, 'en' ),
- array_shift( $usages )
- );
- $this->assertEquals(
- new EntityUsage( $Q43, EntityUsage::LABEL_USAGE, 'en' ),
- array_shift( $usages )
- );
}
}
diff --git
a/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php
b/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php
index e125363..df3b29a 100644
---
a/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php
+++
b/client/tests/phpunit/includes/DataAccess/Scribunto/WikibaseLuaEntityBindingsTest.php
@@ -3,7 +3,6 @@
namespace Wikibase\Client\Tests\DataAccess\Scribunto;
use Wikibase\Client\DataAccess\Scribunto\WikibaseLuaEntityBindings;
-use Wikibase\Client\Usage\HashUsageAccumulator;
use Wikibase\DataModel\Entity\BasicEntityIdParser;
use Wikibase\DataModel\Entity\ItemId;
use Wikibase\DataModel\Statement\Statement;
@@ -24,8 +23,6 @@
* @return WikibaseLuaEntityBindings
*/
private function getWikibaseLuaEntityBindings() {
- $usageAccumulator = new HashUsageAccumulator();
-
$entityStatementsRenderer = $this->getMockBuilder(
'Wikibase\DataAccess\StatementTransclusionInteractor' )
->disableOriginalConstructor()
->getMock();
@@ -38,7 +35,6 @@
return new WikibaseLuaEntityBindings(
$entityStatementsRenderer,
new BasicEntityIdParser(),
- $usageAccumulator,
'enwiki'
);
}
diff --git
a/client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
b/client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
index 50421a5..e189ce0 100644
--- a/client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
+++ b/client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
@@ -36,7 +36,6 @@
}
public function testAddGetUsage() {
- $this->testAddAndGetLabelUsageForSnaks();
$this->testAddAndGetLabelUsage();
$this->testAddAndGetTitleUsage();
$this->testAddAndGetSiteLinksUsage();
@@ -45,9 +44,7 @@
$q2 = new ItemId( 'Q2' );
$q3 = new ItemId( 'Q3' );
- $q4 = new ItemId( 'Q4' );
$expected = array(
- new EntityUsage( $q4, EntityUsage::LABEL_USAGE, 'xx' ),
new EntityUsage( $q2, EntityUsage::LABEL_USAGE, 'xx' ),
new EntityUsage( $q2, EntityUsage::TITLE_USAGE ),
new EntityUsage( $q2, EntityUsage::SITELINK_USAGE ),
@@ -57,19 +54,6 @@
$usages = $this->usageAccumulator->getUsages();
$this->assertSameUsages( $expected, $usages );
- }
-
- private function testAddAndGetLabelUsageForSnaks() {
- $q4 = new ItemId( 'Q4' );
- $this->usageAccumulator->addLabelUsageForSnaks( array(
- new PropertyValueSnak( new PropertyId( 'P4' ), new
EntityIdValue( $q4 ) ),
- new PropertyValueSnak( new PropertyId( 'P5' ), new
StringValue( 'string' ) ),
- ), 'xx' );
-
- $expected = new EntityUsage( $q4, EntityUsage::LABEL_USAGE,
'xx' );
-
- $usages = $this->usageAccumulator->getUsages();
- $this->assertContainsUsage( $expected, $usages );
}
private function testAddAndGetLabelUsage() {
--
To view, visit https://gerrit.wikimedia.org/r/210051
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I89abc34fe17d9be4377e65ef90f584836a47446f
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Daniel Kinzler <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits