jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/373094 )
Change subject: MultipleRepositoryAwareWikibaseServices creates service
containers itself
......................................................................
MultipleRepositoryAwareWikibaseServices creates service containers itself
This simplifies the creating a WikibaseServices instance
in the code using those containers (e.g. in WikibaseClient).
This also makes location of service wiring files no longer
stored as client settings. They're moved to global
variables instead (in order to allow extensions to
define their custom services following the multi-repository
"dispatching" mechanism).
Change-Id: I8a49bff30881df2bffdd956558cfe1334f51aa73
---
M client/WikibaseClient.php
M client/config/WikibaseClient.default.php
M client/includes/WikibaseClient.php
A client/tests/phpunit/includes/MultiRepositoryServiceTestWiring.php
A client/tests/phpunit/includes/MultiRepositoryServicesIntegrationTest.php
A client/tests/phpunit/includes/PerRepositoryServiceTestWiring.php
M client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php
M data-access/src/MultipleRepositoryAwareWikibaseServices.php
M data-access/src/PerRepositoryServiceContainerFactory.php
M data-access/tests/phpunit/MultiRepositoryServiceWiringTest.php
M data-access/tests/phpunit/MultipleRepositoryAwareWikibaseServicesTest.php
M docs/options.wiki
A docs/services.txt
13 files changed, 310 insertions(+), 146 deletions(-)
Approvals:
Daniel Kinzler: Looks good to me, approved
jenkins-bot: Verified
diff --git a/client/WikibaseClient.php b/client/WikibaseClient.php
index 836ac30..c10ec47 100644
--- a/client/WikibaseClient.php
+++ b/client/WikibaseClient.php
@@ -81,6 +81,8 @@
$wgSpecialPages,
$wgTrackingCategories,
$wgWBClientDataTypes,
+ $wgWikibaseMultiRepositoryServiceWiringFiles,
+ $wgWikibasePerRepositoryServiceWiringFiles,
$wgWBClientSettings;
$wgExtensionCredits['wikibase'][] = array(
@@ -105,6 +107,9 @@
$wgWBClientDataTypes[$type] = array_merge( $baseDef, $clientDef
);
}
+ $wgWikibaseMultiRepositoryServiceWiringFiles = [ __DIR__ .
'/../data-access/src/MultiRepositoryServiceWiring.php' ];
+ $wgWikibasePerRepositoryServiceWiringFiles = [ __DIR__ .
'/../data-access/src/PerRepositoryServiceWiring.php' ];
+
// i18n
$wgMessagesDirs['wikibaseclient'] = __DIR__ . '/i18n';
$wgExtensionMessagesFiles['Wikibaseclientalias'] = __DIR__ .
'/WikibaseClient.i18n.alias.php';
diff --git a/client/config/WikibaseClient.default.php
b/client/config/WikibaseClient.default.php
index 415b531..f75c05c 100644
--- a/client/config/WikibaseClient.default.php
+++ b/client/config/WikibaseClient.default.php
@@ -88,8 +88,6 @@
// repo and clients for multiwiki setups.
'sharedCacheType' => $GLOBALS['wgMainCacheType'],
- 'perRepositoryServiceWiringFiles' => [ __DIR__ .
'/../../data-access/src/PerRepositoryServiceWiring.php' ],
- 'multiRepositoryServiceWiringFiles' => [ __DIR__ .
'/../../data-access/src/MultiRepositoryServiceWiring.php' ],
'foreignRepositories' => [],
// Enable writing of term_full_entity_id column in wb_terms
table.
diff --git a/client/includes/WikibaseClient.php
b/client/includes/WikibaseClient.php
index 8dbc7fb..9456d7b 100644
--- a/client/includes/WikibaseClient.php
+++ b/client/includes/WikibaseClient.php
@@ -48,10 +48,7 @@
use Wikibase\Client\Store\TitleFactory;
use Wikibase\Client\Store\ClientStore;
use Wikibase\DataAccess\DataAccessSettings;
-use Wikibase\DataAccess\GenericServices;
-use Wikibase\DataAccess\MultiRepositoryServices;
use Wikibase\DataAccess\MultipleRepositoryAwareWikibaseServices;
-use Wikibase\DataAccess\PerRepositoryServiceContainerFactory;
use Wikibase\DataAccess\WikibaseServices;
use Wikibase\DataModel\DeserializerFactory;
use Wikibase\DataModel\Entity\DispatchingEntityIdParser;
@@ -61,7 +58,6 @@
use Wikibase\DataModel\Entity\ItemIdParser;
use Wikibase\DataModel\SerializerFactory;
use Wikibase\DataModel\Services\Diff\EntityDiffer;
-use Wikibase\DataModel\Services\EntityId\PrefixMappingEntityIdParserFactory;
use Wikibase\DataModel\Services\EntityId\SuffixEntityIdParser;
use Wikibase\DataModel\Services\Lookup\EntityLookup;
use Wikibase\DataModel\Services\Lookup\EntityRetrievingDataTypeLookup;
@@ -86,7 +82,6 @@
use Wikibase\Lib\OutputFormatValueFormatterFactory;
use Wikibase\Lib\PropertyInfoDataTypeLookup;
use Wikibase\Lib\RepositoryDefinitions;
-use Wikibase\Lib\Serialization\RepositorySpecificDataValueDeserializerFactory;
use Wikibase\Lib\Store\CachingPropertyOrderProvider;
use Wikibase\Lib\Store\EntityContentDataCodec;
use Wikibase\Lib\Store\EntityNamespaceLookup;
@@ -392,41 +387,53 @@
*/
public function getWikibaseServices() {
if ( $this->wikibaseServices === null ) {
- $multiRepositoryServices = new MultiRepositoryServices(
- $this->getRepositoryServiceContainerFactory(),
- $this->repositoryDefinitions
+ $this->wikibaseServices = new
MultipleRepositoryAwareWikibaseServices(
+ $this->getEntityIdParser(),
+ $this->getEntityIdComposer(),
+ $this->getEntityNamespaceLookup(),
+ $this->repositoryDefinitions,
+ $this->entityTypeDefinitions,
+ $this->getDataAccessSettings(),
+ $this->getMultiRepositoryServiceWiring(),
+ $this->getPerRepositoryServiceWiring()
);
- $multiRepositoryServices->loadWiringFiles(
$this->settings->getSetting( 'multiRepositoryServiceWiringFiles' ) );
-
- $this->wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $multiRepositoryServices );
}
return $this->wikibaseServices;
}
- private function getRepositoryServiceContainerFactory() {
- $idParserFactory = new PrefixMappingEntityIdParserFactory(
- $this->getEntityIdParser(),
- $this->repositoryDefinitions->getPrefixMappings()
- );
-
- $genericServices = new GenericServices(
$this->getEntityNamespaceLookup(), $this->entityTypeDefinitions );
+ private function getDataAccessSettings() {
$clientSettings = $this->getSettings();
- $dataAccessSettings = new DataAccessSettings(
+ return new DataAccessSettings(
$clientSettings->getSetting( 'maxSerializedEntitySize'
),
$clientSettings->getSetting( 'readFullEntityIdColumn' )
);
+ }
- return new PerRepositoryServiceContainerFactory(
- $idParserFactory,
- $this->getEntityIdComposer(),
- new RepositorySpecificDataValueDeserializerFactory(
$idParserFactory ),
- $this->repositoryDefinitions->getDatabaseNames(),
- $clientSettings->getSetting(
'perRepositoryServiceWiringFiles' ),
- $genericServices,
- $dataAccessSettings,
- $this->entityTypeDefinitions
- );
+ private function getMultiRepositoryServiceWiring() {
+ global $wgWikibaseMultiRepositoryServiceWiringFiles;
+
+ $wiring = [];
+ foreach ( $wgWikibaseMultiRepositoryServiceWiringFiles as $file
) {
+ $wiring = array_merge(
+ $wiring,
+ require $file
+ );
+ }
+ return $wiring;
+ }
+
+ private function getPerRepositoryServiceWiring() {
+ global $wgWikibasePerRepositoryServiceWiringFiles;
+
+ $wiring = [];
+ foreach ( $wgWikibasePerRepositoryServiceWiringFiles as $file )
{
+ $wiring = array_merge(
+ $wiring,
+ require $file
+ );
+ }
+ return $wiring;
}
/**
diff --git a/client/tests/phpunit/includes/MultiRepositoryServiceTestWiring.php
b/client/tests/phpunit/includes/MultiRepositoryServiceTestWiring.php
new file mode 100644
index 0000000..901504c
--- /dev/null
+++ b/client/tests/phpunit/includes/MultiRepositoryServiceTestWiring.php
@@ -0,0 +1,16 @@
+<?php
+
+use Wikibase\DataAccess\MultiRepositoryServices;
+
+/**
+ * @license GPL-2.0+
+ */
+
+return [
+ // Use a custom service instead of standard "dispatching" lookup (for
test purpose only)
+ 'AwesomeService' => function( MultiRepositoryServices
$multiRepositoryServices ) {
+ $servicesPerRepo = $multiRepositoryServices->getServiceMap(
'AwesomeService' );
+ // Pretend it is dispatching all traffic to the local repo's
service instance
+ return $servicesPerRepo[''];
+ }
+];
diff --git
a/client/tests/phpunit/includes/MultiRepositoryServicesIntegrationTest.php
b/client/tests/phpunit/includes/MultiRepositoryServicesIntegrationTest.php
new file mode 100644
index 0000000..faf5f66
--- /dev/null
+++ b/client/tests/phpunit/includes/MultiRepositoryServicesIntegrationTest.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Wikibase\Client\Tests;
+
+use HashSiteStore;
+use Wikibase\Client\WikibaseClient;
+use Wikibase\DataAccess\MultipleRepositoryAwareWikibaseServices;
+use Wikibase\Lib\DataTypeDefinitions;
+use Wikibase\Lib\EntityTypeDefinitions;
+use Wikibase\Lib\RepositoryDefinitions;
+use Wikibase\SettingsArray;
+
+/**
+ * @group Wikibase
+ * @group WikibaseClient
+ *
+ * @license GPL-2.0+
+ */
+class MultiRepositoryServicesIntegrationTest extends \MediaWikiTestCase {
+
+ public function testExtensionCanRegisterCustomMultiRepositoryServices()
{
+ $this->setMwGlobals( [
+ 'wgWikibaseMultiRepositoryServiceWiringFiles' => [
__DIR__ . '/MultiRepositoryServiceTestWiring.php' ],
+ 'wgWikibasePerRepositoryServiceWiringFiles' => [
__DIR__ . '/PerRepositoryServiceTestWiring.php' ],
+ ] );
+
+ $client = $this->getWikibaseClient();
+ $services = $client->getWikibaseServices();
+ // UGLY: this relies on implementation details!
+ /** @var MultipleRepositoryAwareWikibaseServices $services */
+ $multiRepoServices = $services->getMultiRepositoryServices();
+
+ $this->assertContains( 'AwesomeService',
$multiRepoServices->getServiceNames() );
+ }
+
+ private function getWikibaseClient() {
+ return new WikibaseClient(
+ new SettingsArray(
WikibaseClient::getDefaultInstance()->getSettings()->getArrayCopy() ),
+ new DataTypeDefinitions( [] ),
+ new EntityTypeDefinitions( [] ),
+ new RepositoryDefinitions(
+ [ '' => [ 'database' => '', 'base-uri' => '',
'entity-types' => [], 'prefix-mapping' => [] ] ]
+ ),
+ new HashSiteStore()
+ );
+ }
+
+}
diff --git a/client/tests/phpunit/includes/PerRepositoryServiceTestWiring.php
b/client/tests/phpunit/includes/PerRepositoryServiceTestWiring.php
new file mode 100644
index 0000000..6ca987e
--- /dev/null
+++ b/client/tests/phpunit/includes/PerRepositoryServiceTestWiring.php
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @license GPL-2.0+
+ */
+
+return [
+
+ 'AwesomeService' => function () {
+ return new \stdClass();
+ }
+
+];
diff --git a/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php
b/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php
index 80c6d11..5eaf244 100644
--- a/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php
+++ b/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php
@@ -7,9 +7,7 @@
use Wikibase\Client\Usage\UsageLookup;
use Wikibase\Client\Usage\UsageTracker;
use Wikibase\Client\WikibaseClient;
-use Wikibase\DataAccess\MultiRepositoryServices;
-use Wikibase\DataAccess\MultipleRepositoryAwareWikibaseServices;
-use Wikibase\DataAccess\PerRepositoryServiceContainerFactory;
+use Wikibase\DataAccess\WikibaseServices;
use Wikibase\DataModel\Entity\ItemIdParser;
use Wikibase\DataModel\Services\Entity\EntityPrefetcher;
use Wikibase\DataModel\Services\Entity\NullEntityPrefetcher;
@@ -18,7 +16,6 @@
use Wikibase\Client\Store\Sql\DirectSqlStore;
use Wikibase\Lib\Changes\EntityChangeFactory;
use Wikibase\Lib\EntityIdComposer;
-use Wikibase\Lib\RepositoryDefinitions;
use Wikibase\Lib\Store\Sql\EntityChangeLookup;
use Wikibase\Lib\Store\EntityNamespaceLookup;
use Wikibase\Lib\Store\EntityRevisionLookup;
@@ -48,30 +45,14 @@
$client = WikibaseClient::getDefaultInstance();
- /** @var PerRepositoryServiceContainerFactory $containerFactory
*/
- $containerFactory = $this->getMockBuilder(
PerRepositoryServiceContainerFactory::class )
- ->disableOriginalConstructor()
- ->getMock();
+ $wikibaseServices = $this->getMock( WikibaseServices::class );
- /** @var RepositoryDefinitions $repositoryDefinitions */
- $repositoryDefinitions = $this->getMockBuilder(
RepositoryDefinitions::class )
- ->disableOriginalConstructor()
- ->getMock();
-
- $multiRepositoryServices = new MultiRepositoryServices(
- $containerFactory,
- $repositoryDefinitions
- );
-
- $multiRepositoryServices->defineService( 'EntityPrefetcher',
function() {
- return new NullEntityPrefetcher();
- } );
- $multiRepositoryServices->defineService(
'EntityRevisionLookup', function() {
- return $this->getMock( EntityRevisionLookup::class );
- } );
- $multiRepositoryServices->defineService( 'PropertyInfoLookup',
function() {
- return new MockPropertyInfoLookup();
- } );
+ $wikibaseServices->method( 'getEntityPrefetcher' )
+ ->willReturn( new NullEntityPrefetcher() );
+ $wikibaseServices->method( 'getEntityRevisionLookup' )
+ ->willReturn( $this->getMock(
EntityRevisionLookup::class ) );
+ $wikibaseServices->method( 'getPropertyInfoLookup' )
+ ->willReturn( new MockPropertyInfoLookup() );
return new DirectSqlStore(
$entityChangeFactory,
@@ -79,7 +60,7 @@
new ItemIdParser(),
new EntityIdComposer( [] ),
new EntityNamespaceLookup( [] ),
- new MultipleRepositoryAwareWikibaseServices(
$multiRepositoryServices ),
+ $wikibaseServices,
wfWikiID(),
'en'
);
diff --git a/data-access/src/MultipleRepositoryAwareWikibaseServices.php
b/data-access/src/MultipleRepositoryAwareWikibaseServices.php
index ad8d51d..986d3f5 100644
--- a/data-access/src/MultipleRepositoryAwareWikibaseServices.php
+++ b/data-access/src/MultipleRepositoryAwareWikibaseServices.php
@@ -4,10 +4,17 @@
namespace Wikibase\DataAccess;
use MediaWiki\Services\ServiceContainer;
+use Wikibase\DataModel\Entity\EntityIdParser;
use Wikibase\DataModel\Services\Entity\EntityPrefetcher;
+use Wikibase\DataModel\Services\EntityId\PrefixMappingEntityIdParserFactory;
use Wikibase\DataModel\Services\Term\TermBuffer;
+use Wikibase\Lib\EntityIdComposer;
+use Wikibase\Lib\EntityTypeDefinitions;
use Wikibase\Lib\Interactors\TermSearchInteractorFactory;
+use Wikibase\Lib\RepositoryDefinitions;
+use Wikibase\Lib\Serialization\RepositorySpecificDataValueDeserializerFactory;
use Wikibase\Lib\Store\EntityInfoBuilderFactory;
+use Wikibase\Lib\Store\EntityNamespaceLookup;
use Wikibase\Lib\Store\EntityRevisionLookup;
use Wikibase\Lib\Store\EntityStoreWatcher;
use Wikibase\Lib\Store\PropertyInfoLookup;
@@ -21,8 +28,101 @@
*/
class MultipleRepositoryAwareWikibaseServices extends ServiceContainer
implements WikibaseServices {
- public function __construct( MultiRepositoryServices
$multiRepositoryServices ) {
+ /**
+ * @var MultiRepositoryServices
+ */
+ private $multiRepositoryServices;
+
+ /**
+ * @param EntityIdParser $idParser
+ * @param EntityIdComposer $idComposer
+ * @param EntityNamespaceLookup $entityNamespaceLookup
+ * @param RepositoryDefinitions $repositoryDefinitions
+ * @param EntityTypeDefinitions $entityTypeDefinitions
+ * @param DataAccessSettings $settings
+ * @param callable[] $multiRepositoryServiceWiring
+ * @param callable[] $perRepositoryServiceWiring
+ */
+ public function __construct(
+ EntityIdParser $idParser,
+ EntityIdComposer $idComposer,
+ EntityNamespaceLookup $entityNamespaceLookup,
+ RepositoryDefinitions $repositoryDefinitions,
+ EntityTypeDefinitions $entityTypeDefinitions,
+ DataAccessSettings $settings,
+ array $multiRepositoryServiceWiring,
+ array $perRepositoryServiceWiring
+ ) {
parent::__construct();
+
+ $this->multiRepositoryServices =
$this->createMultiRepositoryServices(
+ $idParser,
+ $idComposer,
+ $entityNamespaceLookup,
+ $repositoryDefinitions,
+ $entityTypeDefinitions,
+ $settings,
+ $perRepositoryServiceWiring
+
+ );
+ $this->multiRepositoryServices->applyWiring(
$multiRepositoryServiceWiring );
+
+ $this->defineServices();
+ }
+
+ private function createMultiRepositoryServices(
+ EntityIdParser $idParser,
+ EntityIdComposer $idComposer,
+ EntityNamespaceLookup $entityNamespaceLookup,
+ RepositoryDefinitions $repositoryDefinitions,
+ EntityTypeDefinitions $entityTypeDefinitions,
+ DataAccessSettings $settings,
+ array $perRepositoryServiceWiring
+ ) {
+ return new MultiRepositoryServices(
+ $this->getRepositoryServiceContainerFactory(
+ $idParser,
+ $idComposer,
+ $entityNamespaceLookup,
+ $repositoryDefinitions,
+ $entityTypeDefinitions,
+ $settings,
+ $perRepositoryServiceWiring
+ ),
+ $repositoryDefinitions
+ );
+ }
+
+ private function getRepositoryServiceContainerFactory(
+ EntityIdParser $idParser,
+ EntityIdComposer $idComposer,
+ EntityNamespaceLookup $entityNamespaceLookup,
+ RepositoryDefinitions $repositoryDefinitions,
+ EntityTypeDefinitions $entityTypeDefinitions,
+ DataAccessSettings $settings,
+ array $perRepositoryServiceWiring
+ ) {
+ $idParserFactory = new PrefixMappingEntityIdParserFactory(
+ $idParser,
+ $repositoryDefinitions->getPrefixMappings()
+ );
+
+ $genericServices = new GenericServices( $entityNamespaceLookup,
$entityTypeDefinitions );
+
+ return new PerRepositoryServiceContainerFactory(
+ $idParserFactory,
+ $idComposer,
+ new RepositorySpecificDataValueDeserializerFactory(
$idParserFactory ),
+ $repositoryDefinitions->getDatabaseNames(),
+ $perRepositoryServiceWiring,
+ $genericServices,
+ $settings,
+ $entityTypeDefinitions
+ );
+ }
+
+ private function defineServices() {
+ $multiRepositoryServices = $this->multiRepositoryServices;
$this->applyWiring( [
'EntityInfoBuilderFactory' => function() use (
$multiRepositoryServices ) {
@@ -98,4 +198,8 @@
return $this->getService( 'TermSearchInteractorFactory' );
}
+ public function getMultiRepositoryServices() {
+ return $this->multiRepositoryServices;
+ }
+
}
diff --git a/data-access/src/PerRepositoryServiceContainerFactory.php
b/data-access/src/PerRepositoryServiceContainerFactory.php
index f82195e..56171dd 100644
--- a/data-access/src/PerRepositoryServiceContainerFactory.php
+++ b/data-access/src/PerRepositoryServiceContainerFactory.php
@@ -39,9 +39,9 @@
private $databaseNames;
/**
- * @var string[]
+ * @var callable[]
*/
- private $wiringFiles;
+ private $serviceWiring;
/**
* @var GenericServices
@@ -63,7 +63,7 @@
* @param EntityIdComposer $idComposer
* @param RepositorySpecificDataValueDeserializerFactory
$dataValueDeserializerFactory
* @param array $repositoryDatabaseNames
- * @param string[] $wiringFiles
+ * @param callable[] $serviceWiring
* @param GenericServices $genericServices
* @param DataAccessSettings $settings
* @param EntityTypeDefinitions $entityTypeDefinitions
@@ -73,7 +73,7 @@
EntityIdComposer $idComposer, // TODO: change ID Composer and
pass a factory of prefixing composer (T165589)
RepositorySpecificDataValueDeserializerFactory
$dataValueDeserializerFactory,
array $repositoryDatabaseNames,
- array $wiringFiles,
+ array $serviceWiring,
GenericServices $genericServices,
DataAccessSettings $settings,
EntityTypeDefinitions $entityTypeDefinitions
@@ -82,7 +82,7 @@
$this->idComposer = $idComposer;
$this->dataValueDeserializerFactory =
$dataValueDeserializerFactory;
$this->databaseNames = $repositoryDatabaseNames;
- $this->wiringFiles = $wiringFiles;
+ $this->serviceWiring = $serviceWiring;
$this->genericServices = $genericServices;
$this->settings = $settings;
$this->entityTypeDefinitions = $entityTypeDefinitions;
@@ -110,7 +110,7 @@
$this->settings,
$this->entityTypeDefinitions->getDeserializerFactoryCallbacks()
);
- $container->loadWiringFiles( $this->wiringFiles );
+ $container->applyWiring( $this->serviceWiring );
return $container;
}
diff --git a/data-access/tests/phpunit/MultiRepositoryServiceWiringTest.php
b/data-access/tests/phpunit/MultiRepositoryServiceWiringTest.php
index 0cb40a6..b36edf6 100644
--- a/data-access/tests/phpunit/MultiRepositoryServiceWiringTest.php
+++ b/data-access/tests/phpunit/MultiRepositoryServiceWiringTest.php
@@ -43,7 +43,7 @@
new EntityIdComposer( [] ),
new RepositorySpecificDataValueDeserializerFactory(
$idParser ),
[ '' => false ],
- [ __DIR__ . '/../../src/PerRepositoryServiceWiring.php'
],
+ require __DIR__ .
'/../../src/PerRepositoryServiceWiring.php',
new GenericServices(
$client->getEntityNamespaceLookup(), $entityTypeDefinitions ),
new DataAccessSettings( 0, false ),
$entityTypeDefinitions
diff --git
a/data-access/tests/phpunit/MultipleRepositoryAwareWikibaseServicesTest.php
b/data-access/tests/phpunit/MultipleRepositoryAwareWikibaseServicesTest.php
index 87021e1..f7839b0 100644
--- a/data-access/tests/phpunit/MultipleRepositoryAwareWikibaseServicesTest.php
+++ b/data-access/tests/phpunit/MultipleRepositoryAwareWikibaseServicesTest.php
@@ -2,12 +2,18 @@
namespace Wikibase\DataAccess\Tests;
+use Wikibase\DataAccess\DataAccessSettings;
use Wikibase\DataAccess\MultiRepositoryServices;
use Wikibase\DataAccess\MultipleRepositoryAwareWikibaseServices;
+use Wikibase\DataModel\Entity\BasicEntityIdParser;
use Wikibase\DataModel\Services\Entity\EntityPrefetcher;
use Wikibase\DataModel\Services\Term\TermBuffer;
+use Wikibase\Lib\EntityIdComposer;
+use Wikibase\Lib\EntityTypeDefinitions;
use Wikibase\Lib\Interactors\TermSearchInteractorFactory;
+use Wikibase\Lib\RepositoryDefinitions;
use Wikibase\Lib\Store\EntityInfoBuilderFactory;
+use Wikibase\Lib\Store\EntityNamespaceLookup;
use Wikibase\Lib\Store\EntityRevisionLookup;
use Wikibase\Lib\Store\EntityStoreWatcher;
use Wikibase\Lib\Store\PropertyInfoLookup;
@@ -21,80 +27,96 @@
*/
class MultipleRepositoryAwareWikibaseServicesTest extends
\PHPUnit_Framework_TestCase {
- /**
- * @return MultiRepositoryServices
- */
- private function getMultiRepositoryServices() {
- $multiRepositoryServices = $this->getMockBuilder(
MultiRepositoryServices::class )
- ->disableOriginalConstructor()
- ->getMock();
+ private function newMultipleRepositoryAwareWikibaseServices() {
+ return new MultipleRepositoryAwareWikibaseServices(
+ new BasicEntityIdParser(),
+ new EntityIdComposer( [] ),
+ new EntityNamespaceLookup( [] ),
+ $this->getRepositoryDefinitions(),
+ new EntityTypeDefinitions( [] ),
+ new DataAccessSettings( 1, true ),
+ $this->getMultiRepoServiceWiring(),
+ []
+ );
+ }
- $multiRepositoryServices->method( 'getEntityInfoBuilderFactory'
)
- ->will(
- $this->returnValue( $this->getMock(
EntityInfoBuilderFactory::class ) )
- );
- $multiRepositoryServices->method( 'getEntityPrefetcher' )
- ->will(
- $this->returnValue( $this->getMock(
EntityPrefetcher::class ) )
- );
- $multiRepositoryServices->method( 'getEntityRevisionLookup' )
- ->will(
- $this->returnValue( $this->getMock(
EntityRevisionLookup::class ) )
- );
- $multiRepositoryServices->method( 'getPropertyInfoLookup' )
- ->will(
- $this->returnValue( $this->getMock(
PropertyInfoLookup::class ) )
- );
- $multiRepositoryServices->method( 'getTermBuffer' )
- ->will(
- $this->returnValue( $this->getMock(
TermBuffer::class ) )
- );
- $multiRepositoryServices->method(
'getTermSearchInteractorFactory' )
- ->will(
- $this->returnValue( $this->getMock(
TermSearchInteractorFactory::class ) )
- );
+ private function getRepositoryDefinitions() {
+ return new RepositoryDefinitions( [
+ '' => [
+ 'database' => false,
+ 'base-uri' => 'http://foo',
+ 'entity-types' => [],
+ 'prefix-mapping' => [],
+ ],
+ ] );
+ }
- return $multiRepositoryServices;
+ private function getMultiRepoServiceWiring() {
+ $testCase = $this;
+
+ return [
+ 'EntityInfoBuilderFactory' => function () use (
$testCase ) {
+ return $testCase->getMock(
EntityInfoBuilderFactory::class );
+ },
+ 'EntityPrefetcher' => function () use ( $testCase ) {
+ return $testCase->getMock(
EntityPrefetcher::class );
+ },
+ 'EntityRevisionLookup' => function () use ( $testCase )
{
+ return $testCase->getMock(
EntityRevisionLookup::class );
+ },
+ 'EntityStoreWatcher' => function () use ( $testCase ) {
+ return $testCase->getMock(
EntityStoreWatcher::class );
+ },
+ 'PropertyInfoLookup' => function () use ( $testCase ) {
+ return $testCase->getMock(
PropertyInfoLookup::class );
+ },
+ 'TermBuffer' => function () use ( $testCase ) {
+ return $testCase->getMock( TermBuffer::class );
+ },
+ 'TermSearchInteractorFactory' => function () use (
$testCase ) {
+ return $testCase->getMock(
TermSearchInteractorFactory::class );
+ },
+ ];
}
public function testGetEntityInfoBuilderFactory() {
- $wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $this->getMultiRepositoryServices() );
+ $wikibaseServices =
$this->newMultipleRepositoryAwareWikibaseServices();
$this->assertInstanceOf( EntityInfoBuilderFactory::class,
$wikibaseServices->getEntityInfoBuilderFactory() );
}
public function testGetEntityPrefetcher() {
- $wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $this->getMultiRepositoryServices() );
+ $wikibaseServices =
$this->newMultipleRepositoryAwareWikibaseServices();
$this->assertInstanceOf( EntityPrefetcher::class,
$wikibaseServices->getEntityPrefetcher() );
}
public function testGetEntityRevisionLookup() {
- $wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $this->getMultiRepositoryServices() );
+ $wikibaseServices =
$this->newMultipleRepositoryAwareWikibaseServices();
$this->assertInstanceOf( EntityRevisionLookup::class,
$wikibaseServices->getEntityRevisionLookup() );
}
public function testGetEntityStoreWatcher() {
- $wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $this->getMultiRepositoryServices() );
+ $wikibaseServices =
$this->newMultipleRepositoryAwareWikibaseServices();
$this->assertInstanceOf( EntityStoreWatcher::class,
$wikibaseServices->getEntityStoreWatcher() );
}
public function testGetPropertyInfoLookup() {
- $wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $this->getMultiRepositoryServices() );
+ $wikibaseServices =
$this->newMultipleRepositoryAwareWikibaseServices();
$this->assertInstanceOf( PropertyInfoLookup::class,
$wikibaseServices->getPropertyInfoLookup() );
}
public function testGetTermBuffer() {
- $wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $this->getMultiRepositoryServices() );
+ $wikibaseServices =
$this->newMultipleRepositoryAwareWikibaseServices();
$this->assertInstanceOf( TermBuffer::class,
$wikibaseServices->getTermBuffer() );
}
public function testGetTermSearchInteractorFactory() {
- $wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $this->getMultiRepositoryServices() );
+ $wikibaseServices =
$this->newMultipleRepositoryAwareWikibaseServices();
$this->assertInstanceOf(
TermSearchInteractorFactory::class,
@@ -102,12 +124,8 @@
);
}
- public function
testGetServicesIncludesServicesProvidedByDispatchingServiceContainer() {
- $multiRepositoryServices = $this->getMockBuilder(
MultiRepositoryServices::class )
- ->disableOriginalConstructor()
- ->getMock();
-
- $wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $multiRepositoryServices );
+ public function
testGetServicesIncludesServicesProvidedByMultiRepositoryServiceContainer() {
+ $wikibaseServices =
$this->newMultipleRepositoryAwareWikibaseServices();
$serviceNames = $wikibaseServices->getServiceNames();
@@ -120,35 +138,10 @@
$this->assertContains( 'TermSearchInteractorFactory',
$serviceNames );
}
- public function
testGetServiceReturnsSameServiceInstanceAsDispatchingServiceContainer() {
- $multiRepositoryServices = $this->getMultiRepositoryServices();
+ public function testGetMultiRepositoryServices() {
+ $wikibaseServices =
$this->newMultipleRepositoryAwareWikibaseServices();
- $wikibaseServices = new
MultipleRepositoryAwareWikibaseServices( $multiRepositoryServices );
-
- $this->assertSame(
- $multiRepositoryServices->getEntityInfoBuilderFactory(),
- $wikibaseServices->getEntityInfoBuilderFactory()
- );
- $this->assertSame(
- $multiRepositoryServices->getEntityPrefetcher(),
- $wikibaseServices->getEntityPrefetcher()
- );
- $this->assertSame(
- $multiRepositoryServices->getEntityRevisionLookup(),
- $wikibaseServices->getEntityRevisionLookup()
- );
- $this->assertSame(
- $multiRepositoryServices->getPropertyInfoLookup(),
- $wikibaseServices->getPropertyInfoLookup()
- );
- $this->assertSame(
- $multiRepositoryServices->getTermBuffer(),
- $wikibaseServices->getTermBuffer()
- );
- $this->assertSame(
-
$multiRepositoryServices->getTermSearchInteractorFactory(),
- $wikibaseServices->getTermSearchInteractorFactory()
- );
+ $this->assertInstanceOf( MultiRepositoryServices::class,
$wikibaseServices->getMultiRepositoryServices() );
}
}
diff --git a/docs/options.wiki b/docs/options.wiki
index dde0896..6cf9eb2 100644
--- a/docs/options.wiki
+++ b/docs/options.wiki
@@ -111,9 +111,3 @@
;echoIcon: If <code>sendEchoNotification</code> is set to <code>true</code>,
you can also provide what icon the user will see. The correct syntax is <code>[
'url' => '...' ]</code> or <code>[ 'path' => '...' ]</code> where
<code>path</code> is relative to <code>$wgExtensionAssetsPath</code>. Defaults
to <code>false</code> which means that there will be the default Echo icon.
;disabledUsageAspects: Array of usage aspects that should not be saved in the
<code>wbc_entity_usage</code> table. This currently only supports aspect codes
(like "T", "L" or "X"), but not full aspect keys (like "L.de").
;wikiPageUpdaterDbBatchSize: Batch size in updating page table when applying
changes in the client, default is 50.
-
-=== Pseudo-configuration ===
-Settings mentioned in this section are not really configuration. They are used
to pass definitions of services to service locators. Wiring files should
generally not be replaced with other files, neither should be their content
(PHP code) editted by users, as the usual configuration.
-The way location of wiring files is defined is subject to change (see T153437).
-;perRepositoryServiceWiringFiles: A list of wiring files used by
PerRepositoryServiceContainer. Defaults to only use
<code>data-access/src/PerRepositoryServiceWiring.php</code>.
-;multiRepositoryServiceWiringFiles: A list of wiring files used by
MultiRepositoryServices. Defaults to only use
<code>data-access/src/MultiRepositoryServiceWiring.php</code>.
diff --git a/docs/services.txt b/docs/services.txt
new file mode 100644
index 0000000..3e839fd
--- /dev/null
+++ b/docs/services.txt
@@ -0,0 +1,5 @@
+TODO: add general description about the service container(s) provided, define
terms etc here.
+
+Per-repository and multi-repository services are defined using wiring files.
They are specified using the following global variables (each being an array of
file paths). Extensions can register their custom services by adding their
files to those globals in their extension.json file.
+;wgWikibaseMultiRepositoryServiceWiringFiles: Array of file paths containing
definitions of multi-repository services. By default
<code>data-access/src/MultiRepositoryServiceWiring.php</code> is used.
+;wgWikibasePerRepositoryServiceWiringFiles: Array of file paths containing
definitions of multi-repository services. By default
<code>data-access/src/PerRepositoryServiceWiring.php</code> is used.
--
To view, visit https://gerrit.wikimedia.org/r/373094
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I8a49bff30881df2bffdd956558cfe1334f51aa73
Gerrit-PatchSet: 9
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: WMDE-leszek <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: WMDE-leszek <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits