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) <thiemo.maet...@wikimedia.de> Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits