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:
parent
4f2d91aa87
commit
841294cd53
@ -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**
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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');
|
||||
```
|
||||
```
|
||||
|
@ -1,6 +1,8 @@
|
||||
Unknown Namespace
|
||||
-----------------
|
||||
|
||||
__This exception only occurs in versions 0.3.x and lower.__
|
||||
|
||||
Example PHP:
|
||||
```
|
||||
<?php
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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'));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user