1
0
mirror of https://github.com/danog/class-finder.git synced 2024-11-26 12:04:42 +01:00

Add ClassFinder::namespaceHasClasses instead of throwing on empty namespaces

This commit is contained in:
Benedikt Franke 2019-09-15 14:28:01 +00:00 committed by Hayden Pierce
parent 4f2d91aa87
commit 841294cd53
10 changed files with 67 additions and 40 deletions

View File

@ -97,7 +97,6 @@ Documentation
* [Files could not locate PHP](docs/exceptions/filesCouldNotLocatePHP.md)
* [Files exec not available](docs/exceptions/filesExecNotAvailable.md)
* [Missing composer.json](docs/exceptions/missingComposerConfig.md)
* [Unknown namespace](docs/exceptions/unknownNamespace.md)
**Internals**

View File

@ -1,7 +1,10 @@
#!/usr/bin/env bash
set -Eeuxo pipefail
composer install --working-dir=$1/test/app1 --quiet || exit 1
composer install --working-dir=$1/test/app2 --quiet || exit 1
composer install --working-dir=$1 --quiet || exit 1
php --version
php $1/vendor/bin/phpunit --testsuite all
php $1/vendor/bin/phpunit --testsuite noAutoload
php -d disable_functions=exec ./vendor/phpunit/phpunit/phpunit ./test/app1/src/ClassFinderTest.php --filter=testWorksWhenExecIsDisabled
php -d disable_functions=exec ./vendor/phpunit/phpunit/phpunit ./test/app1/src/ClassFinderTest.php --filter=testWorksWhenExecIsDisabled

View File

@ -1,7 +1,10 @@
#!/usr/bin/env bash
set -Eeuxo pipefail
composer install --working-dir=$1/test/app1 --quiet || exit 1
composer install --working-dir=$1/test/app2 --quiet || exit 1
composer install --working-dir=$1 --quiet || exit 1
php --version
php $1/vendor/bin/phpunit --testsuite all
php $1/vendor/bin/phpunit --testsuite noAutoload
php -d disable_functions=exec ./vendor/phpunit/phpunit/phpunit ./test/app1/src/ClassFinderTest.php --filter=testWorksWhenExecIsDisabled
php -d disable_functions=exec ./vendor/phpunit/phpunit/phpunit ./test/app1/src/ClassFinderTest.php --filter=testWorksWhenExecIsDisabled

View File

@ -1,3 +1,9 @@
Unreleased
----------
* Don't throw if a namespace contains no classes
* Add method `Classfinder::namespaceHasClasses` to detect if a namespace is empty
Version 0.3.3
-------------
@ -139,4 +145,4 @@ ClassFinder::appRoot = '/home/hpierce/whatevs';
New overriding app root:
```
ClassFinder::setAppRoot('/home/hpierce/whatevs');
```
```

View File

@ -1,6 +1,8 @@
Unknown Namespace
-----------------
__This exception only occurs in versions 0.3.x and lower.__
Example PHP:
```
<?php

View File

@ -58,25 +58,20 @@ class ClassFinder
}
/**
* @param $namespace
* @param $options
* @return array
* Identify classes in a given namespace.
*
* @param string $namespace
* @param int $options
*
* @return string[]
*
* @throws \Exception
*/
public static function getClassesInNamespace($namespace, $options = self::STANDARD_MODE)
{
self::initialize();
$findersWithNamespace = array_filter(self::getSupportedFinders(), function(FinderInterface $finder) use ($namespace){
return $finder->isNamespaceKnown($namespace);
});
if (count($findersWithNamespace) === 0) {
throw new ClassFinderException(sprintf("Unknown namespace '%s'. See '%s' for details.",
$namespace,
'https://gitlab.com/hpierce1102/ClassFinder/blob/master/docs/exceptions/unknownNamespace.md'
));
}
$findersWithNamespace = self::findersWithNamespace($namespace);
$classes = array_reduce($findersWithNamespace, function($carry, FinderInterface $finder) use ($namespace, $options){
return array_merge($carry, $finder->findClasses($namespace, $options));
@ -85,6 +80,20 @@ class ClassFinder
return array_unique($classes);
}
/**
* Check if a given namespace contains any classes.
*
* @param string $namespace
*
* @return bool
*/
public static function namespaceHasClasses($namespace)
{
self::initialize();
return count(self::findersWithNamespace($namespace)) > 0;
}
public static function setAppRoot($appRoot)
{
self::initialize();
@ -160,4 +169,18 @@ class ClassFinder
return $supportedFinders;
}
}
/**
* @param string $namespace
*
* @return FinderInterface[]
*/
private static function findersWithNamespace($namespace)
{
$findersWithNamespace = array_filter(self::getSupportedFinders(), function (FinderInterface $finder) use ($namespace) {
return $finder->isNamespaceKnown($namespace);
});
return $findersWithNamespace;
}
}

View File

@ -10,8 +10,8 @@ interface FinderInterface
* For instance:
* If given a classmap for "TestApp1\Foo\Bar\Baz", the namespace "TestApp1\Foo" is known, even if nothing loads
* from that namespace directly. It is known because classes that include that namespace are known.
* @param $namespace
* @param string $namespace
* @return bool
*/
public function isNamespaceKnown($namespace);
}
}

View File

@ -15,13 +15,10 @@ class ClassFinderTest extends \PHPUnit_Framework_TestCase
ClassFinder::setAppRoot(null);
}
/**
* @expectedException HaydenPierce\ClassFinder\Exception\ClassFinderException
* @expectedExceptionMessageRegExp /Unknown namespace 'DoesNotExist'\./
*/
public function testThrowsOnUnknownNameSpace()
public function testNoClassesInNamespace()
{
ClassFinder::getClassesInNamespace('DoesNotExist');
$this->assertCount(0, ClassFinder::getClassesInNamespace('DoesNotExist'));
$this->assertFalse(ClassFinder::namespaceHasClasses('DoesNotExist'));
}
/**
@ -47,4 +44,4 @@ class ClassFinderTest extends \PHPUnit_Framework_TestCase
ClassFinder::getClassesInNamespace('TestApp1');
}
}
}

View File

@ -67,14 +67,11 @@ class FilesTest extends \PHPUnit_Framework_TestCase
);
}
/**
* @expectedException HaydenPierce\ClassFinder\Exception\ClassFinderException
* @expectedExceptionMessageRegExp /Unknown namespace 'TestApp1\\FilesClasses'\./
*/
public function testFilesSupportRequiresEnabling()
{
ClassFinder::disableExperimentalFilesSupport(); // Disabling FilesSupport should cause no files to be found.
$classes = ClassFinder::getClassesInNamespace('TestApp1\FilesClasses');
$this->assertFalse(ClassFinder::namespaceHasClasses('TestApp1\FilesClasses'));
}
}
}

View File

@ -185,13 +185,10 @@ class PSR4Test extends \PHPUnit_Framework_TestCase
);
}
/**
* @expectedException HaydenPierce\ClassFinder\Exception\ClassFinderException
* @expectedExceptionMessageRegExp /Unknown namespace 'TestApp1\\DoesNotExist'\./
*/
public function testThrowsOnUnknownSubNameSpace()
public function testForClassesInNamespace()
{
ClassFinder::getClassesInNamespace('TestApp1\DoesNotExist');
$this->assertFalse(ClassFinder::namespaceHasClasses('DoesNotExist'));
$this->assertTrue(ClassFinder::namespaceHasClasses('HaydenPierce\ClassFinder'));
}
public function testCanFindSelf()
@ -205,4 +202,4 @@ class PSR4Test extends \PHPUnit_Framework_TestCase
$this->assertGreaterThan(0, count($classes), 'ClassFinder should be able to find its own internal classes');
}
}
}