From 65bf86accac86600ef53deebd8f53dbcfe3f9812 Mon Sep 17 00:00:00 2001 From: MohammadAlhallaq Date: Sun, 28 Dec 2025 23:47:24 +0300 Subject: [PATCH 1/3] feat(discovery): Skip discovery based on closure --- .../core/src/Kernel/LoadDiscoveryClasses.php | 21 ++++++++++++++----- packages/discovery/src/SkipDiscovery.php | 5 ++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/core/src/Kernel/LoadDiscoveryClasses.php b/packages/core/src/Kernel/LoadDiscoveryClasses.php index 6c7e2c65e..d4060e243 100644 --- a/packages/core/src/Kernel/LoadDiscoveryClasses.php +++ b/packages/core/src/Kernel/LoadDiscoveryClasses.php @@ -198,11 +198,22 @@ private function scan(DiscoveryLocation $location, array $discoveries, string $p // Resolve `#[SkipDiscovery]` for this class $skipDiscovery = $input->getAttribute(SkipDiscovery::class); - if ($skipDiscovery !== null && $skipDiscovery->except === []) { - $this->shouldSkipForClass[$className] = true; - } elseif ($skipDiscovery !== null) { - foreach ($skipDiscovery->except as $except) { - $this->shouldSkipForClass[$className][$except] = true; + if ($skipDiscovery !== null) { + // Evaluate conditional skip + try { + if (($skipDiscovery->when)() !== true) { + return; + } + } catch (Throwable) { + return; + } + + if ($skipDiscovery->except === []) { + $this->shouldSkipForClass[$className] = true; + } else { + foreach ($skipDiscovery->except as $except) { + $this->shouldSkipForClass[$className][$except] = true; + } } } diff --git a/packages/discovery/src/SkipDiscovery.php b/packages/discovery/src/SkipDiscovery.php index fe8e56d0d..21e012f20 100644 --- a/packages/discovery/src/SkipDiscovery.php +++ b/packages/discovery/src/SkipDiscovery.php @@ -5,6 +5,7 @@ namespace Tempest\Discovery; use Attribute; +use Closure; /** * Instruct Tempest to not discover this class. @@ -15,8 +16,10 @@ public function __construct( /** * Allows the specified `Discovery` classes to still discover this class. - * @var array> + * @param array> + * @param Closure|null */ public array $except = [], + public ?Closure $when = null ) {} } From 1c4bf8dc417ad83324f5f313f6e4ca24f6fb0622 Mon Sep 17 00:00:00 2001 From: MohammadAlhallaq Date: Mon, 29 Dec 2025 00:02:04 +0300 Subject: [PATCH 2/3] fix: coding conventions --- packages/discovery/src/SkipDiscovery.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/discovery/src/SkipDiscovery.php b/packages/discovery/src/SkipDiscovery.php index 21e012f20..90c05aa61 100644 --- a/packages/discovery/src/SkipDiscovery.php +++ b/packages/discovery/src/SkipDiscovery.php @@ -20,6 +20,6 @@ public function __construct( * @param Closure|null */ public array $except = [], - public ?Closure $when = null + public ?Closure $when = null, ) {} } From 2ffa34cd06c2a075a8d1968c2444239f4943d340 Mon Sep 17 00:00:00 2001 From: MohammadAlhallaq Date: Mon, 29 Dec 2025 00:28:07 +0300 Subject: [PATCH 3/3] fix: chkeck nullable closure --- packages/core/src/Kernel/LoadDiscoveryClasses.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/Kernel/LoadDiscoveryClasses.php b/packages/core/src/Kernel/LoadDiscoveryClasses.php index d4060e243..eb6df9888 100644 --- a/packages/core/src/Kernel/LoadDiscoveryClasses.php +++ b/packages/core/src/Kernel/LoadDiscoveryClasses.php @@ -201,7 +201,7 @@ private function scan(DiscoveryLocation $location, array $discoveries, string $p if ($skipDiscovery !== null) { // Evaluate conditional skip try { - if (($skipDiscovery->when)() !== true) { + if ($skipDiscovery->when !== null && ($skipDiscovery->when)() !== true) { return; } } catch (Throwable) {