Allow collecting usage descriptions from each module.
authorGunnar Wrobel <p@rdus.de>
Wed, 15 Dec 2010 15:42:39 +0000 (16:42 +0100)
committerGunnar Wrobel <p@rdus.de>
Thu, 16 Dec 2010 07:07:02 +0000 (08:07 +0100)
framework/Cli_Modular/lib/Horde/Cli/Modular.php
framework/Cli_Modular/lib/Horde/Cli/Modular/Module.php [new file with mode: 0644]
framework/Cli_Modular/lib/Horde/Cli/Modular/ModuleProvider.php [new file with mode: 0644]
framework/Cli_Modular/lib/Horde/Cli/Modular/Modules.php
framework/Cli_Modular/package.xml
framework/Cli_Modular/test/Horde/Cli/Modular/Autoload.php
framework/Cli_Modular/test/Horde/Cli/Modular/Stub/Module/One.php [new file with mode: 0644]
framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModularTest.php
framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModuleProviderTest.php [new file with mode: 0644]

index aafc0cd..ad81c31 100644 (file)
@@ -35,6 +35,13 @@ class Horde_Cli_Modular
     private $_parameters;
 
     /**
+     * Handler for the list of modules.
+     *
+     * @var Horde_Cli_Modular_Modules
+     */
+    private $_modules;
+
+    /**
      * Constructor.
      *
      * @param array $parameters Options for this instance.
@@ -43,6 +50,7 @@ class Horde_Cli_Modular
      *    - parser
      *      - class: Class name of the parser that should be used to parse
      *               command line arguments.
+     *      - usage: The usage decription shown in the help output of the CLI
      *  - modules:   Determines the handler for modules. Can be one of:
      *               (array)  A parameter array.
      *                        See Horde_Cli_Modular_Modules::__construct()
@@ -70,6 +78,24 @@ class Horde_Cli_Modular
     }
 
     /**
+     * Return the usage description for the help output of the parser.
+     *
+     * @return string The usage description.
+     */
+    public function getUsage()
+    {
+        if (empty($this->_parameters['cli']['parser']['usage'])) {
+            $usage = '[options]';
+        } else {
+            $usage = $this->_parameters['cli']['parser']['usage'];
+        }
+        foreach ($this->getModules() as $module) {
+            $usage .= '';
+        }
+        return $usage;
+    }
+
+    /**
      * Create the parser for command line arguments.
      *
      * @return Horde_Argv_Parser The parser.
@@ -79,7 +105,7 @@ class Horde_Cli_Modular
         $parser_class = $this->getParserClass();
         return new $parser_class(
             array(
-                'usage' => '%prog ' . _("[options] PACKAGE_PATH")
+                'usage' => '%prog ' . $this->getUsage()
             )
         );
     }
@@ -89,7 +115,20 @@ class Horde_Cli_Modular
      *
      * @return Horde_Cli_Modular_Modules The module handler.
      */
-    public function createModules()
+    public function getModules()
+    {
+        if ($this->_modules === null) {
+            $this->_modules = $this->_createModules();
+        }
+        return $this->_modules;
+    }
+
+    /**
+     * Create the module handler.
+     *
+     * @return Horde_Cli_Modular_Modules The module handler.
+     */
+    private function _createModules()
     {
         if (is_array($this->_parameters['modules'])) {
             return new Horde_Cli_Modular_Modules(
diff --git a/framework/Cli_Modular/lib/Horde/Cli/Modular/Module.php b/framework/Cli_Modular/lib/Horde/Cli/Modular/Module.php
new file mode 100644 (file)
index 0000000..1b4837a
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/**
+ * The Horde_Cli_Modular_Module:: interface characterizes a single CLI module.
+ *
+ * PHP version 5
+ *
+ * @category Horde
+ * @package  Cli_Modular
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Cli_Modular
+ */
+
+/**
+ * The Horde_Cli_Modular_Module:: interface characterizes a single CLI module.
+ *
+ * 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  Cli_Modular
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Cli_Modular
+ */
+interface Horde_Cli_Modular_Module
+{
+    /**
+     * Get the usage description for this module.
+     *
+     * @return string The description.
+     */
+    static public function getUsage();
+}
\ No newline at end of file
diff --git a/framework/Cli_Modular/lib/Horde/Cli/Modular/ModuleProvider.php b/framework/Cli_Modular/lib/Horde/Cli/Modular/ModuleProvider.php
new file mode 100644 (file)
index 0000000..78949e7
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+/**
+ * The Horde_Cli_Modular_ModuleProvider:: class provides access to a single
+ * module.
+ *
+ * PHP version 5
+ *
+ * @category Horde
+ * @package  Cli_Modular
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Cli_Modular
+ */
+
+/**
+ * The Horde_Cli_Modular_ModuleProvider:: class provides access to a single
+ * module.
+ *
+ * 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  Cli_Modular
+ * @author   Gunnar Wrobel <wrobel@pardus.de>
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link     http://pear.horde.org/index.php?package=Cli_Modular
+ */
+class Horde_Cli_Modular_ModuleProvider
+{
+    /**
+     * Class prefix.
+     *
+     * @var string
+     */
+    private $_prefix;
+
+    /**
+     * Constructor.
+     *
+     * @param array $parameters Options for this instance.
+     * <pre>
+     *  - 
+     * </pre>
+     */
+    public function __construct(array $parameters = null)
+    {
+        if (!isset($parameters['prefix'])) {
+            throw new Horde_Cli_Modular_Exception(
+                'Missing "prefix" parameter!'
+            );
+        }
+        $this->_prefix = $parameters['prefix'];
+    }
+
+    /**
+     * Get the usage string for the specified module.
+     *
+     * @param string $module The desired module.
+     *
+     * @return string The usage description for this module.
+     *
+     * @throws Horde_Cli_Modular_Exception In case the specified module does not
+     * exist.
+     */
+    public function getUsage($module)
+    {
+        if (!class_exists($this->_prefix . $module)) {
+            throw new Horde_Cli_Modular_Exception(
+                sprintf(
+                    'Invalid module %s!', $this->_prefix . $module
+                )
+            );
+        }
+        return call_user_func_array(
+            array($this->_prefix . $module, 'getUsage'), array()
+        );
+    }
+}
\ No newline at end of file
index 8d41294..5566551 100644 (file)
@@ -54,7 +54,8 @@ implements Iterator, Countable
      *
      * @param array $parameters Options for this instance.
      * <pre>
-     *  - 
+     *  - directory: (string) The path to the directory that holds the modules.
+     *  - exclude:   (array) Exclude these modules from the list.
      * </pre>
      */
     public function __construct(array $parameters = null)
index a330a48..ea46cb3 100644 (file)
@@ -17,7 +17,7 @@
   <active>yes</active>
  </lead>
  <date>2010-12-15</date>
- <time>14:29:38</time>
+ <time>16:39:45</time>
  <version>
   <release>0.0.1</release>
   <api>0.0.1</api>
@@ -37,6 +37,8 @@
      <dir name="Cli">
       <dir name="Modular">
        <file name="Exception.php" role="php" />
+       <file name="Module.php" role="php" />
+       <file name="ModuleProvider.php" role="php" />
        <file name="Modules.php" role="php" />
       </dir> <!-- /lib/Horde/Cli/Modular -->
       <file name="Modular.php" role="php" />
         </dir> <!-- /test/Horde/Cli/Modular/fixtures/Module -->
        </dir> <!-- /test/Horde/Cli/Modular/fixtures -->
        <dir name="Stub">
+        <dir name="Module">
+         <file name="One.php" role="test" />
+        </dir> <!-- /test/Horde/Cli/Modular/Stub/Module -->
         <file name="Modules.php" role="test" />
        </dir> <!-- /test/Horde/Cli/Modular/Stub -->
        <dir name="Unit">
         <file name="ModularTest.php" role="test" />
+        <file name="ModuleProviderTest.php" role="test" />
         <file name="ModulesTest.php" role="test" />
        </dir> <!-- /test/Horde/Cli/Modular/Unit -->
        <file name="AllTests.php" role="test" />
@@ -85,6 +91,8 @@
   <filelist>
    <install as="Horde/Cli/Modular.php" name="lib/Horde/Cli/Modular.php" />
    <install as="Horde/Cli/Modular/Exception.php" name="lib/Horde/Cli/Modular/Exception.php" />
+   <install as="Horde/Cli/Modular/Module.php" name="lib/Horde/Cli/Modular/Module.php" />
+   <install as="Horde/Cli/Modular/ModuleProvider.php" name="lib/Horde/Cli/Modular/ModuleProvider.php" />
    <install as="Horde/Cli/Modular/Modules.php" name="lib/Horde/Cli/Modular/Modules.php" />
    <install as="Horde/Cli/Modular/AllTests.php" name="test/Horde/Cli/Modular/AllTests.php" />
    <install as="Horde/Cli/Modular/Autoload.php" name="test/Horde/Cli/Modular/Autoload.php" />
    <install as="Horde/Cli/Modular/fixtures/Module/One.php" name="test/Horde/Cli/Modular/fixtures/Module/One.php" />
    <install as="Horde/Cli/Modular/fixtures/Module/Two.php" name="test/Horde/Cli/Modular/fixtures/Module/Two.php" />
    <install as="Horde/Cli/Modular/Stub/Modules.php" name="test/Horde/Cli/Modular/Stub/Modules.php" />
+   <install as="Horde/Cli/Modular/Stub/Module/One.php" name="test/Horde/Cli/Modular/Stub/Module/One.php" />
    <install as="Horde/Cli/Modular/Unit/ModularTest.php" name="test/Horde/Cli/Modular/Unit/ModularTest.php" />
+   <install as="Horde/Cli/Modular/Unit/ModuleProviderTest.php" name="test/Horde/Cli/Modular/Unit/ModuleProviderTest.php" />
    <install as="Horde/Cli/Modular/Unit/ModulesTest.php" name="test/Horde/Cli/Modular/Unit/ModulesTest.php" />
    <install as="COPYING" name="COPYING" />
   </filelist>
index e94f409..a5290b2 100644 (file)
@@ -26,4 +26,5 @@ error_reporting(E_ALL | E_STRICT);
 require_once dirname(__FILE__) . '/TestCase.php';
 
 /** Load stub classes */
-require_once dirname(__FILE__) . '/Stub/Modules.php';
\ No newline at end of file
+require_once dirname(__FILE__) . '/Stub/Modules.php';
+require_once dirname(__FILE__) . '/Stub/Module/One.php';
\ No newline at end of file
diff --git a/framework/Cli_Modular/test/Horde/Cli/Modular/Stub/Module/One.php b/framework/Cli_Modular/test/Horde/Cli/Modular/Stub/Module/One.php
new file mode 100644 (file)
index 0000000..2ad1a0a
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+class Horde_Cli_Modular_Stub_Module_One
+implements Horde_Cli_Modular_Module
+{
+    static public function getUsage()
+    {
+        return 'Use One';
+    }
+}
\ No newline at end of file
index 30ed93d..4f1ce01 100644 (file)
@@ -37,7 +37,13 @@ extends Horde_Cli_Modular_TestCase
 {
     public function testParser()
     {
-        $modular = new Horde_Cli_Modular();
+        $modular = new Horde_Cli_Modular(
+            array(
+                'modules' => array(
+                    'directory' => dirname(__FILE__) . '/../fixtures/Module'
+                ),
+            )
+        );
         $this->assertInstanceOf('Horde_Argv_Parser', $modular->createParser());
     }
 
@@ -49,7 +55,10 @@ extends Horde_Cli_Modular_TestCase
                     'parser' => array(
                         'class' => 'Horde_Test_Stub_Parser'
                     )
-                )
+                ),
+                'modules' => array(
+                    'directory' => dirname(__FILE__) . '/../fixtures/Module'
+                ),
             )
         );
         $this->assertInstanceOf('Horde_Test_Stub_Parser', $modular->createParser());
@@ -61,7 +70,7 @@ extends Horde_Cli_Modular_TestCase
     public function testMissingModules()
     {
         $modular = new Horde_Cli_Modular();
-        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->getModules());
     }
 
     /**
@@ -70,7 +79,7 @@ extends Horde_Cli_Modular_TestCase
     public function testInvalidModules()
     {
         $modular = new Horde_Cli_Modular(array('modules' => 1.0));
-        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->getModules());
     }
 
     public function testObjectModules()
@@ -83,7 +92,7 @@ extends Horde_Cli_Modular_TestCase
                   )
             )
         );
-        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->getModules());
     }
 
     public function testStringModules()
@@ -93,7 +102,7 @@ extends Horde_Cli_Modular_TestCase
                 'modules' => 'Horde_Cli_Modular_Stub_Modules'
             )
         );
-        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->getModules());
     }
 
     public function testArrayModules()
@@ -105,7 +114,7 @@ extends Horde_Cli_Modular_TestCase
                 ),
             )
         );
-        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+        $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->getModules());
     }
 
 }
diff --git a/framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModuleProviderTest.php b/framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModuleProviderTest.php
new file mode 100644 (file)
index 0000000..d010982
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Test the module provider.
+ *
+ * PHP version 5
+ *
+ * @category   Kolab
+ * @package    Cli_Modular
+ * @subpackage UnitTests
+ * @author     Gunnar Wrobel <wrobel@pardus.de>
+ * @license    http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link       http://pear.horde.org/index.php?package=Cli_Modular
+ */
+
+/**
+ * Prepare the test setup.
+ */
+require_once dirname(__FILE__) . '/../Autoload.php';
+
+/**
+ * Test the module provider.
+ *
+ * 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   Kolab
+ * @package    Cli_Modular
+ * @subpackage UnitTests
+ * @author     Gunnar Wrobel <wrobel@pardus.de>
+ * @license    http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @link       http://pear.horde.org/index.php?package=Cli_Modular
+ */
+class Horde_Cli_Modular_Unit_ModuleProviderTest
+extends Horde_Cli_Modular_TestCase
+{
+    /**
+     * @expectedException Horde_Cli_Modular_Exception
+     */
+    public function testMissingPrefix()
+    {
+        $provider = new Horde_Cli_Modular_ModuleProvider();
+    }
+
+    /**
+     * @expectedException Horde_Cli_Modular_Exception
+     */
+    public function testInvalidModule()
+    {
+        $provider = new Horde_Cli_Modular_ModuleProvider(
+            array('prefix' => 'INVALID')
+        );
+        $provider->getUsage('One');
+    }
+
+    public function testUsage()
+    {
+        $provider = new Horde_Cli_Modular_ModuleProvider(
+            array('prefix' => 'Horde_Cli_Modular_Stub_Module_')
+        );
+        $this->assertEquals('Use One', $provider->getUsage('One'));
+    }
+}