Add the modules handler.
authorGunnar Wrobel <p@rdus.de>
Wed, 15 Dec 2010 13:32:07 +0000 (14:32 +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/Exception.php [new file with mode: 0644]
framework/Cli_Modular/lib/Horde/Cli/Modular/Modules.php [new file with mode: 0644]
framework/Cli_Modular/package.xml
framework/Cli_Modular/test/Horde/Cli/Modular/Autoload.php
framework/Cli_Modular/test/Horde/Cli/Modular/Stub/Modules.php [new file with mode: 0644]
framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModularTest.php
framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModulesTest.php [new file with mode: 0644]
framework/Cli_Modular/test/Horde/Cli/Modular/fixtures/Module/One.php [new file with mode: 0644]
framework/Cli_Modular/test/Horde/Cli/Modular/fixtures/Module/Two.php [new file with mode: 0644]

index 738c8d9..aafc0cd 100644 (file)
@@ -43,6 +43,11 @@ class Horde_Cli_Modular
      *    - 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)
@@ -78,4 +83,30 @@ class Horde_Cli_Modular
             )
         );
     }
+
+    /**
+     * 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
diff --git a/framework/Cli_Modular/lib/Horde/Cli/Modular/Exception.php b/framework/Cli_Modular/lib/Horde/Cli/Modular/Exception.php
new file mode 100644 (file)
index 0000000..42d93f2
--- /dev/null
@@ -0,0 +1,30 @@
+<?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
diff --git a/framework/Cli_Modular/lib/Horde/Cli/Modular/Modules.php b/framework/Cli_Modular/lib/Horde/Cli/Modular/Modules.php
new file mode 100644 (file)
index 0000000..8d41294
--- /dev/null
@@ -0,0 +1,174 @@
+<?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
index 7a7bbc0..a330a48 100644 (file)
@@ -17,7 +17,7 @@
   <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>
index 1d7365f..e94f409 100644 (file)
@@ -24,3 +24,6 @@ error_reporting(E_ALL | E_STRICT);
 
 /** 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
diff --git a/framework/Cli_Modular/test/Horde/Cli/Modular/Stub/Modules.php b/framework/Cli_Modular/test/Horde/Cli/Modular/Stub/Modules.php
new file mode 100644 (file)
index 0000000..c5595d0
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+class Horde_Cli_Modular_Stub_Modules
+extends Horde_Cli_Modular_Modules
+{
+    public function __construct()
+    {
+    }
+}
index f314805..30ed93d 100644 (file)
@@ -54,4 +54,58 @@ extends Horde_Cli_Modular_TestCase
         );
         $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());
+    }
+
 }
diff --git a/framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModulesTest.php b/framework/Cli_Modular/test/Horde/Cli/Modular/Unit/ModulesTest.php
new file mode 100644 (file)
index 0000000..1908d4d
--- /dev/null
@@ -0,0 +1,95 @@
+<?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));
+    }
+}
diff --git a/framework/Cli_Modular/test/Horde/Cli/Modular/fixtures/Module/One.php b/framework/Cli_Modular/test/Horde/Cli/Modular/fixtures/Module/One.php
new file mode 100644 (file)
index 0000000..b3d9bbc
--- /dev/null
@@ -0,0 +1 @@
+<?php
diff --git a/framework/Cli_Modular/test/Horde/Cli/Modular/fixtures/Module/Two.php b/framework/Cli_Modular/test/Horde/Cli/Modular/fixtures/Module/Two.php
new file mode 100644 (file)
index 0000000..b3d9bbc
--- /dev/null
@@ -0,0 +1 @@
+<?php