registration: Fix handling of MessagesDirs array and add tests

Previously the code was designed to handle:
  "MessagesDirs": {
    "FooBar": "i18n"
  }

However, it can also be an array, and some extensions (VisualEditor)
use it like:

  "MessagesDirs": {
    "FooBar": [
      "i18n",
      "also-i18n"
    ]
  }

This properly handles both strings and arrays and adds tests to verify
the behavior.

Change-Id: Iff1523b86f754cac1f5b8d822d4324c5fbfc1a50
This commit is contained in:
Kunal Mehta 2015-01-30 12:56:02 -08:00
parent 576adbca56
commit f2daeaa749
2 changed files with 32 additions and 3 deletions

View file

@ -204,9 +204,11 @@ class ExtensionProcessor implements Processor {
protected function extractMessageSettings( $dir, array $info ) {
foreach ( array( 'ExtensionMessagesFiles', 'MessagesDirs' ) as $key ) {
if ( isset( $info[$key] ) ) {
$this->globals["wg$key"] += array_map( function( $file ) use ( $dir ) {
return "$dir/$file";
}, $info[$key] );
foreach ( $info[$key] as $name => $files ) {
foreach ( (array)$files as $file ) {
$this->globals["wg$key"][$name][] = "$dir/$file";
}
}
$this->processed[] = $key;
}
}

View file

@ -97,6 +97,33 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
$this->assertArrayNotHasKey( 'wg@IGNORED', $extracted['globals'] );
}
public static function provideExtractMessageSettings() {
$dir = __DIR__ . '/FooBar/';
return array(
array(
array( 'MessagesDirs' => array( 'VisualEditor' => 'i18n' ) ),
array( 'wgMessagesDirs' => array( 'VisualEditor' => array( $dir . 'i18n' ) ) )
),
array(
array( 'MessagesDirs' => array( 'VisualEditor' => array( 'i18n', 'foobar' ) ) ),
array( 'wgMessagesDirs' => array( 'VisualEditor' => array( $dir . 'i18n', $dir . 'foobar' ) ) )
),
);
}
/**
* @covers ExtensionProcessor::extractMessageSettings
* @dataProvider provideExtractMessageSettings
*/
public function testExtractMessageSettings( $input, $expected ) {
$processor = new ExtensionProcessor();
$processor->extractInfo( $this->dir, $input + self::$default );
$out = $processor->getExtractedInfo();
foreach ( $expected as $key => $value ) {
$this->assertEquals( $value, $out['globals'][$key] );
}
}
public static function provideSetToGlobal() {
return array(
array(