private $_parameters;
/**
+ * Handler for the list of modules.
+ *
+ * @var Horde_Cli_Modular_Modules
+ */
+ private $_modules;
+
+ /**
* Constructor.
*
* @param array $parameters Options for this instance.
* - 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()
}
/**
+ * 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.
$parser_class = $this->getParserClass();
return new $parser_class(
array(
- 'usage' => '%prog ' . _("[options] PACKAGE_PATH")
+ 'usage' => '%prog ' . $this->getUsage()
)
);
}
*
* @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(
--- /dev/null
+<?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
--- /dev/null
+<?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
*
* @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)
<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>
<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" />
<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>
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
--- /dev/null
+<?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
{
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());
}
'parser' => array(
'class' => 'Horde_Test_Stub_Parser'
)
- )
+ ),
+ 'modules' => array(
+ 'directory' => dirname(__FILE__) . '/../fixtures/Module'
+ ),
)
);
$this->assertInstanceOf('Horde_Test_Stub_Parser', $modular->createParser());
public function testMissingModules()
{
$modular = new Horde_Cli_Modular();
- $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+ $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->getModules());
}
/**
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()
)
)
);
- $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+ $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->getModules());
}
public function testStringModules()
'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()
),
)
);
- $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+ $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->getModules());
}
}
--- /dev/null
+<?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'));
+ }
+}