From 9dcb29af5d2acf24093e14039a5ef9ae80c596fc Mon Sep 17 00:00:00 2001 From: Dan Cryer Date: Thu, 12 Nov 2015 14:41:39 +0000 Subject: [PATCH 1/4] Giving plugins an isAllowedInStage() method to protect them from being run at inappropriate times. Fixes #1122 Fixes #1090 --- PHPCI/Plugin.php | 1 + PHPCI/Plugin/AbstractPlugin.php | 31 +++++++++++++++++++++++++++++ PHPCI/Plugin/Atoum.php | 7 ++++++- PHPCI/Plugin/Behat.php | 7 ++++++- PHPCI/Plugin/Campfire.php | 7 ++++++- PHPCI/Plugin/CleanBuild.php | 2 +- PHPCI/Plugin/Codeception.php | 8 +++++++- PHPCI/Plugin/Composer.php | 3 ++- PHPCI/Plugin/CopyBuild.php | 2 +- PHPCI/Plugin/Deployer.php | 7 ++++++- PHPCI/Plugin/Email.php | 7 ++++++- PHPCI/Plugin/Env.php | 2 +- PHPCI/Plugin/FlowdockNotify.php | 7 ++++++- PHPCI/Plugin/Git.php | 2 +- PHPCI/Plugin/Grunt.php | 2 +- PHPCI/Plugin/Gulp.php | 2 +- PHPCI/Plugin/HipchatNotify.php | 7 ++++++- PHPCI/Plugin/Irc.php | 7 ++++++- PHPCI/Plugin/Lint.php | 7 ++++++- PHPCI/Plugin/Mysql.php | 2 +- PHPCI/Plugin/PackageBuild.php | 2 +- PHPCI/Plugin/Pdepend.php | 7 ++++++- PHPCI/Plugin/Pgsql.php | 2 +- PHPCI/Plugin/Phar.php | 2 +- PHPCI/Plugin/Phing.php | 2 +- PHPCI/Plugin/PhpCodeSniffer.php | 8 +++++++- PHPCI/Plugin/PhpCpd.php | 7 ++++++- PHPCI/Plugin/PhpCsFixer.php | 2 +- PHPCI/Plugin/PhpDocblockChecker.php | 8 +++++++- PHPCI/Plugin/PhpLoc.php | 3 ++- PHPCI/Plugin/PhpMessDetector.php | 8 +++++++- PHPCI/Plugin/PhpParallelLint.php | 7 ++++++- PHPCI/Plugin/PhpSpec.php | 7 ++++++- PHPCI/Plugin/PhpTalLint.php | 7 ++++++- PHPCI/Plugin/PhpUnit.php | 8 +++++++- PHPCI/Plugin/Shell.php | 2 +- PHPCI/Plugin/SlackNotify.php | 7 ++++++- PHPCI/Plugin/Sqlite.php | 2 +- PHPCI/Plugin/TechnicalDebt.php | 8 +++++++- PHPCI/Plugin/Util/Executor.php | 14 +++++++++++-- PHPCI/Plugin/Wipe.php | 2 +- PHPCI/Plugin/Xmpp.php | 2 +- 42 files changed, 196 insertions(+), 41 deletions(-) create mode 100644 PHPCI/Plugin/AbstractPlugin.php diff --git a/PHPCI/Plugin.php b/PHPCI/Plugin.php index ac2960cd..23a2bbda 100644 --- a/PHPCI/Plugin.php +++ b/PHPCI/Plugin.php @@ -15,5 +15,6 @@ namespace PHPCI; */ interface Plugin { + public function isAllowedInStage($stage); public function execute(); } diff --git a/PHPCI/Plugin/AbstractPlugin.php b/PHPCI/Plugin/AbstractPlugin.php new file mode 100644 index 00000000..c986e602 --- /dev/null +++ b/PHPCI/Plugin/AbstractPlugin.php @@ -0,0 +1,31 @@ +allowedStages); + } + + /** + * Execute the plugin and return its success or failure. + * @return bool + */ + abstract public function execute(); +} diff --git a/PHPCI/Plugin/Atoum.php b/PHPCI/Plugin/Atoum.php index 877f009b..52fcb019 100644 --- a/PHPCI/Plugin/Atoum.php +++ b/PHPCI/Plugin/Atoum.php @@ -17,8 +17,13 @@ use PHPCI\Model\Build; * Atoum plugin, runs Atoum tests within a project. * @package PHPCI\Plugin */ -class Atoum implements \PHPCI\Plugin +class Atoum extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + private $args; private $config; private $directory; diff --git a/PHPCI/Plugin/Behat.php b/PHPCI/Plugin/Behat.php index d63016dc..5ace7bf3 100644 --- a/PHPCI/Plugin/Behat.php +++ b/PHPCI/Plugin/Behat.php @@ -20,8 +20,13 @@ use PHPCI\Model\BuildError; * @package PHPCI * @subpackage Plugins */ -class Behat implements \PHPCI\Plugin +class Behat extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + protected $phpci; protected $build; protected $features; diff --git a/PHPCI/Plugin/Campfire.php b/PHPCI/Plugin/Campfire.php index 59ab9128..1829a8b3 100644 --- a/PHPCI/Plugin/Campfire.php +++ b/PHPCI/Plugin/Campfire.php @@ -20,8 +20,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Campfire implements \PHPCI\Plugin +class Campfire extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken'); + private $url; private $authToken; private $userAgent; diff --git a/PHPCI/Plugin/CleanBuild.php b/PHPCI/Plugin/CleanBuild.php index 684e8e7a..fa1f6790 100644 --- a/PHPCI/Plugin/CleanBuild.php +++ b/PHPCI/Plugin/CleanBuild.php @@ -19,7 +19,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class CleanBuild implements \PHPCI\Plugin +class CleanBuild extends AbstractPlugin { protected $remove; protected $phpci; diff --git a/PHPCI/Plugin/Codeception.php b/PHPCI/Plugin/Codeception.php index c28e3a48..f3eca9e5 100644 --- a/PHPCI/Plugin/Codeception.php +++ b/PHPCI/Plugin/Codeception.php @@ -14,6 +14,7 @@ use PHPCI\Helper\Lang; use PHPCI\Model\Build; use PHPCI\Plugin\Util\TestResultParsers\Codeception as Parser; use Psr\Log\LogLevel; +use PHPCI\ZeroConfigPlugin; /** * Codeception Plugin - Enables full acceptance, unit, and functional testing. @@ -23,8 +24,13 @@ use Psr\Log\LogLevel; * @package PHPCI * @subpackage Plugins */ -class Codeception implements \PHPCI\Plugin, \PHPCI\ZeroConfigPlugin +class Codeception extends AbstractPlugin implements ZeroConfigPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + /** @var string */ protected $args = ''; diff --git a/PHPCI/Plugin/Composer.php b/PHPCI/Plugin/Composer.php index bd5f6658..12938868 100644 --- a/PHPCI/Plugin/Composer.php +++ b/PHPCI/Plugin/Composer.php @@ -13,6 +13,7 @@ use PHPCI; use PHPCI\Builder; use PHPCI\Model\Build; use PHPCI\Helper\Lang; +use PHPCI\ZeroConfigPlugin; /** * Composer Plugin - Provides access to Composer functionality. @@ -20,7 +21,7 @@ use PHPCI\Helper\Lang; * @package PHPCI * @subpackage Plugins */ -class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin +class Composer extends AbstractPlugin implements ZeroConfigPlugin { protected $directory; protected $action; diff --git a/PHPCI/Plugin/CopyBuild.php b/PHPCI/Plugin/CopyBuild.php index f9646cac..b847b841 100644 --- a/PHPCI/Plugin/CopyBuild.php +++ b/PHPCI/Plugin/CopyBuild.php @@ -19,7 +19,7 @@ use PHPCI\Helper\Lang; * @package PHPCI * @subpackage Plugins */ -class CopyBuild implements \PHPCI\Plugin +class CopyBuild extends AbstractPlugin { protected $directory; protected $ignore; diff --git a/PHPCI/Plugin/Deployer.php b/PHPCI/Plugin/Deployer.php index 2db839e3..80ed06d7 100644 --- a/PHPCI/Plugin/Deployer.php +++ b/PHPCI/Plugin/Deployer.php @@ -19,8 +19,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Deployer implements \PHPCI\Plugin +class Deployer extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken'); + protected $webhookUrl; protected $reason; diff --git a/PHPCI/Plugin/Email.php b/PHPCI/Plugin/Email.php index 17e235e2..ef1fe7d5 100644 --- a/PHPCI/Plugin/Email.php +++ b/PHPCI/Plugin/Email.php @@ -23,8 +23,13 @@ use Psr\Log\LogLevel; * @package PHPCI * @subpackage Plugins */ -class Email implements \PHPCI\Plugin +class Email extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken'); + /** * @var \PHPCI\Builder */ diff --git a/PHPCI/Plugin/Env.php b/PHPCI/Plugin/Env.php index b89bf67d..a37446bd 100644 --- a/PHPCI/Plugin/Env.php +++ b/PHPCI/Plugin/Env.php @@ -19,7 +19,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Env implements \PHPCI\Plugin +class Env extends AbstractPlugin { protected $phpci; protected $build; diff --git a/PHPCI/Plugin/FlowdockNotify.php b/PHPCI/Plugin/FlowdockNotify.php index 8ac9f2ab..7f8b657c 100644 --- a/PHPCI/Plugin/FlowdockNotify.php +++ b/PHPCI/Plugin/FlowdockNotify.php @@ -19,8 +19,13 @@ use Mremi\Flowdock\Api\Push\TeamInboxMessage; * @package PHPCI * @subpackage Plugins */ -class FlowdockNotify implements \PHPCI\Plugin +class FlowdockNotify extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken'); + private $api_key; private $email; const MESSAGE_DEFAULT = 'Build %BUILD% has finished for commit %SHORT_COMMIT% diff --git a/PHPCI/Plugin/Git.php b/PHPCI/Plugin/Git.php index 60d6b551..7c146300 100644 --- a/PHPCI/Plugin/Git.php +++ b/PHPCI/Plugin/Git.php @@ -19,7 +19,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Git implements \PHPCI\Plugin +class Git extends AbstractPlugin { protected $phpci; protected $build; diff --git a/PHPCI/Plugin/Grunt.php b/PHPCI/Plugin/Grunt.php index 4d62ffd8..77715656 100644 --- a/PHPCI/Plugin/Grunt.php +++ b/PHPCI/Plugin/Grunt.php @@ -18,7 +18,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Grunt implements \PHPCI\Plugin +class Grunt extends AbstractPlugin { protected $directory; protected $task; diff --git a/PHPCI/Plugin/Gulp.php b/PHPCI/Plugin/Gulp.php index b6c6cab4..bbdbf7e0 100644 --- a/PHPCI/Plugin/Gulp.php +++ b/PHPCI/Plugin/Gulp.php @@ -18,7 +18,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Gulp implements \PHPCI\Plugin +class Gulp extends AbstractPlugin { protected $directory; protected $task; diff --git a/PHPCI/Plugin/HipchatNotify.php b/PHPCI/Plugin/HipchatNotify.php index a39b94fe..7af2f5f9 100644 --- a/PHPCI/Plugin/HipchatNotify.php +++ b/PHPCI/Plugin/HipchatNotify.php @@ -19,8 +19,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class HipchatNotify implements \PHPCI\Plugin +class HipchatNotify extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken'); + protected $authToken; protected $color; protected $notify; diff --git a/PHPCI/Plugin/Irc.php b/PHPCI/Plugin/Irc.php index a7610a8c..7ae5beef 100644 --- a/PHPCI/Plugin/Irc.php +++ b/PHPCI/Plugin/Irc.php @@ -19,8 +19,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Irc implements \PHPCI\Plugin +class Irc extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken'); + protected $phpci; protected $build; protected $message; diff --git a/PHPCI/Plugin/Lint.php b/PHPCI/Plugin/Lint.php index 1de49e41..2284ccfe 100644 --- a/PHPCI/Plugin/Lint.php +++ b/PHPCI/Plugin/Lint.php @@ -19,8 +19,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Lint implements PHPCI\Plugin +class Lint extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + protected $directories; protected $recursive = true; protected $ignore; diff --git a/PHPCI/Plugin/Mysql.php b/PHPCI/Plugin/Mysql.php index fdb521ef..5d4035cd 100644 --- a/PHPCI/Plugin/Mysql.php +++ b/PHPCI/Plugin/Mysql.php @@ -21,7 +21,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Mysql implements \PHPCI\Plugin +class Mysql extends AbstractPlugin { /** * @var \PHPCI\Builder diff --git a/PHPCI/Plugin/PackageBuild.php b/PHPCI/Plugin/PackageBuild.php index fb116640..04a52d99 100644 --- a/PHPCI/Plugin/PackageBuild.php +++ b/PHPCI/Plugin/PackageBuild.php @@ -18,7 +18,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class PackageBuild implements \PHPCI\Plugin +class PackageBuild extends AbstractPlugin { protected $directory; protected $filename; diff --git a/PHPCI/Plugin/Pdepend.php b/PHPCI/Plugin/Pdepend.php index faef406d..10b787ac 100644 --- a/PHPCI/Plugin/Pdepend.php +++ b/PHPCI/Plugin/Pdepend.php @@ -19,8 +19,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Pdepend implements \PHPCI\Plugin +class Pdepend extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + protected $args; /** * @var \PHPCI\Builder diff --git a/PHPCI/Plugin/Pgsql.php b/PHPCI/Plugin/Pgsql.php index 60057464..5d6d18e4 100644 --- a/PHPCI/Plugin/Pgsql.php +++ b/PHPCI/Plugin/Pgsql.php @@ -19,7 +19,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Pgsql implements \PHPCI\Plugin +class Pgsql extends AbstractPlugin { /** * @var \PHPCI\Builder diff --git a/PHPCI/Plugin/Phar.php b/PHPCI/Plugin/Phar.php index c734bb6c..f3969829 100644 --- a/PHPCI/Plugin/Phar.php +++ b/PHPCI/Plugin/Phar.php @@ -10,7 +10,7 @@ use Phar as PHPPhar; /** * Phar Plugin */ -class Phar implements \PHPCI\Plugin +class Phar extends AbstractPlugin { /** * PHPCI diff --git a/PHPCI/Plugin/Phing.php b/PHPCI/Plugin/Phing.php index e322b72e..08ced3c3 100644 --- a/PHPCI/Plugin/Phing.php +++ b/PHPCI/Plugin/Phing.php @@ -20,7 +20,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Phing implements \PHPCI\Plugin +class Phing extends AbstractPlugin { private $directory; diff --git a/PHPCI/Plugin/PhpCodeSniffer.php b/PHPCI/Plugin/PhpCodeSniffer.php index 6f4ed4e0..8d072060 100644 --- a/PHPCI/Plugin/PhpCodeSniffer.php +++ b/PHPCI/Plugin/PhpCodeSniffer.php @@ -13,6 +13,7 @@ use PHPCI; use PHPCI\Builder; use PHPCI\Model\Build; use PHPCI\Model\BuildError; +use PHPCI\ZeroConfigPlugin; /** * PHP Code Sniffer Plugin - Allows PHP Code Sniffer testing. @@ -20,8 +21,13 @@ use PHPCI\Model\BuildError; * @package PHPCI * @subpackage Plugins */ -class PhpCodeSniffer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin +class PhpCodeSniffer extends AbstractPlugin implements ZeroConfigPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + /** * @var \PHPCI\Builder */ diff --git a/PHPCI/Plugin/PhpCpd.php b/PHPCI/Plugin/PhpCpd.php index 2424d41e..f074f0dc 100644 --- a/PHPCI/Plugin/PhpCpd.php +++ b/PHPCI/Plugin/PhpCpd.php @@ -20,8 +20,13 @@ use PHPCI\Model\BuildError; * @package PHPCI * @subpackage Plugins */ -class PhpCpd implements \PHPCI\Plugin +class PhpCpd extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + protected $directory; protected $args; protected $phpci; diff --git a/PHPCI/Plugin/PhpCsFixer.php b/PHPCI/Plugin/PhpCsFixer.php index 9aa0d33f..36033bf8 100644 --- a/PHPCI/Plugin/PhpCsFixer.php +++ b/PHPCI/Plugin/PhpCsFixer.php @@ -19,7 +19,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class PhpCsFixer implements \PHPCI\Plugin +class PhpCsFixer extends AbstractPlugin { /** * @var \PHPCI\Builder diff --git a/PHPCI/Plugin/PhpDocblockChecker.php b/PHPCI/Plugin/PhpDocblockChecker.php index 2396497c..7c20e013 100644 --- a/PHPCI/Plugin/PhpDocblockChecker.php +++ b/PHPCI/Plugin/PhpDocblockChecker.php @@ -12,6 +12,7 @@ namespace PHPCI\Plugin; use PHPCI; use PHPCI\Builder; use PHPCI\Model\Build; +use PHPCI\ZeroConfigPlugin; /** * PHP Docblock Checker Plugin - Checks your PHP files for appropriate uses of Docblocks @@ -19,8 +20,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class PhpDocblockChecker implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin +class PhpDocblockChecker extends AbstractPlugin implements ZeroConfigPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + /** * @var \PHPCI\Builder */ diff --git a/PHPCI/Plugin/PhpLoc.php b/PHPCI/Plugin/PhpLoc.php index c8dedb91..c67c88f9 100644 --- a/PHPCI/Plugin/PhpLoc.php +++ b/PHPCI/Plugin/PhpLoc.php @@ -12,6 +12,7 @@ namespace PHPCI\Plugin; use PHPCI; use PHPCI\Builder; use PHPCI\Model\Build; +use PHPCI\ZeroConfigPlugin; /** * PHP Loc - Allows PHP Copy / Lines of Code testing. @@ -19,7 +20,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class PhpLoc implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin +class PhpLoc extends AbstractPlugin implements ZeroConfigPlugin { /** * @var string diff --git a/PHPCI/Plugin/PhpMessDetector.php b/PHPCI/Plugin/PhpMessDetector.php index ec92bc61..11895f55 100644 --- a/PHPCI/Plugin/PhpMessDetector.php +++ b/PHPCI/Plugin/PhpMessDetector.php @@ -12,6 +12,7 @@ namespace PHPCI\Plugin; use PHPCI; use PHPCI\Builder; use PHPCI\Model\Build; +use PHPCI\ZeroConfigPlugin; /** * PHP Mess Detector Plugin - Allows PHP Mess Detector testing. @@ -19,8 +20,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class PhpMessDetector implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin +class PhpMessDetector extends AbstractPlugin implements ZeroConfigPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + /** * @var \PHPCI\Builder */ diff --git a/PHPCI/Plugin/PhpParallelLint.php b/PHPCI/Plugin/PhpParallelLint.php index febed528..ed319a48 100644 --- a/PHPCI/Plugin/PhpParallelLint.php +++ b/PHPCI/Plugin/PhpParallelLint.php @@ -19,8 +19,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class PhpParallelLint implements \PHPCI\Plugin +class PhpParallelLint extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + /** * @var \PHPCI\Builder */ diff --git a/PHPCI/Plugin/PhpSpec.php b/PHPCI/Plugin/PhpSpec.php index e468a718..4918dd4e 100644 --- a/PHPCI/Plugin/PhpSpec.php +++ b/PHPCI/Plugin/PhpSpec.php @@ -19,8 +19,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class PhpSpec implements PHPCI\Plugin +class PhpSpec extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + /** * @var \PHPCI\Builder */ diff --git a/PHPCI/Plugin/PhpTalLint.php b/PHPCI/Plugin/PhpTalLint.php index 8513ec36..960ccfba 100644 --- a/PHPCI/Plugin/PhpTalLint.php +++ b/PHPCI/Plugin/PhpTalLint.php @@ -19,8 +19,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class PhpTalLint implements PHPCI\Plugin +class PhpTalLint extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + protected $directories; protected $recursive = true; protected $suffixes; diff --git a/PHPCI/Plugin/PhpUnit.php b/PHPCI/Plugin/PhpUnit.php index f716f079..6923915c 100644 --- a/PHPCI/Plugin/PhpUnit.php +++ b/PHPCI/Plugin/PhpUnit.php @@ -13,6 +13,7 @@ use PHPCI; use PHPCI\Builder; use PHPCI\Model\Build; use PHPCI\Plugin\Util\TapParser; +use PHPCI\ZeroConfigPlugin; /** * PHP Unit Plugin - Allows PHP Unit testing. @@ -20,8 +21,13 @@ use PHPCI\Plugin\Util\TapParser; * @package PHPCI * @subpackage Plugins */ -class PhpUnit implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin +class PhpUnit extends AbstractPlugin implements ZeroConfigPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + protected $args; protected $phpci; protected $build; diff --git a/PHPCI/Plugin/Shell.php b/PHPCI/Plugin/Shell.php index 5e914f3e..ca219ab6 100644 --- a/PHPCI/Plugin/Shell.php +++ b/PHPCI/Plugin/Shell.php @@ -19,7 +19,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Shell implements \PHPCI\Plugin +class Shell extends AbstractPlugin { /** * @var \PHPCI\Builder diff --git a/PHPCI/Plugin/SlackNotify.php b/PHPCI/Plugin/SlackNotify.php index 0e8d1cad..5b83d4fb 100644 --- a/PHPCI/Plugin/SlackNotify.php +++ b/PHPCI/Plugin/SlackNotify.php @@ -17,8 +17,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class SlackNotify implements \PHPCI\Plugin +class SlackNotify extends AbstractPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken'); + private $webHook; private $room; private $username; diff --git a/PHPCI/Plugin/Sqlite.php b/PHPCI/Plugin/Sqlite.php index f80ece3d..bd616eb0 100644 --- a/PHPCI/Plugin/Sqlite.php +++ b/PHPCI/Plugin/Sqlite.php @@ -19,7 +19,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Sqlite implements \PHPCI\Plugin +class Sqlite extends AbstractPlugin { /** * @var \PHPCI\Builder diff --git a/PHPCI/Plugin/TechnicalDebt.php b/PHPCI/Plugin/TechnicalDebt.php index 6d4711b5..e22d213e 100755 --- a/PHPCI/Plugin/TechnicalDebt.php +++ b/PHPCI/Plugin/TechnicalDebt.php @@ -12,6 +12,7 @@ namespace PHPCI\Plugin; use PHPCI; use PHPCI\Builder; use PHPCI\Model\Build; +use PHPCI\ZeroConfigPlugin; /** * Technical Debt Plugin - Checks for existence of "TODO", "FIXME", etc. @@ -20,8 +21,13 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class TechnicalDebt implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin +class TechnicalDebt extends AbstractPlugin implements ZeroConfigPlugin { + /** + * @inheritdoc + */ + protected $allowedStages = array('test'); + /** * @var \PHPCI\Builder */ diff --git a/PHPCI/Plugin/Util/Executor.php b/PHPCI/Plugin/Util/Executor.php index bdd06b7e..66c0e108 100644 --- a/PHPCI/Plugin/Util/Executor.php +++ b/PHPCI/Plugin/Util/Executor.php @@ -138,7 +138,7 @@ class Executor $this->setPluginStatus($stage, $plugin, Build::STATUS_RUNNING); // Try and execute it - if ($this->executePlugin($plugin, $options)) { + if ($this->executePlugin($plugin, $options, $stage)) { // Execution was successful $this->logger->logSuccess(Lang::get('plugin_success')); $this->setPluginStatus($stage, $plugin, Build::STATUS_SUCCESS); @@ -166,8 +166,12 @@ class Executor /** * Executes a given plugin, with options and returns the result. + * @param string $plugin Plugin name + * @param array $options Plugin options (from phpci.yml) + * @param string $stage Stage name + * @return bool */ - public function executePlugin($plugin, $options) + public function executePlugin($plugin, $options, $stage) { // Any plugin name without a namespace separator is a PHPCI built in plugin // if not we assume it's a fully name-spaced class name that implements the plugin interface. @@ -188,6 +192,12 @@ class Executor try { // Build and run it $obj = $this->pluginFactory->buildPlugin($class, $options); + + if (!$obj->isAllowedInStage($stage)) { + $this->logger->logFailure('Plugin "' . $plugin . '" cannot be run in stage: ' . $stage); + return false; + } + return $obj->execute(); } catch (\Exception $ex) { $this->logger->logFailure(Lang::get('exception') . $ex->getMessage(), $ex); diff --git a/PHPCI/Plugin/Wipe.php b/PHPCI/Plugin/Wipe.php index e6b619a0..aa3d4156 100644 --- a/PHPCI/Plugin/Wipe.php +++ b/PHPCI/Plugin/Wipe.php @@ -18,7 +18,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class Wipe implements \PHPCI\Plugin +class Wipe extends AbstractPlugin { /** * @var \PHPCI\Builder diff --git a/PHPCI/Plugin/Xmpp.php b/PHPCI/Plugin/Xmpp.php index ccfc4399..53d440f8 100644 --- a/PHPCI/Plugin/Xmpp.php +++ b/PHPCI/Plugin/Xmpp.php @@ -18,7 +18,7 @@ use PHPCI\Model\Build; * @package PHPCI * @subpackage Plugins */ -class XMPP implements \PHPCI\Plugin +class XMPP extends AbstractPlugin { protected $directory; protected $phpci; From 6a1b23bbb49604c02b88ed4c9727360b7f85bd67 Mon Sep 17 00:00:00 2001 From: Dan Cryer Date: Thu, 12 Nov 2015 14:46:35 +0000 Subject: [PATCH 2/4] Adding docblock to cheer up PHPCI. --- PHPCI/Plugin/AbstractPlugin.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PHPCI/Plugin/AbstractPlugin.php b/PHPCI/Plugin/AbstractPlugin.php index c986e602..fd78d00b 100644 --- a/PHPCI/Plugin/AbstractPlugin.php +++ b/PHPCI/Plugin/AbstractPlugin.php @@ -4,6 +4,10 @@ namespace PHPCI\Plugin; use PHPCI\Plugin; +/** + * Base for all of the standard PHPCI plugins. Provides the isAllowedInStage() functionality. + * @package PHPCI\Plugin + */ abstract class AbstractPlugin implements Plugin { /** From 29a6c9767ab0704e24a165c2344247a88e4122b2 Mon Sep 17 00:00:00 2001 From: Dan Cryer Date: Thu, 12 Nov 2015 14:51:22 +0000 Subject: [PATCH 3/4] Fixing tests --- Tests/PHPCI/Plugin/Util/ExecutorTest.php | 12 ++++++------ Tests/PHPCI/Plugin/Util/Fake/ExamplePluginFull.php | 2 +- .../Util/Fake/ExamplePluginWithNoConstructorArgs.php | 2 +- .../Util/Fake/ExamplePluginWithSingleOptionalArg.php | 2 +- .../Util/Fake/ExamplePluginWithSingleRequiredArg.php | 2 +- .../Fake/ExamplePluginWithSingleTypedRequiredArg.php | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Tests/PHPCI/Plugin/Util/ExecutorTest.php b/Tests/PHPCI/Plugin/Util/ExecutorTest.php index e9083cec..3d0a3614 100644 --- a/Tests/PHPCI/Plugin/Util/ExecutorTest.php +++ b/Tests/PHPCI/Plugin/Util/ExecutorTest.php @@ -49,7 +49,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase ->shouldBeCalledTimes(1) ->willReturn($this->prophesize('PHPCI\Plugin')->reveal()); - $this->testedExecutor->executePlugin($pluginName, $options); + $this->testedExecutor->executePlugin($pluginName, $options, 'test'); } public function testExecutePlugin_KeepsCalledNameSpace() @@ -61,7 +61,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase ->shouldBeCalledTimes(1) ->willReturn($this->prophesize('PHPCI\Plugin')->reveal()); - $this->testedExecutor->executePlugin($pluginClass, $options); + $this->testedExecutor->executePlugin($pluginClass, $options, 'test'); } public function testExecutePlugin_CallsExecuteOnFactoryBuildPlugin() @@ -76,7 +76,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase $this->mockFactory->buildPlugin(Argument::any(), Argument::any())->willReturn($mockPlugin->reveal()); $this->mockFactory->getResourceFor('PHPCI\Model\Build')->willReturn($build); - $this->testedExecutor->executePlugin($pluginName, $options); + $this->testedExecutor->executePlugin($pluginName, $options, 'test'); } public function testExecutePlugin_ReturnsPluginSuccess() @@ -91,7 +91,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase $this->mockFactory->buildPlugin(Argument::any(), Argument::any())->willReturn($mockPlugin->reveal()); - $returnValue = $this->testedExecutor->executePlugin($pluginName, $options); + $returnValue = $this->testedExecutor->executePlugin($pluginName, $options, 'test'); $this->assertEquals($expectedReturnValue, $returnValue); } @@ -103,7 +103,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase $this->mockBuildLogger->logFailure('Plugin does not exist: ' . $pluginName)->shouldBeCalledTimes(1); - $this->testedExecutor->executePlugin($pluginName, $options); + $this->testedExecutor->executePlugin($pluginName, $options, 'test'); } public function testExecutePlugin_LogsFailureWhenExceptionsAreThrownByPlugin() @@ -121,7 +121,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase $this->mockBuildLogger->logFailure('Exception: ' . $expectedException->getMessage(), $expectedException) ->shouldBeCalledTimes(1); - $this->testedExecutor->executePlugin($pluginName, $options); + $this->testedExecutor->executePlugin($pluginName, $options, 'test'); } public function testExecutePlugins_CallsEachPluginForStage() diff --git a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginFull.php b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginFull.php index fa81a352..73ea98cc 100644 --- a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginFull.php +++ b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginFull.php @@ -14,7 +14,7 @@ use PHPCI\Builder; use PHPCI\Model\Build; use PHPCI\Plugin; -class ExamplePluginFull implements Plugin { +class ExamplePluginFull extends Plugin\AbstractPlugin { /** * @var array */ diff --git a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithNoConstructorArgs.php b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithNoConstructorArgs.php index 544ec4e3..efc27623 100644 --- a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithNoConstructorArgs.php +++ b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithNoConstructorArgs.php @@ -12,7 +12,7 @@ namespace Tests\PHPCI\Plugin\Util\Fake; use PHPCI\Plugin; -class ExamplePluginWithNoConstructorArgs implements Plugin +class ExamplePluginWithNoConstructorArgs extends Plugin\AbstractPlugin { public function execute() { diff --git a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleOptionalArg.php b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleOptionalArg.php index 9c78da6f..f9d636ed 100644 --- a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleOptionalArg.php +++ b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleOptionalArg.php @@ -12,7 +12,7 @@ namespace Tests\PHPCI\Plugin\Util\Fake; use PHPCI\Plugin; -class ExamplePluginWithSingleOptionalArg implements Plugin +class ExamplePluginWithSingleOptionalArg extends Plugin\AbstractPlugin { function __construct($optional = null) { diff --git a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleRequiredArg.php b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleRequiredArg.php index b623d7b1..411c4859 100644 --- a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleRequiredArg.php +++ b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleRequiredArg.php @@ -12,7 +12,7 @@ namespace Tests\PHPCI\Plugin\Util\Fake; use PHPCI\Plugin; -class ExamplePluginWithSingleRequiredArg implements Plugin +class ExamplePluginWithSingleRequiredArg extends Plugin\AbstractPlugin { public $RequiredArgument; diff --git a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleTypedRequiredArg.php b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleTypedRequiredArg.php index b256c58c..17e5a64c 100644 --- a/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleTypedRequiredArg.php +++ b/Tests/PHPCI/Plugin/Util/Fake/ExamplePluginWithSingleTypedRequiredArg.php @@ -12,7 +12,7 @@ namespace Tests\PHPCI\Plugin\Util\Fake; use PHPCI\Plugin; -class ExamplePluginWithSingleTypedRequiredArg implements Plugin +class ExamplePluginWithSingleTypedRequiredArg extends Plugin\AbstractPlugin { public $RequiredArgument; From e437e9b855de48eec037c31d860297f58638ed30 Mon Sep 17 00:00:00 2001 From: Dan Cryer Date: Fri, 13 Nov 2015 14:45:18 +0000 Subject: [PATCH 4/4] Renaming canExecute() to canRunZeroConfig() to avoid confusion with isAllowedInStage() --- PHPCI/Model/Build.php | 2 +- PHPCI/Plugin.php | 4 ++++ PHPCI/Plugin/AbstractPlugin.php | 17 ++++++++++++++++- PHPCI/Plugin/Codeception.php | 2 +- PHPCI/Plugin/Composer.php | 2 +- PHPCI/Plugin/PhpCodeSniffer.php | 2 +- PHPCI/Plugin/PhpDocblockChecker.php | 2 +- PHPCI/Plugin/PhpLoc.php | 2 +- PHPCI/Plugin/PhpMessDetector.php | 2 +- PHPCI/Plugin/PhpUnit.php | 2 +- PHPCI/Plugin/TechnicalDebt.php | 2 +- PHPCI/ZeroConfigPlugin.php | 2 +- 12 files changed, 30 insertions(+), 11 deletions(-) diff --git a/PHPCI/Model/Build.php b/PHPCI/Model/Build.php index a8bfd683..859c069b 100644 --- a/PHPCI/Model/Build.php +++ b/PHPCI/Model/Build.php @@ -168,7 +168,7 @@ class Build extends BuildBase } foreach (array('setup', 'test', 'complete', 'success', 'failure') as $stage) { - if ($className::canExecute($stage, $builder, $this)) { + if ($className::canRunZeroConfig($stage, $builder, $this)) { $config[$stage][$className] = array( 'zero_config' => true ); diff --git a/PHPCI/Plugin.php b/PHPCI/Plugin.php index 23a2bbda..40df598c 100644 --- a/PHPCI/Plugin.php +++ b/PHPCI/Plugin.php @@ -9,12 +9,16 @@ namespace PHPCI; +use PHPCI\Builder; +use PHPCI\Model\Build; + /** * PHPCI Plugin Interface - Used by all build plugins. * @author Dan Cryer */ interface Plugin { + public static function canRunZeroConfig($stage, Builder $builder, Build $build); public function isAllowedInStage($stage); public function execute(); } diff --git a/PHPCI/Plugin/AbstractPlugin.php b/PHPCI/Plugin/AbstractPlugin.php index fd78d00b..d9bc693e 100644 --- a/PHPCI/Plugin/AbstractPlugin.php +++ b/PHPCI/Plugin/AbstractPlugin.php @@ -2,6 +2,8 @@ namespace PHPCI\Plugin; +use PHPCI\Builder; +use PHPCI\Model\Build; use PHPCI\Plugin; /** @@ -12,7 +14,7 @@ abstract class AbstractPlugin implements Plugin { /** * Define the stages that this plugin is allowed to run in. - * @see AbstractPlugin::canExecute() + * @see AbstractPlugin::isAllowedInStage() * @var array */ protected $allowedStages = array('setup', 'test', 'complete', 'success', 'failure', 'fixed', 'broken'); @@ -27,6 +29,19 @@ abstract class AbstractPlugin implements Plugin return in_array($stage, $this->allowedStages); } + /** + * Check whether or not this plugin can execute in zero config mode. + * Many plugins will check if their required config files can be found here. + * @param string $stage + * @param Builder $builder + * @param Build $build + * @return bool + */ + public static function canRunZeroConfig($stage, Builder $builder, Build $build) + { + return false; + } + /** * Execute the plugin and return its success or failure. * @return bool diff --git a/PHPCI/Plugin/Codeception.php b/PHPCI/Plugin/Codeception.php index f3eca9e5..5d99a9d6 100644 --- a/PHPCI/Plugin/Codeception.php +++ b/PHPCI/Plugin/Codeception.php @@ -56,7 +56,7 @@ class Codeception extends AbstractPlugin implements ZeroConfigPlugin * @param Build $build * @return bool */ - public static function canExecute($stage, Builder $builder, Build $build) + public static function canRunZeroConfig($stage, Builder $builder, Build $build) { return $stage == 'test' && !is_null(self::findConfigFile($builder->buildPath)); } diff --git a/PHPCI/Plugin/Composer.php b/PHPCI/Plugin/Composer.php index 12938868..0d4b57de 100644 --- a/PHPCI/Plugin/Composer.php +++ b/PHPCI/Plugin/Composer.php @@ -37,7 +37,7 @@ class Composer extends AbstractPlugin implements ZeroConfigPlugin * @param Build $build * @return bool */ - public static function canExecute($stage, Builder $builder, Build $build) + public static function canRunZeroConfig($stage, Builder $builder, Build $build) { $path = $builder->buildPath . DIRECTORY_SEPARATOR . 'composer.json'; diff --git a/PHPCI/Plugin/PhpCodeSniffer.php b/PHPCI/Plugin/PhpCodeSniffer.php index 8d072060..14da4cee 100644 --- a/PHPCI/Plugin/PhpCodeSniffer.php +++ b/PHPCI/Plugin/PhpCodeSniffer.php @@ -86,7 +86,7 @@ class PhpCodeSniffer extends AbstractPlugin implements ZeroConfigPlugin * @param Build $build * @return bool */ - public static function canExecute($stage, Builder $builder, Build $build) + public static function canRunZeroConfig($stage, Builder $builder, Build $build) { if ($stage == 'test') { return true; diff --git a/PHPCI/Plugin/PhpDocblockChecker.php b/PHPCI/Plugin/PhpDocblockChecker.php index 7c20e013..5993bcae 100644 --- a/PHPCI/Plugin/PhpDocblockChecker.php +++ b/PHPCI/Plugin/PhpDocblockChecker.php @@ -58,7 +58,7 @@ class PhpDocblockChecker extends AbstractPlugin implements ZeroConfigPlugin * @param Build $build * @return bool */ - public static function canExecute($stage, Builder $builder, Build $build) + public static function canRunZeroConfig($stage, Builder $builder, Build $build) { if ($stage == 'test') { return true; diff --git a/PHPCI/Plugin/PhpLoc.php b/PHPCI/Plugin/PhpLoc.php index c67c88f9..6c3293ac 100644 --- a/PHPCI/Plugin/PhpLoc.php +++ b/PHPCI/Plugin/PhpLoc.php @@ -38,7 +38,7 @@ class PhpLoc extends AbstractPlugin implements ZeroConfigPlugin * @param Build $build * @return bool */ - public static function canExecute($stage, Builder $builder, Build $build) + public static function canRunZeroConfig($stage, Builder $builder, Build $build) { if ($stage == 'test') { return true; diff --git a/PHPCI/Plugin/PhpMessDetector.php b/PHPCI/Plugin/PhpMessDetector.php index 11895f55..cf22b664 100644 --- a/PHPCI/Plugin/PhpMessDetector.php +++ b/PHPCI/Plugin/PhpMessDetector.php @@ -68,7 +68,7 @@ class PhpMessDetector extends AbstractPlugin implements ZeroConfigPlugin * @param Build $build * @return bool */ - public static function canExecute($stage, Builder $builder, Build $build) + public static function canRunZeroConfig($stage, Builder $builder, Build $build) { if ($stage == 'test') { return true; diff --git a/PHPCI/Plugin/PhpUnit.php b/PHPCI/Plugin/PhpUnit.php index 6923915c..199dc4ec 100644 --- a/PHPCI/Plugin/PhpUnit.php +++ b/PHPCI/Plugin/PhpUnit.php @@ -62,7 +62,7 @@ class PhpUnit extends AbstractPlugin implements ZeroConfigPlugin * @param Build $build * @return bool */ - public static function canExecute($stage, Builder $builder, Build $build) + public static function canRunZeroConfig($stage, Builder $builder, Build $build) { if ($stage == 'test' && !is_null(self::findConfigFile($builder->buildPath))) { return true; diff --git a/PHPCI/Plugin/TechnicalDebt.php b/PHPCI/Plugin/TechnicalDebt.php index e22d213e..15a5dc91 100755 --- a/PHPCI/Plugin/TechnicalDebt.php +++ b/PHPCI/Plugin/TechnicalDebt.php @@ -73,7 +73,7 @@ class TechnicalDebt extends AbstractPlugin implements ZeroConfigPlugin * @param Build $build * @return bool */ - public static function canExecute($stage, Builder $builder, Build $build) + public static function canRunZeroConfig($stage, Builder $builder, Build $build) { if ($stage == 'test') { return true; diff --git a/PHPCI/ZeroConfigPlugin.php b/PHPCI/ZeroConfigPlugin.php index 73f7746c..e0b1c5a6 100644 --- a/PHPCI/ZeroConfigPlugin.php +++ b/PHPCI/ZeroConfigPlugin.php @@ -17,5 +17,5 @@ use PHPCI\Model\Build; */ interface ZeroConfigPlugin { - public static function canExecute($stage, Builder $builder, Build $build); + public static function canRunZeroConfig($stage, Builder $builder, Build $build); }