From ec6102a652b1ddabcab1609f6305ebb067129c85 Mon Sep 17 00:00:00 2001 From: Steffen Kiefer Date: Wed, 23 Dec 2015 01:05:35 +0100 Subject: [PATCH 01/11] Fixed config issue with AWS SDK v3 in AwsS3ResolverFactory --- .../Factory/Resolver/AwsS3ResolverFactory.php | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php index 97d1f47e2..1767f36ee 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php +++ b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php @@ -4,6 +4,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\DefinitionDecorator; use Symfony\Component\DependencyInjection\Reference; @@ -84,6 +85,12 @@ public function getName() */ public function addConfiguration(ArrayNodeDefinition $builder) { + if (defined('\Aws\Sdk::VERSION') && version_compare(\Aws\Sdk::VERSION, '3.0.0', '>=')) { + $appendClientConfig = $this->addClientConfigAwsV3(); + } else { + $appendClientConfig = $this->addClientConfigAwsV2(); + } + $builder ->children() ->scalarNode('bucket')->isRequired()->cannotBeEmpty()->end() @@ -112,7 +119,62 @@ public function addConfiguration(ArrayNodeDefinition $builder) ->defaultValue(array()) ->prototype('scalar')->end() ->end() + ->append($appendClientConfig) ->end() ; } + + /** + * Add client config legacy AWS API v2 style. + * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition + */ + protected function addClientConfigAwsV2() + { + $builder = new TreeBuilder(); + $node = $builder->root('client_config'); + $node + ->isRequired() + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end(); + return $node; + } + + /** + * Add client config appropriate for AWS API v3. + * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition + */ + protected function addClientConfigAwsV3() + { + $builder = new TreeBuilder(); + $node = $builder->root('client_config'); + $node + ->isRequired() + ->children() + ->arrayNode('credentials') + ->isRequired() + ->children() + ->scalarNode('key')->end() + ->scalarNode('secret')->end() + ->scalarNode('token')->end() + ->end() + ->end() + ->scalarNode('api_provider')->end() + ->scalarNode('debug')->end() + ->scalarNode('endpoint')->end() + ->scalarNode('endpoint_provider')->end() + ->scalarNode('handler')->end() + ->scalarNode('http')->end() + ->scalarNode('http_handler')->end() + ->scalarNode('profile')->end() + ->scalarNode('region')->isRequired()->end() + ->scalarNode('retries')->end() + ->scalarNode('scheme')->end() + ->scalarNode('signature_provider')->end() + ->scalarNode('signature_version')->end() + ->scalarNode('validate')->end() + ->scalarNode('version')->isRequired()->end() + ->end(); + return $node; + } } From d461da50bdece13fa112917871ce53363ead9626 Mon Sep 17 00:00:00 2001 From: Steffen Kiefer Date: Wed, 23 Dec 2015 01:23:59 +0100 Subject: [PATCH 02/11] follow StyleCI --- DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php index 1767f36ee..d8085c87b 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php +++ b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php @@ -126,6 +126,7 @@ public function addConfiguration(ArrayNodeDefinition $builder) /** * Add client config legacy AWS API v2 style. + * * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition */ protected function addClientConfigAwsV2() @@ -137,11 +138,13 @@ protected function addClientConfigAwsV2() ->useAttributeAsKey('key') ->prototype('scalar')->end() ->end(); + return $node; } /** * Add client config appropriate for AWS API v3. + * * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition */ protected function addClientConfigAwsV3() @@ -175,6 +178,7 @@ protected function addClientConfigAwsV3() ->scalarNode('validate')->end() ->scalarNode('version')->isRequired()->end() ->end(); + return $node; } } From 9a23d5087df6e528eb2b39e43612da54d8050e18 Mon Sep 17 00:00:00 2001 From: Steffen Kiefer Date: Wed, 23 Dec 2015 01:26:42 +0100 Subject: [PATCH 03/11] removed extra white space to follow StyleCI --- DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php index d8085c87b..f9247380c 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php +++ b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php @@ -138,7 +138,7 @@ protected function addClientConfigAwsV2() ->useAttributeAsKey('key') ->prototype('scalar')->end() ->end(); - + return $node; } From 60f0f8d3c32f588f622fadff15ce57661b398411 Mon Sep 17 00:00:00 2001 From: Steffen Kiefer Date: Sat, 26 Dec 2015 02:02:20 +0100 Subject: [PATCH 04/11] Extra factory class for V3 AWS SDK. --- .../Factory/Resolver/AwsS3ResolverFactory.php | 163 +----------------- .../Resolver/AwsS3ResolverFactoryBase.php | 126 ++++++++++++++ .../Resolver/AwsS3SdkV3ResolverFactory.php | 49 ++++++ LiipImagineBundle.php | 7 +- Resources/doc/cache-resolver/aws_s3.rst | 24 +++ 5 files changed, 208 insertions(+), 161 deletions(-) create mode 100644 DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php create mode 100644 DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php index f9247380c..6ff2115bf 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php +++ b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php @@ -2,134 +2,17 @@ namespace Liip\ImagineBundle\DependencyInjection\Factory\Resolver; -use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; -use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\DefinitionDecorator; -use Symfony\Component\DependencyInjection\Reference; -class AwsS3ResolverFactory implements ResolverFactoryInterface +class AwsS3ResolverFactory extends AwsS3ResolverFactoryBase { /** - * {@inheritdoc} - */ - public function create(ContainerBuilder $container, $resolverName, array $config) - { - $awsS3ClientId = 'liip_imagine.cache.resolver.'.$resolverName.'.client'; - $awsS3ClientDefinition = new Definition('Aws\S3\S3Client'); - if (method_exists($awsS3ClientDefinition, 'setFactory')) { - $awsS3ClientDefinition->setFactory(array('Aws\S3\S3Client', 'factory')); - } else { - // to be removed when dependency on Symfony DependencyInjection is bumped to 2.6 - $awsS3ClientDefinition->setFactoryClass('Aws\S3\S3Client'); - $awsS3ClientDefinition->setFactoryMethod('factory'); - } - $awsS3ClientDefinition->addArgument($config['client_config']); - $container->setDefinition($awsS3ClientId, $awsS3ClientDefinition); - - $resolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.aws_s3'); - $resolverDefinition->replaceArgument(0, new Reference($awsS3ClientId)); - $resolverDefinition->replaceArgument(1, $config['bucket']); - $resolverDefinition->replaceArgument(2, $config['acl']); - $resolverDefinition->replaceArgument(3, array_replace($config['url_options'], $config['get_options'])); - $resolverDefinition->replaceArgument(4, $config['put_options']); - $resolverId = 'liip_imagine.cache.resolver.'.$resolverName; - $container->setDefinition($resolverId, $resolverDefinition); - - if (isset($config['cache_prefix'])) { - $resolverDefinition->addMethodCall('setCachePrefix', array($config['cache_prefix'])); - } - - if ($config['proxies']) { - $proxiedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.proxied'; - - $container->setDefinition($proxiedResolverId, $resolverDefinition); - - $proxyResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.proxy'); - $proxyResolverDefinition->replaceArgument(0, new Reference($proxiedResolverId)); - $proxyResolverDefinition->replaceArgument(1, $config['proxies']); - - $container->setDefinition($resolverId, $proxyResolverDefinition); - } - - if ($config['cache']) { - $cachedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.cached'; - - $container->setDefinition($cachedResolverId, $container->getDefinition($resolverId)); - - $cacheResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.cache'); - $cacheResolverDefinition->replaceArgument(0, new Reference($config['cache'])); - $cacheResolverDefinition->replaceArgument(1, new Reference($cachedResolverId)); - - $container->setDefinition($resolverId, $cacheResolverDefinition); - } - - $container->getDefinition($resolverId)->addTag('liip_imagine.cache.resolver', array( - 'resolver' => $resolverName, - )); - - return $resolverId; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'aws_s3'; - } - - /** - * {@inheritdoc} - */ - public function addConfiguration(ArrayNodeDefinition $builder) - { - if (defined('\Aws\Sdk::VERSION') && version_compare(\Aws\Sdk::VERSION, '3.0.0', '>=')) { - $appendClientConfig = $this->addClientConfigAwsV3(); - } else { - $appendClientConfig = $this->addClientConfigAwsV2(); - } - - $builder - ->children() - ->scalarNode('bucket')->isRequired()->cannotBeEmpty()->end() - ->scalarNode('cache')->defaultValue(false)->end() - ->scalarNode('acl')->defaultValue('public-read')->cannotBeEmpty()->end() - ->scalarNode('cache_prefix')->defaultValue(null)->end() - ->arrayNode('client_config') - ->isRequired() - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - /* @deprecated Use `get_options` instead */ - ->arrayNode('url_options') - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - ->arrayNode('get_options') - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - ->arrayNode('put_options') - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - ->arrayNode('proxies') - ->defaultValue(array()) - ->prototype('scalar')->end() - ->end() - ->append($appendClientConfig) - ->end() - ; - } - - /** - * Add client config legacy AWS API v2 style. + * Add client config legacy AWS Sdk v2 style. * * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition */ - protected function addClientConfigAwsV2() + protected function addAwsClientConfig() { $builder = new TreeBuilder(); $node = $builder->root('client_config'); @@ -141,44 +24,4 @@ protected function addClientConfigAwsV2() return $node; } - - /** - * Add client config appropriate for AWS API v3. - * - * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition - */ - protected function addClientConfigAwsV3() - { - $builder = new TreeBuilder(); - $node = $builder->root('client_config'); - $node - ->isRequired() - ->children() - ->arrayNode('credentials') - ->isRequired() - ->children() - ->scalarNode('key')->end() - ->scalarNode('secret')->end() - ->scalarNode('token')->end() - ->end() - ->end() - ->scalarNode('api_provider')->end() - ->scalarNode('debug')->end() - ->scalarNode('endpoint')->end() - ->scalarNode('endpoint_provider')->end() - ->scalarNode('handler')->end() - ->scalarNode('http')->end() - ->scalarNode('http_handler')->end() - ->scalarNode('profile')->end() - ->scalarNode('region')->isRequired()->end() - ->scalarNode('retries')->end() - ->scalarNode('scheme')->end() - ->scalarNode('signature_provider')->end() - ->scalarNode('signature_version')->end() - ->scalarNode('validate')->end() - ->scalarNode('version')->isRequired()->end() - ->end(); - - return $node; - } } diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php new file mode 100644 index 000000000..e17e71897 --- /dev/null +++ b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php @@ -0,0 +1,126 @@ +setFactory(array('Aws\S3\S3Client', 'factory')); + } else { + // to be removed when dependency on Symfony DependencyInjection is bumped to 2.6 + $awsS3ClientDefinition->setFactoryClass('Aws\S3\S3Client'); + $awsS3ClientDefinition->setFactoryMethod('factory'); + } + $awsS3ClientDefinition->addArgument($config['client_config']); + $container->setDefinition($awsS3ClientId, $awsS3ClientDefinition); + + $resolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.aws_s3'); + $resolverDefinition->replaceArgument(0, new Reference($awsS3ClientId)); + $resolverDefinition->replaceArgument(1, $config['bucket']); + $resolverDefinition->replaceArgument(2, $config['acl']); + $resolverDefinition->replaceArgument(3, array_replace($config['url_options'], $config['get_options'])); + $resolverDefinition->replaceArgument(4, $config['put_options']); + $resolverId = 'liip_imagine.cache.resolver.'.$resolverName; + $container->setDefinition($resolverId, $resolverDefinition); + + if (isset($config['cache_prefix'])) { + $resolverDefinition->addMethodCall('setCachePrefix', array($config['cache_prefix'])); + } + + if ($config['proxies']) { + $proxiedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.proxied'; + + $container->setDefinition($proxiedResolverId, $resolverDefinition); + + $proxyResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.proxy'); + $proxyResolverDefinition->replaceArgument(0, new Reference($proxiedResolverId)); + $proxyResolverDefinition->replaceArgument(1, $config['proxies']); + + $container->setDefinition($resolverId, $proxyResolverDefinition); + } + + if ($config['cache']) { + $cachedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.cached'; + + $container->setDefinition($cachedResolverId, $container->getDefinition($resolverId)); + + $cacheResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.cache'); + $cacheResolverDefinition->replaceArgument(0, new Reference($config['cache'])); + $cacheResolverDefinition->replaceArgument(1, new Reference($cachedResolverId)); + + $container->setDefinition($resolverId, $cacheResolverDefinition); + } + + $container->getDefinition($resolverId)->addTag('liip_imagine.cache.resolver', array( + 'resolver' => $resolverName, + )); + + return $resolverId; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'aws_s3'; + } + + /** + * {@inheritdoc} + */ + public function addConfiguration(ArrayNodeDefinition $builder) + { + $builder + ->children() + ->scalarNode('bucket')->isRequired()->cannotBeEmpty()->end() + ->scalarNode('cache')->defaultValue(false)->end() + ->scalarNode('acl')->defaultValue('public-read')->cannotBeEmpty()->end() + ->scalarNode('cache_prefix')->defaultValue(null)->end() + ->arrayNode('client_config') + ->isRequired() + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + /* @deprecated Use `get_options` instead */ + ->arrayNode('url_options') + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + ->arrayNode('get_options') + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + ->arrayNode('put_options') + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + ->arrayNode('proxies') + ->defaultValue(array()) + ->prototype('scalar')->end() + ->end() + ->append($this->addAwsClientConfig()) + ->end() + ; + } + + /** + * Add client config for AWS API Client. + * + * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition + */ + protected abstract function addAwsClientConfig(); +} diff --git a/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php new file mode 100644 index 000000000..117211ce4 --- /dev/null +++ b/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php @@ -0,0 +1,49 @@ +root('client_config'); + $node + ->isRequired() + ->children() + ->arrayNode('credentials') + ->isRequired() + ->children() + ->scalarNode('key')->end() + ->scalarNode('secret')->end() + ->scalarNode('token')->end() + ->end() + ->end() + ->scalarNode('api_provider')->end() + ->scalarNode('debug')->end() + ->scalarNode('endpoint')->end() + ->scalarNode('endpoint_provider')->end() + ->scalarNode('handler')->end() + ->scalarNode('http')->end() + ->scalarNode('http_handler')->end() + ->scalarNode('profile')->end() + ->scalarNode('region')->isRequired()->end() + ->scalarNode('retries')->end() + ->scalarNode('scheme')->end() + ->scalarNode('signature_provider')->end() + ->scalarNode('signature_version')->end() + ->scalarNode('validate')->end() + ->scalarNode('version')->isRequired()->end() + ->end(); + + return $node; + } +} diff --git a/LiipImagineBundle.php b/LiipImagineBundle.php index 5894f33a7..babe60d4e 100644 --- a/LiipImagineBundle.php +++ b/LiipImagineBundle.php @@ -9,6 +9,7 @@ use Liip\ImagineBundle\DependencyInjection\Factory\Loader\FileSystemLoaderFactory; use Liip\ImagineBundle\DependencyInjection\Factory\Loader\StreamLoaderFactory; use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\AwsS3ResolverFactory; +use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\AwsS3SdkV3ResolverFactory; use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\WebPathResolverFactory; use Liip\ImagineBundle\DependencyInjection\LiipImagineExtension; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -32,7 +33,11 @@ public function build(ContainerBuilder $container) $extension = $container->getExtension('liip_imagine'); $extension->addResolverFactory(new WebPathResolverFactory()); - $extension->addResolverFactory(new AwsS3ResolverFactory()); + if (defined('\Aws\Sdk::VERSION') && version_compare(\Aws\Sdk::VERSION, '3.0.0', '>=')) { + $extension->addResolverFactory(new AwsS3SdkV3ResolverFactory()); + } else { + $extension->addResolverFactory(new AwsS3ResolverFactory()); + } $extension->addLoaderFactory(new StreamLoaderFactory()); $extension->addLoaderFactory(new FileSystemLoaderFactory()); diff --git a/Resources/doc/cache-resolver/aws_s3.rst b/Resources/doc/cache-resolver/aws_s3.rst index 1f886b06b..813ca891f 100644 --- a/Resources/doc/cache-resolver/aws_s3.rst +++ b/Resources/doc/cache-resolver/aws_s3.rst @@ -42,6 +42,18 @@ Create resolver using factory put_options: CacheControl: 'max-age=86400' +If you use `aws-sdk-php`_ library version >= 3.0.0 client config credentials +must be an associative array containing key and secret. + +.. code-block:: yaml + + aws_s3: + client_config: + credentials: + key: %amazon.s3.key% + secret: %amazon.s3.secret% + region: %amazon.s3.region% + Create resolver as a service ---------------------------- @@ -68,6 +80,18 @@ You have to set up the services required: tags: - { name: 'liip_imagine.cache.resolver', resolver: 'profile_photos' } +If you use `aws-sdk-php`_ library version >= 3.0.0 client config credentials +must be an associative array containing key and secret. + + acme.amazon_s3: + class: Aws\S3\S3Client + factory_class: Aws\S3\S3Client + factory_method: factory + arguments: + - + credentials: { key: %amazon.s3.key%, secret: %amazon.s3.secret% } + region: %amazon.s3.region% + Usage ----- From 7a537b1d29e50a6e07cce6b36fedbff3248b5624 Mon Sep 17 00:00:00 2001 From: Steffen Kiefer Date: Sat, 26 Dec 2015 02:09:15 +0100 Subject: [PATCH 05/11] making StyleCI happy --- .../Factory/Resolver/AwsS3ResolverFactoryBase.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php index e17e71897..5f6a9b578 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php +++ b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php @@ -122,5 +122,5 @@ public function addConfiguration(ArrayNodeDefinition $builder) * * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition */ - protected abstract function addAwsClientConfig(); + abstract protected function addAwsClientConfig(); } From 899a5caf3f7e941a5f1d4b4f6df21b630c10333e Mon Sep 17 00:00:00 2001 From: Steffen Kiefer Date: Sat, 26 Dec 2015 02:24:41 +0100 Subject: [PATCH 06/11] fixed documentation --- Resources/doc/cache-resolver/aws_s3.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/doc/cache-resolver/aws_s3.rst b/Resources/doc/cache-resolver/aws_s3.rst index 813ca891f..5ac8115b8 100644 --- a/Resources/doc/cache-resolver/aws_s3.rst +++ b/Resources/doc/cache-resolver/aws_s3.rst @@ -83,6 +83,8 @@ You have to set up the services required: If you use `aws-sdk-php`_ library version >= 3.0.0 client config credentials must be an associative array containing key and secret. +.. code-block:: yaml + acme.amazon_s3: class: Aws\S3\S3Client factory_class: Aws\S3\S3Client From 6e4d44f11a5c06b5773f04b692d5b63a33d19ed3 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sun, 27 Dec 2015 12:43:43 +0000 Subject: [PATCH 07/11] [aws-s3] Add support of sdk v3 --- .../Factory/Resolver/AwsS3ResolverFactory.php | 123 ++++++++++++-- .../Resolver/AwsS3ResolverFactoryBase.php | 126 -------------- .../Resolver/AwsS3SdkV3ResolverFactory.php | 154 ++++++++++++++---- LiipImagineBundle.php | 7 +- Resources/doc/cache-resolver/aws_s3.rst | 2 +- 5 files changed, 232 insertions(+), 180 deletions(-) delete mode 100644 DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php index 6ff2115bf..b36ecf12c 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php +++ b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php @@ -2,26 +2,117 @@ namespace Liip\ImagineBundle\DependencyInjection\Factory\Resolver; +use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; -use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\DefinitionDecorator; +use Symfony\Component\DependencyInjection\Reference; -class AwsS3ResolverFactory extends AwsS3ResolverFactoryBase +class AwsS3ResolverFactory implements ResolverFactoryInterface { /** - * Add client config legacy AWS Sdk v2 style. - * - * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition + * {@inheritdoc} */ - protected function addAwsClientConfig() + public function create(ContainerBuilder $container, $resolverName, array $config) { - $builder = new TreeBuilder(); - $node = $builder->root('client_config'); - $node - ->isRequired() - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end(); - - return $node; + $awsS3ClientId = 'liip_imagine.cache.resolver.'.$resolverName.'.client'; + $awsS3ClientDefinition = new Definition('Aws\S3\S3Client'); + if (method_exists($awsS3ClientDefinition, 'setFactory')) { + $awsS3ClientDefinition->setFactory(array('Aws\S3\S3Client', 'factory')); + } else { + // to be removed when dependency on Symfony DependencyInjection is bumped to 2.6 + $awsS3ClientDefinition->setFactoryClass('Aws\S3\S3Client'); + $awsS3ClientDefinition->setFactoryMethod('factory'); + } + $awsS3ClientDefinition->addArgument($config['client_config']); + $container->setDefinition($awsS3ClientId, $awsS3ClientDefinition); + + $resolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.aws_s3'); + $resolverDefinition->replaceArgument(0, new Reference($awsS3ClientId)); + $resolverDefinition->replaceArgument(1, $config['bucket']); + $resolverDefinition->replaceArgument(2, $config['acl']); + $resolverDefinition->replaceArgument(3, array_replace($config['url_options'], $config['get_options'])); + $resolverDefinition->replaceArgument(4, $config['put_options']); + $resolverId = 'liip_imagine.cache.resolver.'.$resolverName; + $container->setDefinition($resolverId, $resolverDefinition); + + if (isset($config['cache_prefix'])) { + $resolverDefinition->addMethodCall('setCachePrefix', array($config['cache_prefix'])); + } + + if ($config['proxies']) { + $proxiedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.proxied'; + + $container->setDefinition($proxiedResolverId, $resolverDefinition); + + $proxyResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.proxy'); + $proxyResolverDefinition->replaceArgument(0, new Reference($proxiedResolverId)); + $proxyResolverDefinition->replaceArgument(1, $config['proxies']); + + $container->setDefinition($resolverId, $proxyResolverDefinition); + } + + if ($config['cache']) { + $cachedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.cached'; + + $container->setDefinition($cachedResolverId, $container->getDefinition($resolverId)); + + $cacheResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.cache'); + $cacheResolverDefinition->replaceArgument(0, new Reference($config['cache'])); + $cacheResolverDefinition->replaceArgument(1, new Reference($cachedResolverId)); + + $container->setDefinition($resolverId, $cacheResolverDefinition); + } + + $container->getDefinition($resolverId)->addTag('liip_imagine.cache.resolver', array( + 'resolver' => $resolverName, + )); + + return $resolverId; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'aws_s3'; + } + + /** + * {@inheritdoc} + */ + public function addConfiguration(ArrayNodeDefinition $builder) + { + $builder + ->children() + ->scalarNode('bucket')->isRequired()->cannotBeEmpty()->end() + ->scalarNode('cache')->defaultValue(false)->end() + ->scalarNode('acl')->defaultValue('public-read')->cannotBeEmpty()->end() + ->scalarNode('cache_prefix')->defaultValue(null)->end() + ->arrayNode('client_config') + ->isRequired() + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + /* @deprecated Use `get_options` instead */ + ->arrayNode('url_options') + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + ->arrayNode('get_options') + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + ->arrayNode('put_options') + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + ->arrayNode('proxies') + ->defaultValue(array()) + ->prototype('scalar')->end() + ->end() + ->end() + ; } -} +} \ No newline at end of file diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php deleted file mode 100644 index 5f6a9b578..000000000 --- a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryBase.php +++ /dev/null @@ -1,126 +0,0 @@ -setFactory(array('Aws\S3\S3Client', 'factory')); - } else { - // to be removed when dependency on Symfony DependencyInjection is bumped to 2.6 - $awsS3ClientDefinition->setFactoryClass('Aws\S3\S3Client'); - $awsS3ClientDefinition->setFactoryMethod('factory'); - } - $awsS3ClientDefinition->addArgument($config['client_config']); - $container->setDefinition($awsS3ClientId, $awsS3ClientDefinition); - - $resolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.aws_s3'); - $resolverDefinition->replaceArgument(0, new Reference($awsS3ClientId)); - $resolverDefinition->replaceArgument(1, $config['bucket']); - $resolverDefinition->replaceArgument(2, $config['acl']); - $resolverDefinition->replaceArgument(3, array_replace($config['url_options'], $config['get_options'])); - $resolverDefinition->replaceArgument(4, $config['put_options']); - $resolverId = 'liip_imagine.cache.resolver.'.$resolverName; - $container->setDefinition($resolverId, $resolverDefinition); - - if (isset($config['cache_prefix'])) { - $resolverDefinition->addMethodCall('setCachePrefix', array($config['cache_prefix'])); - } - - if ($config['proxies']) { - $proxiedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.proxied'; - - $container->setDefinition($proxiedResolverId, $resolverDefinition); - - $proxyResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.proxy'); - $proxyResolverDefinition->replaceArgument(0, new Reference($proxiedResolverId)); - $proxyResolverDefinition->replaceArgument(1, $config['proxies']); - - $container->setDefinition($resolverId, $proxyResolverDefinition); - } - - if ($config['cache']) { - $cachedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.cached'; - - $container->setDefinition($cachedResolverId, $container->getDefinition($resolverId)); - - $cacheResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.cache'); - $cacheResolverDefinition->replaceArgument(0, new Reference($config['cache'])); - $cacheResolverDefinition->replaceArgument(1, new Reference($cachedResolverId)); - - $container->setDefinition($resolverId, $cacheResolverDefinition); - } - - $container->getDefinition($resolverId)->addTag('liip_imagine.cache.resolver', array( - 'resolver' => $resolverName, - )); - - return $resolverId; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'aws_s3'; - } - - /** - * {@inheritdoc} - */ - public function addConfiguration(ArrayNodeDefinition $builder) - { - $builder - ->children() - ->scalarNode('bucket')->isRequired()->cannotBeEmpty()->end() - ->scalarNode('cache')->defaultValue(false)->end() - ->scalarNode('acl')->defaultValue('public-read')->cannotBeEmpty()->end() - ->scalarNode('cache_prefix')->defaultValue(null)->end() - ->arrayNode('client_config') - ->isRequired() - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - /* @deprecated Use `get_options` instead */ - ->arrayNode('url_options') - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - ->arrayNode('get_options') - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - ->arrayNode('put_options') - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - ->arrayNode('proxies') - ->defaultValue(array()) - ->prototype('scalar')->end() - ->end() - ->append($this->addAwsClientConfig()) - ->end() - ; - } - - /** - * Add client config for AWS API Client. - * - * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition - */ - abstract protected function addAwsClientConfig(); -} diff --git a/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php index 117211ce4..73d6e71cf 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php +++ b/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php @@ -2,48 +2,138 @@ namespace Liip\ImagineBundle\DependencyInjection\Factory\Resolver; +use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; -use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\DefinitionDecorator; +use Symfony\Component\DependencyInjection\Reference; -class AwsS3SdkV3ResolverFactory extends AwsS3ResolverFactoryBase + +class AwsS3SdkV3ResolverFactory implements ResolverFactoryInterface { /** - * Add client config appropriate for AWS Sdk v3. - * - * @return ArrayNodeDefinition|\Symfony\Component\Config\Definition\Builder\NodeDefinition + * {@inheritdoc} */ - protected function addAwsClientConfig() + public function create(ContainerBuilder $container, $resolverName, array $config) { - $builder = new TreeBuilder(); - $node = $builder->root('client_config'); - $node - ->isRequired() + $awsS3ClientId = 'liip_imagine.cache.resolver.'.$resolverName.'.client'; + $awsS3ClientDefinition = new Definition('Aws\S3\S3Client'); + if (method_exists($awsS3ClientDefinition, 'setFactory')) { + $awsS3ClientDefinition->setFactory(array('Aws\S3\S3Client', 'factory')); + } else { + // to be removed when dependency on Symfony DependencyInjection is bumped to 2.6 + $awsS3ClientDefinition->setFactoryClass('Aws\S3\S3Client'); + $awsS3ClientDefinition->setFactoryMethod('factory'); + } + $awsS3ClientDefinition->addArgument($config['client_config']); + $container->setDefinition($awsS3ClientId, $awsS3ClientDefinition); + + $resolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.aws_s3'); + $resolverDefinition->replaceArgument(0, new Reference($awsS3ClientId)); + $resolverDefinition->replaceArgument(1, $config['bucket']); + $resolverDefinition->replaceArgument(2, $config['acl']); + $resolverDefinition->replaceArgument(3, array_replace($config['url_options'], $config['get_options'])); + $resolverDefinition->replaceArgument(4, $config['put_options']); + $resolverId = 'liip_imagine.cache.resolver.'.$resolverName; + $container->setDefinition($resolverId, $resolverDefinition); + + if (isset($config['cache_prefix'])) { + $resolverDefinition->addMethodCall('setCachePrefix', array($config['cache_prefix'])); + } + + if ($config['proxies']) { + $proxiedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.proxied'; + + $container->setDefinition($proxiedResolverId, $resolverDefinition); + + $proxyResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.proxy'); + $proxyResolverDefinition->replaceArgument(0, new Reference($proxiedResolverId)); + $proxyResolverDefinition->replaceArgument(1, $config['proxies']); + + $container->setDefinition($resolverId, $proxyResolverDefinition); + } + + if ($config['cache']) { + $cachedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.cached'; + + $container->setDefinition($cachedResolverId, $container->getDefinition($resolverId)); + + $cacheResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.cache'); + $cacheResolverDefinition->replaceArgument(0, new Reference($config['cache'])); + $cacheResolverDefinition->replaceArgument(1, new Reference($cachedResolverId)); + + $container->setDefinition($resolverId, $cacheResolverDefinition); + } + + $container->getDefinition($resolverId)->addTag('liip_imagine.cache.resolver', array( + 'resolver' => $resolverName, + )); + + return $resolverId; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'aws_s3_sdk_v3'; + } + + public function addConfiguration(ArrayNodeDefinition $builder) + { + $builder ->children() - ->arrayNode('credentials') + ->scalarNode('bucket')->isRequired()->cannotBeEmpty()->end() + ->scalarNode('cache')->defaultValue(false)->end() + ->scalarNode('acl')->defaultValue('public-read')->cannotBeEmpty()->end() + ->scalarNode('cache_prefix')->defaultValue(null)->end() + ->arrayNode('client_config') ->isRequired() ->children() - ->scalarNode('key')->end() - ->scalarNode('secret')->end() - ->scalarNode('token')->end() + ->arrayNode('credentials') + ->isRequired() + ->children() + ->scalarNode('key')->end() + ->scalarNode('secret')->end() + ->scalarNode('token')->end() + ->end() + ->end() + ->scalarNode('api_provider')->end() + ->scalarNode('debug')->end() + ->scalarNode('endpoint')->end() + ->scalarNode('endpoint_provider')->end() + ->scalarNode('handler')->end() + ->scalarNode('http')->end() + ->scalarNode('http_handler')->end() + ->scalarNode('profile')->end() + ->scalarNode('region')->isRequired()->end() + ->scalarNode('retries')->end() + ->scalarNode('scheme')->end() + ->scalarNode('signature_provider')->end() + ->scalarNode('signature_version')->end() + ->scalarNode('validate')->end() + ->scalarNode('version')->isRequired()->end() ->end() ->end() - ->scalarNode('api_provider')->end() - ->scalarNode('debug')->end() - ->scalarNode('endpoint')->end() - ->scalarNode('endpoint_provider')->end() - ->scalarNode('handler')->end() - ->scalarNode('http')->end() - ->scalarNode('http_handler')->end() - ->scalarNode('profile')->end() - ->scalarNode('region')->isRequired()->end() - ->scalarNode('retries')->end() - ->scalarNode('scheme')->end() - ->scalarNode('signature_provider')->end() - ->scalarNode('signature_version')->end() - ->scalarNode('validate')->end() - ->scalarNode('version')->isRequired()->end() - ->end(); - - return $node; + /* @deprecated Use `get_options` instead */ + ->arrayNode('url_options') + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + ->arrayNode('get_options') + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + ->arrayNode('put_options') + ->useAttributeAsKey('key') + ->prototype('scalar')->end() + ->end() + ->arrayNode('proxies') + ->defaultValue(array()) + ->prototype('scalar')->end() + ->end() + ->end() + ; } } diff --git a/LiipImagineBundle.php b/LiipImagineBundle.php index babe60d4e..e215134a9 100644 --- a/LiipImagineBundle.php +++ b/LiipImagineBundle.php @@ -33,11 +33,8 @@ public function build(ContainerBuilder $container) $extension = $container->getExtension('liip_imagine'); $extension->addResolverFactory(new WebPathResolverFactory()); - if (defined('\Aws\Sdk::VERSION') && version_compare(\Aws\Sdk::VERSION, '3.0.0', '>=')) { - $extension->addResolverFactory(new AwsS3SdkV3ResolverFactory()); - } else { - $extension->addResolverFactory(new AwsS3ResolverFactory()); - } + $extension->addResolverFactory(new AwsS3ResolverFactory()); + $extension->addResolverFactory(new AwsS3SdkV3ResolverFactory()); $extension->addLoaderFactory(new StreamLoaderFactory()); $extension->addLoaderFactory(new FileSystemLoaderFactory()); diff --git a/Resources/doc/cache-resolver/aws_s3.rst b/Resources/doc/cache-resolver/aws_s3.rst index 5ac8115b8..f8451cfda 100644 --- a/Resources/doc/cache-resolver/aws_s3.rst +++ b/Resources/doc/cache-resolver/aws_s3.rst @@ -47,7 +47,7 @@ must be an associative array containing key and secret. .. code-block:: yaml - aws_s3: + aws_s3_sdk_v3: client_config: credentials: key: %amazon.s3.key% From fb478640941dae907c918dd254a59825de46a226 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sun, 27 Dec 2015 12:45:29 +0000 Subject: [PATCH 08/11] fix --- DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php index b36ecf12c..97d1f47e2 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php +++ b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php @@ -115,4 +115,4 @@ public function addConfiguration(ArrayNodeDefinition $builder) ->end() ; } -} \ No newline at end of file +} From f7548ea17e4e617b734e2fa2d742fe824b4d4c3d Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sun, 27 Dec 2015 12:56:06 +0000 Subject: [PATCH 09/11] add tests --- .../AwsS3SdkV3ResolverFactoryTest.php | 479 ++++++++++++++++++ Tests/LiipImagineBundleTest.php | 26 +- 2 files changed, 503 insertions(+), 2 deletions(-) create mode 100644 Tests/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactoryTest.php diff --git a/Tests/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactoryTest.php b/Tests/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactoryTest.php new file mode 100644 index 000000000..d9520fde1 --- /dev/null +++ b/Tests/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactoryTest.php @@ -0,0 +1,479 @@ + + */ +class AwsS3SdkV3ResolverFactoryTest extends \Phpunit_Framework_TestCase +{ + public function testImplementsResolverFactoryInterface() + { + $rc = new \ReflectionClass('Liip\ImagineBundle\DependencyInjection\Factory\Resolver\AwsS3SdkV3ResolverFactory'); + + $this->assertTrue($rc->implementsInterface('Liip\ImagineBundle\DependencyInjection\Factory\Resolver\ResolverFactoryInterface')); + } + + public function testCouldBeConstructedWithoutAnyArguments() + { + new AwsS3SdkV3ResolverFactory(); + } + + public function testReturnExpectedName() + { + $resolver = new AwsS3SdkV3ResolverFactory(); + + $this->assertEquals('aws_s3_sdk_v3', $resolver->getName()); + } + + public function testCreateResolverDefinitionOnCreate() + { + $container = new ContainerBuilder(); + + $resolver = new AwsS3SdkV3ResolverFactory(); + + $resolver->create($container, 'theResolverName', array( + 'client_config' => array(), + 'bucket' => 'theBucket', + 'acl' => 'theAcl', + 'url_options' => array('fooKey' => 'fooVal'), + 'get_options' => array(), + 'put_options' => array('barKey' => 'barVal'), + 'cache' => false, + 'proxies' => array(), + )); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); + + $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); + $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $resolverDefinition); + $this->assertEquals('liip_imagine.cache.resolver.prototype.aws_s3', $resolverDefinition->getParent()); + + $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(0)); + $this->assertEquals('liip_imagine.cache.resolver.theresolvername.client', $resolverDefinition->getArgument(0)); + + $this->assertEquals('theBucket', $resolverDefinition->getArgument(1)); + $this->assertEquals('theAcl', $resolverDefinition->getArgument(2)); + $this->assertEquals(array('fooKey' => 'fooVal'), $resolverDefinition->getArgument(3)); + $this->assertEquals(array('barKey' => 'barVal'), $resolverDefinition->getArgument(4)); + } + + public function testOverrideDeprecatedUrlOptionsWithNewGetOptions() + { + $container = new ContainerBuilder(); + + $resolver = new AwsS3SdkV3ResolverFactory(); + + $resolver->create($container, 'theResolverName', array( + 'client_config' => array(), + 'bucket' => 'theBucket', + 'acl' => 'theAcl', + 'url_options' => array('fooKey' => 'fooVal', 'barKey' => 'barVal'), + 'get_options' => array('fooKey' => 'fooVal_overridden'), + 'put_options' => array(), + 'cache' => false, + 'proxies' => array(), + )); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); + + $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); + $this->assertEquals(array('fooKey' => 'fooVal_overridden', 'barKey' => 'barVal'), $resolverDefinition->getArgument(3)); + } + + public function testCreateS3ClientDefinitionOnCreate() + { + $container = new ContainerBuilder(); + + $resolver = new AwsS3SdkV3ResolverFactory(); + + $resolver->create($container, 'theResolverName', array( + 'client_config' => array('theClientConfigKey' => 'theClientConfigVal'), + 'bucket' => 'aBucket', + 'acl' => 'aAcl', + 'url_options' => array(), + 'get_options' => array(), + 'put_options' => array(), + 'cache' => false, + 'proxies' => array(), + )); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.client')); + + $clientDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.client'); + $this->assertEquals('Aws\S3\S3Client', $clientDefinition->getClass()); + $this->assertEquals(array('theClientConfigKey' => 'theClientConfigVal'), $clientDefinition->getArgument(0)); + } + + public function testCreateS3ClientDefinitionWithFactoryOnCreate() + { + if (version_compare(Kernel::VERSION_ID, '20600') < 0) { + $this->markTestSkipped('No need to test on symfony < 2.6'); + } + + $container = new ContainerBuilder(); + + $resolver = new AwsS3SdkV3ResolverFactory(); + + $resolver->create($container, 'theResolverName', array( + 'client_config' => array('theClientConfigKey' => 'theClientConfigVal'), + 'bucket' => 'aBucket', + 'acl' => 'aAcl', + 'url_options' => array(), + 'get_options' => array(), + 'put_options' => array(), + 'cache' => false, + 'proxies' => array(), + )); + + $clientDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.client'); + $this->assertEquals(array('Aws\S3\S3Client', 'factory'), $clientDefinition->getFactory()); + } + + public function testLegacyCreateS3ClientDefinitionWithFactoryOnCreate() + { + if (version_compare(Kernel::VERSION_ID, '20600') >= 0) { + $this->markTestSkipped('No need to test on symfony >= 2.6'); + } + + $container = new ContainerBuilder(); + + $resolver = new AwsS3SdkV3ResolverFactory(); + + $resolver->create($container, 'theResolverName', array( + 'client_config' => array('theClientConfigKey' => 'theClientConfigVal'), + 'bucket' => 'aBucket', + 'acl' => 'aAcl', + 'url_options' => array(), + 'get_options' => array(), + 'put_options' => array(), + 'cache' => false, + 'proxies' => array(), + )); + + $clientDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.client'); + $this->assertEquals('Aws\S3\S3Client', $clientDefinition->getFactoryClass()); + $this->assertEquals('factory', $clientDefinition->getFactoryMethod()); + } + + public function testWrapResolverWithProxyOnCreateWithoutCache() + { + $container = new ContainerBuilder(); + + $resolver = new AwsS3SdkV3ResolverFactory(); + + $resolver->create($container, 'theResolverName', array( + 'client_config' => array(), + 'bucket' => 'aBucket', + 'acl' => 'aAcl', + 'url_options' => array(), + 'get_options' => array(), + 'put_options' => array(), + 'cache' => false, + 'proxies' => array('foo'), + )); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.proxied')); + $proxiedResolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.proxied'); + $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $proxiedResolverDefinition); + $this->assertEquals('liip_imagine.cache.resolver.prototype.aws_s3', $proxiedResolverDefinition->getParent()); + + $this->assertFalse($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.cached')); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); + $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); + $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $resolverDefinition); + $this->assertEquals('liip_imagine.cache.resolver.prototype.proxy', $resolverDefinition->getParent()); + + $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(0)); + $this->assertEquals('liip_imagine.cache.resolver.theresolvername.proxied', $resolverDefinition->getArgument(0)); + + $this->assertEquals(array('foo'), $resolverDefinition->getArgument(1)); + } + + public function testWrapResolverWithCacheOnCreateWithoutProxy() + { + $container = new ContainerBuilder(); + + $resolver = new AwsS3SdkV3ResolverFactory(); + + $resolver->create($container, 'theResolverName', array( + 'client_config' => array(), + 'bucket' => 'aBucket', + 'acl' => 'aAcl', + 'url_options' => array(), + 'get_options' => array(), + 'put_options' => array(), + 'cache' => 'theCacheServiceId', + 'proxies' => array(), + )); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.cached')); + $cachedResolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.cached'); + $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $cachedResolverDefinition); + $this->assertEquals('liip_imagine.cache.resolver.prototype.aws_s3', $cachedResolverDefinition->getParent()); + + $this->assertFalse($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.proxied')); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); + $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); + $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $resolverDefinition); + $this->assertEquals('liip_imagine.cache.resolver.prototype.cache', $resolverDefinition->getParent()); + + $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(0)); + $this->assertEquals('thecacheserviceid', $resolverDefinition->getArgument(0)); + + $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(1)); + $this->assertEquals('liip_imagine.cache.resolver.theresolvername.cached', $resolverDefinition->getArgument(1)); + } + + public function testWrapResolverWithProxyAndCacheOnCreate() + { + $container = new ContainerBuilder(); + + $resolver = new AwsS3SdkV3ResolverFactory(); + + $resolver->create($container, 'theResolverName', array( + 'client_config' => array(), + 'bucket' => 'aBucket', + 'acl' => 'aAcl', + 'url_options' => array(), + 'get_options' => array(), + 'put_options' => array(), + 'cache' => 'theCacheServiceId', + 'proxies' => array('foo'), + )); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.proxied')); + $proxiedResolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.proxied'); + $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $proxiedResolverDefinition); + $this->assertEquals('liip_imagine.cache.resolver.prototype.aws_s3', $proxiedResolverDefinition->getParent()); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.cached')); + $cachedResolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.cached'); + $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $cachedResolverDefinition); + $this->assertEquals('liip_imagine.cache.resolver.prototype.proxy', $cachedResolverDefinition->getParent()); + + $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $cachedResolverDefinition->getArgument(0)); + $this->assertEquals('liip_imagine.cache.resolver.theresolvername.proxied', $cachedResolverDefinition->getArgument(0)); + + $this->assertEquals(array('foo'), $cachedResolverDefinition->getArgument(1)); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); + $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); + $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $resolverDefinition); + $this->assertEquals('liip_imagine.cache.resolver.prototype.cache', $resolverDefinition->getParent()); + + $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(0)); + $this->assertEquals('thecacheserviceid', $resolverDefinition->getArgument(0)); + + $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(1)); + $this->assertEquals('liip_imagine.cache.resolver.theresolvername.cached', $resolverDefinition->getArgument(1)); + } + + public function testSetCachePrefixIfDefined() + { + $container = new ContainerBuilder(); + + $resolver = new AwsS3SdkV3ResolverFactory(); + + $resolver->create($container, 'theResolverName', array( + 'client_config' => array(), + 'bucket' => 'aBucket', + 'acl' => 'aAcl', + 'url_options' => array(), + 'get_options' => array(), + 'put_options' => array(), + 'cache_prefix' => 'theCachePrefix', + 'cache' => null, + 'proxies' => array(), + )); + + $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); + $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); + + $methodCalls = $resolverDefinition->getMethodCalls(); + + $this->assertCount(1, $methodCalls); + $this->assertEquals('setCachePrefix', $methodCalls[0][0]); + $this->assertEquals(array('theCachePrefix'), $methodCalls[0][1]); + } + + /** + * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException + * @expectedExceptionMessage The child node "bucket" at path "aws_s3_sdk_v3" must be configured. + */ + public function testThrowBucketNotSetOnAddConfiguration() + { + $treeBuilder = new TreeBuilder(); + $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); + + $resolver = new AwsS3SdkV3ResolverFactory(); + $resolver->addConfiguration($rootNode); + + $this->processConfigTree($treeBuilder, array()); + } + + /** + * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException + * @expectedExceptionMessage The child node "client_config" at path "aws_s3_sdk_v3" must be configured. + */ + public function testThrowClientConfigNotSetOnAddConfiguration() + { + $treeBuilder = new TreeBuilder(); + $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); + + $resolver = new AwsS3SdkV3ResolverFactory(); + $resolver->addConfiguration($rootNode); + + $this->processConfigTree($treeBuilder, array( + 'aws_s3_sdk_v3' => array( + 'bucket' => 'aBucket', + ), + )); + } + + /** + * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException + * @expectedExceptionMessage Invalid type for path "aws_s3_sdk_v3.client_config". Expected array, but got string + */ + public function testThrowClientConfigNotArrayOnAddConfiguration() + { + $treeBuilder = new TreeBuilder(); + $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); + + $resolver = new AwsS3SdkV3ResolverFactory(); + $resolver->addConfiguration($rootNode); + + $this->processConfigTree($treeBuilder, array( + 'aws_s3_sdk_v3' => array( + 'bucket' => 'aBucket', + 'client_config' => 'not_array', + ), + )); + } + + public function testProcessCorrectlyOptionsOnAddConfiguration() + { + $expectedClientConfig = array( + 'credentials' => array( + 'key' => 'theKey', + 'secret' => 'theSecret', + 'token' => 'theToken', + ), + 'region' => 'theRegion', + 'version' => 'theVersion', + ); + $expectedUrlOptions = array( + 'theKey' => 'theUrlOptionsVal', + 'theOtherKey' => 'theOtherUrlOptionsValue', + ); + $expectedGetOptions = array( + 'theKey' => 'theGetOptionsVal', + 'theOtherKey' => 'theOtherGetOptionsValue', + ); + $expectedObjectOptions = array( + 'theKey' => 'theObjectOptionsVal', + 'theOtherKey' => 'theOtherObjectOptionsValue', + ); + $expectedBucket = 'theBucket'; + $expectedAcl = 'theAcl'; + $expectedCachePrefix = 'theCachePrefix'; + + $treeBuilder = new TreeBuilder(); + $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); + + $resolver = new AwsS3SdkV3ResolverFactory(); + $resolver->addConfiguration($rootNode); + + $config = $this->processConfigTree($treeBuilder, array( + 'aws_s3_sdk_v3' => array( + 'bucket' => $expectedBucket, + 'acl' => $expectedAcl, + 'client_config' => $expectedClientConfig, + 'url_options' => $expectedUrlOptions, + 'get_options' => $expectedGetOptions, + 'put_options' => $expectedObjectOptions, + 'cache_prefix' => $expectedCachePrefix, + ), + )); + + $this->assertArrayHasKey('bucket', $config); + $this->assertEquals($expectedBucket, $config['bucket']); + + $this->assertArrayHasKey('acl', $config); + $this->assertEquals($expectedAcl, $config['acl']); + + $this->assertArrayHasKey('client_config', $config); + $this->assertEquals($expectedClientConfig, $config['client_config']); + + $this->assertArrayHasKey('url_options', $config); + $this->assertEquals($expectedUrlOptions, $config['url_options']); + + $this->assertArrayHasKey('get_options', $config); + $this->assertEquals($expectedGetOptions, $config['get_options']); + + $this->assertArrayHasKey('put_options', $config); + $this->assertEquals($expectedObjectOptions, $config['put_options']); + + $this->assertArrayHasKey('cache_prefix', $config); + $this->assertEquals($expectedCachePrefix, $config['cache_prefix']); + } + + public function testAddDefaultOptionsIfNotSetOnAddConfiguration() + { + $expectedAcl = 'public-read'; + + $treeBuilder = new TreeBuilder(); + $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); + + $resolver = new AwsS3SdkV3ResolverFactory(); + $resolver->addConfiguration($rootNode); + + $config = $this->processConfigTree($treeBuilder, array( + 'aws_s3_sdk_v3' => array( + 'bucket' => 'aBucket', + 'client_config' => array( + 'credentials' => array( + 'key' => 'theKey', + 'secret' => 'theSecret', + 'token' => 'theToken', + ), + 'region' => 'theRegion', + 'version' => 'theVersion', + ), + ), + )); + + $this->assertArrayHasKey('acl', $config); + $this->assertEquals($expectedAcl, $config['acl']); + + $this->assertArrayHasKey('url_options', $config); + $this->assertEquals(array(), $config['url_options']); + + $this->assertArrayHasKey('get_options', $config); + $this->assertEquals(array(), $config['get_options']); + + $this->assertArrayHasKey('cache_prefix', $config); + $this->assertNull($config['cache_prefix']); + } + + /** + * @param TreeBuilder $treeBuilder + * @param array $configs + * + * @return array + */ + protected function processConfigTree(TreeBuilder $treeBuilder, array $configs) + { + $processor = new Processor(); + + return $processor->process($treeBuilder->buildTree(), $configs); + } +} diff --git a/Tests/LiipImagineBundleTest.php b/Tests/LiipImagineBundleTest.php index 7e7a826ee..0a5edab21 100644 --- a/Tests/LiipImagineBundleTest.php +++ b/Tests/LiipImagineBundleTest.php @@ -141,11 +141,33 @@ public function testAddAwsS3ResolverFactoryOnBuild() $bundle->build($containerMock); } - public function testAddStreamLoaderFactoryOnBuild() + public function testAddAwsS3SdkV3ResolverFactoryOnBuild() { $extensionMock = $this->createExtensionMock(); $extensionMock ->expects($this->at(2)) + ->method('addResolverFactory') + ->with($this->isInstanceOf('Liip\ImagineBundle\DependencyInjection\Factory\Resolver\AwsS3SdkV3ResolverFactory')) + ; + + $containerMock = $this->createContainerBuilderMock(); + $containerMock + ->expects($this->atLeastOnce()) + ->method('getExtension') + ->with('liip_imagine') + ->will($this->returnValue($extensionMock)) + ; + + $bundle = new LiipImagineBundle(); + + $bundle->build($containerMock); + } + + public function testAddStreamLoaderFactoryOnBuild() + { + $extensionMock = $this->createExtensionMock(); + $extensionMock + ->expects($this->at(3)) ->method('addLoaderFactory') ->with($this->isInstanceOf('Liip\ImagineBundle\DependencyInjection\Factory\Loader\StreamLoaderFactory')) ; @@ -167,7 +189,7 @@ public function testAddFilesystemLoaderFactoryOnBuild() { $extensionMock = $this->createExtensionMock(); $extensionMock - ->expects($this->at(3)) + ->expects($this->at(4)) ->method('addLoaderFactory') ->with($this->isInstanceOf('Liip\ImagineBundle\DependencyInjection\Factory\Loader\FilesystemLoaderFactory')) ; From 5641273f66efd8cbe86e48e3e26713fd115a6cf8 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sun, 27 Dec 2015 12:58:31 +0000 Subject: [PATCH 10/11] fix --- .../Factory/Resolver/AwsS3SdkV3ResolverFactory.php | 1 - 1 file changed, 1 deletion(-) diff --git a/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php index 73d6e71cf..07c475530 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php +++ b/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php @@ -8,7 +8,6 @@ use Symfony\Component\DependencyInjection\DefinitionDecorator; use Symfony\Component\DependencyInjection\Reference; - class AwsS3SdkV3ResolverFactory implements ResolverFactoryInterface { /** From b2a21b25ab09e730d9dc34d0bce39afb0d174f78 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Sun, 27 Dec 2015 18:18:42 +0000 Subject: [PATCH 11/11] [aws s3] Added support of Aws SDK V3. Simplier solution --- .../Factory/Resolver/AwsS3ResolverFactory.php | 5 +- .../Resolver/AwsS3SdkV3ResolverFactory.php | 138 ----- LiipImagineBundle.php | 2 - Resources/doc/cache-resolver/aws_s3.rst | 2 +- .../Resolver/AwsS3ResolverFactoryTest.php | 67 +++ .../AwsS3SdkV3ResolverFactoryTest.php | 479 ------------------ Tests/LiipImagineBundleTest.php | 26 +- 7 files changed, 73 insertions(+), 646 deletions(-) delete mode 100644 DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php delete mode 100644 Tests/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactoryTest.php diff --git a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php index 97d1f47e2..c03958318 100644 --- a/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php +++ b/DependencyInjection/Factory/Resolver/AwsS3ResolverFactory.php @@ -92,8 +92,9 @@ public function addConfiguration(ArrayNodeDefinition $builder) ->scalarNode('cache_prefix')->defaultValue(null)->end() ->arrayNode('client_config') ->isRequired() - ->useAttributeAsKey('key') - ->prototype('scalar')->end() + ->prototype('variable') + ->treatNullLike(array()) + ->end() ->end() /* @deprecated Use `get_options` instead */ ->arrayNode('url_options') diff --git a/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php b/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php deleted file mode 100644 index 07c475530..000000000 --- a/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactory.php +++ /dev/null @@ -1,138 +0,0 @@ -setFactory(array('Aws\S3\S3Client', 'factory')); - } else { - // to be removed when dependency on Symfony DependencyInjection is bumped to 2.6 - $awsS3ClientDefinition->setFactoryClass('Aws\S3\S3Client'); - $awsS3ClientDefinition->setFactoryMethod('factory'); - } - $awsS3ClientDefinition->addArgument($config['client_config']); - $container->setDefinition($awsS3ClientId, $awsS3ClientDefinition); - - $resolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.aws_s3'); - $resolverDefinition->replaceArgument(0, new Reference($awsS3ClientId)); - $resolverDefinition->replaceArgument(1, $config['bucket']); - $resolverDefinition->replaceArgument(2, $config['acl']); - $resolverDefinition->replaceArgument(3, array_replace($config['url_options'], $config['get_options'])); - $resolverDefinition->replaceArgument(4, $config['put_options']); - $resolverId = 'liip_imagine.cache.resolver.'.$resolverName; - $container->setDefinition($resolverId, $resolverDefinition); - - if (isset($config['cache_prefix'])) { - $resolverDefinition->addMethodCall('setCachePrefix', array($config['cache_prefix'])); - } - - if ($config['proxies']) { - $proxiedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.proxied'; - - $container->setDefinition($proxiedResolverId, $resolverDefinition); - - $proxyResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.proxy'); - $proxyResolverDefinition->replaceArgument(0, new Reference($proxiedResolverId)); - $proxyResolverDefinition->replaceArgument(1, $config['proxies']); - - $container->setDefinition($resolverId, $proxyResolverDefinition); - } - - if ($config['cache']) { - $cachedResolverId = 'liip_imagine.cache.resolver.'.$resolverName.'.cached'; - - $container->setDefinition($cachedResolverId, $container->getDefinition($resolverId)); - - $cacheResolverDefinition = new DefinitionDecorator('liip_imagine.cache.resolver.prototype.cache'); - $cacheResolverDefinition->replaceArgument(0, new Reference($config['cache'])); - $cacheResolverDefinition->replaceArgument(1, new Reference($cachedResolverId)); - - $container->setDefinition($resolverId, $cacheResolverDefinition); - } - - $container->getDefinition($resolverId)->addTag('liip_imagine.cache.resolver', array( - 'resolver' => $resolverName, - )); - - return $resolverId; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'aws_s3_sdk_v3'; - } - - public function addConfiguration(ArrayNodeDefinition $builder) - { - $builder - ->children() - ->scalarNode('bucket')->isRequired()->cannotBeEmpty()->end() - ->scalarNode('cache')->defaultValue(false)->end() - ->scalarNode('acl')->defaultValue('public-read')->cannotBeEmpty()->end() - ->scalarNode('cache_prefix')->defaultValue(null)->end() - ->arrayNode('client_config') - ->isRequired() - ->children() - ->arrayNode('credentials') - ->isRequired() - ->children() - ->scalarNode('key')->end() - ->scalarNode('secret')->end() - ->scalarNode('token')->end() - ->end() - ->end() - ->scalarNode('api_provider')->end() - ->scalarNode('debug')->end() - ->scalarNode('endpoint')->end() - ->scalarNode('endpoint_provider')->end() - ->scalarNode('handler')->end() - ->scalarNode('http')->end() - ->scalarNode('http_handler')->end() - ->scalarNode('profile')->end() - ->scalarNode('region')->isRequired()->end() - ->scalarNode('retries')->end() - ->scalarNode('scheme')->end() - ->scalarNode('signature_provider')->end() - ->scalarNode('signature_version')->end() - ->scalarNode('validate')->end() - ->scalarNode('version')->isRequired()->end() - ->end() - ->end() - /* @deprecated Use `get_options` instead */ - ->arrayNode('url_options') - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - ->arrayNode('get_options') - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - ->arrayNode('put_options') - ->useAttributeAsKey('key') - ->prototype('scalar')->end() - ->end() - ->arrayNode('proxies') - ->defaultValue(array()) - ->prototype('scalar')->end() - ->end() - ->end() - ; - } -} diff --git a/LiipImagineBundle.php b/LiipImagineBundle.php index e215134a9..5894f33a7 100644 --- a/LiipImagineBundle.php +++ b/LiipImagineBundle.php @@ -9,7 +9,6 @@ use Liip\ImagineBundle\DependencyInjection\Factory\Loader\FileSystemLoaderFactory; use Liip\ImagineBundle\DependencyInjection\Factory\Loader\StreamLoaderFactory; use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\AwsS3ResolverFactory; -use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\AwsS3SdkV3ResolverFactory; use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\WebPathResolverFactory; use Liip\ImagineBundle\DependencyInjection\LiipImagineExtension; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -34,7 +33,6 @@ public function build(ContainerBuilder $container) $extension->addResolverFactory(new WebPathResolverFactory()); $extension->addResolverFactory(new AwsS3ResolverFactory()); - $extension->addResolverFactory(new AwsS3SdkV3ResolverFactory()); $extension->addLoaderFactory(new StreamLoaderFactory()); $extension->addLoaderFactory(new FileSystemLoaderFactory()); diff --git a/Resources/doc/cache-resolver/aws_s3.rst b/Resources/doc/cache-resolver/aws_s3.rst index f8451cfda..5ac8115b8 100644 --- a/Resources/doc/cache-resolver/aws_s3.rst +++ b/Resources/doc/cache-resolver/aws_s3.rst @@ -47,7 +47,7 @@ must be an associative array containing key and secret. .. code-block:: yaml - aws_s3_sdk_v3: + aws_s3: client_config: credentials: key: %amazon.s3.key% diff --git a/Tests/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryTest.php b/Tests/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryTest.php index 470f5e556..ea9ad0cd2 100644 --- a/Tests/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryTest.php +++ b/Tests/DependencyInjection/Factory/Resolver/AwsS3ResolverFactoryTest.php @@ -451,6 +451,73 @@ public function testAddDefaultOptionsIfNotSetOnAddConfiguration() $this->assertNull($config['cache_prefix']); } + public function testSupportAwsV3ClientConfig() + { + $expectedClientConfig = array( + 'credentials' => array( + 'key' => 'theKey', + 'secret' => 'theSecret', + 'token' => 'theToken', + ), + 'region' => 'theRegion', + 'version' => 'theVersion', + ); + $expectedUrlOptions = array( + 'theKey' => 'theUrlOptionsVal', + 'theOtherKey' => 'theOtherUrlOptionsValue', + ); + $expectedGetOptions = array( + 'theKey' => 'theGetOptionsVal', + 'theOtherKey' => 'theOtherGetOptionsValue', + ); + $expectedObjectOptions = array( + 'theKey' => 'theObjectOptionsVal', + 'theOtherKey' => 'theOtherObjectOptionsValue', + ); + $expectedBucket = 'theBucket'; + $expectedAcl = 'theAcl'; + $expectedCachePrefix = 'theCachePrefix'; + + $treeBuilder = new TreeBuilder(); + $rootNode = $treeBuilder->root('aws_s3', 'array'); + + $resolver = new AwsS3ResolverFactory(); + $resolver->addConfiguration($rootNode); + + $config = $this->processConfigTree($treeBuilder, array( + 'aws_s3' => array( + 'bucket' => $expectedBucket, + 'acl' => $expectedAcl, + 'client_config' => $expectedClientConfig, + 'url_options' => $expectedUrlOptions, + 'get_options' => $expectedGetOptions, + 'put_options' => $expectedObjectOptions, + 'cache_prefix' => $expectedCachePrefix, + ), + )); + + $this->assertArrayHasKey('bucket', $config); + $this->assertEquals($expectedBucket, $config['bucket']); + + $this->assertArrayHasKey('acl', $config); + $this->assertEquals($expectedAcl, $config['acl']); + + $this->assertArrayHasKey('client_config', $config); + $this->assertEquals($expectedClientConfig, $config['client_config']); + + $this->assertArrayHasKey('url_options', $config); + $this->assertEquals($expectedUrlOptions, $config['url_options']); + + $this->assertArrayHasKey('get_options', $config); + $this->assertEquals($expectedGetOptions, $config['get_options']); + + $this->assertArrayHasKey('put_options', $config); + $this->assertEquals($expectedObjectOptions, $config['put_options']); + + $this->assertArrayHasKey('cache_prefix', $config); + $this->assertEquals($expectedCachePrefix, $config['cache_prefix']); + } + /** * @param TreeBuilder $treeBuilder * @param array $configs diff --git a/Tests/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactoryTest.php b/Tests/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactoryTest.php deleted file mode 100644 index d9520fde1..000000000 --- a/Tests/DependencyInjection/Factory/Resolver/AwsS3SdkV3ResolverFactoryTest.php +++ /dev/null @@ -1,479 +0,0 @@ - - */ -class AwsS3SdkV3ResolverFactoryTest extends \Phpunit_Framework_TestCase -{ - public function testImplementsResolverFactoryInterface() - { - $rc = new \ReflectionClass('Liip\ImagineBundle\DependencyInjection\Factory\Resolver\AwsS3SdkV3ResolverFactory'); - - $this->assertTrue($rc->implementsInterface('Liip\ImagineBundle\DependencyInjection\Factory\Resolver\ResolverFactoryInterface')); - } - - public function testCouldBeConstructedWithoutAnyArguments() - { - new AwsS3SdkV3ResolverFactory(); - } - - public function testReturnExpectedName() - { - $resolver = new AwsS3SdkV3ResolverFactory(); - - $this->assertEquals('aws_s3_sdk_v3', $resolver->getName()); - } - - public function testCreateResolverDefinitionOnCreate() - { - $container = new ContainerBuilder(); - - $resolver = new AwsS3SdkV3ResolverFactory(); - - $resolver->create($container, 'theResolverName', array( - 'client_config' => array(), - 'bucket' => 'theBucket', - 'acl' => 'theAcl', - 'url_options' => array('fooKey' => 'fooVal'), - 'get_options' => array(), - 'put_options' => array('barKey' => 'barVal'), - 'cache' => false, - 'proxies' => array(), - )); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); - - $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); - $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $resolverDefinition); - $this->assertEquals('liip_imagine.cache.resolver.prototype.aws_s3', $resolverDefinition->getParent()); - - $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(0)); - $this->assertEquals('liip_imagine.cache.resolver.theresolvername.client', $resolverDefinition->getArgument(0)); - - $this->assertEquals('theBucket', $resolverDefinition->getArgument(1)); - $this->assertEquals('theAcl', $resolverDefinition->getArgument(2)); - $this->assertEquals(array('fooKey' => 'fooVal'), $resolverDefinition->getArgument(3)); - $this->assertEquals(array('barKey' => 'barVal'), $resolverDefinition->getArgument(4)); - } - - public function testOverrideDeprecatedUrlOptionsWithNewGetOptions() - { - $container = new ContainerBuilder(); - - $resolver = new AwsS3SdkV3ResolverFactory(); - - $resolver->create($container, 'theResolverName', array( - 'client_config' => array(), - 'bucket' => 'theBucket', - 'acl' => 'theAcl', - 'url_options' => array('fooKey' => 'fooVal', 'barKey' => 'barVal'), - 'get_options' => array('fooKey' => 'fooVal_overridden'), - 'put_options' => array(), - 'cache' => false, - 'proxies' => array(), - )); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); - - $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); - $this->assertEquals(array('fooKey' => 'fooVal_overridden', 'barKey' => 'barVal'), $resolverDefinition->getArgument(3)); - } - - public function testCreateS3ClientDefinitionOnCreate() - { - $container = new ContainerBuilder(); - - $resolver = new AwsS3SdkV3ResolverFactory(); - - $resolver->create($container, 'theResolverName', array( - 'client_config' => array('theClientConfigKey' => 'theClientConfigVal'), - 'bucket' => 'aBucket', - 'acl' => 'aAcl', - 'url_options' => array(), - 'get_options' => array(), - 'put_options' => array(), - 'cache' => false, - 'proxies' => array(), - )); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.client')); - - $clientDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.client'); - $this->assertEquals('Aws\S3\S3Client', $clientDefinition->getClass()); - $this->assertEquals(array('theClientConfigKey' => 'theClientConfigVal'), $clientDefinition->getArgument(0)); - } - - public function testCreateS3ClientDefinitionWithFactoryOnCreate() - { - if (version_compare(Kernel::VERSION_ID, '20600') < 0) { - $this->markTestSkipped('No need to test on symfony < 2.6'); - } - - $container = new ContainerBuilder(); - - $resolver = new AwsS3SdkV3ResolverFactory(); - - $resolver->create($container, 'theResolverName', array( - 'client_config' => array('theClientConfigKey' => 'theClientConfigVal'), - 'bucket' => 'aBucket', - 'acl' => 'aAcl', - 'url_options' => array(), - 'get_options' => array(), - 'put_options' => array(), - 'cache' => false, - 'proxies' => array(), - )); - - $clientDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.client'); - $this->assertEquals(array('Aws\S3\S3Client', 'factory'), $clientDefinition->getFactory()); - } - - public function testLegacyCreateS3ClientDefinitionWithFactoryOnCreate() - { - if (version_compare(Kernel::VERSION_ID, '20600') >= 0) { - $this->markTestSkipped('No need to test on symfony >= 2.6'); - } - - $container = new ContainerBuilder(); - - $resolver = new AwsS3SdkV3ResolverFactory(); - - $resolver->create($container, 'theResolverName', array( - 'client_config' => array('theClientConfigKey' => 'theClientConfigVal'), - 'bucket' => 'aBucket', - 'acl' => 'aAcl', - 'url_options' => array(), - 'get_options' => array(), - 'put_options' => array(), - 'cache' => false, - 'proxies' => array(), - )); - - $clientDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.client'); - $this->assertEquals('Aws\S3\S3Client', $clientDefinition->getFactoryClass()); - $this->assertEquals('factory', $clientDefinition->getFactoryMethod()); - } - - public function testWrapResolverWithProxyOnCreateWithoutCache() - { - $container = new ContainerBuilder(); - - $resolver = new AwsS3SdkV3ResolverFactory(); - - $resolver->create($container, 'theResolverName', array( - 'client_config' => array(), - 'bucket' => 'aBucket', - 'acl' => 'aAcl', - 'url_options' => array(), - 'get_options' => array(), - 'put_options' => array(), - 'cache' => false, - 'proxies' => array('foo'), - )); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.proxied')); - $proxiedResolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.proxied'); - $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $proxiedResolverDefinition); - $this->assertEquals('liip_imagine.cache.resolver.prototype.aws_s3', $proxiedResolverDefinition->getParent()); - - $this->assertFalse($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.cached')); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); - $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); - $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $resolverDefinition); - $this->assertEquals('liip_imagine.cache.resolver.prototype.proxy', $resolverDefinition->getParent()); - - $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(0)); - $this->assertEquals('liip_imagine.cache.resolver.theresolvername.proxied', $resolverDefinition->getArgument(0)); - - $this->assertEquals(array('foo'), $resolverDefinition->getArgument(1)); - } - - public function testWrapResolverWithCacheOnCreateWithoutProxy() - { - $container = new ContainerBuilder(); - - $resolver = new AwsS3SdkV3ResolverFactory(); - - $resolver->create($container, 'theResolverName', array( - 'client_config' => array(), - 'bucket' => 'aBucket', - 'acl' => 'aAcl', - 'url_options' => array(), - 'get_options' => array(), - 'put_options' => array(), - 'cache' => 'theCacheServiceId', - 'proxies' => array(), - )); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.cached')); - $cachedResolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.cached'); - $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $cachedResolverDefinition); - $this->assertEquals('liip_imagine.cache.resolver.prototype.aws_s3', $cachedResolverDefinition->getParent()); - - $this->assertFalse($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.proxied')); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); - $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); - $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $resolverDefinition); - $this->assertEquals('liip_imagine.cache.resolver.prototype.cache', $resolverDefinition->getParent()); - - $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(0)); - $this->assertEquals('thecacheserviceid', $resolverDefinition->getArgument(0)); - - $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(1)); - $this->assertEquals('liip_imagine.cache.resolver.theresolvername.cached', $resolverDefinition->getArgument(1)); - } - - public function testWrapResolverWithProxyAndCacheOnCreate() - { - $container = new ContainerBuilder(); - - $resolver = new AwsS3SdkV3ResolverFactory(); - - $resolver->create($container, 'theResolverName', array( - 'client_config' => array(), - 'bucket' => 'aBucket', - 'acl' => 'aAcl', - 'url_options' => array(), - 'get_options' => array(), - 'put_options' => array(), - 'cache' => 'theCacheServiceId', - 'proxies' => array('foo'), - )); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.proxied')); - $proxiedResolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.proxied'); - $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $proxiedResolverDefinition); - $this->assertEquals('liip_imagine.cache.resolver.prototype.aws_s3', $proxiedResolverDefinition->getParent()); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername.cached')); - $cachedResolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername.cached'); - $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $cachedResolverDefinition); - $this->assertEquals('liip_imagine.cache.resolver.prototype.proxy', $cachedResolverDefinition->getParent()); - - $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $cachedResolverDefinition->getArgument(0)); - $this->assertEquals('liip_imagine.cache.resolver.theresolvername.proxied', $cachedResolverDefinition->getArgument(0)); - - $this->assertEquals(array('foo'), $cachedResolverDefinition->getArgument(1)); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); - $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); - $this->assertInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $resolverDefinition); - $this->assertEquals('liip_imagine.cache.resolver.prototype.cache', $resolverDefinition->getParent()); - - $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(0)); - $this->assertEquals('thecacheserviceid', $resolverDefinition->getArgument(0)); - - $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $resolverDefinition->getArgument(1)); - $this->assertEquals('liip_imagine.cache.resolver.theresolvername.cached', $resolverDefinition->getArgument(1)); - } - - public function testSetCachePrefixIfDefined() - { - $container = new ContainerBuilder(); - - $resolver = new AwsS3SdkV3ResolverFactory(); - - $resolver->create($container, 'theResolverName', array( - 'client_config' => array(), - 'bucket' => 'aBucket', - 'acl' => 'aAcl', - 'url_options' => array(), - 'get_options' => array(), - 'put_options' => array(), - 'cache_prefix' => 'theCachePrefix', - 'cache' => null, - 'proxies' => array(), - )); - - $this->assertTrue($container->hasDefinition('liip_imagine.cache.resolver.theresolvername')); - $resolverDefinition = $container->getDefinition('liip_imagine.cache.resolver.theresolvername'); - - $methodCalls = $resolverDefinition->getMethodCalls(); - - $this->assertCount(1, $methodCalls); - $this->assertEquals('setCachePrefix', $methodCalls[0][0]); - $this->assertEquals(array('theCachePrefix'), $methodCalls[0][1]); - } - - /** - * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException - * @expectedExceptionMessage The child node "bucket" at path "aws_s3_sdk_v3" must be configured. - */ - public function testThrowBucketNotSetOnAddConfiguration() - { - $treeBuilder = new TreeBuilder(); - $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); - - $resolver = new AwsS3SdkV3ResolverFactory(); - $resolver->addConfiguration($rootNode); - - $this->processConfigTree($treeBuilder, array()); - } - - /** - * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException - * @expectedExceptionMessage The child node "client_config" at path "aws_s3_sdk_v3" must be configured. - */ - public function testThrowClientConfigNotSetOnAddConfiguration() - { - $treeBuilder = new TreeBuilder(); - $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); - - $resolver = new AwsS3SdkV3ResolverFactory(); - $resolver->addConfiguration($rootNode); - - $this->processConfigTree($treeBuilder, array( - 'aws_s3_sdk_v3' => array( - 'bucket' => 'aBucket', - ), - )); - } - - /** - * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException - * @expectedExceptionMessage Invalid type for path "aws_s3_sdk_v3.client_config". Expected array, but got string - */ - public function testThrowClientConfigNotArrayOnAddConfiguration() - { - $treeBuilder = new TreeBuilder(); - $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); - - $resolver = new AwsS3SdkV3ResolverFactory(); - $resolver->addConfiguration($rootNode); - - $this->processConfigTree($treeBuilder, array( - 'aws_s3_sdk_v3' => array( - 'bucket' => 'aBucket', - 'client_config' => 'not_array', - ), - )); - } - - public function testProcessCorrectlyOptionsOnAddConfiguration() - { - $expectedClientConfig = array( - 'credentials' => array( - 'key' => 'theKey', - 'secret' => 'theSecret', - 'token' => 'theToken', - ), - 'region' => 'theRegion', - 'version' => 'theVersion', - ); - $expectedUrlOptions = array( - 'theKey' => 'theUrlOptionsVal', - 'theOtherKey' => 'theOtherUrlOptionsValue', - ); - $expectedGetOptions = array( - 'theKey' => 'theGetOptionsVal', - 'theOtherKey' => 'theOtherGetOptionsValue', - ); - $expectedObjectOptions = array( - 'theKey' => 'theObjectOptionsVal', - 'theOtherKey' => 'theOtherObjectOptionsValue', - ); - $expectedBucket = 'theBucket'; - $expectedAcl = 'theAcl'; - $expectedCachePrefix = 'theCachePrefix'; - - $treeBuilder = new TreeBuilder(); - $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); - - $resolver = new AwsS3SdkV3ResolverFactory(); - $resolver->addConfiguration($rootNode); - - $config = $this->processConfigTree($treeBuilder, array( - 'aws_s3_sdk_v3' => array( - 'bucket' => $expectedBucket, - 'acl' => $expectedAcl, - 'client_config' => $expectedClientConfig, - 'url_options' => $expectedUrlOptions, - 'get_options' => $expectedGetOptions, - 'put_options' => $expectedObjectOptions, - 'cache_prefix' => $expectedCachePrefix, - ), - )); - - $this->assertArrayHasKey('bucket', $config); - $this->assertEquals($expectedBucket, $config['bucket']); - - $this->assertArrayHasKey('acl', $config); - $this->assertEquals($expectedAcl, $config['acl']); - - $this->assertArrayHasKey('client_config', $config); - $this->assertEquals($expectedClientConfig, $config['client_config']); - - $this->assertArrayHasKey('url_options', $config); - $this->assertEquals($expectedUrlOptions, $config['url_options']); - - $this->assertArrayHasKey('get_options', $config); - $this->assertEquals($expectedGetOptions, $config['get_options']); - - $this->assertArrayHasKey('put_options', $config); - $this->assertEquals($expectedObjectOptions, $config['put_options']); - - $this->assertArrayHasKey('cache_prefix', $config); - $this->assertEquals($expectedCachePrefix, $config['cache_prefix']); - } - - public function testAddDefaultOptionsIfNotSetOnAddConfiguration() - { - $expectedAcl = 'public-read'; - - $treeBuilder = new TreeBuilder(); - $rootNode = $treeBuilder->root('aws_s3_sdk_v3', 'array'); - - $resolver = new AwsS3SdkV3ResolverFactory(); - $resolver->addConfiguration($rootNode); - - $config = $this->processConfigTree($treeBuilder, array( - 'aws_s3_sdk_v3' => array( - 'bucket' => 'aBucket', - 'client_config' => array( - 'credentials' => array( - 'key' => 'theKey', - 'secret' => 'theSecret', - 'token' => 'theToken', - ), - 'region' => 'theRegion', - 'version' => 'theVersion', - ), - ), - )); - - $this->assertArrayHasKey('acl', $config); - $this->assertEquals($expectedAcl, $config['acl']); - - $this->assertArrayHasKey('url_options', $config); - $this->assertEquals(array(), $config['url_options']); - - $this->assertArrayHasKey('get_options', $config); - $this->assertEquals(array(), $config['get_options']); - - $this->assertArrayHasKey('cache_prefix', $config); - $this->assertNull($config['cache_prefix']); - } - - /** - * @param TreeBuilder $treeBuilder - * @param array $configs - * - * @return array - */ - protected function processConfigTree(TreeBuilder $treeBuilder, array $configs) - { - $processor = new Processor(); - - return $processor->process($treeBuilder->buildTree(), $configs); - } -} diff --git a/Tests/LiipImagineBundleTest.php b/Tests/LiipImagineBundleTest.php index 0a5edab21..7e7a826ee 100644 --- a/Tests/LiipImagineBundleTest.php +++ b/Tests/LiipImagineBundleTest.php @@ -141,33 +141,11 @@ public function testAddAwsS3ResolverFactoryOnBuild() $bundle->build($containerMock); } - public function testAddAwsS3SdkV3ResolverFactoryOnBuild() - { - $extensionMock = $this->createExtensionMock(); - $extensionMock - ->expects($this->at(2)) - ->method('addResolverFactory') - ->with($this->isInstanceOf('Liip\ImagineBundle\DependencyInjection\Factory\Resolver\AwsS3SdkV3ResolverFactory')) - ; - - $containerMock = $this->createContainerBuilderMock(); - $containerMock - ->expects($this->atLeastOnce()) - ->method('getExtension') - ->with('liip_imagine') - ->will($this->returnValue($extensionMock)) - ; - - $bundle = new LiipImagineBundle(); - - $bundle->build($containerMock); - } - public function testAddStreamLoaderFactoryOnBuild() { $extensionMock = $this->createExtensionMock(); $extensionMock - ->expects($this->at(3)) + ->expects($this->at(2)) ->method('addLoaderFactory') ->with($this->isInstanceOf('Liip\ImagineBundle\DependencyInjection\Factory\Loader\StreamLoaderFactory')) ; @@ -189,7 +167,7 @@ public function testAddFilesystemLoaderFactoryOnBuild() { $extensionMock = $this->createExtensionMock(); $extensionMock - ->expects($this->at(4)) + ->expects($this->at(3)) ->method('addLoaderFactory') ->with($this->isInstanceOf('Liip\ImagineBundle\DependencyInjection\Factory\Loader\FilesystemLoaderFactory')) ;