Merge "Map dummy language codes in sites"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 7 Jun 2016 14:13:47 +0000 (14:13 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 7 Jun 2016 14:13:47 +0000 (14:13 +0000)
includes/ServiceWiring.php
includes/site/DBSiteStore.php
includes/site/FileBasedSiteLookup.php
tests/phpunit/includes/site/DBSiteStoreTest.php
tests/phpunit/includes/site/FileBasedSiteLookupTest.php

index b076d07..338f306 100644 (file)
@@ -61,6 +61,9 @@ return [
 
        'SiteStore' => function( MediaWikiServices $services ) {
                $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() );
+               $rawSiteStore->setLanguageCodeMapping(
+                       $services->getMainConfig()->get( 'DummyLanguageCodes' ) ?: []
+               );
 
                // TODO: replace wfGetCache with a CacheFactory service.
                // TODO: replace wfIsHHVM with a capabilities service.
index 974789f..c1c10c2 100644 (file)
@@ -40,6 +40,11 @@ class DBSiteStore implements SiteStore {
         */
        private $dbLoadBalancer;
 
+       /**
+        * @var string[]
+        */
+       private $languageCodeMapping = [];
+
        /**
         * @since 1.27
         *
@@ -96,15 +101,17 @@ class DBSiteStore implements SiteStore {
                );
 
                foreach ( $res as $row ) {
+                       $languageCode = $row->site_language === '' ? null : $row->site_language;
+                       if ( isset( $this->languageCodeMapping[ $languageCode ] ) ) {
+                               $languageCode = $this->languageCodeMapping[ $languageCode ];
+                       }
+
                        $site = Site::newForType( $row->site_type );
                        $site->setGlobalId( $row->site_global_key );
                        $site->setInternalId( (int)$row->site_id );
                        $site->setForward( (bool)$row->site_forward );
                        $site->setGroup( $row->site_group );
-                       $site->setLanguageCode( $row->site_language === ''
-                               ? null
-                               : $row->site_language
-                       );
+                       $site->setLanguageCode( $languageCode );
                        $site->setSource( $row->site_source );
                        $site->setExtraData( unserialize( $row->site_data ) );
                        $site->setExtraConfig( unserialize( $row->site_config ) );
@@ -287,4 +294,13 @@ class DBSiteStore implements SiteStore {
                return $ok;
        }
 
+       /**
+        * Provide an array that maps language codes
+        *
+        * @param string[] $newMapping
+        */
+       public function setLanguageCodeMapping( array $newMapping ) {
+               $this->languageCodeMapping = $newMapping;
+       }
+
 }
index 9654440..424d8e6 100644 (file)
@@ -42,6 +42,11 @@ class FileBasedSiteLookup implements SiteLookup {
         */
        private $cacheFile;
 
+       /**
+        * @var string[]
+        */
+       private $languageCodeMapping = [];
+
        /**
         * @param string $cacheFile
         */
@@ -118,13 +123,18 @@ class FileBasedSiteLookup implements SiteLookup {
         * @return Site
         */
        private function newSiteFromArray( array $data ) {
+               $languageCode = $data['language'];
+               if ( isset( $this->languageCodeMapping[ $languageCode ] ) ) {
+                       $languageCode = $this->languageCodeMapping[ $languageCode ];
+               }
+
                $siteType = array_key_exists( 'type', $data ) ? $data['type'] : Site::TYPE_UNKNOWN;
                $site = Site::newForType( $siteType );
 
                $site->setGlobalId( $data['globalid'] );
                $site->setForward( $data['forward'] );
                $site->setGroup( $data['group'] );
-               $site->setLanguageCode( $data['language'] );
+               $site->setLanguageCode( $languageCode );
                $site->setSource( $data['source'] );
                $site->setExtraData( $data['data'] );
                $site->setExtraConfig( $data['config'] );
@@ -136,4 +146,13 @@ class FileBasedSiteLookup implements SiteLookup {
                return $site;
        }
 
+       /**
+        * Provide an array that maps language codes
+        *
+        * @param string[] $newMapping
+        */
+       public function setLanguageCodeMapping( array $newMapping ) {
+               $this->languageCodeMapping = $newMapping;
+       }
+
 }
index 32dd7f2..316fd89 100644 (file)
@@ -67,6 +67,20 @@ class DBSiteStoreTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * @covers DBSiteStore::getSites
+        * @covers DBSiteStore::setLanguageCodeMapping
+        */
+       public function testLanguageCodeMapping() {
+               TestSites::insertIntoDb();
+
+               $store = $this->newDBSiteStore();
+               $store->setLanguageCodeMapping( [ 'no' => 'nb' ] );
+
+               $site = $store->getSite( 'nowiki' );
+               $this->assertEquals( $site->getLanguageCode(), 'nb' );
+       }
+
        /**
         * @covers DBSiteStore::saveSites
         */
index 7984795..bebda79 100644 (file)
@@ -98,4 +98,15 @@ class FileBasedSiteLookupTest extends PHPUnit_Framework_TestCase {
                return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
        }
 
+       public function testLanguageCodeMapping() {
+               $sites = $this->getSites();
+               $cacheBuilder = $this->newSitesCacheFileBuilder( $sites );
+               $cacheBuilder->build();
+
+               $cache = new FileBasedSiteLookup( $this->cacheFile );
+               $cache->setLanguageCodeMapping( [ 'en' => 'fa' ] );
+
+               $this->assertEquals( $cache->getSite( 'enwiktionary' )->getLanguageCode(), 'fa' );
+       }
+
 }