From: daniel Date: Tue, 2 May 2017 19:44:05 +0000 (+0200) Subject: Fix inconsistent spec of InterwikiLookup::getAllPrefixes. X-Git-Tag: 1.31.0-rc.0~3341^2 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_ecrire%28%22upgrade%22%2C%22reinstall=non%22%29%20.%20%22?a=commitdiff_plain;h=7b45d112e6bf5c06013fc1709f7554da5dc44e10;p=lhc%2Fweb%2Fwiklou.git Fix inconsistent spec of InterwikiLookup::getAllPrefixes. The documented return type was not what existing callers expected, and not what the default implementation actually returned. This patch fixes the interface documentation and the behavior of an alternative implementation. Change-Id: Ib09bffeba3ddc5b43da1c7c299f1fa946be4e2e2 --- diff --git a/includes/interwiki/Interwiki.php b/includes/interwiki/Interwiki.php index 558e32c11e..8dd6193a9d 100644 --- a/includes/interwiki/Interwiki.php +++ b/includes/interwiki/Interwiki.php @@ -92,12 +92,12 @@ class Interwiki { } /** - * Returns all interwiki prefixes + * Returns all interwiki prefix definitions. * * @deprecated since 1.28, unused. Use InterwikiLookup instead. * * @param string|null $local If set, limits output to local/non-local interwikis - * @return array List of prefixes + * @return array[] List of interwiki rows * @since 1.19 */ public static function getAllPrefixes( $local = null ) { diff --git a/includes/interwiki/InterwikiLookup.php b/includes/interwiki/InterwikiLookup.php index d0a7719bbe..697e39d540 100644 --- a/includes/interwiki/InterwikiLookup.php +++ b/includes/interwiki/InterwikiLookup.php @@ -47,10 +47,21 @@ interface InterwikiLookup { public function fetch( $prefix ); /** - * Returns all interwiki prefixes + * Returns information about all interwiki prefixes, in the form of rows + * of the interwiki table. Each row may have the following keys: + * + * - iw_prefix: the prefix. Always present. + * - iw_url: the URL to use for linking, with $1 as a placeholder for the target page. + * Always present. + * - iw_api: the URL of the API. Optional. + * - iw_wikiid: the wiki ID (usually the database name for local wikis). Optional. + * - iw_local: whether the wiki is local, and the "magic redirect" mechanism should apply. + * Defaults to false. + * - iw_trans: whether "scary transclusion" is allowed for this site. + * Defaults to false. * * @param string|null $local If set, limits output to local/non-local interwikis - * @return string[] List of prefixes + * @return array[] interwiki rows. */ public function getAllPrefixes( $local = null ); diff --git a/includes/interwiki/InterwikiLookupAdapter.php b/includes/interwiki/InterwikiLookupAdapter.php index 60d6f43ddd..3baea1a0e5 100644 --- a/includes/interwiki/InterwikiLookupAdapter.php +++ b/includes/interwiki/InterwikiLookupAdapter.php @@ -87,16 +87,20 @@ class InterwikiLookupAdapter implements InterwikiLookup { * See InterwikiLookup::getAllPrefixes * * @param string|null $local If set, limits output to local/non-local interwikis - * @return string[] List of prefixes + * @return array[] interwiki rows */ public function getAllPrefixes( $local = null ) { - if ( $local === null ) { - return array_keys( $this->getInterwikiMap() ); - } $res = []; foreach ( $this->getInterwikiMap() as $interwikiId => $interwiki ) { - if ( $interwiki->isLocal() === $local ) { - $res[] = $interwikiId; + if ( $local === null || $interwiki->isLocal() === $local ) { + $res[] = [ + 'iw_prefix' => $interwikiId, + 'iw_url' => $interwiki->getURL(), + 'iw_api' => $interwiki->getAPI(), + 'iw_wikiid' => $interwiki->getWikiID(), + 'iw_local' => $interwiki->isLocal(), + 'iw_trans' => $interwiki->isTranscludable(), + ]; } } return $res; diff --git a/tests/phpunit/includes/interwiki/InterwikiLookupAdapterTest.php b/tests/phpunit/includes/interwiki/InterwikiLookupAdapterTest.php index 4754b040f9..1d62a78766 100644 --- a/tests/phpunit/includes/interwiki/InterwikiLookupAdapterTest.php +++ b/tests/phpunit/includes/interwiki/InterwikiLookupAdapterTest.php @@ -60,20 +60,37 @@ class InterwikiLookupAdapterTest extends MediaWikiTestCase { } public function testGetAllPrefixes() { + $foo = [ + 'iw_prefix' => 'foo', + 'iw_url' => '', + 'iw_api' => '', + 'iw_wikiid' => 'foobar', + 'iw_local' => false, + 'iw_trans' => false, + ]; + $enwt = [ + 'iw_prefix' => 'enwt', + 'iw_url' => 'https://en.wiktionary.org/wiki/$1', + 'iw_api' => 'https://en.wiktionary.org/w/api.php', + 'iw_wikiid' => 'enwiktionary', + 'iw_local' => true, + 'iw_trans' => false, + ]; + $this->assertEquals( - [ 'foo', 'enwt' ], + [ $foo, $enwt ], $this->interwikiLookup->getAllPrefixes(), 'getAllPrefixes()' ); $this->assertEquals( - [ 'foo' ], + [ $foo ], $this->interwikiLookup->getAllPrefixes( false ), 'get external prefixes' ); $this->assertEquals( - [ 'enwt' ], + [ $enwt ], $this->interwikiLookup->getAllPrefixes( true ), 'get local prefixes' );