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

Reply via email to