Convert to Cli_Modular.
authorGunnar Wrobel <p@rdus.de>
Mon, 10 Jan 2011 22:24:37 +0000 (23:24 +0100)
committerGunnar Wrobel <p@rdus.de>
Mon, 10 Jan 2011 22:24:37 +0000 (23:24 +0100)
components/TODO
components/lib/Components.php
components/lib/Components/Config.php
components/lib/Components/Config/Cli.php
components/lib/Components/Module.php
components/lib/Components/Module/Base.php
components/lib/Components/Modules.php [deleted file]
components/package.xml
components/test/Components/StoryTestCase.php

index b7da012..f5748cb 100644 (file)
@@ -56,5 +56,3 @@
  - Allow absolute/relative paths as arguments
 
  - Fix double file task entry bug.
-
- - Convert to Cli_Modular
index 3857768..2bfc4ec 100644 (file)
@@ -41,17 +41,16 @@ class Components
      */
     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) {
@@ -59,8 +58,8 @@ class Components
             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);
@@ -68,16 +67,23 @@ class Components
         }
     }
 
-    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
+                )
             )
         );
     }
@@ -93,13 +99,6 @@ class Components
         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();
index 2b681cb..3158c59 100644 (file)
 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.
index c9968cf..758ad95 100644 (file)
@@ -110,19 +110,6 @@ implements Components_Config
                 )
             )
         );
-    }
-
-    /**
-     * 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();
     }
@@ -158,25 +145,4 @@ implements Components_Config
         $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);
-    }
 }
index 1f76896..1f254ff 100644 (file)
  * @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.
      *
index 54091dd..79310f6 100644 (file)
@@ -48,6 +48,37 @@ implements Components_Module
     }
 
     /**
+     * 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.
diff --git a/components/lib/Components/Modules.php b/components/lib/Components/Modules.php
deleted file mode 100644 (file)
index 6af5707..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-<?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
index 7d195d9..74c8290 100644 (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" />
index 2b35925..5b69167 100644 (file)
@@ -671,7 +671,7 @@ extends PHPUnit_Extensions_Story_TestCase
     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',