diff --git a/packages/discovery/src/BootDiscovery.php b/packages/discovery/src/BootDiscovery.php index 70e5c4afa..8128291e9 100644 --- a/packages/discovery/src/BootDiscovery.php +++ b/packages/discovery/src/BootDiscovery.php @@ -197,7 +197,7 @@ private function discoverPath(string $input, DiscoveryLocation $location, array } elseif (class_exists($className)) { $input = new ClassReflector($className); } - } catch (AssertionError) { + } catch (AssertionError|\Pest\Exceptions\InvalidPestCommand) { // @phpstan-ignore class.notFound // Workaround for Pest test files autoloading. // @mago-expect lint:no-empty-catch-clause } diff --git a/packages/discovery/src/DiscoveryConfig.php b/packages/discovery/src/DiscoveryConfig.php index 7ffd77bc3..a8b44622a 100644 --- a/packages/discovery/src/DiscoveryConfig.php +++ b/packages/discovery/src/DiscoveryConfig.php @@ -2,12 +2,16 @@ namespace Tempest\Discovery; +use Closure; use Tempest\Support\Filesystem; final class DiscoveryConfig { private array $skipDiscovery = []; + /** @var array */ + private array $skipUsing = []; + /** @var array> The loaded discovery classes that will be used during discovery */ public array $classes = []; @@ -25,7 +29,25 @@ public static function autoload(string $path): self public function shouldSkip(string $input): bool { - return $this->skipDiscovery[$input] ?? false; + if (array_key_exists($input, $this->skipDiscovery)) { + return true; + } + + foreach ($this->skipUsing as $closure) { + if ($closure($input) === true) { + return true; + } + } + + return false; + } + + /** @param (Closure(string): bool) $closure */ + public function skipUsing(Closure $closure): self + { + $this->skipUsing[] = $closure; + + return $this; } public function skipClasses(string ...$classNames): self