jenkins-bot has submitted this change and it was merged.

Change subject: Make LanguageFallbackChain compatible to EntityInfoBuilder
......................................................................


Make LanguageFallbackChain compatible to EntityInfoBuilder

This is split from my pretty old draft I9bbbe80. It expands the
"language chain lookup" (or fixes a bug by adding a missing feature
that is already described in the documentation of the class).

Short explanation: If the provided data array is not an array of
strings but an array of arrays (like the arrays returned by the
EntityInfoBuilders) just return the array as it is.

Additional test cases cover this behavior.

Change-Id: I715bbb02aa780451d4431d185261b3a648910312
---
M lib/includes/LanguageFallbackChain.php
M lib/tests/phpunit/LanguageFallbackChainTest.php
2 files changed, 84 insertions(+), 23 deletions(-)

Approvals:
  Hoo man: Looks good to me, approved
  WikidataJenkins: Verified
  Jeroen De Dauw: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/lib/includes/LanguageFallbackChain.php 
b/lib/includes/LanguageFallbackChain.php
index 179091b..4bd2f7d 100644
--- a/lib/includes/LanguageFallbackChain.php
+++ b/lib/includes/LanguageFallbackChain.php
@@ -2,6 +2,7 @@
 
 namespace Wikibase;
 
+use InvalidArgumentException;
 use Language;
 
 /**
@@ -11,6 +12,8 @@
  * @since 0.4
  *
  * @licence GNU GPL v2+
+ * @author Liangent
+ * @author Thiemo Mättig
  */
 class LanguageFallbackChain {
 
@@ -38,24 +41,31 @@
        /**
         * Try to fetch the best value in a multilingual data array.
         *
-        * @param string[] $data Multilingual data with language codes as keys
+        * @param string[]|array[] $data Multilingual data with language codes 
as keys
         *
-        * @return null|array of three items: array(
+        * @throws InvalidArgumentException
+        * @return string[]|null of three items: array(
         *      'value' => finally fetched and translated value
         *      'language' => language code of the language which final value 
is in
         *      'source' => language code of the language where the value is 
translated from
         * ), or null when no "acceptable" data can be found.
         */
        public function extractPreferredValue( array $data ) {
-
                foreach ( $this->chain as $languageWithConversion ) {
-                       $fetchCode = 
$languageWithConversion->getFetchLanguageCode();
+                       $languageCode = 
$languageWithConversion->getFetchLanguageCode();
 
-                       if ( isset( $data[$fetchCode] ) ) {
-                               return array(
-                                       'value' => 
$languageWithConversion->translate( $data[$fetchCode] ),
-                                       'language' => 
$languageWithConversion->getLanguageCode(),
-                                       'source' => 
$languageWithConversion->getSourceLanguageCode(),
+                       if ( isset( $data[$languageCode] ) ) {
+                               $value = $data[$languageCode];
+
+                               // Data from an EntityInfoBuilder is already 
made of pre-build arrays
+                               if ( is_array( $value ) ) {
+                                       $value = $value['value'];
+                               }
+
+                               return $this->getValueArray(
+                                       $languageWithConversion->translate( 
$value ),
+                                       
$languageWithConversion->getLanguageCode(),
+                                       
$languageWithConversion->getSourceLanguageCode()
                                );
                        }
                }
@@ -67,9 +77,9 @@
         * Try to fetch the best value in a multilingual data array first.
         * If no "acceptable" value exists, return any value known.
         *
-        * @param string[] $data Multilingual data with language codes as keys
+        * @param string[]|array[] $data Multilingual data with language codes 
as keys
         *
-        * @return null|array of three items: array(
+        * @return string[]|null of three items: array(
         *      'value' => finally fetched and translated value
         *      'language' => language code of the language which final value 
is in
         *      'source' => language code of the language where the value is 
translated from
@@ -78,21 +88,38 @@
        public function extractPreferredValueOrAny( array $data ) {
                $preferred = $this->extractPreferredValue( $data );
 
-               if ( $preferred ) {
+               if ( $preferred !== null ) {
                        return $preferred;
                }
 
-               foreach ( $data as $code => $value ) {
-                       if ( Language::isValidCode( $code ) ) {
-                               return array(
-                                       'value' => $value,
-                                       'language' => $code,
-                                       'source' => null,
-                               );
+               foreach ( $data as $languageCode => $value ) {
+                       if ( Language::isValidCode( $languageCode ) ) {
+                               // We can not translate here, we do not have a 
LanguageWithConversion object
+                               return $this->getValueArray( $value, 
$languageCode );
                        }
                }
 
                return null;
        }
 
+       /**
+        * @param string|string[] $value
+        * @param string $languageCode
+        * @param string|null $sourceLanguageCode
+        *
+        * @return string[]
+        */
+       private function getValueArray( $value, $languageCode, 
$sourceLanguageCode = null ) {
+               // Data from an EntityInfoBuilder is already made of pre-build 
arrays
+               if ( !is_array( $value ) ) {
+                       $value = array(
+                               'value' => $value,
+                               'language' => $languageCode,
+                               'source' => $sourceLanguageCode,
+                       );
+               }
+
+               return $value;
+       }
+
 }
diff --git a/lib/tests/phpunit/LanguageFallbackChainTest.php 
b/lib/tests/phpunit/LanguageFallbackChainTest.php
index 83cecc9..e1294d5 100644
--- a/lib/tests/phpunit/LanguageFallbackChainTest.php
+++ b/lib/tests/phpunit/LanguageFallbackChainTest.php
@@ -2,6 +2,7 @@
 
 namespace Wikibase\Test;
 
+use Language;
 use Wikibase\LanguageFallbackChainFactory;
 
 /**
@@ -13,15 +14,16 @@
  *
  * @licence GNU GPL v2+
  * @author Liangent
+ * @author Thiemo Mättig
  */
 class LanguageFallbackChainTest extends \MediaWikiTestCase {
 
        /**
         * @dataProvider provideExtractPreferredValue
         */
-       public function testExtractPreferredValue( $lang, $mode, $data, 
$expected ) {
+       public function testExtractPreferredValue( $languageCode, $mode, $data, 
$expected ) {
                $factory = new LanguageFallbackChainFactory();
-               $chain = $factory->newFromLanguageCode( $lang, $mode );
+               $chain = $factory->newFromLanguageCode( $languageCode, $mode );
 
                $resolved = $chain->extractPreferredValue( $data );
 
@@ -35,6 +37,16 @@
                        'zh-cn' => '测试',
                        'lzh' => '試',
                        'zh-classical' => '驗',
+               );
+               $entityInfoBuilderArray = array(
+                       'de' => array(
+                               'language' => 'de',
+                               'value' => 'Beispiel'
+                       ),
+                       'zh-cn' => array(
+                               'language' => 'zh-cn',
+                               'value' => '测试'
+                       )
                );
 
                return array(
@@ -104,15 +116,26 @@
                                'language' => 'zh-hant',
                                'source' => 'zh-cn',
                        ) ),
+
+                       array( 'de', 
LanguageFallbackChainFactory::FALLBACK_SELF, $entityInfoBuilderArray, array(
+                               'value' => 'Beispiel',
+                               'language' => 'de',
+                               'source' => null,
+                       ) ),
+                       array( 'gan-hant', 
LanguageFallbackChainFactory::FALLBACK_ALL, $entityInfoBuilderArray, array(
+                               'value' => '測試',
+                               'language' => 'zh-hant',
+                               'source' => 'zh-cn',
+                       ) ),
                );
        }
 
        /**
         * @dataProvider provideExtractPreferredValueOrAny
         */
-       public function testExtractPreferredValueOrAny( $lang, $mode, $data, 
$expected ) {
+       public function testExtractPreferredValueOrAny( $languageCode, $mode, 
$data, $expected ) {
                $factory = new LanguageFallbackChainFactory();
-               $chain = $factory->newFromLanguage( \Language::factory( $lang 
), $mode );
+               $chain = $factory->newFromLanguage( Language::factory( 
$languageCode ), $mode );
 
                $resolved = $chain->extractPreferredValueOrAny( $data );
 
@@ -124,6 +147,12 @@
                        'en' => 'foo',
                        'nl' => 'bar',
                        'zh-cn' => '测试',
+               );
+               $entityInfoBuilderArray = array(
+                       'en' => array(
+                               'language' => 'en',
+                               'value' => 'Example'
+                       ),
                );
 
                return array(
@@ -161,6 +190,11 @@
                                ':' => 'qux',
                        ), null ),
                        array( 'ar', 
LanguageFallbackChainFactory::FALLBACK_SELF, array(), null ),
+
+                       array( 'de', 
LanguageFallbackChainFactory::FALLBACK_SELF, $entityInfoBuilderArray, array(
+                               'value' => 'Example',
+                               'language' => 'en',
+                       ) ),
                );
        }
 

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I715bbb02aa780451d4431d185261b3a648910312
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: Hoo man <[email protected]>
Gerrit-Reviewer: Jeroen De Dauw <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: WikidataJenkins <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to