diff --git a/src/Composer/Autoload/ClassMapGenerator.php b/src/Composer/Autoload/ClassMapGenerator.php index cfaa6bb0f..e2518a721 100644 --- a/src/Composer/Autoload/ClassMapGenerator.php +++ b/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; } } diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php index 1196ee5dc..751aa6a38 100644 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ b/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) {