carrierwave-aws 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b420ef988503bad151d75b1794b45ef1d3c2906077df034ddbdf067369f003aa
4
- data.tar.gz: 167626ab412b4b49d26927c7044445974120a273c7fda2398faea3f3d549ff0c
3
+ metadata.gz: ac60b2f92e091d9a99068561005dbf5cd44376269a0e7f101d0a64b2581cd07d
4
+ data.tar.gz: fdb3e1990f6c8845bfe79fb48c44f7ab4a04d5126a550dfd3d4196bb305344df
5
5
  SHA512:
6
- metadata.gz: 0f1c69cf12347fa87723f671de01166a1b6373e3863b36acca438f6cc253d1e50cd76f6835c55d860078003d08d9d9692b596d40736f7eade764a458de5cb826
7
- data.tar.gz: c153eaa6992b88e00c34d3eeca7e8666b6f5f9a665a137b365214f3dc2be9520ef8701cbd3a4b6451d854d160466b4a4e16b3469171a0eac2540553f28d3fc5f
6
+ metadata.gz: d3ff06f23bfd7ad4486adbaeb788be01ccee910eb4d81a786428034031bae77d069c0088dd55873df599bf9bc148530e800607d846d66827b7cebe5659d82633
7
+ data.tar.gz: 4eb6671f489ca213531f3c8bb0aa34da3e6ed6658bae7ae3870d95b321614c1d54ee87f277fc237838ddab3ac9dd537c7a2f7ad817fe862a8bb615ae1fe92a3a
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Carrierwave
4
4
  module AWS
5
- VERSION = '1.5.0'
5
+ VERSION = '1.6.0'
6
6
  end
7
7
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_support/core_ext/module/delegation'
4
+
3
5
  module CarrierWave
4
6
  module Storage
5
7
  class AWSFile
@@ -61,8 +63,8 @@ module CarrierWave
61
63
  end
62
64
 
63
65
  def copy_to(new_path)
64
- bucket.object(new_path).copy_from(
65
- "#{bucket.name}/#{file.key}",
66
+ file.copy_to(
67
+ bucket.object(new_path),
66
68
  aws_options.copy_options(self)
67
69
  )
68
70
  end
@@ -79,12 +81,16 @@ module CarrierWave
79
81
  end
80
82
 
81
83
  def authenticated_url(options = {})
84
+ if asset_host && asset_host == bucket.name
85
+ # Can't use https, since plain S3 doesn't support custom TLS certificates
86
+ options = options.reverse_merge(secure: false, virtual_host: true)
87
+ end
82
88
  file.presigned_url(:get, aws_options.expiration_options(options))
83
89
  end
84
90
 
85
91
  def public_url
86
- if uploader.asset_host
87
- "#{uploader.asset_host}/#{uri_path}"
92
+ if asset_host
93
+ "#{asset_host}/#{uri_path}"
88
94
  else
89
95
  file.public_url.to_s
90
96
  end
@@ -117,6 +123,14 @@ module CarrierWave
117
123
  def public?
118
124
  uploader.aws_acl.to_s == 'public-read' || uploader.asset_host_public
119
125
  end
126
+
127
+ def asset_host
128
+ if uploader.asset_host.respond_to? :call
129
+ uploader.asset_host.call(self)
130
+ else
131
+ uploader.asset_host
132
+ end
133
+ end
120
134
  end
121
135
  end
122
136
  end
@@ -42,6 +42,7 @@ module CarrierWave
42
42
  def aws_attributes
43
43
  attributes = uploader.aws_attributes
44
44
  return {} if attributes.nil?
45
+
45
46
  attributes.respond_to?(:call) ? attributes.call : attributes
46
47
  end
47
48
 
@@ -40,6 +40,8 @@ module CarrierWave
40
40
  end
41
41
 
42
42
  def self.normalized_acl(acl)
43
+ return nil if acl.nil?
44
+
43
45
  normalized = acl.to_s.downcase.sub('_', '-')
44
46
 
45
47
  unless ACCEPTED_ACL.include?(normalized)
@@ -86,7 +86,7 @@ describe CarrierWave::Storage::AWSFile do
86
86
  allow(uploader).to receive(:aws_authenticated_url_expiration) { 60 }
87
87
  allow(uploader).to receive(:asset_host_public) { false }
88
88
 
89
- expect(file).to receive(:presigned_url).with(:get, expires_in: 60)
89
+ expect(file).to receive(:presigned_url).with(:get, { expires_in: 60 })
90
90
 
91
91
  aws_file.url
92
92
  end
@@ -110,6 +110,18 @@ describe CarrierWave::Storage::AWSFile do
110
110
 
111
111
  expect(aws_file.url).to eq('http://example.com/files/1/file.txt')
112
112
  end
113
+
114
+ it 'accepts the asset_host given as a proc' do
115
+ allow(uploader).to receive(:aws_acl) { :'public-read' }
116
+ allow(uploader).to receive(:asset_host) do
117
+ proc do |file|
118
+ expect(file).to be_instance_of(CarrierWave::Storage::AWSFile)
119
+ 'https://example.com'
120
+ end
121
+ end
122
+
123
+ expect(aws_file.url).to eq('https://example.com/files/1/file.txt')
124
+ end
113
125
  end
114
126
 
115
127
  describe '#store' do
@@ -144,4 +156,21 @@ describe CarrierWave::Storage::AWSFile do
144
156
  expect(aws_file.public_url).to eq 'http://example.com/uploads/images/jekyll%2Band%2Bhyde.txt'
145
157
  end
146
158
  end
159
+
160
+ describe '#copy_to' do
161
+ let(:new_s3_object) { instance_double('Aws::S3::Object') }
162
+
163
+ it 'copies file to target path' do
164
+ new_path = 'files/2/file.txt'
165
+ expect(bucket).to receive(:object).with(new_path).and_return(new_s3_object)
166
+ expect(file).to receive(:size).at_least(:once).and_return(1024)
167
+ expect(file).to(
168
+ receive(:copy_to).with(
169
+ new_s3_object,
170
+ aws_file.aws_options.copy_options(aws_file)
171
+ )
172
+ )
173
+ aws_file.copy_to new_path
174
+ end
175
+ end
147
176
  end
@@ -39,8 +39,8 @@ describe CarrierWave::Storage::AWSOptions do
39
39
  write_options = options.write_options(file)
40
40
 
41
41
  expect(write_options).to include(
42
- acl: 'public-read',
43
- content_type: 'image/png',
42
+ acl: 'public-read',
43
+ content_type: 'image/png',
44
44
  encryption_key: 'def'
45
45
  )
46
46
  expect(write_options[:body].path).to eq(file.path)
@@ -54,7 +54,7 @@ describe CarrierWave::Storage::AWSOptions do
54
54
 
55
55
  it 'works if aws_attributes is a Proc' do
56
56
  expect(uploader).to receive(:aws_attributes).and_return(
57
- -> { { expires: 1.week.from_now.httpdate } }
57
+ -> { { expires: (Date.today + 7).httpdate } }
58
58
  )
59
59
 
60
60
  expect { options.write_options(file) }.to_not raise_error
@@ -1,8 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe CarrierWave::Support::UriFilename do
4
- UriFilename = CarrierWave::Support::UriFilename
5
-
6
4
  describe '.filename' do
7
5
  it 'extracts a decoded filename from file uri' do
8
6
  samples = {
@@ -11,7 +9,7 @@ describe CarrierWave::Support::UriFilename do
11
9
  }
12
10
 
13
11
  samples.each do |uri, name|
14
- expect(UriFilename.filename(uri)).to eq(name)
12
+ expect(CarrierWave::Support::UriFilename.filename(uri)).to eq(name)
15
13
  end
16
14
  end
17
15
  end
@@ -20,7 +20,7 @@ describe CarrierWave::Uploader::Base do
20
20
  end
21
21
 
22
22
  describe '#aws_acl' do
23
- it 'allows known acess control values' do
23
+ it 'allows known access control values' do
24
24
  expect do
25
25
  uploader.aws_acl = 'private'
26
26
  uploader.aws_acl = 'public-read'
@@ -28,6 +28,13 @@ describe CarrierWave::Uploader::Base do
28
28
  end.not_to raise_exception
29
29
  end
30
30
 
31
+ it 'allows nil' do
32
+ uploader.aws_acl = 'public-read'
33
+ expect do
34
+ uploader.aws_acl = nil
35
+ end.to change { uploader.aws_acl }.from('public-read').to(nil)
36
+ end
37
+
31
38
  it 'does not allow unknown control values' do
32
39
  expect do
33
40
  uploader.aws_acl = 'everybody'
@@ -73,7 +73,7 @@ describe 'Storing Files', type: :feature do
73
73
  image.close
74
74
  end
75
75
 
76
- it 'gets a url for remote files' do
76
+ it 'gets a public url for remote files' do
77
77
  instance.store!(image)
78
78
  instance.retrieve_from_store!('image.png')
79
79
 
@@ -84,6 +84,34 @@ describe 'Storing Files', type: :feature do
84
84
  instance.file.delete
85
85
  end
86
86
 
87
+ it 'gets a private url for remote files' do
88
+ instance.aws_acl = 'private'
89
+ instance.store!(image)
90
+ instance.retrieve_from_store!('image.png')
91
+
92
+ expect(instance.url).to include(ENV['S3_BUCKET_NAME'])
93
+ expect(instance.url).to include(instance.path)
94
+ expect(instance.url).to include('X-Amz-Signature=')
95
+
96
+ image.close
97
+ instance.file.delete
98
+ end
99
+
100
+ it 'respects asset_host for private urls' do
101
+ allow(instance).to receive(:asset_host).and_return(ENV['S3_BUCKET_NAME'])
102
+ instance.aws_acl = 'private'
103
+ instance.store!(image)
104
+ instance.retrieve_from_store!('image.png')
105
+
106
+ expect(URI.parse(instance.url).scheme).to eq 'http'
107
+ expect(URI.parse(instance.url).hostname).to eq ENV['S3_BUCKET_NAME']
108
+ expect(instance.url).to include(instance.path)
109
+ expect(instance.url).to include('X-Amz-Signature=')
110
+
111
+ image.close
112
+ instance.file.delete
113
+ end
114
+
87
115
  it 'uploads the cache file to the configured bucket' do
88
116
  instance.cache!(image)
89
117
  instance.retrieve_from_cache!(instance.cache_name)
data/spec/spec_helper.rb CHANGED
@@ -49,10 +49,15 @@ RSpec.configure do |config|
49
49
  cw_config.aws_acl = :'public-read'
50
50
 
51
51
  cw_config.aws_credentials = {
52
- access_key_id: ENV['S3_ACCESS_KEY'],
52
+ access_key_id: ENV['S3_ACCESS_KEY'],
53
53
  secret_access_key: ENV['S3_SECRET_ACCESS_KEY'],
54
- region: ENV['AWS_REGION']
55
- }
54
+ region: ENV['AWS_REGION']
55
+ }.merge(
56
+ ENV['CI'] && {
57
+ endpoint: 'http://127.0.0.1:9000',
58
+ force_path_style: true
59
+ } || {}
60
+ )
56
61
  end
57
62
  end
58
63
  end
metadata CHANGED
@@ -1,55 +1,75 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carrierwave-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Parker Selbert
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-01 00:00:00.000000000 Z
11
+ date: 2023-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: carrierwave
14
+ name: aws-sdk-s3
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: aws-sdk-s3
28
+ name: carrierwave
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '2.0'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '4'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
- version: '1.0'
43
+ version: '2.0'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '4'
47
+ - !ruby/object:Gem::Dependency
48
+ name: nokogiri
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: rake
43
63
  requirement: !ruby/object:Gem::Requirement
44
64
  requirements:
45
- - - "~>"
65
+ - - ">="
46
66
  - !ruby/object:Gem::Version
47
67
  version: '10.0'
48
68
  type: :development
49
69
  prerelease: false
50
70
  version_requirements: !ruby/object:Gem::Requirement
51
71
  requirements:
52
- - - "~>"
72
+ - - ">="
53
73
  - !ruby/object:Gem::Version
54
74
  version: '10.0'
55
75
  - !ruby/object:Gem::Dependency
@@ -93,7 +113,7 @@ homepage: https://github.com/sorentwo/carrierwave-aws
93
113
  licenses:
94
114
  - MIT
95
115
  metadata: {}
96
- post_install_message:
116
+ post_install_message:
97
117
  rdoc_options: []
98
118
  require_paths:
99
119
  - lib
@@ -101,15 +121,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
121
  requirements:
102
122
  - - ">="
103
123
  - !ruby/object:Gem::Version
104
- version: '0'
124
+ version: 2.5.0
105
125
  required_rubygems_version: !ruby/object:Gem::Requirement
106
126
  requirements:
107
127
  - - ">="
108
128
  - !ruby/object:Gem::Version
109
129
  version: '0'
110
130
  requirements: []
111
- rubygems_version: 3.0.3
112
- signing_key:
131
+ rubygems_version: 3.3.7
132
+ signing_key:
113
133
  specification_version: 4
114
134
  summary: Native aws-sdk support for S3 in CarrierWave
115
135
  test_files: