jenkins-bot has submitted this change and it was merged.

Change subject: Provides a default to otherProjectsLinks configuration parameter
......................................................................


Provides a default to otherProjectsLinks configuration parameter

Deploy: Requires the "otherProjectsLinks" setting to be set
on client
Change-Id: Ie6ccb218e835991f57b3283cfa75d3934cc5cf1f
---
M client/WikibaseClient.hooks.php
M client/config/WikibaseClient.default.php
A client/includes/OtherProjectsSitesProvider.php
M client/includes/WikibaseClient.php
A client/tests/phpunit/includes/OtherProjectsSitesProviderTest.php
M client/tests/phpunit/includes/WikibaseClientTest.php
6 files changed, 322 insertions(+), 14 deletions(-)

Approvals:
  Aude: Looks good to me, approved
  WikidataJenkins: Verified
  Daniel Kinzler: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/client/WikibaseClient.hooks.php b/client/WikibaseClient.hooks.php
index 26372b4..62f3d04 100644
--- a/client/WikibaseClient.hooks.php
+++ b/client/WikibaseClient.hooks.php
@@ -35,6 +35,7 @@
 use Wikibase\Client\Hooks\OtherProjectsSidebarGenerator;
 use Wikibase\Client\Hooks\SpecialWatchlistQueryHandler;
 use Wikibase\Client\MovePageNotice;
+use Wikibase\Client\OtherProjectsSitesProvider;
 use Wikibase\Client\WikibaseClient;
 
 /**
@@ -621,22 +622,15 @@
        public static function onSkinBuildSidebar( Skin $skin, &$bar ) {
                $settings = WikibaseClient::getDefaultInstance()->getSettings();
 
-               $siteIdsToOutput = $settings->getSetting( 'otherProjectsLinks' 
);
                if (
-                       !$settings->getSetting( 'otherProjectsLinksBeta' ) && 
!$settings->getSetting( 'otherProjectsLinksByDefault' ) ||
-                       count( $siteIdsToOutput ) === 0
+                       !$settings->getSetting( 'otherProjectsLinksBeta' ) &&
+                       !$settings->getSetting( 'otherProjectsLinksByDefault' )
                ) {
                        return true;
                }
 
-               $generator = new OtherProjectsSidebarGenerator(
-                       $settings->getSetting( 'siteGlobalID' ),
-                       
WikibaseClient::getDefaultInstance()->getStore()->getSiteLinkTable(),
-                       WikibaseClient::getDefaultInstance()->getSiteStore(),
-                       $siteIdsToOutput
-               );
-
-               $otherProjectsSidebar = $generator->buildProjectLinkSidebar( 
$skin->getContext()->getTitle() );
+               $otherProjectsSidebarGenerator = 
WikibaseClient::getDefaultInstance()->getOtherProjectsSidebarGenerator();
+               $otherProjectsSidebar = 
$otherProjectsSidebarGenerator->buildProjectLinkSidebar( 
$skin->getContext()->getTitle() );
                if ( count( $otherProjectsSidebar ) !== 0 ) {
                        $bar['wikibase-otherprojects'] = $otherProjectsSidebar;
                }
diff --git a/client/config/WikibaseClient.default.php 
b/client/config/WikibaseClient.default.php
index 68a9a02..1184213 100644
--- a/client/config/WikibaseClient.default.php
+++ b/client/config/WikibaseClient.default.php
@@ -1,5 +1,6 @@
 <?php
 
+use Wikibase\Client\WikibaseClient;
 use Wikibase\SettingsArray;
 
 /**
@@ -37,7 +38,6 @@
                ),
                'allowDataTransclusion' => true,
                'propagateChangesToRepo' => true,
-               'otherProjectsLinks' => array(),
                'otherProjectsLinksByDefault' => false,
                'otherProjectsLinksBeta' => false,
                // List of additional CSS class names for site links that have 
badges, e.g.
@@ -239,6 +239,11 @@
                return null;
        };
 
+       $defaults['otherProjectsLinks'] = function ( SettingsArray $settings ) {
+               $otherProjectsSitesProvider = 
WikibaseClient::getDefaultInstance()->getOtherProjectsSitesProvider();
+               return $otherProjectsSitesProvider->getOtherProjectsSiteIds( 
$settings->getSetting( 'siteLinkGroups' ) );
+       };
+
        // Prefix to use for cache keys that should be shared among
        // a wikibase repo and all its clients.
        // In order to share caches between clients (and the repo)
diff --git a/client/includes/OtherProjectsSitesProvider.php 
b/client/includes/OtherProjectsSitesProvider.php
new file mode 100644
index 0000000..802e58f
--- /dev/null
+++ b/client/includes/OtherProjectsSitesProvider.php
@@ -0,0 +1,109 @@
+<?php
+
+namespace Wikibase\Client;
+
+use Site;
+use SiteList;
+use SiteStore;
+
+/**
+ * Provides a list of sites that should be displayed in the "other project" 
sidebar
+ *
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Thomas Pellissier Tanon
+ * @author Marius Hoch < h...@online.de >
+ */
+class OtherProjectsSitesProvider {
+
+       /**
+        * @param SiteStore $siteStore
+        */
+       private $siteStore;
+
+       /**
+        * @var Site
+        */
+       private $currentSite;
+
+       /**
+        * @param SiteStore $siteStore
+        * @param Site $currentSite
+        */
+       public function __construct( SiteStore $siteStore, Site $currentSite ) {
+               $this->siteStore = $siteStore;
+               $this->currentSite = $currentSite;
+       }
+
+       /**
+        * Provides a list of sites to link to in the "other project" sidebar
+        *
+        * This list contains the wiki in the same language if it exists for 
each other site groups and the wikis alone in their
+        * sites groups (like commons)
+        *
+        * @param string[] $supportedSiteGroupIds
+        *
+        * @return SiteList
+        */
+       public function getOtherProjectsSites( array $supportedSiteGroupIds ) {
+               $currentGroupId = $this->currentSite->getGroup();
+               $otherProjectsSites = new SiteList();
+
+               foreach ( $supportedSiteGroupIds as $groupId ) {
+                       if ( $groupId === $currentGroupId ) {
+                               continue;
+                       }
+
+                       $siteToAdd = $this->getSiteForGroup( $groupId );
+                       if ( $siteToAdd ) {
+                               $otherProjectsSites[] = $siteToAdd;
+                       }
+               }
+
+               return $otherProjectsSites;
+       }
+
+       /**
+        * Get the site ids of other projects to use.
+        *
+        * @param array $supportedSiteGroupIds
+        * @return string[]
+        */
+       public function getOtherProjectsSiteIds( array $supportedSiteGroupIds ) 
{
+               $otherProjectsSites = $this->getOtherProjectsSites( 
$supportedSiteGroupIds );
+
+               $otherProjectsSiteIds = array();
+               foreach ( $otherProjectsSites as $site ) {
+                       $otherProjectsSiteIds[] = $site->getGlobalId();
+               }
+
+               return $otherProjectsSiteIds;
+       }
+
+       /**
+        * Returns the site to link to for a given group or null
+        *
+        * If there is only one site in this group (like for commons) this site 
is returned else the site in the same language
+        * as the current site is returned
+        *
+        * @param string $groupId
+        *
+        * @return Site|null
+        */
+       private function getSiteForGroup( $groupId ) {
+               $siteGroupList = $this->siteStore->getSites()->getGroup( 
$groupId );
+               if ( $siteGroupList->count() === 1 ) {
+                       return $siteGroupList[0];
+               }
+
+               $currentLanguageCode = $this->currentSite->getLanguageCode();
+               foreach ( $siteGroupList as $site ) {
+                       if ( $site->getLanguageCode() === $currentLanguageCode 
) {
+                               return $site;
+                       }
+               }
+
+               return null;
+       }
+}
\ No newline at end of file
diff --git a/client/includes/WikibaseClient.php 
b/client/includes/WikibaseClient.php
index 1a12d89..5e48a5d 100644
--- a/client/includes/WikibaseClient.php
+++ b/client/includes/WikibaseClient.php
@@ -10,11 +10,11 @@
 use LogicException;
 use MediaWikiSite;
 use MWException;
-use Serializers\Serializer;
 use Site;
 use SiteSQLStore;
 use SiteStore;
 use ValueFormatters\FormatterOptions;
+use Wikibase\Client\Hooks\OtherProjectsSidebarGenerator;
 use Wikibase\ClientStore;
 use Wikibase\Client\Hooks\ParserFunctionRegistrant;
 use Wikibase\DataAccess\PropertyParserFunction\RendererFactory;
@@ -638,6 +638,21 @@
                );
        }
 
+       /**
+        * @since 0.5
+        *
+        * @return OtherProjectsSidebarGenerator
+        */
+       public function getOtherProjectsSidebarGenerator() {
+               $settings = $this->getSettings();
+
+               return new OtherProjectsSidebarGenerator(
+                       $settings->getSetting( 'siteGlobalID' ),
+                       $this->getStore()->getSiteLinkTable(),
+                       $this->getSiteStore(),
+                       $settings->getSetting( 'otherProjectsLinks' )
+               );
+       }
 
        /**
         * @since 0.5
@@ -694,4 +709,10 @@
                );
        }
 
+       /**
+        * @return OtherProjectsSitesProvider
+        */
+       public function getOtherProjectsSitesProvider() {
+               return new OtherProjectsSitesProvider( $this->getSiteStore(), 
$this->getSite() );
+       }
 }
diff --git a/client/tests/phpunit/includes/OtherProjectsSitesProviderTest.php 
b/client/tests/phpunit/includes/OtherProjectsSitesProviderTest.php
new file mode 100644
index 0000000..2d91001
--- /dev/null
+++ b/client/tests/phpunit/includes/OtherProjectsSitesProviderTest.php
@@ -0,0 +1,154 @@
+<?php
+
+namespace Wikibase\Client\Test;
+
+use MediaWikiSite;
+use Site;
+use SiteList;
+use SiteStore;
+use Wikibase\Client\OtherProjectsSitesProvider;
+use Wikibase\Client\WikibaseClient;
+use Wikibase\Test\MockSiteStore;
+
+/**
+ * @covers Wikibase\Client\OtherProjectsSitesProvider
+ *
+ * @since 0.5
+ *
+ * @group WikibaseClient
+ * @group Wikibase
+ * @group Database
+ * @group WikibaseIntegration
+ *
+ * @licence GNU GPL v2+
+ * @author Thomas Pellissier Tanon
+ * @author Marius Hoch < h...@online.de >
+ */
+class OtherProjectsSitesProviderTest extends \MediaWikiTestCase {
+
+       /**
+        * @dataProvider otherProjectSitesProvider
+        */
+       public function testOtherProjectSites( array $supportedSites, Site 
$inputSite, SiteList $expectedSites ) {
+               $siteStore = $this->getSiteStoreMock();
+
+               $otherProjectsSitesProvider = new OtherProjectsSitesProvider( 
$siteStore, $inputSite );
+
+               $this->assertEquals(
+                       $expectedSites,
+                       $otherProjectsSitesProvider->getOtherProjectsSites( 
$supportedSites )
+               );
+       }
+
+       /**
+        * @dataProvider otherProjectSitesProvider
+        */
+       public function testOtherProjectSiteIds( array $supportedSites, Site 
$inputSite, SiteList $expectedSites ) {
+               $siteStore = $this->getSiteStoreMock();
+               $otherProjectsSitesProvider = new OtherProjectsSitesProvider( 
$siteStore, $inputSite );
+
+               $expectedSiteIds = array();
+               foreach ( $expectedSites as $site ) {
+                       $expectedSiteIds[] = $site->getGlobalId();
+               }
+
+               $this->assertEquals(
+                       $expectedSiteIds,
+                       $otherProjectsSitesProvider->getOtherProjectsSiteIds( 
$supportedSites )
+               );
+       }
+
+       public function otherProjectSitesProvider() {
+               $siteStore = $this->getSiteStoreMock();
+               $tests = array();
+
+               $result = new SiteList();
+               $result[] = $siteStore->getSite( 'frwiki' );
+               $tests['Same language'] = array(
+                       array( 'wikipedia', 'wikisource' ),
+                       $siteStore->getSite( 'frwikisource' ),
+                       $result
+               );
+
+               $result = new SiteList();
+               $result[] = $siteStore->getSite( 'frwiki' );
+               $result[] = $siteStore->getSite( 'commonswiki' );
+               $tests['Same language + only one in group'] = array(
+                       array( 'wikipedia', 'wikisource', 'commons' ),
+                       $siteStore->getSite( 'frwikisource' ),
+                       $result
+               );
+
+               $result = new SiteList();
+               $result[] = $siteStore->getSite( 'commonswiki' );
+               $tests['Only one in group'] = array(
+                       array( 'wikipedia', 'wikisource', 'commons' ),
+                       $siteStore->getSite( 'eswiki' ),
+                       $result
+               );
+
+               $result = new SiteList();
+               $tests['No other sites'] = array(
+                       array( 'wikipedia', 'wikisource' ),
+                       $siteStore->getSite( 'eswiki' ),
+                       $result
+               );
+
+               return $tests;
+       }
+
+       /**
+        * @return MockSiteStore
+        */
+       private function getSiteStoreMock() {
+               $sites = array();
+
+               $site = new Site();
+               $site->setGlobalId( 'foo' );
+               $site->setLanguageCode( 'en' );
+               $sites[] = $site;
+
+               $site = new Site();
+               $site->setGlobalId( 'bar' );
+               $site->setLanguageCode( 'fr' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'enwiki' );
+               $site->setGroup( 'wikipedia' );
+               $site->setLanguageCode( 'en' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'frwiki' );
+               $site->setGroup( 'wikipedia' );
+               $site->setLanguageCode( 'fr' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'frwikisource' );
+               $site->setGroup( 'wikisource' );
+               $site->setLanguageCode( 'fr' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'nlwikisource' );
+               $site->setGroup( 'wikisource' );
+               $site->setLanguageCode( 'nl' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'eswiki' );
+               $site->setGroup( 'wikipedia' );
+               $site->setLanguageCode( 'es' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'commonswiki' );
+               $site->setGroup( 'commons' );
+               $site->setLanguageCode( 'en' );
+               $sites[] = $site;
+
+               return new MockSiteStore( $sites );
+       }
+}
\ No newline at end of file
diff --git a/client/tests/phpunit/includes/WikibaseClientTest.php 
b/client/tests/phpunit/includes/WikibaseClientTest.php
index 3e41080..7286d93 100644
--- a/client/tests/phpunit/includes/WikibaseClientTest.php
+++ b/client/tests/phpunit/includes/WikibaseClientTest.php
@@ -9,7 +9,6 @@
 use Wikibase\Client\WikibaseClient;
 use Wikibase\DataModel\Entity\Item;
 use Wikibase\Lib\SnakFormatter;
-use Wikibase\Settings;
 use Wikibase\SettingsArray;
 
 /**
@@ -171,6 +170,32 @@
                $this->assertInstanceOf( 
'Wikibase\Client\ClientSiteLinkLookup', $returnValue );
        }
 
+       public function testGetOtherProjectsSidebarGeneratorReturnType() {
+               $settings = $this->getDefaultInstance()->getSettings();
+
+               $otherProjectsLinks = $settings->getSetting( 
'otherProjectsLinks' );
+
+               $settings->setSetting( 'otherProjectsLinks', array( 'my_wiki' ) 
);
+
+               $returnValue = 
$this->getDefaultInstance()->getOtherProjectsSidebarGenerator();
+               $this->assertInstanceOf( 
'Wikibase\Client\Hooks\OtherProjectsSidebarGenerator', $returnValue );
+
+               $settings->setSetting( 'otherProjectsLinks', 
$otherProjectsLinks );
+       }
+
+       public function testGetOtherProjectsSitesProvider() {
+               $settings = $this->getDefaultInstance()->getSettings();
+
+               $siteGlobalID = $settings->getSetting( 'siteGlobalID' );
+
+               $settings->setSetting( 'siteGlobalID', 'enwiki' );
+
+               $returnValue = 
$this->getDefaultInstance()->getOtherProjectsSitesProvider();
+               $this->assertInstanceOf( 
'Wikibase\Client\OtherProjectsSitesProvider', $returnValue );
+
+               $settings->setSetting( 'siteGlobalID', $siteGlobalID );
+       }
+
        public function testGetDefaultInstance() {
                $this->assertSame(
                        WikibaseClient::getDefaultInstance(),

-- 
To view, visit https://gerrit.wikimedia.org/r/132613
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ie6ccb218e835991f57b3283cfa75d3934cc5cf1f
Gerrit-PatchSet: 13
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Tpt <thoma...@hotmail.fr>
Gerrit-Reviewer: Adrian Lang <adrian.l...@wikimedia.de>
Gerrit-Reviewer: Aude <aude.w...@gmail.com>
Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de>
Gerrit-Reviewer: Hoo man <h...@online.de>
Gerrit-Reviewer: Jeroen De Dauw <jeroended...@gmail.com>
Gerrit-Reviewer: Lydia Pintscher <lydia.pintsc...@wikimedia.de>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de>
Gerrit-Reviewer: Tpt <thoma...@hotmail.fr>
Gerrit-Reviewer: WikidataJenkins <wikidata-servi...@wikimedia.de>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to