. */ /** * Doctrine_Cli_Task * * @package Doctrine * @subpackage Cli * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.phpdoctrine.com * @since 1.0 * @version $Revision: 2761 $ * @author Jonathan H. Wage */ class Doctrine_Cli { protected $tasks = array(); protected $scriptName = null; public function run($args) { $this->scriptName = $args[0]; if (!isset($args[1])) { echo $this->printTasks(); return; } unset($args[0]); $taskName = str_replace('-', '_', $args[1]); unset($args[1]); $taskClass = 'Doctrine_Cli_Task_' . Doctrine::classify($taskName); if (class_exists($taskClass)) { $taskInstance = new $taskClass(); $taskInstance->taskName = str_replace('_', '-', Doctrine::tableize(str_replace('Doctrine_Cli_Task_', '', $taskName))); $args = $taskInstance->prepareArgs($args); $taskInstance->validate($args); $taskInstance->execute($args); } else { throw new Doctrine_Cli_Exception('Cli task could not be found: '.$taskClass); } } public function printTasks() { $tasks = $this->loadTasks(); echo "\nAvailable Doctrine Command Line Interface Tasks\n"; echo str_repeat('-', 40)."\n\n"; foreach ($tasks as $taskName) { $className = 'Doctrine_Cli_Task_' . $taskName; $taskInstance = new $className(); $taskInstance->taskName = str_replace('_', '-', Doctrine::tableize($taskName)); echo $taskInstance->getDescription() . "\n"; $syntax = "Syntax: "; $syntax .= $this->scriptName . ' ' . $taskInstance->getTaskName(); if ($required = $taskInstance->getRequiredArguments()) { $syntax .= ' <' . implode('> <', $required) . '>'; } if ($optional = $taskInstance->getOptionalArguments()) { $syntax .= ' <' . implode('> <', $optional) . '>'; } echo $syntax."\n"; $args = null; if ($requiredArguments = $taskInstance->getRequiredArgumentsDescriptions()) { foreach ($requiredArguments as $name => $description) { $args .= '*' . $name . ' - ' . $description."\n"; } } if ($optionalArguments = $taskInstance->getOptionalArgumentsDescriptions()) { foreach ($requiredArguments as $name => $description) { $args .= $name . ' - ' . $description."\n"; } } if ($args) { echo "\nArguments:\n"; echo $args; } echo "\n".str_repeat("-", 40)."\n"; } } public function loadTasks($directory = null) { if ($directory === null) { $directory = dirname(__FILE__). DIRECTORY_SEPARATOR . 'Cli' . DIRECTORY_SEPARATOR . 'Task'; } $parent = new ReflectionClass('Doctrine_Cli_Task'); $tasks = array(); foreach ((array) $directory as $dir) { $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::LEAVES_ONLY); foreach ($it as $file) { $e = explode('.', $file->getFileName()); if (end($e) === 'php' && strpos($file->getFileName(), '.inc') === false) { require_once($file->getPathName()); $className = 'Doctrine_Cli_Task_' . $e[0]; $class = new ReflectionClass($className); if ($class->isSubClassOf($parent)) { $tasks[] = $e[0]; } } } } $this->tasks = array_merge($this->tasks, $tasks); return $this->tasks; } }