Browse Source

[ClassMapGenerator] Improve error message when the path does not exist

i.e. the composer.json has a typo
Victor Berchet 12 years ago
parent
commit
ab48114531

+ 19 - 12
src/Composer/Autoload/ClassMapGenerator.php

@@ -40,42 +40,49 @@ class ClassMapGenerator
     /**
      * Iterate over all files in the given directory searching for classes
      *
-     * @param Iterator|string $dir       The directory to search in or an iterator
+     * @param Iterator|string $path      The path to search in or an iterator
      * @param string          $whitelist Regex that matches against the file path
      *
      * @return array A class map array
+     *
+     * @throws \RuntimeException When the path is neither an existing file nor directory
      */
-    public static function createMap($dir, $whitelist = null)
+    public static function createMap($path, $whitelist = null)
     {
-        if (is_string($dir)) {
-            if (is_file($dir)) {
-                $dir = array(new \SplFileInfo($dir));
+        if (is_string($path)) {
+            if (is_file($path)) {
+                $path = array(new \SplFileInfo($path));
+            } else if (is_dir($path)) {
+                $path = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
             } else {
-                $dir = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir));
+                throw new \RuntimeException(
+                    'Could not scan for classes inside "'.$path.
+                    '" which does not appear to be a file nor a folder'
+                );
             }
         }
 
         $map = array();
 
-        foreach ($dir as $file) {
+        foreach ($path as $file) {
             if (!$file->isFile()) {
                 continue;
             }
 
-            $path = $file->getRealPath();
+            $filePath = $file->getRealPath();
 
-            if (pathinfo($path, PATHINFO_EXTENSION) !== 'php') {
+            if (pathinfo($filePath, PATHINFO_EXTENSION) !== 'php') {
                 continue;
             }
 
-            if ($whitelist && !preg_match($whitelist, strtr($path, '\\', '/'))) {
+            if ($whitelist && !preg_match($whitelist, strtr($filePath, '\\', '/'))) {
                 continue;
             }
 
-            $classes = self::findClasses($path);
+            $classes = self::findClasses($filePath);
 
             foreach ($classes as $class) {
-                $map[$class] = $path;
+                $map[$class] = $filePath;
             }
 
         }

+ 10 - 1
tests/Composer/Test/Autoload/ClassMapGeneratorTest.php

@@ -88,7 +88,7 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase
      * @expectedException \RuntimeException
      * @expectedExceptionMessage Could not scan for classes inside
      */
-    public function testThrowsWhenFileDoesNotExist()
+    public function testFindClassesThrowsWhenFileDoesNotExist()
     {
         $r = new \ReflectionClass('Composer\\Autoload\\ClassMapGenerator');
         $find = $r->getMethod('findClasses');
@@ -97,6 +97,15 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase
         $find->invoke(null, __DIR__.'/no-file');
     }
 
+    /**
+     * @expectedException \RuntimeException
+     * @expectedExceptionMessage Could not scan for classes inside
+     */
+    public function testCreateMapThrowsWhenDirectoryDoesNotExist()
+    {
+        ClassMapGenerator::createMap(__DIR__.'/no-file.no-foler');
+    }
+
     protected function assertEqualsNormalized($expected, $actual, $message = null)
     {
         foreach ($expected as $ns => $path) {