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