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