jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/336815 )

Change subject: Use RepositoryDefinitions in top-level factories
......................................................................


Use RepositoryDefinitions in top-level factories

RepositoryDefinitions object is used instead of directly
accessing arbitrary settings.

As currently foreign repositories are defined as a part of
Client settings, WikibaseClient's static constructor
instantiates a RepositoryDefinitions object based on
the settings.
This might change once the way of defining foreign repositories
changes.

When Client is enabled Repo uses RepositoryDefinitions
passed from Client to figure out all available entity types
(including foreign entity types apart from repo's own entity
types).
When Client is not enabled, WikibaseRepo's static
constructor instantiates RepositoryDefinitions for
a single repository.

Bug: T157570
Change-Id: Icb0ead35bafb8d580de49c9ec662688791cbf16a
---
M client/includes/WikibaseClient.php
M client/tests/phpunit/includes/Store/RepositoryServiceContainerTest.php
M client/tests/phpunit/includes/WikibaseClientTest.php
M repo/includes/WikibaseRepo.php
M repo/tests/phpunit/includes/Content/EntityHandlerTest.php
M repo/tests/phpunit/includes/WikibaseRepoTest.php
6 files changed, 166 insertions(+), 158 deletions(-)

Approvals:
  Daniel Kinzler: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/client/includes/WikibaseClient.php 
b/client/includes/WikibaseClient.php
index 053f231..710e15e 100644
--- a/client/includes/WikibaseClient.php
+++ b/client/includes/WikibaseClient.php
@@ -75,6 +75,7 @@
 use Wikibase\Lib\EntityTypeDefinitions;
 use Wikibase\Lib\FormatterLabelDescriptionLookupFactory;
 use Wikibase\Lib\Interactors\TermSearchInteractor;
+use Wikibase\Lib\RepositoryDefinitions;
 use Wikibase\Lib\Serialization\RepositorySpecificDataValueDeserializerFactory;
 use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory;
 use Wikibase\Lib\LanguageNameLookup;
@@ -217,6 +218,11 @@
        private $entityTypeDefinitions;
 
        /**
+        * @var RepositoryDefinitions
+        */
+       private $repositoryDefinitions;
+
+       /**
         * @var PrefetchingTermLookup|null
         */
        private $termLookup = null;
@@ -313,17 +319,20 @@
         * @param SettingsArray $settings
         * @param DataTypeDefinitions $dataTypeDefinitions
         * @param EntityTypeDefinitions $entityTypeDefinitions
+        * @param RepositoryDefinitions $repositoryDefinitions
         * @param SiteLookup $siteLookup
         */
        public function __construct(
                SettingsArray $settings,
                DataTypeDefinitions $dataTypeDefinitions,
                EntityTypeDefinitions $entityTypeDefinitions,
+               RepositoryDefinitions $repositoryDefinitions,
                SiteLookup $siteLookup
        ) {
                $this->settings = $settings;
                $this->dataTypeDefinitions = $dataTypeDefinitions;
                $this->entityTypeDefinitions = $entityTypeDefinitions;
+               $this->repositoryDefinitions = $repositoryDefinitions;
                $this->siteLookup = $siteLookup;
        }
 
@@ -371,12 +380,8 @@
                if ( $this->entityDataRetrievalServiceFactory === null ) {
                        $factory = new DispatchingServiceFactory(
                                $this->getRepositoryServiceContainerFactory(),
-                               // FIXME: array_merge trick will no longer be 
needed once repositry settings are unified, see: T153767.
-                               array_merge(
-                                       [ '' ],
-                                       array_keys( 
$this->getSettings()->getSetting( 'foreignRepositories' ) )
-                               ),
-                               $this->buildEntityTypeToRepoMapping()
+                               
$this->repositoryDefinitions->getRepositoryNames(),
+                               
$this->repositoryDefinitions->getEntityTypeToRepositoryMapping()
                        );
                        $factory->loadWiringFiles( $this->settings->getSetting( 
'dispatchingServiceWiringFiles' ) );
 
@@ -389,75 +394,16 @@
        private function getRepositoryServiceContainerFactory() {
                $idParserFactory = new PrefixMappingEntityIdParserFactory(
                        $this->getEntityIdParser(),
-                       $this->getIdPrefixMaps()
+                       $this->repositoryDefinitions->getPrefixMappings()
                );
 
                return new RepositoryServiceContainerFactory(
                        $idParserFactory,
                        new RepositorySpecificDataValueDeserializerFactory( 
$idParserFactory ),
-                       $this->getRepositoryDatabaseNames(),
+                       $this->repositoryDefinitions->getDatabaseNames(),
                        $this->getSettings()->getSetting( 
'repositoryServiceWiringFiles' ),
                        $this
                );
-       }
-
-       /**
-        * Returns an associative array mapping names of configured 
repositories to respective database names
-        * (either strings or false for local wiki's database).
-        * Returned map contains an empty string key for a local repository.
-        *
-        * @return array
-        */
-       private function getRepositoryDatabaseNames() {
-               // FIXME: t no longer be needed to check different settings 
(repoDatabase vs foreignRepositories
-               // once repositry settings are unified, see: T153767.
-               $databaseNames = [ '' => $this->getSettings()->getSetting( 
'repoDatabase' ) ];
-
-               foreach ( $this->getSettings()->getSetting( 
'foreignRepositories' )
-                       as $repositoryName => $repositorySettings
-               ) {
-                       $databaseNames[$repositoryName] = 
$repositorySettings['repoDatabase'];
-               }
-
-               return $databaseNames;
-       }
-
-       /**
-        * Returns a map of id prefix mappings defined for configured foreign 
repositories.
-        *
-        * @return array[] Associative array mapping repository names to 
repository-specific prefix mapping.
-        */
-       private function getIdPrefixMaps() {
-               $mappings = [];
-               foreach ( $this->getSettings()->getSetting( 
'foreignRepositories' )
-                       as $repositoryName => $repositorySettings
-               ) {
-                       if ( array_key_exists( 'prefixMapping', 
$repositorySettings ) ) {
-                               $mappings[$repositoryName] = 
$repositorySettings['prefixMapping'];
-                       }
-               }
-               return $mappings;
-       }
-
-       /**
-        * @return string[] Associative array mapping entity type names to 
repository names which are used to provide
-        *         entities of the given type.
-        *         Note: currently single entity type is mapped to a single 
repository. This might change in the future
-        *         and a particular entity type might be provide by multitple 
repositories.
-        */
-       private function buildEntityTypeToRepoMapping() {
-               $localRepoEntityTypes = array_keys( 
$this->getSettings()->getSetting( 'repoNamespaces' ) );
-               $entityTypeToRepoMap = array_fill_keys( $localRepoEntityTypes, 
'' );
-               foreach ( $this->getSettings()->getSetting( 
'foreignRepositories' ) as $repositoryName => $repoSettings ) {
-                       foreach ( $repoSettings['supportedEntityTypes'] as 
$entityType ) {
-                               if ( array_key_exists( $entityType, 
$entityTypeToRepoMap ) ) {
-                                       wfWarn( 'Using same entity types on 
multiple repositories is not supported yet.' );
-                                       continue;
-                               }
-                               $entityTypeToRepoMap[$entityType] = 
$repositoryName;
-                       }
-               }
-               return $entityTypeToRepoMap;
        }
 
        /**
@@ -717,8 +663,34 @@
                                $settings->getSetting( 'disabledDataTypes' )
                        ),
                        new EntityTypeDefinitions( $entityTypeDefinitions ),
+                       self::getRepositoryDefinitionsFromSettings( $settings ),
                        MediaWikiServices::getInstance()->getSiteLookup()
                );
+       }
+
+       /**
+        * @param SettingsArray $settings
+        *
+        * @return RepositoryDefinitions
+        */
+       private static function getRepositoryDefinitionsFromSettings( 
SettingsArray $settings ) {
+               // FIXME: It might no longer be needed to check different 
settings (repoDatabase vs foreignRepositories)
+               // once repository settings are unified, see: T153767.
+               $definitions = [ '' => [
+                       'database' => $settings->getSetting( 'repoDatabase' ),
+                       'prefix-mapping' => [ '' => '' ],
+                       'entity-types' => array_keys( $settings->getSetting( 
'repoNamespaces' ) ),
+               ] ];
+
+               foreach ( $settings->getSetting( 'foreignRepositories' ) as 
$repository => $repositorySettings ) {
+                       $definitions[$repository] = [
+                               'database' => 
$repositorySettings['repoDatabase'],
+                               'entity-types' => 
$repositorySettings['supportedEntityTypes'],
+                               'prefix-mapping' => 
$repositorySettings['prefixMapping'],
+                       ];
+               }
+
+               return new RepositoryDefinitions( $definitions );
        }
 
        /**
@@ -1306,4 +1278,11 @@
                );
        }
 
+       /**
+        * @return RepositoryDefinitions
+        */
+       public function getRepositoryDefinitions() {
+               return $this->repositoryDefinitions;
+       }
+
 }
diff --git 
a/client/tests/phpunit/includes/Store/RepositoryServiceContainerTest.php 
b/client/tests/phpunit/includes/Store/RepositoryServiceContainerTest.php
index 47d6bc2..0732763 100644
--- a/client/tests/phpunit/includes/Store/RepositoryServiceContainerTest.php
+++ b/client/tests/phpunit/includes/Store/RepositoryServiceContainerTest.php
@@ -15,9 +15,9 @@
 use Wikibase\EntityRevision;
 use Wikibase\Lib\DataTypeDefinitions;
 use Wikibase\Lib\EntityTypeDefinitions;
+use Wikibase\Lib\RepositoryDefinitions;
 use Wikibase\Lib\Store\EntityRevisionLookup;
 use Wikibase\Lib\Store\EntityStoreWatcher;
-use Wikibase\SettingsArray;
 
 /**
  * @covers Wikibase\Client\Store\RepositoryServiceContainer
@@ -33,15 +33,16 @@
         * @return WikibaseClient
         */
        private function getWikibaseClient() {
-               $settings = 
WikibaseClient::getDefaultInstance()->getSettings()->getArrayCopy();
-               $settings['foreignRepositories'] = [
-                       'foo' => [ 'repoDatabase' => 'foowiki', 'prefixMapping' 
=> [ 'bar' => 'xyz' ] ]
-               ];
+               /** @var RepositoryDefinitions $repositoryDefinitions */
+               $repositoryDefinitions = $this->getMockBuilder( 
RepositoryDefinitions::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
 
                return new WikibaseClient(
-                       new SettingsArray( $settings ),
+                       WikibaseClient::getDefaultInstance()->getSettings(),
                        new DataTypeDefinitions( [] ),
                        new EntityTypeDefinitions( [] ),
+                       $repositoryDefinitions,
                        new HashSiteStore()
                );
        }
diff --git a/client/tests/phpunit/includes/WikibaseClientTest.php 
b/client/tests/phpunit/includes/WikibaseClientTest.php
index 1ec8cb5..7737124 100644
--- a/client/tests/phpunit/includes/WikibaseClientTest.php
+++ b/client/tests/phpunit/includes/WikibaseClientTest.php
@@ -36,6 +36,7 @@
 use Wikibase\Lib\Interactors\TermSearchInteractor;
 use Wikibase\Lib\OutputFormatSnakFormatterFactory;
 use Wikibase\Lib\OutputFormatValueFormatterFactory;
+use Wikibase\Lib\RepositoryDefinitions;
 use Wikibase\Lib\Store\EntityContentDataCodec;
 use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory;
 use Wikibase\Lib\Store\PropertyOrderProvider;
@@ -152,6 +153,7 @@
                        $settings,
                        new DataTypeDefinitions( array() ),
                        new EntityTypeDefinitions( array() ),
+                       $this->getRepositoryDefinitions(),
                        $this->getSiteLookup()
                );
 
@@ -172,6 +174,7 @@
                        $settings,
                        new DataTypeDefinitions( array() ),
                        new EntityTypeDefinitions( array() ),
+                       $this->getRepositoryDefinitions(),
                        $siteLookup
                );
 
@@ -206,6 +209,7 @@
                        $settings,
                        new DataTypeDefinitions( array() ),
                        new EntityTypeDefinitions( array() ),
+                       $this->getRepositoryDefinitions(),
                        $siteLookup
                );
 
@@ -365,6 +369,12 @@
                $this->assertInstanceOf( DataAccessSnakFormatterFactory::class, 
$instance );
        }
 
+       public function testGetRepositoryDefinitions() {
+               $repositoryDefinitions = 
$this->getWikibaseClient()->getRepositoryDefinitions();
+               $this->assertInstanceOf( RepositoryDefinitions::class, 
$repositoryDefinitions );
+               $this->assertEquals( $this->getRepositoryDefinitions(), 
$repositoryDefinitions );
+       }
+
        /**
         * @return WikibaseClient
         */
@@ -373,8 +383,18 @@
                        new SettingsArray( 
WikibaseClient::getDefaultInstance()->getSettings()->getArrayCopy() ),
                        new DataTypeDefinitions( array() ),
                        new EntityTypeDefinitions( array() ),
+                       $this->getRepositoryDefinitions(),
                        new HashSiteStore()
                );
        }
 
+       /**
+        * @return RepositoryDefinitions
+        */
+       private function getRepositoryDefinitions() {
+               return new RepositoryDefinitions(
+                       [ '' => [ 'database' => '', 'entity-types' => [], 
'prefix-mapping' => [] ] ]
+               );
+       }
+
 }
diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php
index da724a6..55a29e8 100644
--- a/repo/includes/WikibaseRepo.php
+++ b/repo/includes/WikibaseRepo.php
@@ -76,6 +76,7 @@
 use Wikibase\Lib\OutputFormatSnakFormatterFactory;
 use Wikibase\Lib\OutputFormatValueFormatterFactory;
 use Wikibase\Lib\PropertyInfoDataTypeLookup;
+use Wikibase\Lib\RepositoryDefinitions;
 use Wikibase\Lib\SnakFormatter;
 use Wikibase\Lib\StaticContentLanguages;
 use Wikibase\Lib\Store\CachingPropertyOrderProvider;
@@ -260,6 +261,11 @@
        private $entityTypeDefinitions;
 
        /**
+        * @var RepositoryDefinitions
+        */
+       private $repositoryDefinitons;
+
+       /**
         * @var ValueSnakRdfBuilderFactory
         */
        private $valueSnakRdfBuilderFactory;
@@ -278,11 +284,6 @@
         * @var EntityDataRetrievalServiceFactory|null
         */
        private $entityDataRetrievalServiceFactory = null;
-
-       /**
-        * @var SettingsArray|null
-        */
-       private $clientSettings = null;
 
        /**
         * IMPORTANT: Use only when it is not feasible to inject an instance 
properly.
@@ -307,13 +308,14 @@
                $settings = new SettingsArray( $wgWBRepoSettings );
                $settings->setSetting( 'entityNamespaces', 
self::buildEntityNamespaceConfigurations() );
 
+               $repositoryDefinitions = 
self::getRepositoryDefinitionsFromSettings( $settings );
+
                $dataRetrievalServices = null;
-               $clientSettings = null;
 
                // If client functionality is enabled, use it to enable 
federation.
                if ( defined( 'WBC_VERSION' ) ) {
                        $dataRetrievalServices = 
WikibaseClient::getDefaultInstance()->getEntityDataRetrievalServiceFactory();
-                       $clientSettings = 
WikibaseClient::getDefaultInstance()->getSettings();
+                       $repositoryDefinitions = 
WikibaseClient::getDefaultInstance()->getRepositoryDefinitions();
                }
 
                return new self(
@@ -323,9 +325,22 @@
                                $settings->getSetting( 'disabledDataTypes' )
                        ),
                        new EntityTypeDefinitions( $entityTypeDefinitions ),
-                       $dataRetrievalServices,
-                       $clientSettings
+                       $repositoryDefinitions,
+                       $dataRetrievalServices
                );
+       }
+
+       /**
+        * @param SettingsArray $settings
+        *
+        * @return RepositoryDefinitions
+        */
+       private static function getRepositoryDefinitionsFromSettings( 
SettingsArray $settings ) {
+               return new RepositoryDefinitions( [ '' => [
+                       'database' => $settings->getSetting( 'changesDatabase' 
),
+                       'prefix-mapping' => [ '' => '' ],
+                       'entity-types' => array_keys( $settings->getSetting( 
'entityNamespaces' ) ),
+               ] ] );
        }
 
        /**
@@ -370,22 +385,6 @@
         */
        public function newValidatorBuilders() {
                $urlSchemes = $this->settings->getSetting( 'urlSchemes' );
-               $entityTypesPerRepo = [];
-
-               if ( $this->clientSettings ) {
-                       $foreignRepoConfig = $this->clientSettings->getSetting( 
'foreignRepositories' );
-                       $entityTypesPerRepo = array_map(
-                               function( $repoSettings ) {
-                                       return $repoSettings[ 
'supportedEntityTypes' ];
-                               },
-                               $foreignRepoConfig
-                       );
-               }
-
-               $entityTypesPerRepo = array_merge(
-                       $entityTypesPerRepo,
-                       [ '' => $this->getLocalEntityTypes(), ]
-               );
 
                return new ValidatorBuilders(
                        $this->getEntityLookup(),
@@ -394,7 +393,7 @@
                        $this->getVocabularyBaseUri(),
                        $this->getMonolingualTextLanguages(),
                        $this->getCachingCommonsMediaFileNameLookup(),
-                       $entityTypesPerRepo,
+                       
$this->repositoryDefinitons->getEntityTypesPerRepository(),
                        new MediaWikiPageNameNormalizer()
                );
        }
@@ -480,39 +479,34 @@
        }
 
        /**
-        * FIXME: Optional $entityDataRetrievalServiceFactory and 
$clientSettings make it possible to access
+        * FIXME: Optional $entityDataRetrievalServiceFactory makes it possible 
to access
         * entities from foreign repositories from Repo component but they also 
introduce the optional
         * dependency on the Client component. Such dependency is bad and in 
the long run it should be removed
         * by making EntityDataRetrievalServiceFactory implementation provided 
to WikibaseRepo not be
-        * bound to WikibaseClient. Foreign repository settings should also 
moved out of Client's settings,
-        * so WikibaseRepo could be aware of entity types introduced in foreign 
repositories without needing
-        * to rely on $clientSettings.
+        * bound to WikibaseClient.
         *
         * @param SettingsArray $settings
         * @param DataTypeDefinitions $dataTypeDefinitions
         * @param EntityTypeDefinitions $entityTypeDefinitions
+        * @param RepositoryDefinitions $repositoryDefinitions
         * @param EntityDataRetrievalServiceFactory|null 
$entityDataRetrievalServiceFactory optional factory
         *        of entity data retrieval services that will be used by the 
Repo instead of it creating
         *        instances of those services itself.
         *        This factory could be provided in order to allow Repo make 
use of Dispatching services
         *        and access data of entities from foreign repositories.
-        * @param SettingsArray|null $clientSettings Settings of WikibaseClient 
related
-        *        to the $entityDataRetrievalServiceFactory. Should be provided 
when
-        *        foreign repositories configured in the WikibaseClient 
instance introduce custom
-        *        entity types.
         */
        public function __construct(
                SettingsArray $settings,
                DataTypeDefinitions $dataTypeDefinitions,
                EntityTypeDefinitions $entityTypeDefinitions,
-               EntityDataRetrievalServiceFactory 
$entityDataRetrievalServiceFactory = null,
-               SettingsArray $clientSettings = null
+               RepositoryDefinitions $repositoryDefinitions,
+               EntityDataRetrievalServiceFactory 
$entityDataRetrievalServiceFactory = null
        ) {
                $this->settings = $settings;
                $this->dataTypeDefinitions = $dataTypeDefinitions;
                $this->entityTypeDefinitions = $entityTypeDefinitions;
+               $this->repositoryDefinitons = $repositoryDefinitions;
                $this->entityDataRetrievalServiceFactory = 
$entityDataRetrievalServiceFactory;
-               $this->clientSettings = $clientSettings;
        }
 
        /**
@@ -1259,25 +1253,7 @@
         *  entity types from the configured foreign repositories.
         */
        public function getEnabledEntityTypes() {
-               if ( $this->clientSettings ) {
-                       $foreignRepoConfig = $this->clientSettings->getSetting( 
'foreignRepositories' );
-                       $foreignRepoEntityTypes = array_reduce(
-                               $foreignRepoConfig,
-                               function( $types, $repoSettings ) {
-                                       return array_merge( $types, 
$repoSettings['supportedEntityTypes'] );
-                               },
-                               []
-                       );
-               } else {
-                       $foreignRepoEntityTypes = [];
-               }
-
-               $enabledTypes = array_unique( array_merge(
-                       $this->getLocalEntityTypes(),
-                       $foreignRepoEntityTypes
-               ) );
-
-               return $enabledTypes;
+               return $this->repositoryDefinitons->getAllEntityTypes();
        }
 
        /**
diff --git a/repo/tests/phpunit/includes/Content/EntityHandlerTest.php 
b/repo/tests/phpunit/includes/Content/EntityHandlerTest.php
index 26a4cc6..1882772 100644
--- a/repo/tests/phpunit/includes/Content/EntityHandlerTest.php
+++ b/repo/tests/phpunit/includes/Content/EntityHandlerTest.php
@@ -21,6 +21,7 @@
 use Wikibase\EntityContent;
 use Wikibase\Lib\DataTypeDefinitions;
 use Wikibase\Lib\EntityTypeDefinitions;
+use Wikibase\Lib\RepositoryDefinitions;
 use Wikibase\Repo\Content\EntityHandler;
 use Wikibase\Repo\Validators\EntityValidator;
 use Wikibase\Repo\Validators\ValidatorErrorLocalizer;
@@ -55,10 +56,16 @@
                        $repoSettings = array_merge( $repoSettings, 
$settings->getArrayCopy() );
                }
 
+               /** @var RepositoryDefinitions $repositoryDefinitions */
+               $repositoryDefinitions = $this->getMockBuilder( 
RepositoryDefinitions::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
                return new WikibaseRepo(
                        new SettingsArray( $repoSettings ),
                        new DataTypeDefinitions( array() ),
-                       new EntityTypeDefinitions( require __DIR__ . 
'/../../../../../lib/WikibaseLib.entitytypes.php' )
+                       new EntityTypeDefinitions( require __DIR__ . 
'/../../../../../lib/WikibaseLib.entitytypes.php' ),
+                       $repositoryDefinitions
                );
        }
 
diff --git a/repo/tests/phpunit/includes/WikibaseRepoTest.php 
b/repo/tests/phpunit/includes/WikibaseRepoTest.php
index 62c885d..cf8be2b 100644
--- a/repo/tests/phpunit/includes/WikibaseRepoTest.php
+++ b/repo/tests/phpunit/includes/WikibaseRepoTest.php
@@ -19,8 +19,8 @@
 use Serializers\Serializer;
 use User;
 use Wikibase\ChangeOp\ChangeOpFactoryProvider;
-use Wikibase\Client\WikibaseClient;
 use Wikibase\DataModel\DeserializerFactory;
+use Wikibase\DataModel\Entity\EntityId;
 use Wikibase\DataModel\Entity\EntityIdParser;
 use Wikibase\DataModel\Entity\EntityIdValue;
 use Wikibase\DataModel\Entity\ItemId;
@@ -42,6 +42,7 @@
 use Wikibase\Lib\Interactors\TermIndexSearchInteractor;
 use Wikibase\Lib\OutputFormatSnakFormatterFactory;
 use Wikibase\Lib\OutputFormatValueFormatterFactory;
+use Wikibase\Lib\RepositoryDefinitions;
 use Wikibase\Lib\Store\EntityContentDataCodec;
 use Wikibase\Lib\Store\EntityNamespaceLookup;
 use Wikibase\Lib\Store\EntityRevisionLookup;
@@ -99,15 +100,28 @@
        }
 
        public function testNewValidatorBuilders() {
-               $entityId = new ItemId( 'other:Q9' );
-               $repo = $this->getWikibaseRepoWithClientSettings( new 
SettingsArray( [
-                       'foreignRepositories' => [
-                               'other' => [
-                                       'supportedEntityTypes' => [ 
$entityId->getEntityType() ],
-                               ]
-                       ]
-               ] ) );
-               $valueToValidate = new EntityIdValue( $entityId );
+               $kittenId = $this->getMockBuilder( EntityId::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $kittenId->expects( $this->any() )
+                       ->method( 'getEntityType' )
+                       ->will( $this->returnValue( 'kitten' ) );
+               $kittenId->expects( $this->any() )
+                       ->method( 'getSerialization' )
+                       ->will( $this->returnValue( 'other:K9' ) );
+               $kittenId->expects( $this->any() )
+                       ->method( 'getLocalPart' )
+                       ->will( $this->returnValue( 'K9' ) );
+               $kittenId->expects( $this->any() )
+                       ->method( 'getRepositoryName' )
+                       ->will( $this->returnValue( 'other' ) );
+
+               $valueToValidate = new EntityIdValue( $kittenId );
+
+               $repo = $this->getWikibaseRepoWithCustomRepositoryDefinitions( 
array_merge(
+                       $this->getRepositoryDefinition( '', [ 'entity-types' => 
[ 'item', 'property' ] ] ),
+                       $this->getRepositoryDefinition( 'other', [ 
'entity-types' => [ 'kitten' ] ] )
+               ) );
 
                $builders = $repo->newValidatorBuilders();
                $this->assertInstanceOf( ValidatorBuilders::class, $builders );
@@ -349,18 +363,29 @@
        }
 
        /**
-        * @param SettingsArray $clientSettings
+        * @param $repositoryName
+        * @param array $customSettings
+        *
+        * @return array
+        */
+       private function getRepositoryDefinition( $repositoryName, array 
$customSettings = [] ) {
+               return [ $repositoryName => array_merge(
+                       [ 'database' => '', 'entity-types' => [ 'item', 
'property' ], 'prefix-mapping' => [] ],
+                       $customSettings
+               ) ];
+       }
+
+       /**
+        * @param array $repoDefinitions
         *
         * @return WikibaseRepo
         */
-       private function getWikibaseRepoWithClientSettings( SettingsArray 
$clientSettings ) {
-               $settings = new SettingsArray( 
WikibaseRepo::getDefaultInstance()->getSettings()->getArrayCopy() );
+       private function getWikibaseRepoWithCustomRepositoryDefinitions( array 
$repoDefinitions ) {
                return new WikibaseRepo(
-                       $settings,
+                       WikibaseRepo::getDefaultInstance()->getSettings(),
                        new DataTypeDefinitions( [] ),
                        new EntityTypeDefinitions( [] ),
-                       null, // FIXME: providing no 
DataRetrievalServiceFactory but client settings does not make much sense
-                       $clientSettings
+                       new RepositoryDefinitions( $repoDefinitions )
                );
        }
 
@@ -369,17 +394,11 @@
                        $this->markTestSkipped( 'WikibaseClient must be enabled 
to run this test' );
                }
 
-               $clientSettings = 
WikibaseClient::getDefaultInstance()->getSettings()->getArrayCopy();
-               $clientSettings['foreignRepositories'] = [
-                       'repo1' => [ 'supportedEntityTypes' => [ 'foo', 'baz' ] 
],
-                       'repo2' => [ 'supportedEntityTypes' => [ 'foobar' ] ],
-               ];
-
-               $wikibaseRepo = $this->getWikibaseRepoWithClientSettings( new 
SettingsArray( $clientSettings ) );
-               $wikibaseRepo->getSettings()->setSetting(
-                       'entityNamespaces',
-                       [ 'foo' => 100, 'bar' => 102 ]
-               );
+               $wikibaseRepo = 
$this->getWikibaseRepoWithCustomRepositoryDefinitions( array_merge(
+                       $this->getRepositoryDefinition( '', [ 'entity-types' => 
[ 'foo', 'bar' ] ] ),
+                       $this->getRepositoryDefinition( 'repo1', [ 
'entity-types' => [ 'baz' ] ] ),
+                       $this->getRepositoryDefinition( 'repo2', [ 
'entity-types' => [ 'foobar' ] ] )
+               ) );
 
                $enabled = $wikibaseRepo->getEnabledEntityTypes();
                $this->assertContains( 'foo', $enabled );
@@ -496,11 +515,17 @@
         * @return WikibaseRepo
         */
        private function getWikibaseRepo( $entityTypeDefinitions = array() ) {
+               /** @var RepositoryDefinitions $repositoryDefinitions */
+               $repositoryDefinitions = $this->getMockBuilder( 
RepositoryDefinitions::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
                $settings = new SettingsArray( 
WikibaseRepo::getDefaultInstance()->getSettings()->getArrayCopy() );
                return new WikibaseRepo(
                        $settings,
                        new DataTypeDefinitions( array() ),
-                       new EntityTypeDefinitions( $entityTypeDefinitions )
+                       new EntityTypeDefinitions( $entityTypeDefinitions ),
+                       $repositoryDefinitions
                );
        }
 

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Icb0ead35bafb8d580de49c9ec662688791cbf16a
Gerrit-PatchSet: 12
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: WMDE-leszek <[email protected]>
Gerrit-Reviewer: Aleksey Bekh-Ivanov (WMDE) <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[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

Reply via email to