diff --git a/CHANGELOG.md b/CHANGELOG.md index fac0aebf..897fefda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## 1.1.1 - 2016-06-30 + +### Changed + +- Removed Puli logic and require `php-http/discovery:0.9` which makes Puli optional. ## 1.1.0 - 2016-05-19 diff --git a/DependencyInjection/Compiler/DiscoveryPass.php b/DependencyInjection/Compiler/DiscoveryPass.php index 58e626d7..b54e8e02 100644 --- a/DependencyInjection/Compiler/DiscoveryPass.php +++ b/DependencyInjection/Compiler/DiscoveryPass.php @@ -3,14 +3,15 @@ namespace Http\HttplugBundle\DependencyInjection\Compiler; use Http\Client\HttpClient; -use Http\HttplugBundle\HttplugFactory; +use Http\Discovery\HttpClientDiscovery; +use Http\Discovery\MessageFactoryDiscovery; +use Http\Discovery\StreamFactoryDiscovery; +use Http\Discovery\UriFactoryDiscovery; use Http\Message\MessageFactory; use Http\Message\StreamFactory; use Http\Message\UriFactory; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; -use Symfony\Component\DependencyInjection\Reference; /** * Adds fallback and discovery services. @@ -31,55 +32,32 @@ final class DiscoveryPass implements CompilerPassInterface 'stream_factory' => StreamFactory::class, ]; + /** + * Factories by type. + * + * @var array + */ + private $factoryClasses = [ + 'client' => HttpClientDiscovery::class, + 'message_factory' => MessageFactoryDiscovery::class, + 'uri_factory' => UriFactoryDiscovery::class, + 'stream_factory' => StreamFactoryDiscovery::class, + ]; + /** * {@inheritdoc} */ public function process(ContainerBuilder $container) { - $useDiscovery = false; - foreach ($this->services as $service => $class) { $serviceId = sprintf('httplug.%s.default', $service); if (false === $container->has($serviceId)) { - // Register and create factory for the first time - if (false === $useDiscovery) { - $this->registerFactory($container); - - $factory = [ - new Reference('httplug.factory'), - 'find', - ]; - - $useDiscovery = true; - } - + // Register and create factory for service $definition = $container->register($serviceId, $class); - - $definition->setFactory($factory); + $definition->setFactory([$this->factoryClasses[$service], 'find']); $definition->addArgument($class); } } } - - /** - * @param ContainerBuilder $container - * - * @throws RuntimeException - */ - private function registerFactory(ContainerBuilder $container) - { - if (false === $container->has('puli.discovery')) { - throw new RuntimeException( - 'You need to install puli/symfony-bundle or add configuration at httplug.classes in order to use this bundle. Refer to http://docs.php-http.org/en/latest/integrations/symfony-bundle.html#discovery-of-factory-classes' - ); - } - - $definition = $container->register('httplug.factory', HttplugFactory::class); - - $definition - ->addArgument(new Reference('puli.discovery')) - ->setPublic(false) - ; - } } diff --git a/HttplugFactory.php b/HttplugFactory.php deleted file mode 100644 index e3e88c2a..00000000 --- a/HttplugFactory.php +++ /dev/null @@ -1,104 +0,0 @@ - - */ -final class HttplugFactory -{ - /** - * @var Discovery - */ - private $discovery; - - /** - * @param Discovery $discovery - */ - public function __construct(Discovery $discovery) - { - $this->discovery = $discovery; - } - - /** - * Creates a class of type. - * - * @param string $type - * - * @return object - */ - public function find($type) - { - $class = $this->findOneByType($type); - - return new $class(); - } - - /** - * Finds a class of type and resolves optional dependency conditions. - * - * @param string $type - * - * @return string - * - * @throws \RuntimeException if no class is found. - */ - private function findOneByType($type) - { - /** @var ClassBinding[] $bindings */ - $bindings = $this->discovery->findBindings( - $type, - Expr::isInstanceOf('Puli\Discovery\Binding\ClassBinding') - ); - - foreach ($bindings as $binding) { - if ($binding->hasParameterValue('depends')) { - $dependency = $binding->getParameterValue('depends'); - - if (false === $this->evaluateCondition($dependency)) { - continue; - } - } - - return $binding->getClassName(); - } - - throw new \RuntimeException(sprintf('Class binding of type "%s" is not found', $type)); - } - - /** - * Evaluates conditions to boolean. - * - * @param mixed $condition - * - * @return bool - */ - protected function evaluateCondition($condition) - { - if (is_string($condition)) { - // Should be extended for functions, extensions??? - return class_exists($condition); - } elseif (is_callable($condition)) { - return $condition(); - } elseif (is_bool($condition)) { - return $condition; - } elseif (is_array($condition)) { - $evaluatedCondition = true; - - // Immediately stop execution if the condition is false - while (count($condition) > 0 && $evaluatedCondition) { - $evaluatedCondition = $this->evaluateCondition(array_shift($condition)); - } - - return $evaluatedCondition; - } - - return false; - } -} diff --git a/Tests/Resources/app/AppKernel.php b/Tests/Resources/app/AppKernel.php index 9cc31844..139bb45b 100644 --- a/Tests/Resources/app/AppKernel.php +++ b/Tests/Resources/app/AppKernel.php @@ -14,11 +14,7 @@ public function registerBundles() new \Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new \Http\HttplugBundle\HttplugBundle(), ]; - - if (false === defined('HHVM_VERSION')) { - $bundles[] = new \Puli\SymfonyBundle\PuliBundle(); - } - + return $bundles; } diff --git a/Tests/Unit/DependencyInjection/Compiler/DiscoveryPassTest.php b/Tests/Unit/DependencyInjection/Compiler/DiscoveryPassTest.php index f39167af..d84549f9 100644 --- a/Tests/Unit/DependencyInjection/Compiler/DiscoveryPassTest.php +++ b/Tests/Unit/DependencyInjection/Compiler/DiscoveryPassTest.php @@ -4,7 +4,6 @@ use Http\Client\HttpClient; use Http\HttplugBundle\DependencyInjection\Compiler\DiscoveryPass; -use Http\HttplugBundle\HttplugFactory; use Http\Message\MessageFactory; use Http\Message\StreamFactory; use Http\Message\UriFactory; @@ -24,12 +23,8 @@ protected function registerCompilerPass(ContainerBuilder $container) public function testDiscoveryFallbacks() { - $this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery')); - $this->compile(); - $this->assertContainerBuilderHasService('httplug.factory', HttplugFactory::class); - $this->assertContainerBuilderHasService('httplug.client.default', HttpClient::class); $this->assertContainerBuilderHasService('httplug.message_factory.default', MessageFactory::class); $this->assertContainerBuilderHasService('httplug.uri_factory.default', UriFactory::class); @@ -38,13 +33,10 @@ public function testDiscoveryFallbacks() public function testDiscoveryPartialFallbacks() { - $this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery')); $this->setDefinition('httplug.client.default', new Definition('Http\Adapter\Guzzle6\Client')); $this->compile(); - $this->assertContainerBuilderHasService('httplug.factory', HttplugFactory::class); - $this->assertContainerBuilderHasService('httplug.client.default', 'Http\Adapter\Guzzle6\Client'); $this->assertContainerBuilderHasService('httplug.message_factory.default', MessageFactory::class); $this->assertContainerBuilderHasService('httplug.uri_factory.default', UriFactory::class); @@ -59,18 +51,5 @@ public function testNoDiscoveryFallbacks() $this->setDefinition('httplug.stream_factory.default', new Definition(StreamFactory::class)); $this->compile(); - - $this->assertContainerBuilderNotHasService('httplug.factory'); - } - - /** - * Overridden test as we have dependencies in this compiler pass. - * - * @test - * @expectedException \RuntimeException - */ - public function compilation_should_not_fail_with_empty_container() - { - $this->compile(); } } diff --git a/Tests/Unit/HttplugFactoryTest.php b/Tests/Unit/HttplugFactoryTest.php deleted file mode 100644 index 5914bbca..00000000 --- a/Tests/Unit/HttplugFactoryTest.php +++ /dev/null @@ -1,123 +0,0 @@ - - */ -class HttplugFactoryTest extends \PHPUnit_Framework_TestCase -{ - public function testEvaluateConditionString() - { - $existingClass = MessageJournal::class; - $factory = $this->getMockedFactory($existingClass); - $this->assertInstanceOf(DummyClient::class, $factory->find('type')); - } - - /** - * @expectedException \RuntimeException - */ - public function testEvaluateConditionInvalidString() - { - // String - $factory = $this->getMockedFactory('non_existent_class'); - $factory->find('type'); - } - - public function testEvaluateConditionCallableTrue() - { - $factory = $this->getMockedFactory( - function () { - return true; - } - ); - $this->assertInstanceOf(DummyClient::class, $factory->find('type')); - } - - /** - * @expectedException \RuntimeException - */ - public function testEvaluateConditionCallableFalse() - { - $factory = $this->getMockedFactory( - function () { - return false; - } - ); - - $factory->find('type'); - } - - public function testEvaluateConditionBooleanTrue() - { - $factory = $this->getMockedFactory(true); - $this->assertInstanceOf(DummyClient::class, $factory->find('type')); - } - - /** - * @expectedException \RuntimeException - */ - public function testEvaluateConditionBooleanFalse() - { - $factory = $this->getMockedFactory(false); - $factory->find('type'); - } - - public function testEvaluateConditionArrayTrue() - { - $factory = $this->getMockedFactory([true, true]); - $this->assertInstanceOf(DummyClient::class, $factory->find('type')); - } - - /** - * @expectedException \RuntimeException - */ - public function testEvaluateConditionArrayFalse() - { - $factory = $this->getMockedFactory([true, false, true]); - $factory->find('type'); - } - - public function testEvaluateConditionArrayAssoc() - { - $factory = $this->getMockedFactory(['test1' => true, true]); - $this->assertInstanceOf(DummyClient::class, $factory->find('type')); - } - - /** - * @expectedException \RuntimeException - */ - public function testEvaluateConditionObject() - { - $factory = $this->getMockedFactory(new \DateTime()); - $factory->find('type'); - } - - /** - * @param $condition - * - * @return HttplugFactory - */ - private function getMockedFactory($condition) - { - $discovery = $this->prophesize(Discovery::class); - $factory = new HttplugFactory($discovery->reveal()); - $binding = $this->prophesize(ClassBinding::class); - $discovery->findBindings('type', Expr::isInstanceOf('Puli\Discovery\Binding\ClassBinding'))->willReturn( - [$binding->reveal()] - ); - - $binding->hasParameterValue('depends')->willReturn(true); - $binding->getClassName()->willReturn(DummyClient::class); - $binding->getParameterValue('depends')->willReturn($condition); - - return $factory; - } -} diff --git a/Tests/autoload.php b/Tests/autoload.php deleted file mode 100644 index 96959c78..00000000 --- a/Tests/autoload.php +++ /dev/null @@ -1,10 +0,0 @@ -= 50600) { - $loader->addClassMap([ - 'Puli\\GeneratedPuliFactory' => __DIR__.'/../.puli/GeneratedPuliFactory.php', - ]); -} diff --git a/composer.json b/composer.json index b8ebe963..a2503d9d 100644 --- a/composer.json +++ b/composer.json @@ -24,28 +24,26 @@ "php-http/logger-plugin": "^1.0", "php-http/stopwatch-plugin": "^1.0", "symfony/options-resolver": "^2.7|^3.0", - "symfony/framework-bundle": "^2.7|^3.0" + "symfony/framework-bundle": "^2.7|^3.0", + "php-http/discovery": "^0.9" }, "require-dev": { "phpunit/phpunit": "^4.5", "php-http/curl-client": "^1.0", "php-http/socket-client": "^1.0", - "php-http/guzzle6-adapter": "^1.1", - "php-http/react-adapter": "^0.1", - "php-http/buzz-adapter": "^0.1", + "php-http/guzzle6-adapter": "^1.1.1", + "php-http/react-adapter": "^0.2", + "php-http/buzz-adapter": "^0.2", "php-http/message": "^1.0", "symfony/symfony": "^2.7|^3.0", "polishsymfonycommunity/symfony-mocker-container": "^1.0", - "matthiasnoback/symfony-dependency-injection-test": "^0.7", - "puli/symfony-bundle": "^1.0@beta" + "matthiasnoback/symfony-dependency-injection-test": "^0.7" }, "conflict": { - "php-http/guzzle6-adapter": "<1.1", - "puli/composer-plugin": "<1.0.0-beta9", - "puli/symfony-bundle": "<=1.0.0-beta7" + "php-http/guzzle6-adapter": "<1.1" }, "suggest": { - "puli/symfony-bundle": "Used for automatic service discovery" + "php-http/discovery": "Used for automatic service discovery" }, "autoload": { "psr-4": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index ca9b6a9c..b548381d 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,6 +1,6 @@ -