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