diff --git a/composer.json b/composer.json index 128af59..8473328 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,14 @@ "require": { "php": "^5.5 || ^7.0" }, + "repositories": { + "client-common": { + "type": "vcs", + "url": "git@github.com:fbourigault/client-common" + } + }, "require-dev": { + "php-http/client-common": "dev-plugin-client-factory", "php-http/httplug": "^1.0", "php-http/message-factory": "^1.0", "puli/composer-plugin": "1.0.0-beta10", diff --git a/spec/PluginClientFactoryDiscoverySpec.php b/spec/PluginClientFactoryDiscoverySpec.php new file mode 100644 index 0000000..d8daea9 --- /dev/null +++ b/spec/PluginClientFactoryDiscoverySpec.php @@ -0,0 +1,41 @@ +shouldHaveType('Http\Discovery\PluginClientFactoryDiscovery'); + } + + function it_is_a_class_discovery() + { + $this->shouldHaveType('Http\Discovery\ClassDiscovery'); + } + + function it_finds_a_plugin_client_factory(DiscoveryStrategy $strategy) { + + $candidate = ['class' => 'spec\Http\Discovery\Stub\PluginClientFactoryStub', 'condition' => true]; + DiscoveryHelper::setClasses(PluginClientFactoryInterface::class, [$candidate]); + + $this->find()->shouldImplement('Http\Client\Common\PluginClientFactoryInterface'); + } + + function it_throw_exception(DiscoveryStrategy $strategy) { + $this->shouldThrow(NotFoundException::class)->duringFind(); + } +} diff --git a/spec/Stub/PluginClientFactoryStub.php b/spec/Stub/PluginClientFactoryStub.php new file mode 100644 index 0000000..61d9af6 --- /dev/null +++ b/spec/Stub/PluginClientFactoryStub.php @@ -0,0 +1,13 @@ + + */ +final class PluginClientFactoryDiscovery extends ClassDiscovery +{ + /** + * Finds a PluginClientFactoryInterface implementation. + * + * @return PluginClientFactoryInterface + * + * @throws Exception\NotFoundException + */ + public static function find() + { + try { + $client = static::findOneByType(PluginClientFactoryInterface::class); + } catch (DiscoveryFailedException $e) { + throw new NotFoundException( + 'No HTTPlug plugin clients found. Make sure to install "php-http/client-common".', + 0, + $e + ); + } + + return static::instantiateClass($client); + } +} diff --git a/src/Strategy/CommonClassesStrategy.php b/src/Strategy/CommonClassesStrategy.php index cbed15d..a453077 100644 --- a/src/Strategy/CommonClassesStrategy.php +++ b/src/Strategy/CommonClassesStrategy.php @@ -3,6 +3,7 @@ namespace Http\Discovery\Strategy; use GuzzleHttp\Psr7\Request as GuzzleRequest; +use Http\Client\Common\PluginClientFactory; use Http\Message\MessageFactory\GuzzleMessageFactory; use Http\Message\StreamFactory\GuzzleStreamFactory; use Http\Message\UriFactory\GuzzleUriFactory; @@ -60,6 +61,9 @@ final class CommonClassesStrategy implements DiscoveryStrategy ['class' => Buzz::class, 'condition' => Buzz::class], ['class' => React::class, 'condition' => React::class], ], + 'Http\Client\Common\PluginClientFactoryInterface' => [ + ['class' => PluginClientFactory::class, 'condition' => PluginClientFactory::class], + ], ]; /**