From 1f486bb49892611459efd692fe6a7c02983b33dc Mon Sep 17 00:00:00 2001 From: Gunnar Wrobel Date: Wed, 15 Dec 2010 16:42:39 +0100 Subject: [PATCH] Allow collecting usage descriptions from each module. --- framework/Cli_Modular/lib/Horde/Cli/Modular.php | 43 +++++++++++- .../Cli_Modular/lib/Horde/Cli/Modular/Module.php | 36 ++++++++++ .../lib/Horde/Cli/Modular/ModuleProvider.php | 80 ++++++++++++++++++++++ .../Cli_Modular/lib/Horde/Cli/Modular/Modules.php | 3 +- framework/Cli_Modular/package.xml | 12 +++- .../test/Horde/Cli/Modular/Autoload.php | 3 +- .../test/Horde/Cli/Modular/Stub/Module/One.php | 10 +++ .../test/Horde/Cli/Modular/Unit/ModularTest.php | 23 +++++-- .../Horde/Cli/Modular/Unit/ModuleProviderTest.php | 64 +++++++++++++++++ 9 files changed, 262 insertions(+), 12 deletions(-) create mode 100644 framework/Cli_Modular/lib/Horde/Cli/Modular/Module.php create mode 100644 framework/Cli_Modular/lib/Horde/Cli/Modular/ModuleProvider.php create mode 100644 framework/Cli_Modular/test/Horde/Cli/Modular/Stub/Module/One.php create mode 100644 framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModuleProviderTest.php diff --git a/framework/Cli_Modular/lib/Horde/Cli/Modular.php b/framework/Cli_Modular/lib/Horde/Cli/Modular.php index aafc0cd61..ad81c3175 100644 --- a/framework/Cli_Modular/lib/Horde/Cli/Modular.php +++ b/framework/Cli_Modular/lib/Horde/Cli/Modular.php @@ -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 index 000000000..1b4837a65 --- /dev/null +++ b/framework/Cli_Modular/lib/Horde/Cli/Modular/Module.php @@ -0,0 +1,36 @@ + + * @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 + * @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 index 000000000..78949e799 --- /dev/null +++ b/framework/Cli_Modular/lib/Horde/Cli/Modular/ModuleProvider.php @@ -0,0 +1,80 @@ + + * @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 + * @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. + *
+     *  - 
+     * 
+ */ + 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 diff --git a/framework/Cli_Modular/lib/Horde/Cli/Modular/Modules.php b/framework/Cli_Modular/lib/Horde/Cli/Modular/Modules.php index 8d4129431..5566551ea 100644 --- a/framework/Cli_Modular/lib/Horde/Cli/Modular/Modules.php +++ b/framework/Cli_Modular/lib/Horde/Cli/Modular/Modules.php @@ -54,7 +54,8 @@ implements Iterator, Countable * * @param array $parameters Options for this instance. *
-     *  - 
+     *  - directory: (string) The path to the directory that holds the modules.
+     *  - exclude:   (array) Exclude these modules from the list.
      * 
*/ public function __construct(array $parameters = null) diff --git a/framework/Cli_Modular/package.xml b/framework/Cli_Modular/package.xml index a330a48a1..ea46cb3a9 100644 --- a/framework/Cli_Modular/package.xml +++ b/framework/Cli_Modular/package.xml @@ -17,7 +17,7 @@ yes 2010-12-15 - + 0.0.1 0.0.1 @@ -37,6 +37,8 @@ + + @@ -54,10 +56,14 @@ + + + + @@ -85,6 +91,8 @@ + + @@ -93,7 +101,9 @@ + + diff --git a/framework/Cli_Modular/test/Horde/Cli/Modular/Autoload.php b/framework/Cli_Modular/test/Horde/Cli/Modular/Autoload.php index e94f40936..a5290b218 100644 --- a/framework/Cli_Modular/test/Horde/Cli/Modular/Autoload.php +++ b/framework/Cli_Modular/test/Horde/Cli/Modular/Autoload.php @@ -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 index 000000000..2ad1a0a9a --- /dev/null +++ b/framework/Cli_Modular/test/Horde/Cli/Modular/Stub/Module/One.php @@ -0,0 +1,10 @@ + 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 index 000000000..d01098295 --- /dev/null +++ b/framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModuleProviderTest.php @@ -0,0 +1,64 @@ + + * @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 + * @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')); + } +} -- 2.11.0