Noella94 has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/405410 )
Change subject: [WIP]Replacing target Arrays with Objects.
......................................................................
[WIP]Replacing target Arrays with Objects.
Instead of passing targets as Arrays passing now but target Objects
Bug: T178215
Bug: T178431
Change-Id: I680b49a9fda733b9f851f06a0d90e93bf2b03847
---
M MassMessage.hooks.php
M extension.json
M includes/ApiEditMassMessageList.php
M includes/MassMessage.php
M includes/MassMessageTargets.php
M includes/SpecialCreateMassMessageList.php
M includes/SpecialEditMassMessageList.php
A includes/Target.php
M includes/content/MassMessageListContent.php
M includes/content/MassMessageListContentHandler.php
10 files changed, 127 insertions(+), 77 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MassMessage
refs/changes/10/405410/1
diff --git a/MassMessage.hooks.php b/MassMessage.hooks.php
index 15da813..ecebafd 100644
--- a/MassMessage.hooks.php
+++ b/MassMessage.hooks.php
@@ -40,17 +40,17 @@
$parser->addTrackingCategory( 'massmessage-list-category' );
- $data = MassMessage::processPFData( $page, $site );
- if ( isset( $data['error'] ) ) {
+ $data =(object) MassMessage::processPFData( $page, $site );
+ if ( isset( $data->error ) ) {
return $data;
}
// Use a message so wikis can customize the output
if ( $wgAllowGlobalMessaging ) {
$msg = wfMessage( 'massmessage-target' )
- ->params( $data['site'], $wgScript,
$data['title'] )->plain();
+ ->params( $data->site, $wgScript, $data->title
)->plain();
} else {
- $msg = wfMessage( 'massmessage-target-local' )->params(
$data['title'] )->plain();
+ $msg = wfMessage( 'massmessage-target-local' )->params(
$data->title )->plain();
}
return [ $msg, 'noparse' => false ];
@@ -65,16 +65,16 @@
*/
public static function storeDataParserFunction( Parser $parser, $page,
$site = '' ) {
$data = MassMessage::processPFData( $page, $site );
- if ( isset( $data['error'] ) ) {
+ if ( isset( $data->error ) ) {
return ''; // Output doesn't matter
}
$output = $parser->getOutput();
$current = $output->getExtensionData( 'massmessage-targets' );
if ( !$current ) {
- $output->setExtensionData( 'massmessage-targets', [
$data ] );
+ $output->setExtensionData( 'massmessage-targets',
(array) $data );
} else {
$output->setExtensionData( 'massmessage-targets',
- array_merge( $current, [ $data ] ) );
+ array_merge( $current, (array) $data ) );
}
return '';
}
diff --git a/extension.json b/extension.json
index 6a1b354..e9d0a46 100644
--- a/extension.json
+++ b/extension.json
@@ -226,7 +226,8 @@
"MediaWiki\\MassMessage\\MassMessageListContentHandler":
"includes/content/MassMessageListContentHandler.php",
"MediaWiki\\MassMessage\\MassMessageListDiffEngine":
"includes/content/MassMessageListDiffEngine.php",
"MediaWiki\\MassMessage\\MassMessageTestCase":
"tests/phpunit/MassMessageTestCase.php",
- "MediaWiki\\MassMessage\\MassMessageApiTestCase":
"tests/phpunit/MassMessageApiTestCase.php"
+ "MediaWiki\\MassMessage\\MassMessageApiTestCase":
"tests/phpunit/MassMessageApiTestCase.php",
+ "MediaWiki\\MassMessage\\Target": "includes/Target.php"
},
"manifest_version": 1
}
diff --git a/includes/ApiEditMassMessageList.php
b/includes/ApiEditMassMessageList.php
index 9ffd8e7..ae5c5e7 100644
--- a/includes/ApiEditMassMessageList.php
+++ b/includes/ApiEditMassMessageList.php
@@ -44,9 +44,9 @@
foreach ( $data['add'] as $page ) {
$target =
MassMessageListContentHandler::extractTarget( $page );
- if ( isset( $target['errors'] ) ) {
+ if ( isset( $target->errors ) ) {
$item = [ '*' => $page ];
- foreach ( $target['errors'] as $error )
{
+ foreach ( $target->errors as $error ) {
$item[$error] = '';
}
$invalidAdd[] = $item;
@@ -66,7 +66,7 @@
foreach ( $data['remove'] as $page ) {
$target =
MassMessageListContentHandler::extractTarget( $page );
- if ( isset( $target['errors'] ) || !in_array(
$target, $newTargets ) ) {
+ if ( isset( $target->errors ) || !in_array(
$target, $newTargets ) ) {
$invalidRemove[] = $page;
} else {
$toRemove[] = $target;
@@ -112,25 +112,25 @@
$result = $this->getResult();
$resultArray = [ 'result' => 'Success' ];
-
if ( isset( $data['add'] ) ) {
$resultArray['added'] = $added;
// Use a LinkBatch to look up and cache existence for
all local targets
$lb = new LinkBatch;
foreach ( $resultArray['added'] as $target ) {
- if ( !isset( $target['site'] ) ) {
- $lb->addObj( Title::newFromText(
$target['title'] ) );
+ if ( !isset( $target->site ) ) {
+ $lb->addObj( Title::newFromText(
$target->title ) );
}
}
$lb->execute();
// Add an empty "missing" attribute to new local
targets that do not exist
foreach ( $resultArray['added'] as &$target ) {
- if ( !isset( $target['site'] )
- && !Title::newFromText(
$target['title'] )->exists()
+
+ if ( !isset( $target->site )
+ && !Title::newFromText( $target->title
)->exists()
) {
- $target['missing'] = '';
+ $target->missing = '';
}
}
diff --git a/includes/MassMessage.php b/includes/MassMessage.php
index 8a79902..1db81bc 100644
--- a/includes/MassMessage.php
+++ b/includes/MassMessage.php
@@ -46,10 +46,10 @@
}
/**
- * Verify that parser function data is valid and return processed data
as an array
+ * Verify that parser function data is valid and returns processed data
as an object
* @param string $page
* @param string $site
- * @return array
+ * @return Target object
*/
public static function processPFData( $page, $site ) {
global $wgCanonicalServer, $wgAllowGlobalMessaging;
@@ -57,21 +57,25 @@
if ( $titleObj === null ) {
return self::parserError( 'massmessage-parse-badpage',
$page );
}
+
+ // Target object.
+ $data = new Target();
- $data = [ 'title' => $page, 'site' => trim( $site ) ];
- if ( $data['site'] === '' ) {
- $data['site'] = UrlHelper::getBaseUrl(
$wgCanonicalServer );
- $data['wiki'] = wfWikiID();
+ $data->title = $page;
+ $data->site = trim($site);
+ if ( $data->site === '' ) {
+ $data->site = UrlHelper::getBaseUrl( $wgCanonicalServer
);
+ $data->wiki = wfWikiID();
} else {
- $data['wiki'] = DatabaseLookup::getDBName(
$data['site'] );
- if ( $data['wiki'] === null ) {
+ $data->wiki = DatabaseLookup::getDBName( $data->site );
+ if ( $data->wiki === null ) {
return self::parserError(
'massmessage-parse-badurl', $site );
}
- if ( !$wgAllowGlobalMessaging && $data['wiki'] !==
wfWikiID() ) {
+ if ( !$wgAllowGlobalMessaging && $data->wiki !==
wfWikiID() ) {
return self::parserError(
'massmessage-global-disallowed' );
}
}
- if ( $data['wiki'] === wfWikiID() && $titleObj->isExternal() ) {
+ if ( $data->wiki === wfWikiID() && $titleObj->isExternal() ) {
// interwiki links don't work
if ( $wgAllowGlobalMessaging ) {
// tell them they need to use the |site=
parameter
diff --git a/includes/MassMessageTargets.php b/includes/MassMessageTargets.php
index 9052682..05a5feb 100644
--- a/includes/MassMessageTargets.php
+++ b/includes/MassMessageTargets.php
@@ -17,13 +17,13 @@
/**
* Get an array of targets given a title; returns null if invalid.
*
- * Each target is an associative array with the following keys:
+ * Each target is an object with the following properties:
* title: The title of the target
* wiki: The ID of the wiki (wfWikiID() for the local wiki)
* site: The hostname and port (if exists) of the wiki
*
- * Normalized targets are briefly cached because it can be expensive to
parse PF targets on both
- * preview and save in SpecialMassMessage.
+ * Normalized targets are briefly cached because it can be expensive to
parse PF
+ * targets on both preview and save in SpecialMassMessage.
*
* @param Title $spamlist
* @param bool $normalize Whether to normalize and deduplicate the
targets
@@ -81,8 +81,8 @@
global $wgNamespacesToConvert;
foreach ( $data as &$target ) {
- if ( $target['wiki'] === wfWikiID() ) {
- $title = Title::newFromText( $target['title'] );
+ if ( $target->wiki === wfWikiID() ) {
+ $title = Title::newFromText( $target->title );
if ( $title === null ) {
continue;
}
@@ -94,7 +94,7 @@
if ( $title === null ) {
continue; // Interwiki redirect
}
- $target['title'] = $title->getPrefixedText();
+ $target->title = $title->getPrefixedText();
}
}
@@ -115,10 +115,12 @@
/** @var Title $member */
foreach ( $members as $member ) {
+ // Target object in the list of targets.
+ $targetObject = new Target();
$targets[] = [
- 'title' => $member->getPrefixedText(),
- 'wiki' => wfWikiID(),
- 'site' => UrlHelper::getBaseUrl(
$wgCanonicalServer ),
+ $targetObject->title =>
$member->getPrefixedText(),
+ $targetObject->wiki => wfWikiID(),
+ $targetObject->site => UrlHelper::getBaseUrl(
$wgCanonicalServer ),
];
}
return $targets;
@@ -134,11 +136,13 @@
$targets = Revision::newFromTitle( $spamlist
)->getContent()->getValidTargets();
foreach ( $targets as &$target ) {
- if ( array_key_exists( 'site', $target ) ) {
- $target['wiki'] = DatabaseLookup::getDBName(
$target['site'] );
+ // Target object in the list of targets.
+ $targetObject = new Target();
+ if ( isset( $targetObject->site ) ) {
+ $targetObject->wiki =
DatabaseLookup::getDBName( $target->site );
} else {
- $target['site'] = UrlHelper::getBaseUrl(
$wgCanonicalServer );
- $target['wiki'] = wfWikiId();
+ $targetObject->site = UrlHelper::getBaseUrl(
$wgCanonicalServer );
+ $targetObject->wiki = wfWikiId();
}
}
return $targets;
diff --git a/includes/SpecialCreateMassMessageList.php
b/includes/SpecialCreateMassMessageList.php
index 5ce83b1..c5e7058 100644
--- a/includes/SpecialCreateMassMessageList.php
+++ b/includes/SpecialCreateMassMessageList.php
@@ -145,9 +145,11 @@
$targets = [];
foreach ( $pages as $page ) {
- $target = [ 'title' => $page['title'] ];
- if ( $page['wiki'] !== wfWikiID() ) {
- $target['site'] = $page['site'];
+ // Target object.
+ $target = new Target();
+ $target->title = $page->title;
+ if ( $page->wiki !== wfWikiID() ) {
+ $target->site = $page->site;
}
$targets[] = $target;
}
diff --git a/includes/SpecialEditMassMessageList.php
b/includes/SpecialEditMassMessageList.php
index bb258e7..92b7041 100644
--- a/includes/SpecialEditMassMessageList.php
+++ b/includes/SpecialEditMassMessageList.php
@@ -287,7 +287,7 @@
$invalidTargets = [];
foreach ( $lines as $line ) {
$target = MassMessageListContentHandler::extractTarget(
$line );
- if ( array_key_exists( 'errors', $target ) ) {
+ if ( $target->errors !== null ) {
$invalidTargets[] = $line;
}
$targets[] = $target;
diff --git a/includes/Target.php b/includes/Target.php
new file mode 100644
index 0000000..bd29f8f
--- /dev/null
+++ b/includes/Target.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * Class to allow MassMessage use targets an object
+ * and not as arrays as was done previously.
+ *
+ * @file
+ * @author Noella Teke
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
2.0 or later
+ */
+
+namespace MediaWiki\MassMessage;
+
+class Target {
+
+ /**
+ * @var string
+ */
+ public $title;
+
+ /**
+ * @var string
+ */
+ public $site;
+
+ /**
+ * @var int
+ */
+ public $wiki;
+
+ /**
+ * @var array
+ */
+ public $errors = [];
+
+ public function __construct() {
+ parent::__construct( 'MassMessage', 'massmessage' );
+ }
+}
diff --git a/includes/content/MassMessageListContent.php
b/includes/content/MassMessageListContent.php
index 592d66c..cafba5b 100644
--- a/includes/content/MassMessageListContent.php
+++ b/includes/content/MassMessageListContent.php
@@ -95,9 +95,9 @@
$targets = $this->getTargets();
$validTargets = [];
foreach ( $targets as $target ) {
- if ( !array_key_exists( 'site', $target )
+ if ( !$target->site
|| $wgAllowGlobalMessaging
- && DatabaseLookup::getDBName( $target['site'] )
!== null
+ && DatabaseLookup::getDBName( $target->site )
!== null
) {
$validTargets[] = $target;
}
@@ -115,14 +115,15 @@
$targets = $this->getTargets();
$targetStrings = [];
foreach ( $targets as $target ) {
- if ( array_key_exists( 'site', $target ) ) {
- $targetStrings[] = $target['title'] . '@' .
$target['site'];
- } elseif ( strpos( $target['title'], '@' ) !== false ) {
+ $target = (object) $target;
+ if ( $target->site ) {
+ $targetStrings[] = $target->title . '@' .
$target->site;
+ } elseif ( strpos( $target->title, '@' ) !== false ) {
// List the site if it'd otherwise be ambiguous
- $targetStrings[] = $target['title'] . '@'
+ $targetStrings[] = $target->title . '@'
. UrlHelper::getBaseUrl(
$wgCanonicalServer );
} else {
- $targetStrings[] = $target['title'];
+ $targetStrings[] = $target->title;
}
}
return $targetStrings;
@@ -139,14 +140,14 @@
$data = $jsonParse->isGood() ? $jsonParse->getValue() : null;
if ( $data ) {
$this->description = isset( $data->description ) ?
$data->description : null;
- if ( isset( $data->targets ) && is_array(
$data->targets ) ) {
+ if ( isset( $data->targets ) ) {
$this->targets = [];
foreach ( $data->targets as $target ) {
if ( !is_object( $target ) ) { // There
is a malformed target.
$this->targets = null;
break;
}
- $this->targets[] = wfObjectToArray(
$target ); // Convert to associative array.
+ $this->targets[] = $target;
}
} else {
$this->targets = null;
@@ -191,11 +192,11 @@
// Update the links table.
$targets = $this->getTargets();
foreach ( $targets as $target ) {
- if ( !array_key_exists( 'site', $target ) ) {
- $output->addLink( Title::newFromText(
$target['title'] ) );
+ if ( !isset( $target->site ) ) {
+ $output->addLink( Title::newFromText(
$target->title ) );
} else {
- $output->addExternalLink( '//' .
$target['site'] . $wgScript . '?title='
- . Title::newFromText( $target['title']
)->getPrefixedURL() );
+ $output->addExternalLink( '//' . $target->site
. $wgScript . '?title='
+ . Title::newFromText( $target->title
)->getPrefixedURL() );
}
}
}
@@ -294,10 +295,10 @@
$targets = $this->getTargets();
$results = [];
foreach ( $targets as $target ) {
- if ( array_key_exists( 'site', $target ) ) {
- $results[$target['site']][] = $target['title'];
+ if ( isset( $target->site ) ) {
+ $results[$target->site][] = $target->title;
} else {
- $results['local'][] = $target['title'];
+ $results['local'][] = $target->title;
}
}
return $results;
diff --git a/includes/content/MassMessageListContentHandler.php
b/includes/content/MassMessageListContentHandler.php
index a04f78c..3e49f63 100644
--- a/includes/content/MassMessageListContentHandler.php
+++ b/includes/content/MassMessageListContentHandler.php
@@ -97,7 +97,7 @@
}
/**
- * Deduplicate and sort a target array
+ * Deduplicate and sort a target objects
* @param array $targets
* @return array
*/
@@ -109,28 +109,28 @@
/**
* Compare two targets for ordering
- * @param array $a
- * @param array $b
+ * @param Target $a
+ * @param Target $b
* @return int
*/
public static function compareTargets( $a, $b ) {
- if ( !array_key_exists( 'site', $a ) && array_key_exists(
'site', $b ) ) {
+ if ( !isset( $a->site ) && isset( $b->site ) ) {
return -1;
- } elseif ( array_key_exists( 'site', $a ) && !array_key_exists(
'site', $b ) ) {
+ } elseif ( isset( $a->site ) && !isset( $b->site ) ) {
return 1;
- } elseif ( array_key_exists( 'site', $a ) && array_key_exists(
'site', $b )
- && $a['site'] !== $b['site']
+ } elseif ( isset( $a->site ) && isset( $b->site )
+ && $a->site !== $b->site
) {
- return strcmp( $a['site'], $b['site'] );
+ return strcmp( $a->site, $b->site );
} else {
- return strcmp( $a['title'], $b['title'] );
+ return strcmp( $a->title, $b->title );
}
}
/**
* Helper function to extract and validate title and site (if
specified) from a target string
* @param string $target
- * @return array Contains an 'errors' key for an array of errors if the
string is invalid
+ * @return Target Contains an 'errors' key for an array of errors if
the string is invalid
*/
public static function extractTarget( $target ) {
global $wgCanonicalServer, $wgAllowGlobalMessaging;
@@ -145,28 +145,27 @@
$site = null;
}
- $result = [];
-
+ $result = new Target();
$title = Title::newFromText( $titleText );
if ( !$title
|| $title->getText() === ''
|| !$title->canExist()
) {
- $result['errors'][] = 'invalidtitle';
+ $result->errors = 'invalidtitle';
} else {
- $result['title'] = $title->getPrefixedText(); // Use
the canonical form.
+ $result->title = $title->getPrefixedText(); // Use the
canonical form.
}
if ( $site !== null && $site !== UrlHelper::getBaseUrl(
$wgCanonicalServer ) ) {
if ( !$wgAllowGlobalMessaging ||
DatabaseLookup::getDBName( $site ) === null ) {
- $result['errors'][] = 'invalidsite';
+ $result->errors = 'invalidsite';
} else {
- $result['site'] = $site;
+ $result->site = $site;
}
} elseif ( $title && $title->isExternal() ) {
// Target has site set to current wiki, but external
title
// TODO: Provide better error message?
- $result['errors'][] = 'invalidtitle';
+ $result->errors = 'invalidtitle';
}
return $result;
--
To view, visit https://gerrit.wikimedia.org/r/405410
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I680b49a9fda733b9f851f06a0d90e93bf2b03847
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MassMessage
Gerrit-Branch: master
Gerrit-Owner: Noella94 <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits