Bene has uploaded a new change for review. https://gerrit.wikimedia.org/r/145560
Change subject: Create a badge lookup to get the titles for badges ...................................................................... Create a badge lookup to get the titles for badges This patch introduces a new class BadgeLookup which looks up the labels of all badge items and caches them. If an item does not have a label in the specified language, its serialized item id is used as a title instead. Change-Id: Ib868f13c93b54d7d99ce15e5da8407d733c2740e --- A repo/includes/BadgeLookup.php M repo/includes/WikibaseRepo.php A repo/tests/phpunit/includes/BadgeLookupTest.php 3 files changed, 181 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/60/145560/1 diff --git a/repo/includes/BadgeLookup.php b/repo/includes/BadgeLookup.php new file mode 100644 index 0000000..ef9039d --- /dev/null +++ b/repo/includes/BadgeLookup.php @@ -0,0 +1,91 @@ +<?php + +namespace Wikibase\Repo; + +use Language; +use Wikibase\DataModel\Entity\ItemId; +use Wikibase\EntityInfoBuilder; + +/** + * Looks up badges + * + * @licence GNU GPL v2+ + * @author Bene* < benestar.wikime...@gmail.com > + */ +class BadgeLookup { + + /** + * @var string + */ + private $languageCode; + + /** + * @var array + */ + private $badgeItems; + + /** + * @var EntityInfoBuilder + */ + private $entityInfoBuilder; + + /** + * @var array|null + */ + private $badgeTitles = null; + + public function __construct( Language $language, array $badgeItems, EntityInfoBuilder $entityInfoBuilder ) { + $this->languageCode = $language->getCode(); + $this->badgeItems = $badgeItems; + $this->entityInfoBuilder = $entityInfoBuilder; + } + + /** + * Returns the titles for all available badges. + * + * @return array + */ + public function getBadgeTitles() { + if ( $this->badgeTitles === null ) { + $this->badgeTitles = $this->lookupBadgeTitles(); + } + + return $this->badgeTitles; + } + + /** + * Returns the title for the given badge id. + * + * @param ItemId $badgeId + * @return string|null + */ + public function getBadgeTitle( ItemId $badgeId ) { + $titles = $this->getBadgeTitles(); + $badgeId = $badgeId->getSerialization(); + return isset( $titles[$badgeId] ) ? $titles[$badgeId] : null; + } + + /** + * Looksup the lables for all badges and uses them as titles. + * + * @return array + */ + private function lookupBadgeTitles() { + $itemIds = array(); + foreach ( $this->badgeItems as $badgeId => $value ) { + $itemIds[] = new ItemId( $badgeId ); + } + + $entityInfo = $this->entityInfoBuilder->buildEntityInfo( $itemIds ); + $this->entityInfoBuilder->addTerms( $entityInfo, array( 'label' ), array( $this->languageCode ) ); + + $titles = array(); + foreach ( $this->badgeItems as $badgeId => $value ) { + $titles[$badgeId] = isset( $entityInfo[$badgeId]['labels'][$this->languageCode] ) ? + $entityInfo[$badgeId]['labels'][$this->languageCode]['value'] : $badgeId; + } + + return $titles; + } + +} diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php index fed3171..9bd3d1d 100644 --- a/repo/includes/WikibaseRepo.php +++ b/repo/includes/WikibaseRepo.php @@ -153,6 +153,11 @@ private $store; /** + * @var BadgeLookup + */ + private $badgeLookup = null; + + /** * Returns the default instance constructed using newInstance(). * IMPORTANT: Use only when it is not feasible to inject an instance properly. * @@ -890,4 +895,21 @@ return array( 'Wikibase\Lib\Serializers\LegacyInternalEntitySerializer', 'isBlobUsingLegacyFormat' ); } + /** + * @return BadgeLookup + */ + public function getBadgeLookup() { + global $wgLang; + + if ( $this->badgeLookup === null ) { + $this->badgeLookup = new BadgeLookup( + $wgLang, + $this->getSettings()->getSetting( 'badgeItems' ), + $this->getStore()->getEntityInfoBuilder() + ); + } + + return $this->badgeLookup; + } + } diff --git a/repo/tests/phpunit/includes/BadgeLookupTest.php b/repo/tests/phpunit/includes/BadgeLookupTest.php new file mode 100644 index 0000000..ec3013d --- /dev/null +++ b/repo/tests/phpunit/includes/BadgeLookupTest.php @@ -0,0 +1,68 @@ +<?php + +namespace Wikibase\Tests\Repo; + +use Language; +use Wikibase\DataModel\Entity\Item; +use Wikibase\DataModel\Entity\ItemId; +use Wikibase\Repo\WikibaseRepo; +use Wikibase\Repo\BadgeLookup; + +/** + * @covers Wikibase\Repo\BadgeLookup + * + * @group Wikibase + * @group WikibaseRepo + * @group WikibaseRepoTest + * + * @licence GNU GPL v2+ + * @author Bene* < benestar.wikime...@gmail.com > + */ +class ValueParserFactoryTest extends \MediaWikiTestCase { + + /** + * @var array + */ + private static $badgeItems = null; + + public function setUp() { + parent::setUp(); + + if ( self::$badgeItems === null ) { + $this->createItems(); + } + } + + private function createItems() { + $store = WikibaseRepo::getDefaultInstance()->getEntityStore(); + self::$badgeItems = array(); + + foreach ( array( 'foo', 'bar', null, 'baz', null ) as $label ) { + $item = Item::newEmpty(); + if ( $label !== null ) { + $item->setLabel( 'en', $label ); + } + $store->saveEntity( $item, 'testing', $GLOBALS['wgUser'], EDIT_NEW ); + $badgeId = $item->getId()->getSerialization(); + self::$badgeItems[$badgeId] = $label === null ? $badgeId : $label; + } + } + + public function testGetBadgeTitles() { + $badgeLookup = new BadgeLookup( + Language::factory( 'en' ), + self::$badgeItems, + WikibaseRepo::getDefaultInstance()->getStore()->getEntityInfoBuilder() + ); + + $this->assertEquals( + self::$badgeItems, + $badgeLookup->getBadgeTitles() + ); + + foreach ( self::$badgeItems as $badgeId => $title ) { + $this->assertEquals( $title, $badgeLookup->getBadgeTitle( new ItemId( $badgeId ) ) ); + } + } + +} -- To view, visit https://gerrit.wikimedia.org/r/145560 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib868f13c93b54d7d99ce15e5da8407d733c2740e Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Bene <benestar.wikime...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits