Phantom42 has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/405608 )
Change subject: Fix multiple PHP class declarations in one file ...................................................................... Fix multiple PHP class declarations in one file All files containing more than one PHP class were splitted into multiple files. extension.json was updated to match new class locations. Bug: T177809 Change-Id: I4e7d8f02164c3048c41c4c9fbe4be18a99e7abaa --- M extension.json D includes/ContainmentSet.php A includes/EchoArrayList.php A includes/EchoCachedList.php A includes/EchoContainmentList.php A includes/EchoContainmentSet.php A includes/EchoDiffGroup.php R includes/EchoDiffParser.php A includes/EchoOnWikiList.php 9 files changed, 397 insertions(+), 371 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Echo refs/changes/08/405608/1 diff --git a/extension.json b/extension.json index 3928781..088b764 100644 --- a/extension.json +++ b/extension.json @@ -921,18 +921,18 @@ "EchoAbstractMapper": "includes/mapper/AbstractMapper.php", "EchoAbstractMapperStub": "tests/phpunit/mapper/AbstractMapperTest.php", "EchoAbstractMapperTest": "tests/phpunit/mapper/AbstractMapperTest.php", - "EchoArrayList": "includes/ContainmentSet.php", + "EchoArrayList": "includes/EchoArrayList.php", "EchoAttributeManager": "includes/AttributeManager.php", "EchoAttributeManagerTest": "tests/phpunit/AttributeManagerTest.php", - "EchoCachedList": "includes/ContainmentSet.php", + "EchoCachedList": "includes/EchoCachedList.php", "EchoCallbackIterator": "includes/iterator/CallbackIterator.php", "EchoCatchableFatalErrorException": "includes/exception/CatchableFatalErrorException.php", - "EchoContainmentList": "includes/ContainmentSet.php", - "EchoContainmentSet": "includes/ContainmentSet.php", + "EchoContainmentList": "includes/EchoContainmentList.php", + "EchoContainmentSet": "includes/EchoContainmentSet.php", "EchoDataOutputFormatter": "includes/DataOutputFormatter.php", "EchoDeferredMarkAsDeletedUpdate": "includes/DeferredMarkAsDeletedUpdate.php", - "EchoDiffGroup": "includes/DiffParser.php", - "EchoDiffParser": "includes/DiffParser.php", + "EchoDiffGroup": "includes/EchoDiffGroup.php", + "EchoDiffParser": "includes/EchoDiffParser.php", "EchoDiffParserTest": "tests/phpunit/DiffParserTest.php", "EchoDiscussionParser": "includes/DiscussionParser.php", "EchoDiscussionParserTest": "tests/phpunit/DiscussionParserTest.php", @@ -975,7 +975,7 @@ "EchoNotificationTest": "tests/phpunit/model/NotificationTest.php", "EchoNotifier": "includes/Notifier.php", "EchoOOUI\\LabelIconWidget": "includes/ooui/LabelIconWidget.php", - "EchoOnWikiList": "includes/ContainmentSet.php", + "EchoOnWikiList": "includes/EchoOnWikiList.php", "EchoPageLinkedPresentationModel": "includes/formatters/PageLinkedPresentationModel.php", "EchoPlainTextDigestEmailFormatter": "includes/formatters/EchoPlainTextDigestEmailFormatter.php", "EchoPlainTextEmailFormatter": "includes/formatters/EchoPlainTextEmailFormatter.php", diff --git a/includes/ContainmentSet.php b/includes/ContainmentSet.php deleted file mode 100644 index 5b779d0..0000000 --- a/includes/ContainmentSet.php +++ /dev/null @@ -1,271 +0,0 @@ -<?php - -/** - * Interface providing list of contained values and an optional cache key to go along with it. - */ -interface EchoContainmentList { - /** - * @return array The values contained within this list. - */ - public function getValues(); - - /** - * @return string A string suitable for appending to the cache key prefix to facilitate - * cache busting when the underlying data changes, or a blank string if - * not relevant. - */ - public function getCacheKey(); -} - -/** - * Utilizes EchoContainmentList interface to provide a fluent interface to whitelist/blacklist - * from multiple sources like global variables, wiki pages, etc. - * - * Initialize: - * $cache = ObjectCache::getLocalClusterIntance(); - * $set = new EchoContainmentSet; - * $set->addArray( $wgSomeGlobalParameter ); - * $set->addOnWiki( NS_USER, 'Foo/bar-baz', $cache, 'some_user_specific_cache_key' ); - * - * Usage: - * if ( $set->contains( 'SomeUser' ) ) { - * ... - * } - */ -class EchoContainmentSet { - /** - * @var EchoContainmentList[] - */ - protected $lists = []; - - /** - * @var User - */ - protected $recipient; - - public function __construct( User $recipient ) { - $this->recipient = $recipient; - } - - /** - * Add an EchoContainmentList to the set of lists checked by self::contains() - * - * @param EchoContainmentList $list - */ - public function add( EchoContainmentList $list ) { - $this->lists[] = $list; - } - - /** - * Add a php array to the set of lists checked by self::contains() - * - * @param array $list - */ - public function addArray( array $list ) { - $this->add( new EchoArrayList( $list ) ); - } - - /** - * Add a list from a user preference to the set of lists checked by self::contains(). - * - * @param string $preferenceName - */ - public function addFromUserOption( $preferenceName ) { - $preference = $this->recipient->getOption( $preferenceName, [] ); - - if ( $preference ) { - $lookup = CentralIdLookup::factory(); - $names = $lookup->namesFromCentralIds( $preference, $this->recipient ); - $this->addArray( $names ); - } - } - - /** - * Add a list from a wiki page to the set of lists checked by self::contains(). Data - * from wiki pages is cached via the BagOStuff. Caching is disabled when passing a null - * $cache object. - * - * @param int $namespace An NS_* constant representing the mediawiki namespace of the page containing the list. - * @param string $title The title of the page containing the list. - * @param BagOStuff $cache An object to cache the page with or null for no cache. - * @param string $cacheKeyPrefix A prefix to be combined with the pages latest revision id and used as a cache key. - * - * @throws MWException - */ - public function addOnWiki( $namespace, $title, BagOStuff $cache = null, $cacheKeyPrefix = '' ) { - $list = new EchoOnWikiList( $namespace, $title ); - if ( $cache ) { - if ( $cacheKeyPrefix === '' ) { - throw new MWException( 'Cache requires providing a cache key prefix.' ); - } - $list = new EchoCachedList( $cache, $cacheKeyPrefix, $list ); - } - $this->add( $list ); - } - - /** - * Test the wrapped lists for existence of $value - * - * @param mixed $value The value to look for - * @return bool True when the set contains the provided value - */ - public function contains( $value ) { - foreach ( $this->lists as $list ) { - // Use strict comparison to prevent the number 0 from matching all strings (T177825) - if ( array_search( $value, $list->getValues(), true ) !== false ) { - return true; - } - } - - return false; - } -} - -/** - * Implements the EchoContainmentList interface for php arrays. Possible source - * of arrays includes $wg* global variables initialized from extensions or global - * wiki config. - */ -class EchoArrayList implements EchoContainmentList { - /** - * @var array - */ - protected $list; - - /** - * @param array $list - */ - public function __construct( array $list ) { - $this->list = $list; - } - - /** - * @inheritDoc - */ - public function getValues() { - return $this->list; - } - - /** - * @inheritDoc - */ - public function getCacheKey() { - return ''; - } -} - -/** - * Implements EchoContainmentList interface for sourcing a list of items from a wiki - * page. Uses the pages latest revision ID as cache key. - */ -class EchoOnWikiList implements EchoContainmentList { - /** - * @var Title|null A title object representing the page to source the list from, - * or null if the page does not exist. - */ - protected $title; - - /** - * @param int $titleNs An NS_* constant representing the mediawiki namespace of the page - * @param string $titleString String portion of the wiki page title - */ - public function __construct( $titleNs, $titleString ) { - $title = Title::newFromText( $titleString, $titleNs ); - if ( $title !== null && $title->getArticleId() ) { - $this->title = $title; - } - } - - /** - * @inheritDoc - */ - public function getValues() { - if ( !$this->title ) { - return []; - } - - $article = WikiPage::newFromID( $this->title->getArticleId() ); - if ( $article === null || !$article->exists() ) { - return []; - } - $text = ContentHandler::getContentText( $article->getContent() ); - if ( $text === null ) { - return []; - } - return array_filter( array_map( 'trim', explode( "\n", $text ) ) ); - } - - /** - * @inheritDoc - */ - public function getCacheKey() { - if ( !$this->title ) { - return ''; - } - - return $this->title->getLatestRevID(); - } -} - -/** - * Caches an EchoContainmentList within a BagOStuff(memcache, etc) to prevent needing - * to load the nested list from a potentially slow source (mysql, etc). - */ -class EchoCachedList implements EchoContainmentList { - const ONE_WEEK = 4233600; - const ONE_DAY = 86400; - - protected $cache; - protected $partialCacheKey; - protected $nestedList; - protected $timeout; - private $result; - - /** - * @param BagOStuff $cache Bag to stored cached data in. - * @param string $partialCacheKey Partial cache key, $nestedList->getCacheKey() will be appended - * to this to construct the cache key used. - * @param EchoContainmentList $nestedList The nested EchoContainmentList to cache the result of. - * @param int $timeout How long in seconds to cache the nested list, defaults to 1 week. - */ - public function __construct( BagOStuff $cache, $partialCacheKey, EchoContainmentList $nestedList, $timeout = self::ONE_WEEK ) { - $this->cache = $cache; - $this->partialCacheKey = $partialCacheKey; - $this->nestedList = $nestedList; - $this->timeout = $timeout; - } - - /** - * @inheritDoc - */ - public function getValues() { - if ( $this->result ) { - return $this->result; - } - - $cacheKey = $this->getCacheKey(); - $fetched = $this->cache->get( $cacheKey ); - if ( is_array( $fetched ) ) { - return $this->result = $fetched; - } - - $result = $this->nestedList->getValues(); - if ( !is_array( $result ) ) { - throw new MWException( sprintf( - "Expected array but received '%s' from '%s::getValues'", - is_object( $result ) ? get_class( $result ) : gettype( $result ), - get_class( $this->nestedList ) - ) ); - } - $this->cache->set( $cacheKey, $result, $this->timeout ); - - return $this->result = $result; - } - - /** - * @inheritDoc - */ - public function getCacheKey() { - return $this->partialCacheKey . '_' . $this->nestedList->getCacheKey(); - } -} diff --git a/includes/EchoArrayList.php b/includes/EchoArrayList.php new file mode 100644 index 0000000..7c22021 --- /dev/null +++ b/includes/EchoArrayList.php @@ -0,0 +1,34 @@ +<?php + +/** + * Implements the EchoContainmentList interface for php arrays. Possible source + * of arrays includes $wg* global variables initialized from extensions or global + * wiki config. + */ +class EchoArrayList implements EchoContainmentList { + /** + * @var array + */ + protected $list; + + /** + * @param array $list + */ + public function __construct( array $list ) { + $this->list = $list; + } + + /** + * @inheritDoc + */ + public function getValues() { + return $this->list; + } + + /** + * @inheritDoc + */ + public function getCacheKey() { + return ''; + } +} diff --git a/includes/EchoCachedList.php b/includes/EchoCachedList.php new file mode 100644 index 0000000..6e0a209 --- /dev/null +++ b/includes/EchoCachedList.php @@ -0,0 +1,64 @@ +<?php + +/** + * Caches an EchoContainmentList within a BagOStuff(memcache, etc) to prevent needing + * to load the nested list from a potentially slow source (mysql, etc). + */ +class EchoCachedList implements EchoContainmentList { + const ONE_WEEK = 4233600; + const ONE_DAY = 86400; + + protected $cache; + protected $partialCacheKey; + protected $nestedList; + protected $timeout; + private $result; + + /** + * @param BagOStuff $cache Bag to stored cached data in. + * @param string $partialCacheKey Partial cache key, $nestedList->getCacheKey() will be appended + * to this to construct the cache key used. + * @param EchoContainmentList $nestedList The nested EchoContainmentList to cache the result of. + * @param int $timeout How long in seconds to cache the nested list, defaults to 1 week. + */ + public function __construct( BagOStuff $cache, $partialCacheKey, EchoContainmentList $nestedList, $timeout = self::ONE_WEEK ) { + $this->cache = $cache; + $this->partialCacheKey = $partialCacheKey; + $this->nestedList = $nestedList; + $this->timeout = $timeout; + } + + /** + * @inheritDoc + */ + public function getValues() { + if ( $this->result ) { + return $this->result; + } + + $cacheKey = $this->getCacheKey(); + $fetched = $this->cache->get( $cacheKey ); + if ( is_array( $fetched ) ) { + return $this->result = $fetched; + } + + $result = $this->nestedList->getValues(); + if ( !is_array( $result ) ) { + throw new MWException( sprintf( + "Expected array but received '%s' from '%s::getValues'", + is_object( $result ) ? get_class( $result ) : gettype( $result ), + get_class( $this->nestedList ) + ) ); + } + $this->cache->set( $cacheKey, $result, $this->timeout ); + + return $this->result = $result; + } + + /** + * @inheritDoc + */ + public function getCacheKey() { + return $this->partialCacheKey . '_' . $this->nestedList->getCacheKey(); + } +} diff --git a/includes/EchoContainmentList.php b/includes/EchoContainmentList.php new file mode 100644 index 0000000..56c5b29 --- /dev/null +++ b/includes/EchoContainmentList.php @@ -0,0 +1,18 @@ +<?php + +/** + * Interface providing list of contained values and an optional cache key to go along with it. + */ +interface EchoContainmentList { + /** + * @return array The values contained within this list. + */ + public function getValues(); + + /** + * @return string A string suitable for appending to the cache key prefix to facilitate + * cache busting when the underlying data changes, or a blank string if + * not relevant. + */ + public function getCacheKey(); +} diff --git a/includes/EchoContainmentSet.php b/includes/EchoContainmentSet.php new file mode 100644 index 0000000..58b95f5 --- /dev/null +++ b/includes/EchoContainmentSet.php @@ -0,0 +1,105 @@ +<?php + +/** + * Utilizes EchoContainmentList interface to provide a fluent interface to whitelist/blacklist + * from multiple sources like global variables, wiki pages, etc. + * + * Initialize: + * $cache = ObjectCache::getLocalClusterIntance(); + * $set = new EchoContainmentSet; + * $set->addArray( $wgSomeGlobalParameter ); + * $set->addOnWiki( NS_USER, 'Foo/bar-baz', $cache, 'some_user_specific_cache_key' ); + * + * Usage: + * if ( $set->contains( 'SomeUser' ) ) { + * ... + * } + */ +class EchoContainmentSet { + /** + * @var EchoContainmentList[] + */ + protected $lists = []; + + /** + * @var User + */ + protected $recipient; + + public function __construct( User $recipient ) { + $this->recipient = $recipient; + } + + /** + * Add an EchoContainmentList to the set of lists checked by self::contains() + * + * @param EchoContainmentList $list + */ + public function add( EchoContainmentList $list ) { + $this->lists[] = $list; + } + + /** + * Add a php array to the set of lists checked by self::contains() + * + * @param array $list + */ + public function addArray( array $list ) { + $this->add( new EchoArrayList( $list ) ); + } + + /** + * Add a list from a user preference to the set of lists checked by self::contains(). + * + * @param string $preferenceName + */ + public function addFromUserOption( $preferenceName ) { + $preference = $this->recipient->getOption( $preferenceName, [] ); + + if ( $preference ) { + $lookup = CentralIdLookup::factory(); + $names = $lookup->namesFromCentralIds( $preference, $this->recipient ); + $this->addArray( $names ); + } + } + + /** + * Add a list from a wiki page to the set of lists checked by self::contains(). Data + * from wiki pages is cached via the BagOStuff. Caching is disabled when passing a null + * $cache object. + * + * @param int $namespace An NS_* constant representing the mediawiki namespace of the page containing the list. + * @param string $title The title of the page containing the list. + * @param BagOStuff $cache An object to cache the page with or null for no cache. + * @param string $cacheKeyPrefix A prefix to be combined with the pages latest revision id and used as a cache key. + * + * @throws MWException + */ + public function addOnWiki( $namespace, $title, BagOStuff $cache = null, $cacheKeyPrefix = '' ) { + $list = new EchoOnWikiList( $namespace, $title ); + if ( $cache ) { + if ( $cacheKeyPrefix === '' ) { + throw new MWException( 'Cache requires providing a cache key prefix.' ); + } + $list = new EchoCachedList( $cache, $cacheKeyPrefix, $list ); + } + $this->add( $list ); + } + + /** + * Test the wrapped lists for existence of $value + * + * @param mixed $value The value to look for + * @return bool True when the set contains the provided value + */ + public function contains( $value ) { + foreach ( $this->lists as $list ) { + // Use strict comparison to prevent the number 0 from matching all strings (T177825) + if ( array_search( $value, $list->getValues(), true ) !== false ) { + return true; + } + } + + return false; + } +} diff --git a/includes/EchoDiffGroup.php b/includes/EchoDiffGroup.php new file mode 100644 index 0000000..daeb0d7 --- /dev/null +++ b/includes/EchoDiffGroup.php @@ -0,0 +1,115 @@ +<?php +/** + * MediaWiki Extension: Echo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * This program is distributed WITHOUT ANY WARRANTY. + */ + +/** + * @file + * @ingroup Extensions + * @author Erik Bernhardson + */ + +/** + * Represents a single set of changes all effecting neighboring lines + */ +class EchoDiffGroup { + /** + * @var array The left and right position this change starts at + */ + protected $position; + + /** + * @var array The lines that have been added + */ + protected $new = []; + + /** + * @var array The lines that have been removed + */ + protected $old = []; + + /** + * @param int $leftPos The starting line number in the left text + * @param int $rightPos The starting line number in the right text + */ + public function __construct( $leftPos, $rightPos ) { + // +1 due to the origional code use 1 indexing for this result + $this->position = [ + 'right-pos' => $rightPos + 1, + 'left-pos' => $leftPos + 1, + ]; + } + + /** + * @param string $line Line in the right text but not in the left + */ + public function add( $line ) { + $this->new[] = $line; + } + + /** + * @param string $line Line in the left text but not in the right + */ + public function subtract( $line ) { + $this->old[] = $line; + } + + /** + * @return array[] set of changes + * Each change consists of: + * An 'action', one of: + * - add + * - subtract + * - change + * 'content' that was added or removed, or in the case + * of a change, 'old_content' and 'new_content' + * 'left_pos' and 'right_pos' (in 1-indexed lines) of the change. + */ + public function getChangeSet() { + $old = implode( "\n", $this->old ); + $new = implode( "\n", $this->new ); + $position = $this->position; + $changeSet = []; + + // The implodes must come first because we consider array( '' ) to also be false + // meaning a blank link replaced with content is an addition + if ( $old && $new ) { + $min = min( count( $this->old ), count( $this->new ) ); + $changeSet[] = $position + [ + 'action' => 'change', + 'old_content' => implode( "\n", array_slice( $this->old, 0, $min ) ), + 'new_content' => implode( "\n", array_slice( $this->new, 0, $min ) ), + ]; + $position['left-pos'] += $min; + $position['right-pos'] += $min; + $old = implode( "\n", array_slice( $this->old, $min ) ); + $new = implode( "\n", array_slice( $this->new, $min ) ); + } + + if ( $new ) { + $changeSet[] = $position + [ + 'action' => 'add', + 'content' => $new, + ]; + } elseif ( $old ) { + $changeSet[] = $position + [ + 'action' => 'subtract', + 'content' => $old, + ]; + } + + return $changeSet; + } +} diff --git a/includes/DiffParser.php b/includes/EchoDiffParser.php similarity index 73% rename from includes/DiffParser.php rename to includes/EchoDiffParser.php index 379945f..f8b97af 100644 --- a/includes/DiffParser.php +++ b/includes/EchoDiffParser.php @@ -238,96 +238,3 @@ return $change; } } - -/** - * Represents a single set of changes all effecting neighboring lines - */ -class EchoDiffGroup { - /** - * @var array The left and right position this change starts at - */ - protected $position; - - /** - * @var array The lines that have been added - */ - protected $new = []; - - /** - * @var array The lines that have been removed - */ - protected $old = []; - - /** - * @param int $leftPos The starting line number in the left text - * @param int $rightPos The starting line number in the right text - */ - public function __construct( $leftPos, $rightPos ) { - // +1 due to the origional code use 1 indexing for this result - $this->position = [ - 'right-pos' => $rightPos + 1, - 'left-pos' => $leftPos + 1, - ]; - } - - /** - * @param string $line Line in the right text but not in the left - */ - public function add( $line ) { - $this->new[] = $line; - } - - /** - * @param string $line Line in the left text but not in the right - */ - public function subtract( $line ) { - $this->old[] = $line; - } - - /** - * @return array[] set of changes - * Each change consists of: - * An 'action', one of: - * - add - * - subtract - * - change - * 'content' that was added or removed, or in the case - * of a change, 'old_content' and 'new_content' - * 'left_pos' and 'right_pos' (in 1-indexed lines) of the change. - */ - public function getChangeSet() { - $old = implode( "\n", $this->old ); - $new = implode( "\n", $this->new ); - $position = $this->position; - $changeSet = []; - - // The implodes must come first because we consider array( '' ) to also be false - // meaning a blank link replaced with content is an addition - if ( $old && $new ) { - $min = min( count( $this->old ), count( $this->new ) ); - $changeSet[] = $position + [ - 'action' => 'change', - 'old_content' => implode( "\n", array_slice( $this->old, 0, $min ) ), - 'new_content' => implode( "\n", array_slice( $this->new, 0, $min ) ), - ]; - $position['left-pos'] += $min; - $position['right-pos'] += $min; - $old = implode( "\n", array_slice( $this->old, $min ) ); - $new = implode( "\n", array_slice( $this->new, $min ) ); - } - - if ( $new ) { - $changeSet[] = $position + [ - 'action' => 'add', - 'content' => $new, - ]; - } elseif ( $old ) { - $changeSet[] = $position + [ - 'action' => 'subtract', - 'content' => $old, - ]; - } - - return $changeSet; - } -} diff --git a/includes/EchoOnWikiList.php b/includes/EchoOnWikiList.php new file mode 100644 index 0000000..5bdc4dd --- /dev/null +++ b/includes/EchoOnWikiList.php @@ -0,0 +1,54 @@ +<?php + +/** + * Implements EchoContainmentList interface for sourcing a list of items from a wiki + * page. Uses the pages latest revision ID as cache key. + */ +class EchoOnWikiList implements EchoContainmentList { + /** + * @var Title|null A title object representing the page to source the list from, + * or null if the page does not exist. + */ + protected $title; + + /** + * @param int $titleNs An NS_* constant representing the mediawiki namespace of the page + * @param string $titleString String portion of the wiki page title + */ + public function __construct( $titleNs, $titleString ) { + $title = Title::newFromText( $titleString, $titleNs ); + if ( $title !== null && $title->getArticleId() ) { + $this->title = $title; + } + } + + /** + * @inheritDoc + */ + public function getValues() { + if ( !$this->title ) { + return []; + } + + $article = WikiPage::newFromID( $this->title->getArticleId() ); + if ( $article === null || !$article->exists() ) { + return []; + } + $text = ContentHandler::getContentText( $article->getContent() ); + if ( $text === null ) { + return []; + } + return array_filter( array_map( 'trim', explode( "\n", $text ) ) ); + } + + /** + * @inheritDoc + */ + public function getCacheKey() { + if ( !$this->title ) { + return ''; + } + + return $this->title->getLatestRevID(); + } +} -- To view, visit https://gerrit.wikimedia.org/r/405608 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I4e7d8f02164c3048c41c4c9fbe4be18a99e7abaa Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Echo Gerrit-Branch: master Gerrit-Owner: Phantom42 <nikita...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits