Denny Vrandecic has submitted this change and it was merged.

Change subject: Make MultiLangSerializationOptions aware of fallback chains
......................................................................


Make MultiLangSerializationOptions aware of fallback chains

Change-Id: I61e51f32f1e495e885210a835f37dd9c41a670af
---
M lib/includes/serializers/SerializationOptions.php
M lib/tests/phpunit/serializers/SerializationOptionsTest.php
2 files changed, 154 insertions(+), 10 deletions(-)

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



diff --git a/lib/includes/serializers/SerializationOptions.php 
b/lib/includes/serializers/SerializationOptions.php
index d713702..a026d76 100644
--- a/lib/includes/serializers/SerializationOptions.php
+++ b/lib/includes/serializers/SerializationOptions.php
@@ -1,10 +1,12 @@
 <?php
 
 namespace Wikibase\Lib\Serializers;
+use Language;
 use MWException;
 use ValueFormatters\ValueFormatter;
 use Wikibase\EntityId;
 use Wikibase\Lib\EntityIdFormatter;
+use Wikibase\LanguageFallbackChainFactory;
 
 /**
  * Options for Serializer objects.
@@ -131,24 +133,54 @@
  */
 class MultiLangSerializationOptions extends SerializationOptions {
        /**
-        * The language codes of the languages for which internationalized data 
(ie descriptions) should be returned.
+        * The language info array of the languages for which internationalized 
data (ie descriptions) should be returned.
         * Or null for no restriction.
         *
-        * @since 0.2
+        * Array keys are language codes (may include pseudo ones to identify 
some given fallback chains); values are
+        * LanguageFallbackChain objects (plain code inputs are constructed 
into language chains with a single language).
         *
-        * @var null|array of string
+        * @since 0.4
+        *
+        * @var null|array as described above
         */
-       protected $languageCodes = null;
+       protected $languages = null;
 
        /**
-        * Sets the language codes of the languages for which internationalized 
data (ie descriptions) should be returned.
+        * Used to create LanguageFallbackChain objects when the old style 
array-of-strings argument is used in setLanguage().
+        *
+        * @var LanguageFallbackChainFactory
+        */
+       protected $languageFallbackChainFactory;
+
+       /**
+        * Sets the language codes or language fallback chains of the languages 
for which internationalized data
+        * (ie descriptions) should be returned.
         *
         * @since 0.2
         *
-        * @param array|null $languageCodes
+        * @param array|null $languages array of strings (back compat, as 
language codes)
+        *                     or LanguageFallbackChain objects (requested 
language codes as keys, to identify chains)
         */
-       public function setLanguages( array $languageCodes = null ) {
-               $this->languageCodes = $languageCodes;
+       public function setLanguages( array $languages = null ) {
+               if ( $languages === null ) {
+                       $this->languages = null;
+
+                       return;
+               }
+
+               $this->languages = array();
+
+               foreach ( $languages as $languageCode => $languageFallbackChain 
) {
+                       // back-compat
+                       if ( is_numeric( $languageCode ) ) {
+                               $languageCode = $languageFallbackChain;
+                               $languageFallbackChain = 
$this->getLanguageFallbackChainFactory()->newFromLanguage(
+                                       Language::factory( $languageCode ), 
LanguageFallbackChainFactory::FALLBACK_SELF
+                               );
+                       }
+
+                       $this->languages[$languageCode] = 
$languageFallbackChain;
+               }
        }
 
        /**
@@ -159,7 +191,50 @@
         * @return array|null
         */
        public function getLanguages() {
-               return $this->languageCodes;
+               if ( $this->languages === null ) {
+                       return null;
+               } else {
+                       return array_keys( $this->languages );
+               }
+       }
+
+       /**
+        * Gets an associative array with language codes as keys and their 
fallback chains as values, or null.
+        *
+        * @since 0.4
+        *
+        * @return array|null
+        */
+       public function getLanguageFallbackChains() {
+               return $this->languages;
+       }
+
+       /**
+        * Get the language fallback chain factory previously set, or a new one 
if none was set.
+        *
+        * @since 0.4
+        *
+        * @return LanguageFallbackChainFactory
+        */
+       public function getLanguageFallbackChainFactory() {
+               if ( $this->languageFallbackChainFactory === null ) {
+                       $this->languageFallbackChainFactory = new 
LanguageFallbackChainFactory();
+               }
+
+               return $this->languageFallbackChainFactory;
+       }
+
+       /**
+        * Set language fallback chain factory and return the previously set 
one.
+        *
+        * @since 0.4
+        *
+        * @param LanguageFallbackChainFactory $factory
+        *
+        * @return LanguageFallbackChainFactory|null
+        */
+       public function setLanguageFallbackChainFactory( 
LanguageFallbackChainFactory $factory ) {
+               return wfSetVar( $this->languageFallbackChainFactory, $factory 
);
        }
 }
 
diff --git a/lib/tests/phpunit/serializers/SerializationOptionsTest.php 
b/lib/tests/phpunit/serializers/SerializationOptionsTest.php
index 1cf5114..106ba97 100644
--- a/lib/tests/phpunit/serializers/SerializationOptionsTest.php
+++ b/lib/tests/phpunit/serializers/SerializationOptionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Wikibase\Test;
 use Wikibase\Lib\Serializers\SerializationOptions;
+use Wikibase\Lib\Serializers\MultiLangSerializationOptions;
+use Wikibase\LanguageFallbackChainFactory;
 
 /**
  * Tests for the Wikibase\SerializationOptions class.
@@ -33,12 +35,79 @@
  *
  * @licence GNU GPL v2+
  * @author Jeroen De Dauw < jeroended...@gmail.com >
+ * @author Liangent < liang...@gmail.com >
  */
 class SerializationOptionsTest extends \MediaWikiTestCase {
 
-       public function testConstructor() {
+       public function testSerializationOptionsConstructor() {
                new SerializationOptions();
                $this->assertTrue( true );
        }
 
+       public function testMultiLangSerializationOptionsConstructor() {
+               new MultiLangSerializationOptions();
+               $this->assertTrue( true );
+       }
+
+       private function preprocessTestMultiLangSerializationOptionsLanguages( 
$languages ) {
+               if ( $languages === null ) {
+                       return null;
+               }
+
+               $factory = new LanguageFallbackChainFactory();
+
+               foreach ( $languages as $languageKey => &$languageValue ) {
+                       if ( !is_numeric( $languageKey ) ) {
+                               $languageValue = $factory->newFromLanguage(
+                                       \Language::factory( $languageKey ), 
$languageValue
+                               );
+                       }
+               }
+
+               return $languages;
+       }
+
+       /**
+        * @dataProvider provideTestMultiLangSerializationOptionsLanguages
+        */
+       public function testMultiLangSerializationOptionsLanguages( $languages, 
$codes, $fallbackChains ) {
+               $languages = 
$this->preprocessTestMultiLangSerializationOptionsLanguages( $languages );
+               $fallbackChains = 
$this->preprocessTestMultiLangSerializationOptionsLanguages( $fallbackChains );
+
+               $options = new MultiLangSerializationOptions();
+               $options->setLanguages( $languages );
+
+               $this->assertEquals( $codes, $options->getLanguages() );
+               $this->assertEquals( $fallbackChains, 
$options->getLanguageFallbackChains() );
+       }
+
+       public function provideTestMultiLangSerializationOptionsLanguages() {
+               return array(
+                       array( null, null, null ),
+                       array( array( 'en' ), array( 'en' ), array( 'en' => 
LanguageFallbackChainFactory::FALLBACK_SELF ) ),
+                       array( array( 'en', 'de' ), array( 'en', 'de' ), array(
+                               'en' => 
LanguageFallbackChainFactory::FALLBACK_SELF, 'de' => 
LanguageFallbackChainFactory::FALLBACK_SELF
+                       ) ),
+                       array(
+                               array( 'en', 'zh' => 
LanguageFallbackChainFactory::FALLBACK_SELF | 
LanguageFallbackChainFactory::FALLBACK_VARIANTS ),
+                               array( 'en', 'zh' ),
+                               array(
+                                       'en' => 
LanguageFallbackChainFactory::FALLBACK_SELF,
+                                       'zh' => 
LanguageFallbackChainFactory::FALLBACK_SELF | 
LanguageFallbackChainFactory::FALLBACK_VARIANTS,
+                               ),
+                       ),
+                       array(
+                               array(
+                                       'de-formal' => 
LanguageFallbackChainFactory::FALLBACK_OTHERS,
+                                       'sr' => 
LanguageFallbackChainFactory::FALLBACK_SELF | 
LanguageFallbackChainFactory::FALLBACK_VARIANTS,
+                               ),
+                               array( 'de-formal', 'sr' ),
+                               array(
+                                       'de-formal' => 
LanguageFallbackChainFactory::FALLBACK_OTHERS,
+                                       'sr' => 
LanguageFallbackChainFactory::FALLBACK_SELF | 
LanguageFallbackChainFactory::FALLBACK_VARIANTS,
+                               ),
+                       ),
+               );
+       }
+
 }

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I61e51f32f1e495e885210a835f37dd9c41a670af
Gerrit-PatchSet: 13
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: Liangent <liang...@gmail.com>
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