From fe4fc26c00149f6de7b014667830de519ea0de38 Mon Sep 17 00:00:00 2001 From: Enzo Innocenzi Date: Sat, 28 Mar 2026 01:18:57 +0100 Subject: [PATCH 1/3] feat(discovery): support containers with autowiring --- packages/discovery/src/BootDiscovery.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/discovery/src/BootDiscovery.php b/packages/discovery/src/BootDiscovery.php index df677e88f..9ff1819c3 100644 --- a/packages/discovery/src/BootDiscovery.php +++ b/packages/discovery/src/BootDiscovery.php @@ -8,7 +8,7 @@ use Closure; use Pest\Exceptions\InvalidPestCommand; use Psr\Container\ContainerInterface; -use Tempest\Container\GenericContainer; +use Psr\Container\NotFoundExceptionInterface; use Tempest\Reflection\ClassReflector; use Tempest\Support\Filesystem; use Throwable; @@ -260,16 +260,17 @@ private function discoverPath(string $input, DiscoveryLocation $location, array /** * Create a discovery instance from a class name. * Optionally set the cached discovery items whenever caching is enabled. + * * @template T of Discovery * @param class-string $discoveryClass * @return T */ private function resolveDiscovery(string $discoveryClass): Discovery { - if ($this->container instanceof GenericContainer || $this->container->has($discoveryClass)) { + try { /** @var Discovery $discovery */ $discovery = $this->container->get($discoveryClass); - } else { + } catch (NotFoundExceptionInterface) { /** @var Discovery $discovery */ $discovery = new $discoveryClass(); } From fedc2f922aabfe9fcd85ef68ba046d5b0f6f3faf Mon Sep 17 00:00:00 2001 From: Enzo Innocenzi Date: Sat, 28 Mar 2026 01:34:56 +0100 Subject: [PATCH 2/3] refactor: support non-autowiring containers resolving discoveries with arguments --- packages/discovery/src/BootDiscovery.php | 13 +++++++++++-- .../Exceptions/DiscoveryClassCouldNotBeResolved.php | 13 +++++++++++++ .../discovery/src/Exceptions/DiscoveryException.php | 5 +++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 packages/discovery/src/Exceptions/DiscoveryClassCouldNotBeResolved.php create mode 100644 packages/discovery/src/Exceptions/DiscoveryException.php diff --git a/packages/discovery/src/BootDiscovery.php b/packages/discovery/src/BootDiscovery.php index 9ff1819c3..c016d7086 100644 --- a/packages/discovery/src/BootDiscovery.php +++ b/packages/discovery/src/BootDiscovery.php @@ -4,11 +4,13 @@ namespace Tempest\Discovery; +use ArgumentCountError; use AssertionError; use Closure; use Pest\Exceptions\InvalidPestCommand; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; +use Tempest\Discovery\Exceptions\DiscoveryClassCouldNotBeResolved; use Tempest\Reflection\ClassReflector; use Tempest\Support\Filesystem; use Throwable; @@ -271,8 +273,15 @@ private function resolveDiscovery(string $discoveryClass): Discovery /** @var Discovery $discovery */ $discovery = $this->container->get($discoveryClass); } catch (NotFoundExceptionInterface) { - /** @var Discovery $discovery */ - $discovery = new $discoveryClass(); + } + + if (! $discovery instanceof Discovery) { + try { + /** @var Discovery $discovery */ + $discovery = new $discoveryClass(); + } catch (ArgumentCountError) { + throw DiscoveryClassCouldNotBeResolved::forDiscoveryClass($discoveryClass); + } } $discovery->setItems(new DiscoveryItems()); diff --git a/packages/discovery/src/Exceptions/DiscoveryClassCouldNotBeResolved.php b/packages/discovery/src/Exceptions/DiscoveryClassCouldNotBeResolved.php new file mode 100644 index 000000000..aaa22764c --- /dev/null +++ b/packages/discovery/src/Exceptions/DiscoveryClassCouldNotBeResolved.php @@ -0,0 +1,13 @@ + Date: Sat, 28 Mar 2026 01:57:14 +0100 Subject: [PATCH 3/3] style: apply fixes from qa --- packages/discovery/src/BootDiscovery.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/discovery/src/BootDiscovery.php b/packages/discovery/src/BootDiscovery.php index c016d7086..59f45858b 100644 --- a/packages/discovery/src/BootDiscovery.php +++ b/packages/discovery/src/BootDiscovery.php @@ -269,17 +269,19 @@ private function discoverPath(string $input, DiscoveryLocation $location, array */ private function resolveDiscovery(string $discoveryClass): Discovery { + $discovery = null; + try { /** @var Discovery $discovery */ $discovery = $this->container->get($discoveryClass); } catch (NotFoundExceptionInterface) { + // @mago-expect lint:no-empty-catch-clause } - if (! $discovery instanceof Discovery) { + if ($discovery === null) { try { - /** @var Discovery $discovery */ $discovery = new $discoveryClass(); - } catch (ArgumentCountError) { + } catch (ArgumentCountError) { // @phpstan-ignore catch.neverThrown throw DiscoveryClassCouldNotBeResolved::forDiscoveryClass($discoveryClass); } }