Denny Vrandecic has submitted this change and it was merged.

Change subject: Improve class LanguageFallbackChain and its factory
......................................................................


Improve class LanguageFallbackChain and its factory

Change-Id: I55516170998e983ef7bc0b7c99cf63d31098d46c
---
M lib/includes/LanguageFallbackChain.php
M lib/includes/LanguageFallbackChainFactory.php
M lib/tests/phpunit/LanguageFallbackChainFactoryTest.php
3 files changed, 157 insertions(+), 24 deletions(-)

Approvals:
  Denny Vrandecic: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/lib/includes/LanguageFallbackChain.php 
b/lib/includes/LanguageFallbackChain.php
index e9e78e5..ee91987 100644
--- a/lib/includes/LanguageFallbackChain.php
+++ b/lib/includes/LanguageFallbackChain.php
@@ -66,13 +66,14 @@
        public function extractPreferredValue( $data ) {
 
                foreach ( $this->chain as $languageWithConversion ) {
-                       if ( isset( 
$data[$languageWithConversion->getFetchLanguage()->getCode()] ) ) {
+                       $fetchCode = 
$languageWithConversion->getFetchLanguage()->getCode();
+                       $languageCode = 
$languageWithConversion->getLanguage()->getCode();
+
+                       if ( isset( $data[$fetchCode] ) ) {
                                return array(
-                                       'value' => 
$languageWithConversion->translate(
-                                               
$data[$languageWithConversion->getFetchLanguage()->getCode()]
-                                       ),
-                                       'language' => 
$languageWithConversion->getLanguage()->getCode(),
-                                       'source' => 
$languageWithConversion->getFetchLanguage()->getCode(),
+                                       'value' => 
$languageWithConversion->translate( $data[$fetchCode] ),
+                                       'language' => $languageCode,
+                                       'source' => $fetchCode,
                                );
                        }
                }
diff --git a/lib/includes/LanguageFallbackChainFactory.php 
b/lib/includes/LanguageFallbackChainFactory.php
index e5ede9d..5bcfda1 100644
--- a/lib/includes/LanguageFallbackChainFactory.php
+++ b/lib/includes/LanguageFallbackChainFactory.php
@@ -84,14 +84,17 @@
        }
 
        /**
-        * Build fallback chain for a given language.
+        * Build fallback chain array for a given language.
         *
         * @param Language $language
         * @param $mode bitfield of self::FALLBACK_*
         * @param LanguageFallbackChain[] $chain for recursive calls
         * @param array $fetched for recursive calls
+        *
+        * @return LanguageWithConversion[]
         */
-       private function buildFromLanguage( Language $language, $mode, &$chain 
= array(), &$fetched = array() ) {
+       public function buildFromLanguage( Language $language, $mode, &$chain = 
array(), &$fetched = array() ) {
+               wfProfileIn( __METHOD__ );
 
                if ( $mode & self::FALLBACK_SELF ) {
                        if ( !isset( $fetched[$language->getCode()] ) ) {
@@ -140,6 +143,7 @@
                        }
                }
 
+               wfProfileOut( __METHOD__ );
                return $chain;
        }
 
@@ -152,15 +156,20 @@
         */
        public function newFromContext( IContextSource $context ) {
                global $wgBabelCategoryNames;
+               wfProfileIn( __METHOD__ );
 
                $user = $context->getUser();
 
                if ( !class_exists( 'Babel' ) || $user->isAnon() ) {
-                       return $this->newFromLanguage( $context->getLanguage(), 
self::FALLBACK_ALL );
+                       $cached =  $this->newFromLanguage( 
$context->getLanguage(), self::FALLBACK_ALL );
+                       wfProfileOut( __METHOD__ );
+                       return $cached;
                }
 
                if ( isset( 
$this->userLanguageCache[$user->getName()][$context->getLanguage()->getCode()] 
) ) {
-                       return 
$this->userLanguageCache[$user->getName()][$context->getLanguage()->getCode()];
+                       $cached = 
$this->userLanguageCache[$user->getName()][$context->getLanguage()->getCode()];
+                       wfProfileOut( __METHOD__ );
+                       return $cached;
                }
 
                $babel = array();
@@ -187,15 +196,19 @@
 
                
$this->userLanguageCache[$user->getName()][$context->getLanguage()->getCode()] 
= $languageFallbackChain;
 
+               wfProfileOut( __METHOD__ );
                return $languageFallbackChain;
        }
 
        /**
-        * Build fallback chain for a given babel array.
+        * Build fallback chain array for a given babel array.
         *
         * @param array $babel
+        *
+        * @return LanguageWithConversion[]
         */
-       private function buildFromBabel( array $babel ) {
+       public function buildFromBabel( array $babel ) {
+               wfProfileIn( __METHOD__ );
 
                $chain = array();
                $fetched = array();
@@ -218,6 +231,7 @@
                        }
                }
 
+               wfProfileOut( __METHOD__ );
                return $chain;
        }
 
diff --git a/lib/tests/phpunit/LanguageFallbackChainFactoryTest.php 
b/lib/tests/phpunit/LanguageFallbackChainFactoryTest.php
index cd8b09a..73109bf 100644
--- a/lib/tests/phpunit/LanguageFallbackChainFactoryTest.php
+++ b/lib/tests/phpunit/LanguageFallbackChainFactoryTest.php
@@ -20,6 +20,20 @@
  */
 class LanguageFallbackChainFactoryTest extends \MediaWikiTestCase {
 
+       private function assertChainEquals( $expectedItems, $chain ) {
+               $this->assertEquals( count( $expectedItems ), count( $chain ) );
+
+               foreach ( $expectedItems as $i => $expected ) {
+                       if ( is_array( $expected ) ) {
+                               $this->assertEquals( $expected[0], 
$chain[$i]->getLanguage()->getCode() );
+                               $this->assertEquals( $expected[1], 
$chain[$i]->getSourceLanguage()->getCode() );
+                       } else {
+                               $this->assertEquals( $expected, 
$chain[$i]->getLanguage()->getCode() );
+                               $this->assertNull( 
$chain[$i]->getSourceLanguage() );
+                       }
+               }
+       }
+
        /**
         * @group WikibaseLib
         * @dataProvider providerNewFromLanguage
@@ -27,17 +41,7 @@
        public function testNewFromLanguage( $lang, $mode, $expected ) {
                $factory = new LanguageFallbackChainFactory();
                $chain = $factory->newFromLanguage( \Language::factory( $lang 
), $mode )->getFallbackChain();
-
-               $this->assertEquals( count( $expected ), count( $chain ) );
-               for ( $i = 0; $i < count( $chain ); $i++ ) {
-                       if ( is_array( $expected[$i] ) ) {
-                               $this->assertEquals( $expected[$i][0], 
$chain[$i]->getLanguage()->getCode() );
-                               $this->assertEquals( $expected[$i][1], 
$chain[$i]->getSourceLanguage()->getCode() );
-                       } else {
-                               $this->assertEquals( $expected[$i], 
$chain[$i]->getLanguage()->getCode() );
-                               $this->assertNull( 
$chain[$i]->getSourceLanguage() );
-                       }
-               }
+               $this->assertChainEquals( $expected, $chain );
        }
 
        public static function providerNewFromLanguage() {
@@ -150,9 +154,123 @@
        /**
         * @group WikibaseLib
         */
-       public function testGetFallbackChainFromContext() {
+       public function testNewFromContext() {
                $factory = new LanguageFallbackChainFactory();
                $languageFallbackChain = $factory->newFromContext( 
\RequestContext::getMain() );
                $this->assertTrue( $languageFallbackChain instanceof 
LanguageFallbackChain );
        }
+
+       /**
+        * @group WikibaseLib
+        * @dataProvider provideTestFromBabel
+        */
+       public function testBuildFromBabel( $babel, $expected ) {
+               $factory = new LanguageFallbackChainFactory();
+               $chain = $factory->buildFromBabel( $babel );
+               $this->assertChainEquals( $expected, $chain );
+       }
+
+       public function provideTestFromBabel() {
+               return array(
+                       array(
+                               array(
+                                       'N' => array( 'de-formal' ),
+                               ),
+                               array(
+                                       'de-formal',
+                                       'de',
+                                       'en',
+                               ),
+                       ),
+                       array(
+                               array(
+                                       'N' => array( 'en', 'de-formal' ),
+                               ),
+                               array(
+                                       'en',
+                                       'de-formal',
+                                       'de',
+                               ),
+                       ),
+                       array(
+                               array(
+                                       'N' => array( 'de-formal' ),
+                                       '3' => array( 'en' ),
+                               ),
+                               array(
+                                       'de-formal',
+                                       'en',
+                                       'de',
+                               ),
+                       ),
+                       array(
+                               array(
+                                       'N' => array( 'zh-cn', 'de-formal' ),
+                                       '3' => array( 'en', 'de' ),
+                               ),
+                               array(
+                                       'zh-cn',
+                                       'de-formal',
+                                       array( 'zh-cn', 'zh-hans' ),
+                                       array( 'zh-cn', 'zh-sg' ),
+                                       array( 'zh-cn', 'zh-my' ),
+                                       array( 'zh-cn', 'zh' ),
+                                       array( 'zh-cn', 'zh-hant' ),
+                                       array( 'zh-cn', 'zh-hk' ),
+                                       array( 'zh-cn', 'zh-mo' ),
+                                       array( 'zh-cn', 'zh-tw' ),
+                                       'en',
+                                       'de',
+                               ),
+                       ),
+                       array(
+                               array(
+                                       'N' => array( 'zh-cn', 'zh-hk' ),
+                                       '3' => array( 'en', 'de-formal' ),
+                               ),
+                               array(
+                                       'zh-cn',
+                                       'zh-hk',
+                                       array( 'zh-cn', 'zh-hans' ),
+                                       array( 'zh-cn', 'zh-sg' ),
+                                       array( 'zh-cn', 'zh-my' ),
+                                       array( 'zh-cn', 'zh' ),
+                                       array( 'zh-cn', 'zh-hant' ),
+                                       array( 'zh-cn', 'zh-mo' ),
+                                       array( 'zh-cn', 'zh-tw' ),
+                                       'en',
+                                       'de-formal',
+                                       'de',
+                               ),
+                       ),
+                       array(
+                               array(
+                                       'N' => array( 'en', 'de-formal', 'zh', 
'zh-cn' ),
+                                       '4' => array( 'kk-cn' ),
+                                       '2' => array( 'zh-hk', 'kk' ),
+                               ),
+                               array(
+                                       'en',
+                                       'de-formal',
+                                       'zh',
+                                       'zh-cn',
+                                       array( 'zh', 'zh-hans' ),
+                                       array( 'zh', 'zh-hant' ),
+                                       array( 'zh', 'zh-tw' ),
+                                       array( 'zh', 'zh-hk' ),
+                                       array( 'zh', 'zh-sg' ),
+                                       array( 'zh', 'zh-mo' ),
+                                       array( 'zh', 'zh-my' ),
+                                       'kk-cn',
+                                       array( 'kk-cn', 'kk' ),
+                                       array( 'kk-cn', 'kk-cyrl' ),
+                                       array( 'kk-cn', 'kk-latn' ),
+                                       array( 'kk-cn', 'kk-arab' ),
+                                       array( 'kk-cn', 'kk-kz' ),
+                                       array( 'kk-cn', 'kk-tr' ),
+                                       'de',
+                               ),
+                       ),
+               );
+       }
 }

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I55516170998e983ef7bc0b7c99cf63d31098d46c
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Liangent <liang...@gmail.com>
Gerrit-Reviewer: Aude <aude.w...@gmail.com>
Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de>
Gerrit-Reviewer: Denny Vrandecic <denny.vrande...@wikimedia.de>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to