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

Reply via email to