Skip to content

Commit

Permalink
Add support for AsyncAws's Flysystem adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
Nyholm committed Mar 15, 2020
1 parent b0a38b4 commit a3fa96d
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 0 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"symfony/options-resolver": "^4.2|^5.0"
},
"require-dev": {
"async-aws/flysystem-s3": "^0.3",
"league/flysystem-aws-s3-v3": "^1.0.22",
"league/flysystem-azure-blob-storage": "^0.1.5",
"league/flysystem-cached-adapter": "^1.0.9",
Expand Down
62 changes: 62 additions & 0 deletions src/Adapter/Builder/AsyncAwsAdapterDefinitionBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

/*
* This file is part of the flysystem-bundle project.
*
* (c) Titouan Galopin <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace League\FlysystemBundle\Adapter\Builder;

use AsyncAws\Flysystem\S3\S3FilesystemV1;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
* @author Titouan Galopin <[email protected]>
* @author Tobias Nyholm <[email protected]>
*
* @internal
*/
class AsyncAwsAdapterDefinitionBuilder extends AbstractAdapterDefinitionBuilder
{
public function getName(): string
{
return 'asyncaws';
}

protected function getRequiredPackages(): array
{
return [
S3FilesystemV1::class => 'async-aws/flysystem-s3',
];
}

protected function configureOptions(OptionsResolver $resolver)
{
$resolver->setRequired('client');
$resolver->setAllowedTypes('client', 'string');

$resolver->setRequired('bucket');
$resolver->setAllowedTypes('bucket', 'string');

$resolver->setDefault('prefix', '');
$resolver->setAllowedTypes('prefix', 'string');

$resolver->setDefault('options', []);
$resolver->setAllowedTypes('options', 'array');
}

protected function configureDefinition(Definition $definition, array $options)
{
$definition->setClass(S3FilesystemV1::class);
$definition->setArgument(0, new Reference($options['client']));
$definition->setArgument(1, $options['bucket']);
$definition->setArgument(2, $options['prefix']);
$definition->setArgument(3, $options['options']);
}
}
74 changes: 74 additions & 0 deletions tests/Adapter/Builder/AsyncAwsAdapterDefinitionBuilderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

/*
* This file is part of the flysystem-bundle project.
*
* (c) Titouan Galopin <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Tests\League\FlysystemBundle\Adapter\Builder;

use AsyncAws\Flysystem\S3\S3FilesystemV1;
use League\FlysystemBundle\Adapter\Builder\AsyncAwsAdapterDefinitionBuilder;
use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\Reference;

class AsyncAwsAdapterDefinitionBuilderTest extends TestCase
{
public function createBuilder()
{
return new AsyncAwsAdapterDefinitionBuilder();
}

public function provideValidOptions()
{
yield 'minimal' => [[
'client' => 'my_client',
'bucket' => 'bucket',
]];

yield 'prefix' => [[
'client' => 'my_client',
'bucket' => 'bucket',
'prefix' => 'prefix/path',
]];

yield 'options' => [[
'client' => 'my_client',
'bucket' => 'bucket',
'options' => [
'ServerSideEncryption' => 'AES256',
],
]];
}

/**
* @dataProvider provideValidOptions
*/
public function testCreateDefinition($options)
{
$this->assertSame(S3FilesystemV1::class, $this->createBuilder()->createDefinition($options)->getClass());
}

public function testOptionsBehavior()
{
$definition = $this->createBuilder()->createDefinition([
'client' => 'my_client',
'bucket' => 'bucket',
'prefix' => 'prefix/path',
'options' => [
'ServerSideEncryption' => 'AES256',
],
]);

$this->assertSame(S3FilesystemV1::class, $definition->getClass());
$this->assertInstanceOf(Reference::class, $definition->getArgument(0));
$this->assertSame('my_client', (string) $definition->getArgument(0));
$this->assertSame('bucket', $definition->getArgument(1));
$this->assertSame('prefix/path', $definition->getArgument(2));
$this->assertSame(['ServerSideEncryption' => 'AES256'], $definition->getArgument(3));
}
}
7 changes: 7 additions & 0 deletions tests/Adapter/options.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
fs_async_aws:
adapter: 'asyncaws'
options:
client: 'aws_client_service'
bucket: 'bucket_name'
prefix: 'optional/path/prefix'

fs_aws:
adapter: 'aws'
options:
Expand Down

0 comments on commit a3fa96d

Please sign in to comment.