From 9d944bd8166815373710ffd9a790818dc523b4ae Mon Sep 17 00:00:00 2001 From: David Causse Date: Thu, 1 Aug 2019 19:27:29 +0200 Subject: [PATCH] Add SearchResultTrait to hold non-obvious behaviors and rarely specialized methods. Change-Id: Idc600e22b35a01be8be8cb629bfb09701e842cd7 --- autoload.php | 1 + includes/search/SearchResult.php | 43 +--------------- includes/search/SearchResultTrait.php | 50 +++++++++++++++++++ ...sultTest.php => SearchResultTraitTest.php} | 20 +++++--- 4 files changed, 64 insertions(+), 50 deletions(-) create mode 100644 includes/search/SearchResultTrait.php rename tests/phpunit/includes/search/{SearchResultTest.php => SearchResultTraitTest.php} (68%) diff --git a/autoload.php b/autoload.php index acdf8dd3d2..b6ec4590bf 100644 --- a/autoload.php +++ b/autoload.php @@ -1316,6 +1316,7 @@ $wgAutoloadLocalClasses = [ 'SearchResult' => __DIR__ . '/includes/search/SearchResult.php', 'SearchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php', 'SearchResultSetTrait' => __DIR__ . '/includes/search/SearchResultSetTrait.php', + 'SearchResultTrait' => __DIR__ . '/includes/search/SearchResultTrait.php', 'SearchSqlite' => __DIR__ . '/includes/search/SearchSqlite.php', 'SearchSuggestion' => __DIR__ . '/includes/search/SearchSuggestion.php', 'SearchSuggestionSet' => __DIR__ . '/includes/search/SearchSuggestionSet.php', diff --git a/includes/search/SearchResult.php b/includes/search/SearchResult.php index 1954e85c7e..4f91ccbbb9 100644 --- a/includes/search/SearchResult.php +++ b/includes/search/SearchResult.php @@ -30,6 +30,7 @@ use MediaWiki\MediaWikiServices; * @ingroup Search */ class SearchResult { + use SearchResultTrait; /** * @var Revision @@ -51,12 +52,6 @@ class SearchResult { */ protected $mText; - /** - * A function returning a set of extension data. - * @var Closure|null - */ - protected $extensionData; - /** * Return a new SearchResult and initializes it with a title. * @@ -241,40 +236,4 @@ class SearchResult { return false; } - /** - * Get the extension data as: - * augmentor name => data - * @return array[] - */ - public function getExtensionData() { - if ( $this->extensionData ) { - return call_user_func( $this->extensionData ); - } else { - return []; - } - } - - /** - * Set extension data for this result. - * The data is: - * augmentor name => data - * @param Closure|array $extensionData Takes no arguments, returns - * either array of extension data or null. - */ - public function setExtensionData( $extensionData ) { - if ( $extensionData instanceof Closure ) { - $this->extensionData = $extensionData; - } elseif ( is_array( $extensionData ) ) { - wfDeprecated( __METHOD__ . ' with array argument', '1.32' ); - $this->extensionData = function () use ( $extensionData ) { - return $extensionData; - }; - } else { - $type = is_object( $extensionData ) - ? get_class( $extensionData ) - : gettype( $extensionData ); - throw new \InvalidArgumentException( - __METHOD__ . " must be called with Closure|array, but received $type" ); - } - } } diff --git a/includes/search/SearchResultTrait.php b/includes/search/SearchResultTrait.php new file mode 100644 index 0000000000..9a0df2560a --- /dev/null +++ b/includes/search/SearchResultTrait.php @@ -0,0 +1,50 @@ + data + * @return array[] + */ + public function getExtensionData() { + if ( $this->extensionData ) { + return call_user_func( $this->extensionData ); + } else { + return []; + } + } + + /** + * Set extension data for this result. + * The data is: + * augmentor name => data + * @param Closure|array $extensionData Takes no arguments, returns + * either array of extension data or null. + */ + public function setExtensionData( $extensionData ) { + if ( $extensionData instanceof Closure ) { + $this->extensionData = $extensionData; + } elseif ( is_array( $extensionData ) ) { + wfDeprecated( __METHOD__ . ' with array argument', '1.32' ); + $this->extensionData = function () use ( $extensionData ) { + return $extensionData; + }; + } else { + $type = is_object( $extensionData ) + ? get_class( $extensionData ) + : gettype( $extensionData ); + throw new \InvalidArgumentException( + __METHOD__ . " must be called with Closure|array, but received $type" ); + } + } +} diff --git a/tests/phpunit/includes/search/SearchResultTest.php b/tests/phpunit/includes/search/SearchResultTraitTest.php similarity index 68% rename from tests/phpunit/includes/search/SearchResultTest.php rename to tests/phpunit/includes/search/SearchResultTraitTest.php index 0e1e24c089..6700c56a2f 100644 --- a/tests/phpunit/includes/search/SearchResultTest.php +++ b/tests/phpunit/includes/search/SearchResultTraitTest.php @@ -1,12 +1,14 @@ assertEquals( [], $result->getExtensionData(), 'starts empty' ); $data = [ 'hello' => 'world' ]; @@ -19,13 +21,15 @@ class SearchResultTest extends MediawikiTestCase { } /** - * @covers SearchResult::getExtensionData - * @covers SearchResult::setExtensionData + * @covers SearchResultTrait::getExtensionData + * @covers SearchResultTrait::setExtensionData */ public function testExtensionDataArrayBC() { - $result = SearchResult::newFromTitle( Title::newMainPage() ); + $result = new class() { + use SearchResultTrait; + }; $data = [ 'hello' => 'world' ]; - $this->hideDeprecated( 'SearchResult::setExtensionData with array argument' ); + $this->hideDeprecated( 'SearchResultTrait::setExtensionData with array argument' ); $this->assertEquals( [], $result->getExtensionData(), 'starts empty' ); $result->setExtensionData( $data ); $this->assertEquals( $data, $result->getExtensionData(), 'can set extension data' ); -- 2.20.1