* - parser
* - class: Class name of the parser that should be used to parse
* command line arguments.
+ * - modules: Determines the handler for modules. Can be one of:
+ * (array) A parameter array.
+ * See Horde_Cli_Modular_Modules::__construct()
+ * (string) A class name.
+ * (object) An instance of Horde_Cli_Modular_Modules
* </pre>
*/
public function __construct(array $parameters = null)
)
);
}
+
+ /**
+ * Create the module handler.
+ *
+ * @return Horde_Cli_Modular_Modules The module handler.
+ */
+ public function createModules()
+ {
+ if (is_array($this->_parameters['modules'])) {
+ return new Horde_Cli_Modular_Modules(
+ $this->_parameters['modules']
+ );
+ } else if ($this->_parameters['modules'] instanceOf Horde_Cli_Modular_Modules) {
+ return $this->_parameters['modules'];
+ } else if (is_string($this->_parameters['modules'])) {
+ return new $this->_parameters['modules']();
+ } else if (empty($this->_parameters['modules'])) {
+ throw new Horde_Cli_Modular_Exception(
+ 'Missing "modules" parameter!'
+ );
+ } else {
+ throw new Horde_Cli_Modular_Exception(
+ 'Invalid "modules" parameter!'
+ );
+ }
+ }
}
\ No newline at end of file
--- /dev/null
+<?php
+/**
+ * Error handling.
+ *
+ * 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
+ */
+
+/**
+ * This class provides the standard error class for exceptions in this package.
+ *
+ * Copyright 2009-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_Exception extends Horde_Exception_Prior
+{
+}
\ No newline at end of file
--- /dev/null
+<?php
+/**
+ * The Horde_Cli_Modular_Modules:: class handles a set of CLI modules.
+ *
+ * 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_Modules:: class handles a set of CLI 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 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_Modules
+implements Iterator, Countable
+{
+ /**
+ * Parameters.
+ *
+ * @var array
+ */
+ private $_parameters;
+
+ /**
+ * The available modules.
+ *
+ * @var array
+ */
+ private $_modules;
+
+ /**
+ * The dependency provider.
+ *
+ * @var Cli_Modular_Dependencies
+ */
+ private $_dependencies;
+
+ /**
+ * Constructor.
+ *
+ * @param array $parameters Options for this instance.
+ * <pre>
+ * -
+ * </pre>
+ */
+ public function __construct(array $parameters = null)
+ {
+ $this->_parameters = $parameters;
+ $this->_initModules();
+ }
+
+ /**
+ * Initialize the list of module class names.
+ *
+ * @return NULL
+ *
+ * @throws Horde_Cli_Modular_Exception In case the list of modules could not
+ * be established.
+ */
+ private function _initModules()
+ {
+ if (empty($this->_parameters['directory'])) {
+ throw new Horde_Cli_Modular_Exception(
+ 'The "directory" parameter is missing!'
+ );
+ }
+ if (!file_exists($this->_parameters['directory'])) {
+ throw new Horde_Cli_Modular_Exception(
+ sprintf(
+ 'The indicated directory %s does not exist!',
+ $this->_parameters['directory']
+ )
+ );
+ }
+ if (!isset($this->_parameters['exclude'])) {
+ $this->_parameters['exclude'] = array();
+ } else if (!is_array($this->_parameters['exclude'])) {
+ $this->_parameters['exclude'] = array($this->_parameters['exclude']);
+ }
+ foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->_parameters['directory'])) as $file) {
+ if ($file->isFile() && preg_match('/.php$/', $file->getFilename())) {
+ $class = preg_replace("/^(.*)\.php/", '\\1', $file->getFilename());
+ if (!in_array($class, $this->_parameters['exclude'])) {
+ $this->_modules[] = $class;
+ }
+ }
+ }
+ }
+
+ /**
+ * List the available modules.
+ *
+ * @return array The list of modules.
+ */
+ public function listModules()
+ {
+ return $this->_modules;
+ }
+
+ /**
+ * 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 Cli_Modular_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
<active>yes</active>
</lead>
<date>2010-12-15</date>
- <time>09:18:48</time>
+ <time>14:29:38</time>
<version>
<release>0.0.1</release>
<api>0.0.1</api>
<dir name="lib">
<dir name="Horde">
<dir name="Cli">
- <file name="#Modular.php#" role="php" />
+ <dir name="Modular">
+ <file name="Exception.php" role="php" />
+ <file name="Modules.php" role="php" />
+ </dir> <!-- /lib/Horde/Cli/Modular -->
<file name="Modular.php" role="php" />
</dir> <!-- /lib/Horde/Cli -->
</dir> <!-- /lib/Horde -->
<dir name="Horde">
<dir name="Cli">
<dir name="Modular">
+ <dir name="fixtures">
+ <dir name="Module">
+ <file name="One.php" role="test" />
+ <file name="Two.php" role="test" />
+ </dir> <!-- /test/Horde/Cli/Modular/fixtures/Module -->
+ </dir> <!-- /test/Horde/Cli/Modular/fixtures -->
+ <dir name="Stub">
+ <file name="Modules.php" role="test" />
+ </dir> <!-- /test/Horde/Cli/Modular/Stub -->
<dir name="Unit">
<file name="ModularTest.php" role="test" />
+ <file name="ModulesTest.php" role="test" />
</dir> <!-- /test/Horde/Cli/Modular/Unit -->
<file name="AllTests.php" role="test" />
<file name="Autoload.php" role="test" />
</dependencies>
<phprelease>
<filelist>
- <install as="Horde/Cli/#Modular.php#" name="lib/Horde/Cli/#Modular.php#" />
<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/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/phpunit.xml" name="test/Horde/Cli/Modular/phpunit.xml" />
<install as="Horde/Cli/Modular/TestCase.php" name="test/Horde/Cli/Modular/TestCase.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/Unit/ModularTest.php" name="test/Horde/Cli/Modular/Unit/ModularTest.php" />
+ <install as="Horde/Cli/Modular/Unit/ModulesTest.php" name="test/Horde/Cli/Modular/Unit/ModulesTest.php" />
<install as="COPYING" name="COPYING" />
</filelist>
</phprelease>
/** Load the basic test definition */
require_once dirname(__FILE__) . '/TestCase.php';
+
+/** Load stub classes */
+require_once dirname(__FILE__) . '/Stub/Modules.php';
\ No newline at end of file
--- /dev/null
+<?php
+
+class Horde_Cli_Modular_Stub_Modules
+extends Horde_Cli_Modular_Modules
+{
+ public function __construct()
+ {
+ }
+}
);
$this->assertInstanceOf('Horde_Test_Stub_Parser', $modular->createParser());
}
+
+ /**
+ * @expectedException Horde_Cli_Modular_Exception
+ */
+ public function testMissingModules()
+ {
+ $modular = new Horde_Cli_Modular();
+ $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+ }
+
+ /**
+ * @expectedException Horde_Cli_Modular_Exception
+ */
+ public function testInvalidModules()
+ {
+ $modular = new Horde_Cli_Modular(array('modules' => 1.0));
+ $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+ }
+
+ public function testObjectModules()
+ {
+ $modular = new Horde_Cli_Modular(
+ array('modules' => new Horde_Cli_Modular_Modules(
+ array(
+ 'directory' => dirname(__FILE__) . '/../fixtures/Module'
+ )
+ )
+ )
+ );
+ $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+ }
+
+ public function testStringModules()
+ {
+ $modular = new Horde_Cli_Modular(
+ array(
+ 'modules' => 'Horde_Cli_Modular_Stub_Modules'
+ )
+ );
+ $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+ }
+
+ public function testArrayModules()
+ {
+ $modular = new Horde_Cli_Modular(
+ array(
+ 'modules' => array(
+ 'directory' => dirname(__FILE__) . '/../fixtures/Module'
+ ),
+ )
+ );
+ $this->assertInstanceOf('Horde_Cli_Modular_Modules', $modular->createModules());
+ }
+
}
--- /dev/null
+<?php
+/**
+ * Test the modules handler.
+ *
+ * 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 modules handler.
+ *
+ * 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_ModulesTest
+extends Horde_Cli_Modular_TestCase
+{
+
+ /**
+ * @expectedException Horde_Cli_Modular_Exception
+ */
+ public function testMissingDirectory()
+ {
+ $modules = new Horde_Cli_Modular_Modules();
+ }
+
+ /**
+ * @expectedException Horde_Cli_Modular_Exception
+ */
+ public function testInvalidDirectory()
+ {
+ $modules = new Horde_Cli_Modular_Modules(
+ array('directory' => dirname(__FILE__) . '/DOES_NOT_EXIST')
+ );
+ }
+
+ public function testList()
+ {
+ $modules = new Horde_Cli_Modular_Modules(
+ array('directory' => dirname(__FILE__) . '/../fixtures/Module')
+ );
+ $this->assertEquals(array('One', 'Two'), $modules->listModules());
+ }
+
+ public function testExclusion()
+ {
+ $modules = new Horde_Cli_Modular_Modules(
+ array(
+ 'directory' => dirname(__FILE__) . '/../fixtures/Module',
+ 'exclude' => 'One'
+ )
+ );
+ $this->assertEquals(array('Two'), $modules->listModules());
+ }
+
+ public function testIteration()
+ {
+ $modules = new Horde_Cli_Modular_Modules(
+ array('directory' => dirname(__FILE__) . '/../fixtures/Module')
+ );
+ $result = array();
+ foreach ($modules as $name => $module) {
+ $result[] = $module;
+ }
+ $this->assertEquals(array('One', 'Two'), $result);
+ }
+
+ public function testCount()
+ {
+ $modules = new Horde_Cli_Modular_Modules(
+ array('directory' => dirname(__FILE__) . '/../fixtures/Module')
+ );
+ $this->assertEquals(2, count($modules));
+ }
+}