carrierwave-aws 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dbc243216be54ab5f7e5ab0adeda6c6d61beea1e
4
- data.tar.gz: ce824a3dbf900b615bfc58c1bb0ebbc6b92d9b6e
3
+ metadata.gz: 9cfb613038a1d6671516ddc5f04d4c6a78024a7d
4
+ data.tar.gz: 85ed3134b7b2ffb7b2e5b6fab8a825a26b0258c9
5
5
  SHA512:
6
- metadata.gz: 0bc524f441434927eeed0303ddc4001afbe9d347c25e92fb319ad67545810b62d6e5c4efd4a6782d55253f97c3bfaf85ac43a5e7e7cf30f0382e54357b8dc1da
7
- data.tar.gz: d23855a85418360efe6cfcfd837c0cd1668c2bd7299ba65b68885f7099c873fd6c2e11054b5f303f9f5fa602aa09f45302953c6776b838a9369b4fb68865daed
6
+ metadata.gz: 58cf39368f66fafde4dfcde883d2a19314012a4b3604ca3160caf067dbb42905a727eb8d985c4d9e3f85251c1cd6961caa9aadd4d06c60431a314b5b710d50c8
7
+ data.tar.gz: 7efb7a4b9c857749c55b420946bfa8eafc2d7bd4ee9217046ee610ada3e098f6447c5820b79f68c6ee5a52377a41b4f8cf2d453a605b3655d1db3be57f948757
data/.travis.yml CHANGED
@@ -1,8 +1,7 @@
1
- ---
2
1
  language: ruby
3
2
  rvm:
4
- - 2.0.0
5
- - 2.1.0
3
+ - 2.1.5
4
+ - 2.2.2
6
5
  script: bundle exec rspec spec
7
6
  env:
8
7
  global:
@@ -18,3 +17,4 @@ env:
18
17
  B75vnSCFTnQgCP4dmz78VN/WWj88Tpnh4cjUCU0cQjQ5M7oQ0KTbM0d7WDyf
19
18
  rf0F+B9OihBtLNQWqjocRvNH0dU5OzBLCC9DVolUgNwOdNTHW2I7CwlxJ5t7
20
19
  ljQTxzPP+tFASwzBHjywbo7n0EX3efT5UOZhbD9LZL93X4SOlyU=
20
+ - secure: Uv276ljIrpfYNE34zKnawA6rxchmMymTzMs3LRcmsCDawDhNmtEuoqeHLiZctFU0k40YDylwcDXDWJayVDSW97+ytMqFfQ6e7HkL06iNZPcAW8V0LJt4SrVzRGIm6ER9Xib57lXhOnfS0jcVxT/UuD0pegvYdZb0VhUedmqInP0=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## Version 0.6.0 2015-06-26
2
+
3
+ * Breaking Change: Updated to use AWS-SDK v2 [Mark Oleson]
4
+ * You must specify a region in your `aws_credentials` configuration
5
+ * You must use hyphens in ACLs instead of underscores (`:public_read` becomes
6
+ `:'public-read'` or `'public-read'`)
7
+ * Authenticated URL's are now longer than 255 characters. If you are caching
8
+ url values you'll need to ensure columns allow 255+ characters.
9
+ * Authenticated URL expiration has been limited to 7 days.
10
+
1
11
  ## Version 0.5.0 2015-01-31
2
12
 
3
13
  * Change: Nudge the expected AWS-SDK version.
data/README.md CHANGED
@@ -38,45 +38,37 @@ the use of `aws_bucket` instead of `fog_directory`, and `aws_acl` instead of
38
38
  CarrierWave.configure do |config|
39
39
  config.storage = :aws
40
40
  config.aws_bucket = ENV.fetch('S3_BUCKET_NAME')
41
- config.aws_acl = :public_read
41
+ config.aws_acl = 'public-read'
42
42
  config.asset_host = 'http://example.com'
43
- config.aws_authenticated_url_expiration = 60 * 60 * 24 * 365
43
+
44
+ # The maximum period for authenticated_urls is only 7 days.
45
+ config.aws_authenticated_url_expiration = 60 * 60 * 24 * 7
44
46
 
45
47
  config.aws_credentials = {
46
48
  access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
47
- secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY')
49
+ secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
50
+ region: ENV.fetch('AWS_REGION') # Required
48
51
  }
49
52
  end
50
53
  ```
51
54
 
52
- If you want to supply your own AWS configuration, put it inside
53
- `config.aws_credentials` like this:
54
-
55
- ```ruby
56
- config.aws_credentials = {
57
- access_key_id: ENV['AWS_ACCESS_KEY_ID'],
58
- secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
59
- config: AWS.config(my_aws_options)
60
- }
61
- ```
62
-
63
- `AWS.config` will return `AWS::Core::Configuration` object which is used
64
- through `aws-sdk` gem. Browse [Amazon docs](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/Core/Configuration.html)
65
- for additional info. For example, if you want to turn off SSL for your asset
66
- URLs, you could simply set `AWS.config(use_ssl: false)`.
67
-
68
55
  ### Custom options for AWS URLs
69
56
 
70
57
  If you have a custom uploader that specifies additional headers for each URL, please try the following example:
71
58
 
72
59
  ```ruby
73
- class MyUploader < Carrierwave::Uploader::Base
74
- # You can find full list of custom headers in AWS SDK documentation on
75
- # AWS::S3::S3Object
76
- def download_url(filename)
77
- url(response_content_disposition: %Q{attachment; filename="#{filename}"})
78
- end
60
+ class MyUploader < Carrierwave::Uploader::Base
61
+ # Storage configuration within the uploader supercedes the global CarrierWave
62
+ # config, so be sure that your uploader does not contain `storage :file`, or
63
+ # AWS will not be used.
64
+ storage :aws
65
+
66
+ # You can find full list of custom headers in AWS SDK documentation on
67
+ # AWS::S3::S3Object
68
+ def download_url(filename)
69
+ url(response_content_disposition: %Q{attachment; filename="#{filename}"})
79
70
  end
71
+ end
80
72
  ```
81
73
 
82
74
  If you migrate from `fog` you probably have something like `url(query: {'my-header': 'my-value'})`.
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.require_paths = ['lib']
18
18
 
19
19
  gem.add_dependency 'carrierwave', '~> 0.7'
20
- gem.add_dependency 'aws-sdk', '~> 1.58'
20
+ gem.add_dependency 'aws-sdk', '~> 2.0.47'
21
21
 
22
22
  gem.add_development_dependency 'rspec', '~> 3'
23
23
  end
@@ -2,6 +2,8 @@ require 'carrierwave'
2
2
  require 'carrierwave/aws/version'
3
3
  require 'carrierwave/storage/aws'
4
4
  require 'carrierwave/storage/aws_file'
5
+ require 'carrierwave/storage/aws_options'
6
+ require 'carrierwave/support/uri_filename'
5
7
 
6
8
  class CarrierWave::Uploader::Base
7
9
  add_config :aws_attributes
@@ -1,5 +1,5 @@
1
1
  module Carrierwave
2
2
  module AWS
3
- VERSION = '0.5.0'
3
+ VERSION = '0.6.0'
4
4
  end
5
5
  end
@@ -1,4 +1,4 @@
1
- require 'aws/s3'
1
+ require 'aws-sdk-resources'
2
2
 
3
3
  module CarrierWave
4
4
  module Storage
@@ -23,7 +23,7 @@ module CarrierWave
23
23
 
24
24
  def connection
25
25
  @connection ||= begin
26
- self.class.connection_cache[credentials] ||= ::AWS::S3.new(*credentials)
26
+ self.class.connection_cache[credentials] ||= ::Aws::S3::Resource.new(*credentials)
27
27
  end
28
28
  end
29
29
 
@@ -1,43 +1,51 @@
1
1
  module CarrierWave
2
2
  module Storage
3
3
  class AWSFile
4
- attr_writer :content_type
5
- attr_reader :uploader, :connection, :path
4
+ attr_writer :file
5
+ attr_accessor :uploader, :connection, :path, :aws_options
6
6
 
7
7
  def initialize(uploader, connection, path)
8
- @uploader = uploader
9
- @connection = connection
10
- @path = path
8
+ @uploader = uploader
9
+ @connection = connection
10
+ @path = path
11
+ @aws_options = AWSOptions.new(uploader)
11
12
  end
12
13
 
14
+ def file
15
+ @file ||= bucket.object(path)
16
+ end
17
+
18
+ alias_method :to_file, :file
19
+
13
20
  def attributes
14
- file.head.data
21
+ file.data.to_h
15
22
  end
16
23
 
17
24
  def content_type
18
- @content_type || file.content_type
25
+ file.content_type
19
26
  end
20
27
 
21
28
  def delete
22
29
  file.delete
23
30
  end
24
31
 
25
- def extension
26
- path.split('.').last
27
- end
28
-
29
32
  def exists?
30
33
  file.exists?
31
34
  end
32
35
 
36
+ def extension
37
+ elements = path.split('.')
38
+ elements.last if elements.size > 1
39
+ end
40
+
33
41
  def filename(options = {})
34
42
  if file_url = url(options)
35
- URI.decode(file_url.split('?').first).gsub(/.*\/(.*?$)/, '\1')
43
+ CarrierWave::Support::UriFilename.filename(file_url)
36
44
  end
37
45
  end
38
46
 
39
47
  def read
40
- file.read(uploader_read_options)
48
+ file.get(aws_options.read_options).body.read
41
49
  end
42
50
 
43
51
  def size
@@ -45,25 +53,15 @@ module CarrierWave
45
53
  end
46
54
 
47
55
  def store(new_file)
48
- @file = bucket.objects[path].write(uploader_write_options(new_file))
49
-
50
- true
56
+ !!file.put(aws_options.write_options(new_file))
51
57
  end
52
58
 
53
- def to_file
54
- file
55
- end
56
-
57
- def url(options = {})
58
- if uploader.aws_acl != :public_read
59
- authenticated_url(options)
60
- else
61
- public_url
62
- end
59
+ def copy_to(new_path)
60
+ bucket.object(new_path).copy_from(copy_source: "#{bucket.name}/#{file.key}")
63
61
  end
64
62
 
65
63
  def authenticated_url(options = {})
66
- file.url_for(:read, { expires: uploader.aws_authenticated_url_expiration }.merge(options)).to_s
64
+ file.presigned_url(:get, aws_options.expiration_options(options))
67
65
  end
68
66
 
69
67
  def public_url
@@ -74,42 +72,18 @@ module CarrierWave
74
72
  end
75
73
  end
76
74
 
77
- def copy_to(new_path)
78
- file.copy_to(bucket.objects[new_path], uploader_copy_options)
79
- end
80
-
81
- def uploader_read_options
82
- uploader.aws_read_options || {}
83
- end
84
-
85
- def uploader_write_options(new_file)
86
- aws_attributes = uploader.aws_attributes || {}
87
- aws_write_options = uploader.aws_write_options || {}
88
-
89
- { acl: uploader.aws_acl,
90
- content_type: new_file.content_type,
91
- file: new_file.path
92
- }.merge(aws_attributes).merge(aws_write_options)
93
- end
94
-
95
- def uploader_copy_options
96
- aws_write_options = uploader.aws_write_options || {}
97
-
98
- storage_options = aws_write_options.select do |key,_|
99
- [:reduced_redundancy, :storage_class, :server_side_encryption].include?(key)
75
+ def url(options = {})
76
+ if uploader.aws_acl.to_s != 'public-read'
77
+ authenticated_url(options)
78
+ else
79
+ public_url
100
80
  end
101
-
102
- { acl: uploader.aws_acl }.merge(storage_options)
103
81
  end
104
82
 
105
83
  private
106
84
 
107
85
  def bucket
108
- @bucket ||= connection.buckets[uploader.aws_bucket]
109
- end
110
-
111
- def file
112
- @file ||= bucket.objects[path]
86
+ @bucket ||= connection.bucket(uploader.aws_bucket)
113
87
  end
114
88
  end
115
89
  end
@@ -0,0 +1,42 @@
1
+ module CarrierWave
2
+ module Storage
3
+ class AWSOptions
4
+ attr_reader :uploader
5
+
6
+ def initialize(uploader)
7
+ @uploader = uploader
8
+ end
9
+
10
+ def read_options
11
+ aws_read_options
12
+ end
13
+
14
+ def write_options(new_file)
15
+ { acl: uploader.aws_acl,
16
+ body: new_file.to_file,
17
+ content_type: new_file.content_type,
18
+ }.merge(aws_attributes).merge(aws_write_options)
19
+ end
20
+
21
+ def expiration_options(options = {})
22
+ uploader_expiration = uploader.aws_authenticated_url_expiration
23
+
24
+ { expires_in: uploader_expiration }.merge(options)
25
+ end
26
+
27
+ private
28
+
29
+ def aws_attributes
30
+ uploader.aws_attributes || {}
31
+ end
32
+
33
+ def aws_read_options
34
+ uploader.aws_read_options || {}
35
+ end
36
+
37
+ def aws_write_options
38
+ uploader.aws_write_options || {}
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,11 @@
1
+ module CarrierWave
2
+ module Support
3
+ module UriFilename
4
+ def self.filename(url)
5
+ path = url.split('?').first
6
+
7
+ URI.decode(path).gsub(/.*\/(.*?$)/, '\1')
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,16 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe CarrierWave::Storage::AWSFile do
4
- let(:objects) { { 'files/1/file.txt' => file } }
5
4
  let(:path) { 'files/1/file.txt' }
6
- let(:bucket) { double(:bucket, objects: objects) }
7
- let(:connection) { double(:connection, buckets: { 'example-com' => bucket }) }
8
- let(:file) { double(:file, read: '0101010', content_type: 'content/type', path: '/file/path') }
5
+ let(:file) { double(:file, content_type: 'content/type', path: '/file/path') }
6
+ let(:bucket) { double(:bucket, object: file) }
7
+ let(:connection) { double(:connection, bucket: bucket) }
9
8
 
10
9
  let(:uploader) do
11
10
  double(:uploader,
12
11
  aws_bucket: 'example-com',
13
- aws_acl: :public_read,
12
+ aws_acl: :'public-read',
14
13
  aws_attributes: {},
15
14
  asset_host: nil,
16
15
  aws_read_options: { encryption_key: 'abc' },
@@ -22,86 +21,32 @@ describe CarrierWave::Storage::AWSFile do
22
21
  CarrierWave::Storage::AWSFile.new(uploader, connection, path)
23
22
  end
24
23
 
25
- describe '#exists?' do
26
- it 'checks if the remote file object exists' do
27
- expect(file).to receive(:exists?).and_return(true)
28
-
29
- aws_file.exists?
30
- end
31
- end
32
-
33
- describe '#read' do
34
- it 'reads from the remote file object' do
35
- expect(aws_file.read).to eq('0101010')
36
- end
37
- end
38
-
39
- describe '#uploader_write_options' do
40
- it 'includes acl, content_type, file, aws_attributes, and aws_write_options' do
41
- expect(aws_file.uploader_write_options(file)).to eq(
42
- acl: :public_read,
43
- content_type: 'content/type',
44
- file: '/file/path',
45
- encryption_key: 'def'
46
- )
47
- end
48
-
49
- it 'works if aws_attributes is nil' do
50
- allow(uploader).to receive(:aws_attributes) { nil }
51
-
52
- expect {
53
- aws_file.uploader_write_options(file)
54
- }.to_not raise_error
55
- end
56
-
57
- it 'works if aws_write_options is nil' do
58
- allow(uploader).to receive(:aws_write_options) { nil }
59
-
60
- expect {
61
- aws_file.uploader_write_options(file)
62
- }.to_not raise_error
63
- end
64
- end
65
-
66
- describe '#uploader_read_options' do
67
- it 'includes aws_read_options' do
68
- expect(aws_file.uploader_read_options).to eq(encryption_key: 'abc')
69
- end
70
-
71
- it 'ensures that read options are a hash' do
72
- allow(uploader).to receive(:aws_read_options) { nil }
73
-
74
- expect(aws_file.uploader_read_options).to eq({})
75
- end
76
- end
77
-
78
24
  describe '#to_file' do
79
25
  it 'returns the internal file instance' do
26
+ file = Object.new
27
+ aws_file.file = file
28
+
80
29
  expect(aws_file.to_file).to be(file)
81
30
  end
82
31
  end
83
32
 
84
- describe '#authenticated_url' do
85
- it 'requests a url for reading with the configured expiration' do
86
- allow(uploader).to receive(:aws_authenticated_url_expiration) { 60 }
33
+ describe '#extension' do
34
+ it 'extracts the file extension from the path' do
35
+ aws_file.path = 'file.txt'
87
36
 
88
- expect(file).to receive(:url_for).with(:read, expires: 60)
89
-
90
- aws_file.authenticated_url
37
+ expect(aws_file.extension).to eq('txt')
91
38
  end
92
39
 
93
- it 'requests a url for reading with custom options' do
94
- allow(uploader).to receive(:aws_authenticated_url_expiration) { 60 }
95
-
96
- expect(file).to receive(:url_for).with(:read, hash_including(response_content_disposition: 'attachment'))
40
+ it 'is nil if the file has no extension' do
41
+ aws_file.path = 'filetxt'
97
42
 
98
- aws_file.authenticated_url(response_content_disposition: 'attachment')
43
+ expect(aws_file.extension).to be_nil
99
44
  end
100
45
  end
101
46
 
102
47
  describe '#url' do
103
48
  it 'requests a public url if acl is public readable' do
104
- allow(uploader).to receive(:aws_acl) { :public_read }
49
+ allow(uploader).to receive(:aws_acl) { :'public-read' }
105
50
 
106
51
  expect(file).to receive(:public_url)
107
52
 
@@ -112,24 +57,16 @@ describe CarrierWave::Storage::AWSFile do
112
57
  allow(uploader).to receive(:aws_acl) { :private }
113
58
  allow(uploader).to receive(:aws_authenticated_url_expiration) { 60 }
114
59
 
115
- expect(file).to receive(:url_for)
60
+ expect(file).to receive(:presigned_url).with(:get, { expires_in: 60 })
116
61
 
117
62
  aws_file.url
118
63
  end
119
64
 
120
65
  it 'uses the asset_host and file path if asset_host is set' do
121
- allow(uploader).to receive(:aws_acl) { :public_read }
66
+ allow(uploader).to receive(:aws_acl) { :'public-read' }
122
67
  allow(uploader).to receive(:asset_host) { 'http://example.com' }
123
68
 
124
69
  expect(aws_file.url).to eq('http://example.com/files/1/file.txt')
125
70
  end
126
71
  end
127
-
128
- describe '#filename' do
129
- it 'returns the filename from the url' do
130
- expect(aws_file).to receive(:url).and_return('http://example.com/files/1/file%201.txt?foo=bar/baz.txt')
131
-
132
- expect(aws_file.filename).to eq('file 1.txt')
133
- end
134
- end
135
72
  end
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ describe CarrierWave::Storage::AWSOptions do
4
+ uploader_klass = Class.new do
5
+ attr_accessor :aws_attributes, :aws_read_options, :aws_write_options
6
+
7
+ def aws_acl
8
+ 'public-read'
9
+ end
10
+
11
+ def aws_authenticated_url_expiration
12
+ '60'
13
+ end
14
+ end
15
+
16
+ let(:uploader) { uploader_klass.new }
17
+ let(:options) { CarrierWave::Storage::AWSOptions.new(uploader) }
18
+
19
+ describe '#read_options' do
20
+ it 'uses the uploader aws_read_options' do
21
+ uploader.aws_read_options = { encryption_key: 'abc' }
22
+
23
+ expect(options.read_options).to eq(uploader.aws_read_options)
24
+ end
25
+
26
+ it 'ensures that read_options are a hash' do
27
+ uploader.aws_read_options = nil
28
+
29
+ expect(options.read_options).to eq({})
30
+ end
31
+ end
32
+
33
+ describe '#write_options' do
34
+ let(:file) { CarrierWave::SanitizedFile.new('spec/fixtures/image.png') }
35
+
36
+ it 'includes acl, content_type, body (file), aws_attributes, and aws_write_options' do
37
+ uploader.aws_write_options = { encryption_key: 'def' }
38
+
39
+ write_options = options.write_options(file)
40
+
41
+ expect(write_options).to include(
42
+ acl: 'public-read',
43
+ content_type: 'image/png',
44
+ encryption_key: 'def'
45
+ )
46
+ expect(write_options[:body].path).to eq(file.path)
47
+ end
48
+
49
+ it 'works if aws_attributes is nil' do
50
+ expect(uploader).to receive(:aws_attributes) { nil }
51
+
52
+ expect {
53
+ options.write_options(file)
54
+ }.to_not raise_error
55
+ end
56
+
57
+ it 'works if aws_write_options is nil' do
58
+ expect(uploader).to receive(:aws_write_options) { nil }
59
+
60
+ expect {
61
+ options.write_options(file)
62
+ }.to_not raise_error
63
+ end
64
+ end
65
+
66
+ describe '#expiration_options' do
67
+ it 'extracts the expiration value' do
68
+ expect(options.expiration_options).to eq(
69
+ expires_in: uploader.aws_authenticated_url_expiration
70
+ )
71
+ end
72
+
73
+ it 'allows expiration to be overridden' do
74
+ expect(options.expiration_options(expires_in: 10)).to eq(
75
+ expires_in: 10
76
+ )
77
+ end
78
+ end
79
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe CarrierWave::Storage::AWS do
4
- let(:credentials) { { access_key_id: 'abc', secret_access_key: '123' } }
4
+ let(:credentials) { { access_key_id: 'abc', secret_access_key: '123', region: 'us-east-1' } }
5
5
  let(:uploader) { double(:uploader, aws_credentials: credentials) }
6
6
 
7
7
  subject(:storage) do
@@ -14,17 +14,11 @@ describe CarrierWave::Storage::AWS do
14
14
 
15
15
  describe '#connection' do
16
16
  it 'instantiates a new connection with credentials' do
17
- expect(AWS::S3).to receive(:new).with(credentials)
17
+ expect(Aws::S3::Resource).to receive(:new).with(credentials)
18
18
 
19
19
  storage.connection
20
20
  end
21
21
 
22
- it 'instantiates a new connection without any credentials' do
23
- allow(uploader).to receive(:aws_credentials) { nil }
24
-
25
- expect { storage.connection }.not_to raise_exception
26
- end
27
-
28
22
  it 'caches connections by credentials' do
29
23
  expect(storage.connection).to eq(storage.connection)
30
24
  end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe CarrierWave::Support::UriFilename do
4
+ UriFilename = CarrierWave::Support::UriFilename
5
+
6
+ describe '.filename' do
7
+ it 'extracts a decoded filename from file uri' do
8
+ samples = {
9
+ 'http://example.com/file.txt' => 'file.txt',
10
+ 'http://example.com/files/1/file%201.txt?foo=bar/baz.txt' => 'file 1.txt',
11
+ }
12
+
13
+ samples.each do |uri, name|
14
+ expect(UriFilename.filename(uri)).to eq(name)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,20 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Copying Files', type: :feature do
4
- it 'copies an existing file to the specified path' do
5
- uploader = Class.new(CarrierWave::Uploader::Base) do
6
- def filename; 'image.png'; end
7
- end
8
-
9
- image = File.open('spec/fixtures/image.png', 'r')
10
- original = uploader.new
4
+ let(:image) { File.open('spec/fixtures/image.png', 'r') }
5
+ let(:original) { FeatureUploader.new }
11
6
 
7
+ it 'copies an existing file to the specified path' do
12
8
  original.store!(image)
13
9
  original.retrieve_from_store!('image.png')
14
10
 
15
11
  original.file.copy_to('uploads/image2.png')
16
12
 
17
- copy = uploader.new
13
+ copy = FeatureUploader.new
18
14
  copy.retrieve_from_store!('image2.png')
19
15
 
20
16
  original_attributes = original.file.attributes
@@ -1,19 +1,59 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Storing Files', type: :feature do
4
+ let(:image) { File.open('spec/fixtures/image.png', 'r') }
5
+ let(:instance) { FeatureUploader.new }
6
+
4
7
  it 'uploads the file to the configured bucket' do
5
- uploader = Class.new(CarrierWave::Uploader::Base) do
6
- def filename; 'image.png'; end
7
- end
8
+ instance.store!(image)
9
+ instance.retrieve_from_store!('image.png')
10
+
11
+ expect(instance.file.size).to eq(image.size)
12
+ expect(instance.file.read).to eq(image.read)
13
+ expect(instance.file.read).to eq(instance.file.read)
14
+
15
+ image.close
16
+ instance.file.delete
17
+ end
18
+
19
+ it 'retrieves the attributes for a stored file' do
20
+ instance.store!(image)
21
+ instance.retrieve_from_store!('image.png')
22
+
23
+ expect(instance.file.attributes).to include(
24
+ :metadata,
25
+ :content_type,
26
+ :etag,
27
+ :accept_ranges,
28
+ :last_modified,
29
+ :content_length
30
+ )
31
+
32
+ expect(instance.file.content_type).to eq('image/png')
33
+ expect(instance.file.filename).to eq('image.png')
8
34
 
9
- image = File.open('spec/fixtures/image.png', 'r')
10
- instance = uploader.new
35
+ image.close
36
+ instance.file.delete
37
+ end
38
+
39
+ it 'checks if a remote file exists' do
40
+ instance.store!(image)
41
+ instance.retrieve_from_store!('image.png')
42
+
43
+ expect(instance.file.exists?).to be_truthy
44
+
45
+ instance.file.delete
46
+
47
+ expect(instance.file.exists?).to be_falsy
48
+
49
+ image.close
50
+ end
11
51
 
52
+ it 'gets a url for remote files' do
12
53
  instance.store!(image)
13
54
  instance.retrieve_from_store!('image.png')
14
55
 
15
- expect(instance.file.size).to be_nonzero
16
- expect(image.size).to eq(instance.file.size)
56
+ expect(instance.url).to eq("https://#{ENV['S3_BUCKET_NAME']}.s3.amazonaws.com/#{instance.path}")
17
57
 
18
58
  image.close
19
59
  instance.file.delete
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,10 @@ def source_environment_file!
10
10
  end
11
11
  end
12
12
 
13
+ FeatureUploader = Class.new(CarrierWave::Uploader::Base) do
14
+ def filename; 'image.png'; end
15
+ end
16
+
13
17
  RSpec.configure do |config|
14
18
  source_environment_file!
15
19
 
@@ -32,12 +36,12 @@ RSpec.configure do |config|
32
36
  CarrierWave.configure do |config|
33
37
  config.storage = :aws
34
38
  config.aws_bucket = ENV['S3_BUCKET_NAME']
35
- config.aws_acl = :public_read
39
+ config.aws_acl = :'public-read'
36
40
 
37
41
  config.aws_credentials = {
38
42
  access_key_id: ENV['S3_ACCESS_KEY'],
39
43
  secret_access_key: ENV['S3_SECRET_ACCESS_KEY'],
40
- region: ENV['S3_REGION']
44
+ region: ENV['AWS_REGION']
41
45
  }
42
46
  end
43
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carrierwave-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Parker Selbert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-31 00:00:00.000000000 Z
11
+ date: 2015-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: carrierwave
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.58'
33
+ version: 2.0.47
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.58'
40
+ version: 2.0.47
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -73,11 +73,14 @@ files:
73
73
  - lib/carrierwave/aws/version.rb
74
74
  - lib/carrierwave/storage/aws.rb
75
75
  - lib/carrierwave/storage/aws_file.rb
76
+ - lib/carrierwave/storage/aws_options.rb
77
+ - lib/carrierwave/support/uri_filename.rb
76
78
  - spec/carrierwave-aws_spec.rb
77
79
  - spec/carrierwave/storage/aws_file_spec.rb
80
+ - spec/carrierwave/storage/aws_options_spec.rb
78
81
  - spec/carrierwave/storage/aws_spec.rb
82
+ - spec/carrierwave/support/uri_filename_spec.rb
79
83
  - spec/features/copying_files_spec.rb
80
- - spec/features/querying_files_spec.rb
81
84
  - spec/features/storing_files_spec.rb
82
85
  - spec/fixtures/image.png
83
86
  - spec/spec_helper.rb
@@ -107,9 +110,10 @@ summary: A slimmer alternative to using Fog for S3 support in CarrierWave
107
110
  test_files:
108
111
  - spec/carrierwave-aws_spec.rb
109
112
  - spec/carrierwave/storage/aws_file_spec.rb
113
+ - spec/carrierwave/storage/aws_options_spec.rb
110
114
  - spec/carrierwave/storage/aws_spec.rb
115
+ - spec/carrierwave/support/uri_filename_spec.rb
111
116
  - spec/features/copying_files_spec.rb
112
- - spec/features/querying_files_spec.rb
113
117
  - spec/features/storing_files_spec.rb
114
118
  - spec/fixtures/image.png
115
119
  - spec/spec_helper.rb
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Querying Files', type: :feature do
4
- it 'retrieves the attributes for a stored file' do
5
- uploader = Class.new(CarrierWave::Uploader::Base) do
6
- def filename; 'image.png'; end
7
- end
8
-
9
- image = File.open('spec/fixtures/image.png', 'r')
10
- instance = uploader.new
11
-
12
- instance.store!(image)
13
- instance.retrieve_from_store!('image.png')
14
-
15
- expect(instance.file.attributes).to include(
16
- :meta,
17
- :restore_in_progress,
18
- :content_type,
19
- :etag,
20
- :accept_ranges,
21
- :last_modified,
22
- :content_length
23
- )
24
-
25
- image.close
26
- instance.file.delete
27
- end
28
-
29
- it 'checks if a remote file exists' do
30
- uploader = Class.new(CarrierWave::Uploader::Base) do
31
- def filename; 'image.png'; end
32
- end
33
-
34
- image = File.open('spec/fixtures/image.png', 'r')
35
- instance = uploader.new
36
-
37
- instance.store!(image)
38
- instance.retrieve_from_store!('image.png')
39
-
40
- expect(instance.file.exists?).to be true
41
-
42
- instance.file.delete
43
-
44
- expect(instance.file.exists?).to be false
45
-
46
- image.close
47
- end
48
- end