Hoo man has uploaded a new change for review. https://gerrit.wikimedia.org/r/150206
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 (cherry picked from commit 82cecdc64930dc7c03931b62c0fbff5af77e44e4) --- 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(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/06/150206/1 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 a7dbf93..e05b748 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\DataModel\Entity\BasicEntityIdParser; @@ -635,6 +635,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 @@ -664,4 +679,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 3cea512..048edc7 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/150206 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie6ccb218e835991f57b3283cfa75d3934cc5cf1f Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: mw1.24-wmf14 Gerrit-Owner: Hoo man <h...@online.de> Gerrit-Reviewer: Tpt <thoma...@hotmail.fr> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits