diff --git a/README.md b/README.md index c9659c4e..bcce7ddb 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ use Arkitect\Expression\ForClasses\ResideInOneOfTheseNamespaces; use Arkitect\Rules\Rule; return static function (Config $config): void { - $mvcClassSet = ClassSet::fromDir(__DIR__.'/mvc'); + $mvcClassSet = ClassSet::fromDir(__DIR__.'/mvc', __DIR__.'/lib/my-lib/src'); $rules = []; diff --git a/src/ClassSet.php b/src/ClassSet.php index 519a8953..3430b324 100644 --- a/src/ClassSet.php +++ b/src/ClassSet.php @@ -7,15 +7,15 @@ class ClassSet implements \IteratorAggregate { - /** @var string */ - private $directory; + /** @var string[] */ + private $directoryList; /** @var array */ private $exclude; - private function __construct(string $directory) + private function __construct(string ...$directoryList) { - $this->directory = $directory; + $this->directoryList = $directoryList; $this->exclude = []; } @@ -26,21 +26,21 @@ public function excludePath(string $pattern): self return $this; } - public static function fromDir(string $directory): self + public static function fromDir(string ...$directoryList): self { - return new self($directory); + return new self(...$directoryList); } public function getDir(): string { - return $this->directory; + return implode(', ', $this->directoryList); } public function getIterator(): \Traversable { $finder = (new Finder()) ->files() - ->in($this->directory) + ->in($this->directoryList) ->name('*.php') ->sortByName() ->followLinks() diff --git a/tests/Unit/ClassSetTest.php b/tests/Unit/ClassSetTest.php index 5ea3dca1..c9ba60c0 100644 --- a/tests/Unit/ClassSetTest.php +++ b/tests/Unit/ClassSetTest.php @@ -10,6 +10,30 @@ class ClassSetTest extends TestCase { + public function test_can_exclude_files_or_directories_from_multiple_dir_class_set(): void + { + $path = $this->createMvcProjectStructure(); + + $set = ClassSet::fromDir($path.'/Controller', $path.'/Model') + ->excludePath('Repository'); + + $expected = [ + $path.'/Controller/CatalogController.php', + $path.'/Controller/Foo.php', + $path.'/Controller/ProductsController.php', + $path.'/Controller/UserController.php', + $path.'/Controller/YieldController.php', + $path.'/Model/Catalog.php', + $path.'/Model/Products.php', + $path.'/Model/User.php', + ]; + $actual = array_values(array_map(function ($item) { + /** @var \SplFileInfo $item */ + return $item->getPathname(); + }, iterator_to_array($set))); + self::assertEquals($expected, $actual); + } + public function test_can_exclude_files_or_directories(): void { $path = $this->createMvcProjectStructure();