jenkins-bot has submitted this change and it was merged.
Change subject: Rework standalone PageImagesDataUpdate into a
ParserOutputDataUpdate
......................................................................
Rework standalone PageImagesDataUpdate into a ParserOutputDataUpdate
This was intentionally left out in I5fba0e4 to avoid merge conflicts.
Bug: T112865
Bug: T114220
Change-Id: Ib6d7f24db21919d313b885a9974cb486b32bb6e7
---
M repo/includes/DataUpdates/PageImagesDataUpdate.php
M repo/includes/EntityParserOutputGenerator.php
M repo/includes/EntityParserOutputGeneratorFactory.php
M repo/includes/WikibaseRepo.php
M repo/tests/phpunit/includes/DataUpdates/PageImagesDataUpdateTest.php
5 files changed, 78 insertions(+), 48 deletions(-)
Approvals:
Daniel Kinzler: Looks good to me, approved
jenkins-bot: Verified
diff --git a/repo/includes/DataUpdates/PageImagesDataUpdate.php
b/repo/includes/DataUpdates/PageImagesDataUpdate.php
index 43f6eb9..944aa53 100644
--- a/repo/includes/DataUpdates/PageImagesDataUpdate.php
+++ b/repo/includes/DataUpdates/PageImagesDataUpdate.php
@@ -3,21 +3,22 @@
namespace Wikibase\Repo\DataUpdates;
use DataValues\StringValue;
+use ParserOutput;
use Wikibase\DataModel\Entity\PropertyId;
use Wikibase\DataModel\Snak\PropertyValueSnak;
use Wikibase\DataModel\Snak\Snak;
use Wikibase\DataModel\Statement\Statement;
-use Wikibase\DataModel\Statement\StatementList;
/**
- * Code to make the PageImages extension aware of pages in the Wikibase
namespaces.
+ * Code to make the PageImages extension aware of pages in the Wikibase
namespaces. The algorithm
+ * tries to find the one "best" image on an entity page, also referred to as
the "lead image".
*
* @since 0.5
*
* @licence GNU GPL v2+
* @author Thiemo Mättig
*/
-class PageImagesDataUpdate {
+class PageImagesDataUpdate implements StatementDataUpdate {
/**
* @var int[] Hash table of image property id strings pointing to
priorities (smaller numbers
@@ -36,42 +37,29 @@
private $bestRank;
/**
- * @var string
+ * @var string|null
*/
- private $bestFileName;
+ private $bestFileName = null;
/**
* @param string[] $imagePropertyIds List of image property id strings,
in order of preference.
*/
public function __construct( array $imagePropertyIds ) {
- $this->setPropertyIds( $imagePropertyIds );
+ $this->propertyPriorities = array_flip( array_unique(
array_values( $imagePropertyIds ) ) );
}
/**
- * @param string[] $ids
- */
- private function setPropertyIds( array $ids ) {
- $this->propertyPriorities = array_flip( array_unique(
array_values( $ids ) ) );
- }
-
- /**
- * @param StatementList $statements
+ * Returns the one "best" image file name found after processing all
statements.
*
* @return string|null The file's page name without the NS_FILE
namespace, or null if not found.
*/
- public function getBestImageFileName( StatementList $statements ) {
- $this->bestProperty = null;
- $this->bestRank = null;
- $this->bestFileName = null;
-
- foreach ( $statements->toArray() as $statement ) {
- $this->processStatement( $statement );
- }
-
+ public function getBestImageFileName() {
return $this->bestFileName;
}
/**
+ * @see StatementDataUpdate::processStatement
+ *
* @param Statement $statement
*/
public function processStatement( Statement $statement ) {
@@ -192,4 +180,14 @@
return $rank > $this->bestRank;
}
+ /**
+ * @see ParserOutputDataUpdate::updateParserOutput
+ *
+ * @param ParserOutput $parserOutput
+ */
+ public function updateParserOutput( ParserOutput $parserOutput ) {
+ // This property name is the only "soft dependency" on the
PageImages extension.
+ $parserOutput->setProperty( 'page_image', $this->bestFileName );
+ }
+
}
diff --git a/repo/includes/EntityParserOutputGenerator.php
b/repo/includes/EntityParserOutputGenerator.php
index 87d54e3..ccbd2ce 100644
--- a/repo/includes/EntityParserOutputGenerator.php
+++ b/repo/includes/EntityParserOutputGenerator.php
@@ -11,8 +11,6 @@
use Wikibase\DataModel\Entity\Item;
use Wikibase\DataModel\SiteLink;
use Wikibase\DataModel\SiteLinkList;
-use Wikibase\DataModel\Statement\StatementList;
-use Wikibase\DataModel\Statement\StatementListProvider;
use Wikibase\DataModel\Term\FingerprintProvider;
use Wikibase\Lib\Store\EntityInfo;
use Wikibase\Lib\Store\EntityInfoBuilderFactory;
@@ -20,10 +18,8 @@
use Wikibase\Lib\Store\EntityTitleLookup;
use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookup;
use Wikibase\Repo\DataUpdates\EntityParserOutputDataUpdater;
-use Wikibase\Repo\DataUpdates\PageImagesDataUpdate;
use Wikibase\Repo\LinkedData\EntityDataFormatProvider;
use Wikibase\Repo\View\RepoSpecialPageLinker;
-use Wikibase\Repo\WikibaseRepo;
use Wikibase\View\EmptyEditSectionGenerator;
use Wikibase\View\EntityViewFactory;
use Wikibase\View\Template\TemplateFactory;
@@ -151,11 +147,6 @@
$configVars = $this->configBuilder->build( $entity );
$parserOutput->addJsConfigVars( $configVars );
- // FIXME: Rework this to use the visitor infrastructure above!
- if ( $entity instanceof StatementListProvider ) {
- $this->addBestImageToParserOutput( $parserOutput,
$entity->getStatements() );
- }
-
// FIXME: OCP violation -
https://phabricator.wikimedia.org/T75495
if ( $entity instanceof Item ) {
$this->addBadgesToParserOutput( $parserOutput,
$entity->getSiteLinkList() );
@@ -190,19 +181,6 @@
}
return $parserOutput;
- }
-
- private function addBestImageToParserOutput( ParserOutput
$parserOutput, StatementList $statements ) {
- $repo = WikibaseRepo::getDefaultInstance();
- // TODO: Inject this setting!
- $propertyIds = $repo->getSettings()->getSetting(
'preferredPageImagesProperties' );
-
- if ( !empty( $propertyIds ) ) {
- $dataUpdate = new PageImagesDataUpdate( $propertyIds );
- $fileName = $dataUpdate->getBestImageFileName(
$statements );
- // This property name is the only "soft dependency" on
the PageImages extension.
- $parserOutput->setProperty( 'page_image', $fileName );
- }
}
/**
diff --git a/repo/includes/EntityParserOutputGeneratorFactory.php
b/repo/includes/EntityParserOutputGeneratorFactory.php
index 5cf37b6..a096f2b 100644
--- a/repo/includes/EntityParserOutputGeneratorFactory.php
+++ b/repo/includes/EntityParserOutputGeneratorFactory.php
@@ -12,6 +12,7 @@
use Wikibase\Repo\DataUpdates\ExternalLinksDataUpdate;
use Wikibase\Repo\DataUpdates\GeoDataDataUpdate;
use Wikibase\Repo\DataUpdates\ImageLinksDataUpdate;
+use Wikibase\Repo\DataUpdates\PageImagesDataUpdate;
use Wikibase\Repo\DataUpdates\ParserOutputDataUpdate;
use Wikibase\Repo\DataUpdates\ReferencedEntitiesDataUpdate;
use Wikibase\Repo\LinkedData\EntityDataFormatProvider;
@@ -71,6 +72,23 @@
*/
private $preferredGeoDataProperties;
+ /**
+ * @var string[]
+ */
+ private $preferredPageImagesProperties;
+
+ /**
+ * @param EntityViewFactory $entityViewFactory
+ * @param EntityInfoBuilderFactory $entityInfoBuilderFactory
+ * @param EntityTitleLookup $entityTitleLookup
+ * @param LanguageFallbackChainFactory $languageFallbackChainFactory
+ * @param TemplateFactory $templateFactory
+ * @param EntityDataFormatProvider $entityDataFormatProvider
+ * @param PropertyDataTypeLookup $propertyDataTypeLookup
+ * @param EntityIdParser $externalEntityIdParser
+ * @param string[] $preferredGeoDataProperties
+ * @param string[] $preferredPageImagesProperties
+ */
public function __construct(
EntityViewFactory $entityViewFactory,
EntityInfoBuilderFactory $entityInfoBuilderFactory,
@@ -80,7 +98,8 @@
EntityDataFormatProvider $entityDataFormatProvider,
PropertyDataTypeLookup $propertyDataTypeLookup,
EntityIdParser $externalEntityIdParser,
- array $preferredGeoDataProperties
+ array $preferredGeoDataProperties = array(),
+ array $preferredPageImagesProperties = array()
) {
$this->entityViewFactory = $entityViewFactory;
$this->entityInfoBuilderFactory = $entityInfoBuilderFactory;
@@ -91,6 +110,7 @@
$this->propertyDataTypeLookup = $propertyDataTypeLookup;
$this->externalEntityIdParser = $externalEntityIdParser;
$this->preferredGeoDataProperties = $preferredGeoDataProperties;
+ $this->preferredPageImagesProperties =
$preferredPageImagesProperties;
}
/**
@@ -151,6 +171,10 @@
new ImageLinksDataUpdate( $propertyDataTypeMatcher )
);
+ if ( !empty( $this->preferredPageImagesProperties ) ) {
+ $dataUpdates[] = new PageImagesDataUpdate(
$this->preferredPageImagesProperties );
+ }
+
if ( class_exists( 'GeoData' ) ) {
$dataUpdates[] = new GeoDataDataUpdate(
$propertyDataTypeMatcher,
diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php
index 6ddb0cc..52abad4 100644
--- a/repo/includes/WikibaseRepo.php
+++ b/repo/includes/WikibaseRepo.php
@@ -1344,7 +1344,8 @@
$entityDataFormatProvider,
$this->getPropertyDataTypeLookup(),
$this->getLocalEntityUriParser(),
- $this->settings->getSetting(
'preferredGeoDataProperties' )
+ $this->settings->getSetting(
'preferredGeoDataProperties' ),
+ $this->settings->getSetting(
'preferredPageImagesProperties' )
);
}
diff --git
a/repo/tests/phpunit/includes/DataUpdates/PageImagesDataUpdateTest.php
b/repo/tests/phpunit/includes/DataUpdates/PageImagesDataUpdateTest.php
index 6be288d..f7fbb2c 100644
--- a/repo/tests/phpunit/includes/DataUpdates/PageImagesDataUpdateTest.php
+++ b/repo/tests/phpunit/includes/DataUpdates/PageImagesDataUpdateTest.php
@@ -79,7 +79,36 @@
$expected
) {
$instance = $this->newInstance( $propertyIds );
- $this->assertSame( $expected, $instance->getBestImageFileName(
$statements ) );
+
+ foreach ( $statements as $statement ) {
+ $instance->processStatement( $statement );
+ }
+
+ $this->assertSame( $expected, $instance->getBestImageFileName()
);
+ }
+
+ /**
+ * @dataProvider bestImageProvider
+ */
+ public function testUpdateParserOutput(
+ StatementList $statements,
+ array $propertyIds,
+ $expected
+ ) {
+ $parserOutput = $this->getMockBuilder( 'ParserOutput' )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $parserOutput->expects( $this->once() )
+ ->method( 'setProperty' )
+ ->with( 'page_image', $expected );
+
+ $instance = $this->newInstance( $propertyIds );
+
+ foreach ( $statements as $statement ) {
+ $instance->processStatement( $statement );
+ }
+
+ $instance->updateParserOutput( $parserOutput );
}
public function bestImageProvider() {
--
To view, visit https://gerrit.wikimedia.org/r/246192
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ib6d7f24db21919d313b885a9974cb486b32bb6e7
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits