Addshore has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/95357


Change subject: Move Getting sitelink targets to its own class
......................................................................

Move Getting sitelink targets to its own class

Change-Id: I6596af12597b3c25db983b0f1e4121d312413489
---
M repo/Wikibase.classes.php
M repo/includes/api/ApiWikibase.php
M repo/includes/api/EditEntity.php
M repo/includes/api/GetEntities.php
M repo/includes/api/LinkTitles.php
M repo/includes/api/ModifyEntity.php
M repo/includes/api/SetSiteLink.php
A repo/includes/api/SiteLinkTargetProvider.php
A repo/tests/phpunit/includes/api/SiteLinkTargetProviderTest.php
9 files changed, 150 insertions(+), 29 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/57/95357/1

diff --git a/repo/Wikibase.classes.php b/repo/Wikibase.classes.php
index 8f7d4a9..19fcd6f 100644
--- a/repo/Wikibase.classes.php
+++ b/repo/Wikibase.classes.php
@@ -111,6 +111,7 @@
                'Wikibase\Api\ModifyClaim' => 'includes/api/ModifyClaim.php',
                'Wikibase\Api\ClaimModificationHelper' => 
'includes/api/ClaimModificationHelper.php',
                'Wikibase\Api\ResultBuilder' => 
'includes/api/ResultBuilder.php',
+               'Wikibase\Api\SiteLinkTargetProvider' => 
'includes/api/SiteLinkTargetProvider.php',
 
                // includes/serializers
                'Wikibase\Serializers\EntityRevisionSerializer' => 
'includes/serializers/EntityRevisionSerializer.php',
diff --git a/repo/includes/api/ApiWikibase.php 
b/repo/includes/api/ApiWikibase.php
index 33930e9..b560a50 100644
--- a/repo/includes/api/ApiWikibase.php
+++ b/repo/includes/api/ApiWikibase.php
@@ -155,28 +155,6 @@
        }
 
        /**
-        * Returns the list of sites that is suitable as a sitelink target.
-        *
-        * @return \SiteList
-        */
-       protected function getSiteLinkTargetSites() {
-               $sites = new \SiteList();
-               $groups = Settings::get( 'siteLinkGroups' );
-
-               $allSites = \SiteSQLStore::newInstance()->getSites();
-
-               /* @var \Site $site */
-               foreach ( $allSites as $site ) {
-                       if ( in_array( $site->getGroup(), $groups ) ) {
-                               $sites->append( $site );
-                       }
-               }
-
-               return $sites;
-       }
-
-
-       /**
         * Load the entity content of the given revision.
         *
         * Will fail by calling dieUsage() if the revision can not be found or 
can not be loaded.
diff --git a/repo/includes/api/EditEntity.php b/repo/includes/api/EditEntity.php
index ee09e68..53f432a 100644
--- a/repo/includes/api/EditEntity.php
+++ b/repo/includes/api/EditEntity.php
@@ -8,6 +8,7 @@
 use MWException;
 use Revision;
 use SiteList;
+use SiteSQLStore;
 use Title;
 use Wikibase\ChangeOp\ChangeOp;
 use Wikibase\ChangeOp\ChangeOpAliases;
@@ -26,6 +27,7 @@
 use Wikibase\Lib\Serializers\SerializerFactory;
 use Wikibase\Property;
 use Wikibase\Repo\WikibaseRepo;
+use Wikibase\Settings;
 use Wikibase\Summary;
 use Wikibase\Utils;
 use WikiPage;
@@ -339,7 +341,8 @@
                        $this->dieUsage( "List of sitelinks must be an array", 
'not-recognized-array' );
                }
 
-               $sites = $this->getSiteLinkTargetSites();
+               $siteLinkTargetProvider = new SiteLinkTargetProvider( 
SiteSQLStore::newInstance() );
+               $sites = $siteLinkTargetProvider->getSiteList( Settings::get( 
'siteLinkGroups' ) );
 
                foreach ( $siteLinks as $siteId => $arg ) {
                        $this->checkSiteLinks( $arg, $siteId, $sites );
diff --git a/repo/includes/api/GetEntities.php 
b/repo/includes/api/GetEntities.php
index 3b58fd0..06c3766 100644
--- a/repo/includes/api/GetEntities.php
+++ b/repo/includes/api/GetEntities.php
@@ -12,6 +12,7 @@
 use Wikibase\Lib\Serializers\EntitySerializer;
 use Wikibase\Lib\Serializers\SerializerFactory;
 use Wikibase\Repo\WikibaseRepo;
+use Wikibase\Settings;
 use Wikibase\Utils;
 use Wikibase\StoreFactory;
 use Wikibase\Item;
@@ -272,13 +273,15 @@
         * @see \ApiBase::getAllowedParams()
         */
        public function getAllowedParams() {
+               $siteLinkTargetProvider = new SiteLinkTargetProvider( 
SiteSQLStore::newInstance() );
+               $sites = $siteLinkTargetProvider->getSiteList( Settings::get( 
'siteLinkGroups' ) );
                return array_merge( parent::getAllowedParams(), array(
                        'ids' => array(
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_ISMULTI => true,
                        ),
                        'sites' => array(
-                               ApiBase::PARAM_TYPE => 
$this->getSiteLinkTargetSites()->getGlobalIdentifiers(),
+                               ApiBase::PARAM_TYPE => 
$sites->getGlobalIdentifiers(),
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_ALLOW_DUPLICATES => true
                        ),
diff --git a/repo/includes/api/LinkTitles.php b/repo/includes/api/LinkTitles.php
index 8fcfb8f..91db68f 100644
--- a/repo/includes/api/LinkTitles.php
+++ b/repo/includes/api/LinkTitles.php
@@ -3,11 +3,13 @@
 namespace Wikibase\Api;
 
 use ApiBase, Status;
+use SiteSQLStore;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\SimpleSiteLink;
 use Wikibase\EntityContent;
 use Wikibase\ItemContent;
 use Wikibase\Repo\WikibaseRepo;
+use Wikibase\Settings;
 use Wikibase\StoreFactory;
 use Wikibase\Summary;
 
@@ -44,7 +46,8 @@
                $this->validateParameters( $params );
 
                // Sites are already tested through allowed params ;)
-               $sites = $this->getSiteLinkTargetSites();
+               $siteLinkTargetProvider = new SiteLinkTargetProvider( 
SiteSQLStore::newInstance() );
+               $sites = $siteLinkTargetProvider->getSiteList( Settings::get( 
'siteLinkGroups' ) );
                $fromSite = $sites->getSite( $params['fromsite'] );
                $toSite = $sites->getSite( $params['tosite'] );
 
@@ -208,7 +211,8 @@
         * @return array|bool
         */
        public function getAllowedParams() {
-               $sites = $this->getSiteLinkTargetSites();
+               $siteLinkTargetProvider = new SiteLinkTargetProvider( 
SiteSQLStore::newInstance() );
+               $sites = $siteLinkTargetProvider->getSiteList( Settings::get( 
'siteLinkGroups' ) );
                return array_merge( parent::getAllowedParams(), array(
                        'tosite' => array(
                                ApiBase::PARAM_TYPE => 
$sites->getGlobalIdentifiers(),
diff --git a/repo/includes/api/ModifyEntity.php 
b/repo/includes/api/ModifyEntity.php
index 3438166..2c41c10 100644
--- a/repo/includes/api/ModifyEntity.php
+++ b/repo/includes/api/ModifyEntity.php
@@ -2,6 +2,7 @@
 
 namespace Wikibase\Api;
 
+use SiteSQLStore;
 use Status, User, Title;
 use ApiBase;
 use ValueParsers\ParseException;
@@ -9,6 +10,7 @@
 use Wikibase\EntityContentFactory;
 use Wikibase\ItemHandler;
 use Wikibase\Repo\WikibaseRepo;
+use Wikibase\Settings;
 use Wikibase\StringNormalizer;
 use Wikibase\Summary;
 use Wikibase\Utils;
@@ -328,9 +330,11 @@
         * @return array the allowed params
         */
        public function getAllowedParamsForSiteLink() {
+               $siteLinkTargetProvider = new SiteLinkTargetProvider( 
SiteSQLStore::newInstance() );
+               $sites = $siteLinkTargetProvider->getSiteList( Settings::get( 
'siteLinkGroups' ) );
                return array(
                        'site' => array(
-                               ApiBase::PARAM_TYPE => 
$this->getSiteLinkTargetSites()->getGlobalIdentifiers(),
+                               ApiBase::PARAM_TYPE => 
$sites->getGlobalIdentifiers(),
                        ),
                        'title' => array(
                                ApiBase::PARAM_TYPE => 'string',
diff --git a/repo/includes/api/SetSiteLink.php 
b/repo/includes/api/SetSiteLink.php
index d54e84e..3e169d8 100644
--- a/repo/includes/api/SetSiteLink.php
+++ b/repo/includes/api/SetSiteLink.php
@@ -2,10 +2,12 @@
 
 namespace Wikibase\Api;
 
+use SiteSQLStore;
 use Wikibase\ChangeOp\ChangeOpSiteLink;
 use ApiBase;
 use Wikibase\EntityContent;
 use Wikibase\ItemContent;
+use Wikibase\Settings;
 
 /**
  * API module to associate a page on a site with a Wikibase entity or remove 
an already made such association.
@@ -96,7 +98,8 @@
                        return new ChangeOpSiteLink( $linksite, null );
                } else {
                        $linksite = $this->stringNormalizer->trimToNFC( 
$params['linksite'] );
-                       $sites = $this->getSiteLinkTargetSites();
+                       $siteLinkTargetProvider = new SiteLinkTargetProvider( 
SiteSQLStore::newInstance() );
+                       $sites = $siteLinkTargetProvider->getSiteList( 
Settings::get( 'siteLinkGroups' ) );
                        $site = $sites->getSite( $linksite );
 
                        if ( $site === false ) {
@@ -137,6 +140,8 @@
         * @return array|bool
         */
        public function getAllowedParams() {
+               $siteLinkTargetProvider = new SiteLinkTargetProvider( 
SiteSQLStore::newInstance() );
+               $sites = $siteLinkTargetProvider->getSiteList( Settings::get( 
'siteLinkGroups' ) );
                return array_merge(
                        parent::getAllowedParams(),
                        parent::getAllowedParamsForId(),
@@ -144,7 +149,7 @@
                        parent::getAllowedParamsForEntity(),
                        array(
                                'linksite' => array(
-                                       ApiBase::PARAM_TYPE => 
$this->getSiteLinkTargetSites()->getGlobalIdentifiers(),
+                                       ApiBase::PARAM_TYPE => 
$sites->getGlobalIdentifiers(),
                                        ApiBase::PARAM_REQUIRED => true,
                                ),
                                'linktitle' => array(
diff --git a/repo/includes/api/SiteLinkTargetProvider.php 
b/repo/includes/api/SiteLinkTargetProvider.php
new file mode 100644
index 0000000..9456090
--- /dev/null
+++ b/repo/includes/api/SiteLinkTargetProvider.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Wikibase\Api;
+
+use Site;
+use SiteList;
+use SiteStore;
+
+/**
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ *
+ * @author Daniel K
+ * @author Adam Shorland
+ */
+class SiteLinkTargetProvider {
+
+       /**
+        * @var SiteStore
+        */
+       protected $siteStore;
+
+       /**
+        * @param SiteStore $siteStore
+        */
+       public function __construct( SiteStore $siteStore ) {
+               $this->siteStore = $siteStore;
+       }
+
+       /**
+        * Returns the list of sites that is suitable as a sitelink target.
+        *
+        * @param array $groups sitelink groups to get
+        *
+        * @return SiteList
+        */
+       public function getSiteList( array $groups ) {
+               $sites = new SiteList();
+               $allSites = $this->siteStore->getSites();
+
+               /* @var Site $site */
+               foreach ( $allSites as $site ) {
+                       if ( in_array( $site->getGroup(), $groups ) ) {
+                               $sites->append( $site );
+                       }
+               }
+
+               return $sites;
+       }
+
+} 
\ No newline at end of file
diff --git a/repo/tests/phpunit/includes/api/SiteLinkTargetProviderTest.php 
b/repo/tests/phpunit/includes/api/SiteLinkTargetProviderTest.php
new file mode 100644
index 0000000..5e10da3
--- /dev/null
+++ b/repo/tests/phpunit/includes/api/SiteLinkTargetProviderTest.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Wikibase\Test\Api;
+
+use SiteList;
+use Wikibase\Api\SiteLinkTargetProvider;
+
+/**
+ * @covers Wikibase\Api\SiteLinkTargetProvider
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class SiteLinkTargetProviderTest extends \MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideExpected
+        */
+       public function testGetSiteList( $groups, $expectedGlobalIds ) {
+               $provider = new SiteLinkTargetProvider( 
$this->getMockSiteStore() );
+
+               $siteList = $provider->getSiteList( $groups );
+
+               $this->assertEquals( count( $expectedGlobalIds ), count( 
$siteList ) );
+               foreach( $expectedGlobalIds as $globalId ) {
+                       $this->assertTrue( $siteList->hasSite( $globalId ) );
+               }
+       }
+
+       public static function provideExpected(){
+               return array(
+                       //groupsToGet, siteIdsExpected
+                       array( array( 'foo' ), array( 'site1', 'site2' ) ),
+                       array( array( 'bar' ), array( 'site3' ) ),
+                       array( array( 'baz' ), array( 'site4' ) ),
+                       array( array( 'qwerty' ), array() ),
+                       array( array( 'foo', 'bar' ), array( 'site1', 'site2', 
'site3' ) ),
+                       array( array( 'foo', 'baz' ), array( 'site1', 'site2', 
'site4' ) ),
+                       array( array(), array() ),
+               );
+       }
+
+       protected function getSiteList() {
+               $siteList = new SiteList();
+               $siteList->append( $this->getMockSite( 'site1', 'foo' ) );
+               $siteList->append( $this->getMockSite( 'site2', 'foo' ) );
+               $siteList->append( $this->getMockSite( 'site3', 'bar' ) );
+               $siteList->append( $this->getMockSite( 'site4', 'baz' ) );
+               return $siteList;
+       }
+
+       protected function getMockSiteStore() {
+               $siteList = $this->getSiteList();
+               $mockSiteStore = $this->getMock( 'SiteStore' );
+               $mockSiteStore->expects( $this->once() )
+                       ->method( 'getSites' )
+                       ->will( $this->returnValue( $siteList ) );
+               return $mockSiteStore;
+       }
+
+       protected function getMockSite( $globalId, $group ){
+               $mockSite = $this->getMock( 'Site' );
+               $mockSite->expects( $this->once() )
+                       ->method( 'getGroup' )
+                       ->will( $this->returnValue( $group ) );
+               $mockSite->expects( $this->any() )
+                       ->method( 'getGlobalId' )
+                       ->will( $this->returnValue( $globalId ) );
+               return $mockSite;
+       }
+
+} 
\ No newline at end of file

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6596af12597b3c25db983b0f1e4121d312413489
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to