- Allow absolute/relative paths as arguments
- Fix double file task entry bug.
-
- - Convert to Cli_Modular
*/
static public function main(array $parameters = array())
{
- $parser = self::_prepareParser($parameters);
- $config = self::_prepareConfig($parser);
if (isset($parameters['dependencies'])
&& $parameters['dependencies'] instanceOf Components_Dependencies) {
$dependencies = $parameters['dependencies'];
} else {
$dependencies = new Components_Dependencies_Injector();
}
+ $modular = self::_prepareModular($dependencies, $parameters);
+ $parser = $modular->createParser();
+ $config = self::_prepareConfig($parser);
$dependencies->initConfig($config);
- $modules = self::_prepareModules($dependencies);
- $config->handleModules($modules);
try {
self::_validateArguments($config);
} catch (Components_Exception $e) {
return;
}
try {
- foreach ($modules as $module) {
- $module->handle($config);
+ foreach ($modular->getModules() as $module) {
+ $modular->getProvider()->getModule($module)->handle($config);
}
} catch (Components_Exception $e) {
$dependencies->getOutput()->fail($e);
}
}
- static private function _prepareParser(array $parameters = array())
- {
- if (empty($parameters['cli']['parser']['class'])) {
- $parser_class = 'Horde_Argv_Parser';
- } else {
- $parser_class = $parameters['cli']['parser']['class'];
- }
- return new $parser_class(
+ static private function _prepareModular(
+ Components_Dependencies $dependencies, array $parameters = array()
+ ) {
+ return new Horde_Cli_Modular(
array(
- 'usage' => '%prog ' . _("[options] PACKAGE_PATH")
+ 'parser' => array(
+ 'class' => empty($parameters['parser']['class']) ? 'Horde_Argv_Parser' : $parameters['parser']['class'],
+ 'usage' => '%prog [options] PACKAGE_PATH'
+ ),
+ 'modules' => array(
+ 'directory' => dirname(__FILE__) . '/Components/Module',
+ 'exclude' => 'Base'
+ ),
+ 'provider' => array(
+ 'prefix' => 'Components_Module_',
+ 'dependencies' => $dependencies
+ )
)
);
}
return $config;
}
- static private function _prepareModules(Components_Dependencies $dependencies)
- {
- $modules = new Components_Modules($dependencies);
- $modules->addModulesFromDirectory(dirname(__FILE__) . '/Components/Module');
- return $modules;
- }
-
static private function _validateArguments(Components_Config $config)
{
$arguments = $config->getArguments();
interface Components_Config
{
/**
- * Provide each configuration handler with the list of supported modules.
- *
- * @param Components_Modules $modules A list of modules.
- * @return NULL
- */
- public function handleModules(Components_Modules $modules);
-
- /**
* Return the options provided by the configuration handlers.
*
* @return array An array of options.
)
)
);
- }
-
- /**
- * Load the options for the list of supported modules.
- *
- * @param Components_Modules $modules A list of modules.
- * @return NULL
- */
- public function handleModules(Components_Modules $modules)
- {
- foreach ($modules as $module) {
- $this->_addOptionsFromModule($this->_parser, $module);
- }
list($this->_options, $this->_arguments) = $this->_parser->parseArgs();
}
$arguments = $this->getArguments();
return $arguments[0];
}
-
- /**
- * Add an option group from the provided module to the parser.
- *
- * @param Horde_Argv_Parser $parser The parser.
- * @param Components_Module $module The module providing the option group.
- *
- * @return NULL
- */
- private function _addOptionsFromModule($parser, $module)
- {
- $group = new Horde_Argv_OptionGroup(
- $parser,
- $module->getOptionGroupTitle(),
- $module->getOptionGroupDescription()
- );
- foreach ($module->getOptionGroupOptions() as $option) {
- $group->addOption($option);
- }
- $parser->addOptionGroup($group);
- }
}
* @license http://www.fsf.org/copyleft/lgpl.html LGPL
* @link http://pear.horde.org/index.php?package=Components
*/
-interface Components_Module
+interface Components_Module extends Horde_Cli_Modular_Module
{
/**
- * Return the title for the option group representing this module.
- *
- * @return string The group title.
- */
- public function getOptionGroupTitle();
-
- /**
- * Return the description for the option group representing this module.
- *
- * @return string The group description.
- */
- public function getOptionGroupDescription();
-
- /**
- * Return the options for this module.
- *
- * @return array The group options.
- */
- public function getOptionGroupOptions();
-
- /**
* Determine if this module should act. Run all required actions if it has
* been instructed to do so.
*
}
/**
+ * Get the usage description for this module.
+ *
+ * @return string The description.
+ */
+ public function getUsage()
+ {
+ return '';
+ }
+
+ /**
+ * Get a set of base options that this module adds to the CLI argument
+ * parser.
+ *
+ * @return array The options.
+ */
+ public function getBaseOptions()
+ {
+ return array();
+ }
+
+ /**
+ * Indicate if the module provides an option group.
+ *
+ * @return boolean True if an option group should be added.
+ */
+ public function hasOptionGroup()
+ {
+ return true;
+ }
+
+ /**
* Validate that there is a package.xml file in the provided directory.
*
* @param string $directory The package directory.
+++ /dev/null
-<?php
-/**
- * The Components_Modules:: class handles a set of Components modules.
- *
- * PHP version 5
- *
- * @category Horde
- * @package Components
- * @author Gunnar Wrobel <wrobel@pardus.de>
- * @license http://www.fsf.org/copyleft/lgpl.html LGPL
- * @link http://pear.horde.org/index.php?package=Components
- */
-
-/**
- * The Components_Modules:: class handles a set of Components modules.
- *
- * Copyright 2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @category Horde
- * @package Components
- * @author Gunnar Wrobel <wrobel@pardus.de>
- * @license http://www.fsf.org/copyleft/lgpl.html LGPL
- * @link http://pear.horde.org/index.php?package=Components
- */
-class Components_Modules
-implements Iterator, Countable
-{
- /**
- * The available modules.
- *
- * @var array
- */
- private $_modules;
-
- /**
- * The dependency provider.
- *
- * @var Components_Dependencies
- */
- private $_dependencies;
-
- /**
- * Constructor.
- *
- * @param Components_Dependencies $dependencies The dependency provider.
- */
- public function __construct(Components_Dependencies $dependencies)
- {
- $this->_dependencies = $dependencies;
- $this->_modules = array();
- }
-
- /**
- * Add all modules found in the specified directory.
- *
- * @param string $module_directory Load the modules from this directory.
- *
- * @return NULL
- */
- public function addModulesFromDirectory(
- $module_directory,
- $base = 'Components_Module_'
- ) {
- foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($module_directory)) as $file) {
- if ($file->isFile() && preg_match('/.php$/', $file->getFilename())) {
- $class = $base . preg_replace("/^(.*)\.php/", '\\1', $file->getFilename());
- if ($class != 'Components_Module_Base') {
- $this->_modules[$class] = new $class($this->_dependencies);
- }
- }
- }
- }
-
- /**
- * Implementation of the Iterator rewind() method. Rewinds the module list.
- *
- * return NULL
- */
- public function rewind()
- {
- reset($this->_modules);
- }
-
- /**
- * Implementation of the Iterator current(). Returns the current module.
- *
- * @return mixed The current module.
- */
- public function current()
- {
- return current($this->_modules);
- }
-
- /**
- * Implementation of the Iterator key() method. Returns the key of the current module.
- *
- * @return mixed The class name of the current module.
- */
- public function key()
- {
- return key($this->_modules);
- }
-
- /**
- * Implementation of the Iterator next() method. Returns the next module.
- *
- * @return Components_Module|null The next module or null if there are no more
- * modules.
- */
- public function next()
- {
- return next($this->_modules);
- }
-
- /**
- * Implementation of the Iterator valid() method. Indicates if the current element is a valid element.
- *
- * @return boolean Whether the current element is valid
- */
- public function valid()
- {
- return key($this->_modules) !== null;
- }
-
- /**
- * Implementation of Countable count() method. Returns the number of modules.
- *
- * @return integer Number of modules.
- */
- public function count()
- {
- return count($this->_modules);
- }
-}
\ No newline at end of file
<file name="Dependencies.php" role="php" />
<file name="Exception.php" role="php" />
<file name="Module.php" role="php" />
- <file name="Modules.php" role="php" />
<file name="Output.php" role="php" />
</dir> <!-- /lib/Components -->
<file name="Components.php" role="php" />
<install as="Components/Dependencies.php" name="lib/Components/Dependencies.php" />
<install as="Components/Exception.php" name="lib/Components/Exception.php" />
<install as="Components/Module.php" name="lib/Components/Module.php" />
- <install as="Components/Modules.php" name="lib/Components/Modules.php" />
<install as="Components/Output.php" name="lib/Components/Output.php" />
<install as="Components/Config/Application.php" name="lib/Components/Config/Application.php" />
<install as="Components/Config/Cli.php" name="lib/Components/Config/Cli.php" />
private function _callComponents(array $parameters, $callback)
{
ob_start();
- $parameters['cli']['parser']['class'] = 'Horde_Test_Stub_Parser';
+ $parameters['parser']['class'] = 'Horde_Test_Stub_Parser';
$parameters['dependencies'] = new Components_Dependencies_Injector();
$parameters['dependencies']->setInstance(
'Horde_Cli',