From d47b5b14fc10b3c4f43165d700a9ee083119e997 Mon Sep 17 00:00:00 2001 From: wei <> Date: Tue, 19 Sep 2006 22:34:28 +0000 Subject: update prado-cli.php --- framework/prado-cli.php | 264 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 224 insertions(+), 40 deletions(-) (limited to 'framework/prado-cli.php') diff --git a/framework/prado-cli.php b/framework/prado-cli.php index 36dc03ac..341ddb36 100755 --- a/framework/prado-cli.php +++ b/framework/prado-cli.php @@ -3,12 +3,20 @@ /** * Prado command line developer tools. + * + * @author Wei Zhuo + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2006 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Id$ */ -if(!isset($_SERVER['argv'])) +if(!isset($_SERVER['argv']) || php_sapi_name()!=='cli') die('Must be run from the command line'); require_once(dirname(__FILE__).'/prado.php'); + +//stub application class class PradoShellApplication extends TApplication { public function run() @@ -16,51 +24,78 @@ class PradoShellApplication extends TApplication $this->initApplication(); } } -class DummyHttpRequest extends THttpRequest -{ - protected function resolveRequest() - { - } -} - -function __shell_print_var($shell,$var) -{ - if(!$shell->has_semicolon) - echo Prado::varDump($var); -} restore_exception_handler(); +//register action classes +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineCreateProject'); +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineCreateTests'); +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLinePhpShell'); +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineUnitTest'); + //run it; -PradoCommandLineInterpreter::run($_SERVER['argv']); +PradoCommandLineInterpreter::getInstance()->run($_SERVER['argv']); + +//run PHP shell if(count($_SERVER['argv']) > 1 && strtolower($_SERVER['argv'][1])==='shell') +{ + function __shell_print_var($shell,$var) + { + if(!$shell->has_semicolon) echo Prado::varDump($var); + } include_once(dirname(__FILE__).'/3rdParty/PhpShell/php-shell-cmd.php'); +} + +/**************** END CONFIGURATION **********************/ + +/** + * PradoCommandLineInterpreter Class + * + * Command line interface, configures the action classes and dispatches the command actions. + * + * @author Wei Zhuo + * @version $Id$ + * @since 3.0.5 + */ class PradoCommandLineInterpreter { - protected $_actions=array( - 'PradoCommandLineCreateProject' => null, - 'PradoCommandLineCreateTests' => null, - 'PradoCommandLinePhpShell' => null - ); + /** + * @var array command action classes + */ + protected $_actions=array(); - public function __construct() + /** + * @param string action class name + */ + public function addActionClass($class) + { + $this->_actions[$class] = new $class; + } + + /** + * @return PradoCommandLineInterpreter static instance + */ + public static function getInstance() { - foreach(array_keys($this->_actions) as $class) - $this->_actions[$class] = new $class; + static $instance; + if(is_null($instance)) + $instance = new self; + return $instance; } - public static function run($args) + /** + * Dispatch the command line actions. + * @param array command line arguments + */ + public function run($args) { echo "Command line tools for Prado ".Prado::getVersion().".\n"; if(count($args) > 1) array_shift($args); - static $int; - if(is_null($int)) - $int = new self; $valid = false; - foreach($int->_actions as $class => $action) + foreach($this->_actions as $class => $action) { if($action->isValidAction($args)) { @@ -73,9 +108,12 @@ class PradoCommandLineInterpreter } } if(!$valid) - $int->printHelp(); + $this->printHelp(); } + /** + * Print command line help, default action. + */ public function printHelp() { echo "usage: php prado-cli.php action [optional]\n"; @@ -86,8 +124,20 @@ class PradoCommandLineInterpreter } } +/** + * Base class for command line actions. + * + * @author Wei Zhuo + * @version $Id$ + * @since 3.0.5 + */ abstract class PradoCommandLineAction { + /** + * Execute the action. + * @param array command line parameters + * @return boolean true if action was handled + */ abstract public function performAction($args); protected function createDirectory($dir, $mask) @@ -135,9 +185,31 @@ abstract class PradoCommandLineAction EOD; } -} + protected function initializePradoApplication($directory) + { + $app_dir = realpath($directory.'/protected/'); + if($app_dir !== false) + { + $app = new PradoShellApplication($app_dir); + $app->run(); + $dir = substr(str_replace(realpath('./'),'',$app_dir),1); + + echo '** Loaded Prado appplication in directory "'.$dir."\".\n"; + } + else + echo '** Unable to load Prado application in directory "'.$directory."\".\n"; + } + +} +/** + * Create a Prado project skeleton, including directories and files. + * + * @author Wei Zhuo + * @version $Id$ + * @since 3.0.5 + */ class PradoCommandLineCreateProject extends PradoCommandLineAction { protected $action = '-c'; @@ -223,6 +295,13 @@ EOD; } } +/** + * Creates test fixtures for a Prado application. + * + * @author Wei Zhuo + * @version $Id$ + * @since 3.0.5 + */ class PradoCommandLineCreateTests extends PradoCommandLineAction { protected $action = '-t'; @@ -292,6 +371,13 @@ $tester->run(new SimpleReporter()); } +/** + * Creates and run a Prado application in a PHP Shell. + * + * @author Wei Zhuo + * @version $Id$ + * @since 3.0.5 + */ class PradoCommandLinePhpShell extends PradoCommandLineAction { protected $action = 'shell'; @@ -302,27 +388,125 @@ class PradoCommandLinePhpShell extends PradoCommandLineAction public function performAction($args) { if(count($args) > 1) - $this->createAndRunPradoApp($args); + $this->initializePradoApplication($args[1]); + return true; + } +} + +/** + * Runs unit test cases. + * + * @author Wei Zhuo + * @version $Id$ + * @since 3.0.5 + */ +class PradoCommandLineUnitTest extends PradoCommandLineAction +{ + protected $action = 'test'; + protected $parameters = array('directory'); + protected $optional = array('testcase ...'); + protected $description = 'Runs all unit test cases in the given . Use [testcase] option to run specific test cases.'; + + protected $matches = array(); + + public function performAction($args) + { + $dir = realpath($args[1]); + if($dir !== false) + $this->runUnitTests($dir,$args); + else + echo '** Unable to find directory "'.$args[1]."\".\n"; return true; } - protected function createAndRunPradoApp($args) + protected function initializeTestRunner() + { + $TEST_TOOLS = realpath(dirname(__FILE__).'/../tests/test_tools/'); + + require_once($TEST_TOOLS.'/simpletest/unit_tester.php'); + require_once($TEST_TOOLS.'/simpletest/web_tester.php'); + require_once($TEST_TOOLS.'/simpletest/mock_objects.php'); + require_once($TEST_TOOLS.'/simpletest/reporter.php'); + } + + protected function runUnitTests($dir, $args) { - $app_dir = realpath($args[1].'/protected/'); + $app_dir = $this->getAppDir($dir); if($app_dir !== false) - { - $app = new PradoShellApplication($app_dir); - $app->setRequest(new DummyHttpRequest()); - $app->run(); - $dir = substr(str_replace(realpath('./'),'',$app_dir),1); + $this->initializePradoApplication($app_dir.'/../'); - echo '** Loaded Prado appplication in directory "'.$dir."\".\n"; + $this->initializeTestRunner(); + $test_dir = $this->getTestDir($dir); + if($test_dir !== false) + { + $test =$this->getUnitTestCases($test_dir,$args); + $running_dir = substr(str_replace(realpath('./'),'',$test_dir),1); + echo 'Running unit tests in directory "'.$running_dir."\":\n"; + $test->run(new TextReporter()); } else - echo '** Unable to load Prado application in directory "'.$args[1]."\".\n"; + { + $running_dir = substr(str_replace(realpath('./'),'',$dir),1); + echo '** Unable to find test directory "'.$running_dir.'/unit" or "'.$running_dir.'/tests/unit".'."\n"; + } + } + + protected function getAppDir($dir) + { + $app_dir = realpath($dir.'/protected'); + if($app_dir !== false) + return $app_dir; + return realpath($dir.'/../protected'); + } + + protected function getTestDir($dir) + { + $test_dir = realpath($dir.'/unit'); + if($test_dir !== false) + return $test_dir; + return realpath($dir.'/tests/unit/'); + } + + protected function getUnitTestCases($dir,$args) + { + $matches = null; + if(count($args) > 2) + $matches = array_slice($args,2); + $test=new GroupTest(' '); + $this->addTests($test,$dir,true,$matches); + $test->setLabel(implode(' ',$this->matches)); + return $test; } -} + protected function addTests($test,$path,$recursive=true,$match=null) + { + $dir=opendir($path); + while(($entry=readdir($dir))!==false) + { + if(is_file($path.'/'.$entry) && (preg_match('/[^\s]*test[^\s]*\.php/', strtolower($entry)))) + { + if($match==null||($match!=null && $this->hasMatch($match,$entry))) + $test->addTestFile($path.'/'.$entry); + } + if($entry!=='.' && $entry!=='..' && $entry!=='.svn' && is_dir($path.'/'.$entry) && $recursive) + $this->addTests($test,$path.'/'.$entry,$recursive,$match); + } + closedir($dir); + } + protected function hasMatch($match,$entry) + { + $file = strtolower(substr($entry,0,strrpos($entry,'.'))); + foreach($match as $m) + { + if(strtolower($m) === $file) + { + $this->matches[] = $m; + return true; + } + } + return false; + } +} ?> \ No newline at end of file -- cgit v1.2.3