capistrano-s3 2.3.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +5 -0
- data/README.md +50 -1
- data/capistrano-s3.gemspec +1 -1
- data/certs/j15e.pem +19 -20
- data/lib/capistrano/s3.rb +1 -0
- data/lib/capistrano/s3/mime_types.rb +53 -0
- data/lib/capistrano/s3/publisher.rb +26 -7
- data/lib/capistrano/s3/version.rb +1 -1
- data/lib/capistrano/tasks/capistrano_2.rb +1 -1
- data/lib/capistrano/tasks/capistrano_3.rb +1 -1
- data/spec/publisher_spec.rb +78 -0
- data/spec/sample-mime/script.js +1 -0
- data/spec/sample-write/assets/script.js +1 -0
- data/spec/sample-write/assets/style.css +3 -0
- data/spec/sample-write/index.html +4 -0
- data/spec/spec_helper.rb +4 -0
- metadata +31 -28
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d90b10eb5f19179837cae17bcf810dd296e249dd7cbb9ef589091eaefe5b668
|
4
|
+
data.tar.gz: 4d7e192fe0bcbd150a8d9b2d846db39db30d7cb4ec420f4dd9e626d7abcec407
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb1ec55f60aee74e0673a0f9e9219bab41ec107dd0b928326bf43b9694afc001dc3d82ff8a1d4776380082d51823039b6ce8550bbf306beb0581e213fc6632d6
|
7
|
+
data.tar.gz: ff237af6085eb21a2a7defe9c762d79491f0e58483f783cca60fe77701ab0935f2fe7be0efbbca22479df1d6c90d9d59c4b8cfa28af8b7685b62ce0f14d46f9e
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -104,6 +104,10 @@ set :target_path, 'app'
|
|
104
104
|
|
105
105
|
### Write options
|
106
106
|
|
107
|
+
See aws-sdk [S3Client.put_object doc](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/Client.html#put_object-instance_method) for all available options both for `bucket_write_options` and `object_write_options`.
|
108
|
+
|
109
|
+
#### Bucket-level options
|
110
|
+
|
107
111
|
capistrano-s3 sets files `:content_type` and `:acl` to `public-read`, add or override with:
|
108
112
|
|
109
113
|
```ruby
|
@@ -112,7 +116,38 @@ set :bucket_write_options, {
|
|
112
116
|
}
|
113
117
|
```
|
114
118
|
|
115
|
-
|
119
|
+
#### Object-level options
|
120
|
+
|
121
|
+
You can also set write options for files matching specific [patterns](https://ruby-doc.org/core-2.3.0/Dir.html#method-c-glob) using:
|
122
|
+
|
123
|
+
```ruby
|
124
|
+
set :object_write_options, {
|
125
|
+
'index.html' => { cache_control: 'no-cache' }
|
126
|
+
}
|
127
|
+
```
|
128
|
+
|
129
|
+
or in a more advanced scenario
|
130
|
+
|
131
|
+
```ruby
|
132
|
+
set :object_write_options, {
|
133
|
+
'assets/**' => { cache_control: 'public, max-age=86400' },
|
134
|
+
'index.html' => { cache_control: 'no-cache' }
|
135
|
+
}
|
136
|
+
```
|
137
|
+
|
138
|
+
**NOTES:**
|
139
|
+
|
140
|
+
* `object_write_options` are evaulated **after** `bucket_write_options` and can override them
|
141
|
+
* Also the pattern matching for `object_write_options` is evaluated in the order of definition and overrides on match down the chain. For example defining
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
set :object_write_options, {
|
145
|
+
'assets/my-script.js' => { cache_control: 'no-cache' },
|
146
|
+
'assets/**' => { cache_control: 'public, max-age=86400' }
|
147
|
+
}
|
148
|
+
```
|
149
|
+
|
150
|
+
will set `Cache-Control: public, max-age=86400` header on `assets/my-script.js` as well!
|
116
151
|
|
117
152
|
### Redirecting
|
118
153
|
|
@@ -174,6 +209,20 @@ You can set a list of files or directories to exclude from upload. The path must
|
|
174
209
|
set :exclusions, [ "index.html", "resources/**/*" ]
|
175
210
|
```
|
176
211
|
|
212
|
+
### MIME types
|
213
|
+
|
214
|
+
Under the hood capistrano-s3 is using the [mime-types](https://github.com/mime-types/ruby-mime-types) gem to determine the correct MIME type used for `:content_type` based on the filename extension. The possible list of MIME types are in a priority ordered list, and by default capistrano-s3 uses the first element - the "best" match.
|
215
|
+
|
216
|
+
However CloudFront has [a list](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html#compressed-content-cloudfront-file-types) of MIME types that are supported by the [Serving Compressed Files](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html) feature, and the two results are not necessarily overlap.
|
217
|
+
|
218
|
+
> *For example:* the "best" MIME type match for a `.js` file is `application/ecmascript`, but files with this type are not compressed by CloudFront, only the ones with `application/javascript`.
|
219
|
+
|
220
|
+
You can enable to prefer CloudFront-supported MIME types over the "best" ones by setting:
|
221
|
+
|
222
|
+
```ruby
|
223
|
+
set :prefer_cf_mime_types, true
|
224
|
+
```
|
225
|
+
|
177
226
|
## Example of usage
|
178
227
|
|
179
228
|
Our Ruby stack for static websites:
|
data/capistrano-s3.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.name = 'capistrano-s3'
|
16
16
|
s.require_paths = ['lib']
|
17
17
|
s.version = Capistrano::S3::VERSION
|
18
|
-
s.cert_chain = ['certs/
|
18
|
+
s.cert_chain = ['certs/j15e.pem']
|
19
19
|
s.signing_key = File.expand_path("~/.ssh/gem-private_key.pem") if $0 =~ /gem\z/
|
20
20
|
|
21
21
|
# Min rubies
|
data/certs/j15e.pem
CHANGED
@@ -1,22 +1,21 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
ytwUJvEjznBnJV4OoDE=
|
2
|
+
MIIDYjCCAkqgAwIBAgIBATANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDDCJqZWFu
|
3
|
+
cGhpbGlwcGUuZG95bGUvREM9Z21haWwvREM9Y29tMB4XDTE5MDEwMzIzNDA1OFoX
|
4
|
+
DTI0MDEwMjIzNDA1OFowLTErMCkGA1UEAwwiamVhbnBoaWxpcHBlLmRveWxlL0RD
|
5
|
+
PWdtYWlsL0RDPWNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6Z
|
6
|
+
1CIdnc0gZAIISOGc3Xn6G1nRh/DPco4smZeA3zvi0i1eaL3KlWD2K38x5uEyTuMN
|
7
|
+
Eu4533cKuOZhjt6IBDG5kC8+Af21GV1R19Cvf/yka6LHkQlB9uARNKuOlAnmhTLO
|
8
|
+
cBnJ4k+14bg3Kj0GqgiMQxNWgcXCpWYPIutsjNwTv8l+Q8Cz6ochLl1VYifj7x41
|
9
|
+
BmuvYsNX6lLPT2Wn/VnSh8jx4YG4cMu8asexGrxvrZh0FMbSH+8YZTlPNIVLB0K5
|
10
|
+
I+T8T1NkH7Oqtozsa30XFEgSWcVA845m4T/XqtFzfm+fwqs9zm6EiJ1hdCo9Pe9c
|
11
|
+
CYGYjXc17CzMvs5h3YkCAwEAAaOBjDCBiTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE
|
12
|
+
sDAdBgNVHQ4EFgQUa6PNSYrB10QT+XWYeZszhB7Iy8UwJwYDVR0RBCAwHoEcamVh
|
13
|
+
bnBoaWxpcHBlLmRveWxlQGdtYWlsLmNvbTAnBgNVHRIEIDAegRxqZWFucGhpbGlw
|
14
|
+
cGUuZG95bGVAZ21haWwuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQAgO4ZWrs7jiVwB
|
15
|
+
rjuziOlVkE0pQYIL04DYqFHh+OUXehbla3ez6yXrJDYzmGssG9gWw2x7zLJDzMGS
|
16
|
+
Nuu5LJb6fLt7ngeNkT2VrX8BAi6SNOBkclDbaG2no8Of0/1Ckic0edeRhR2O2WiO
|
17
|
+
Ss4Bjfz1DIeMWXQ6XohtG2lW2hdHdkqZEz9CjOHtW9+oUZkEvE/x0zxW/xV1dy0E
|
18
|
+
wLg21KGfGL5oeHjZugRKz6VH9DchvEjlNdaagy3ew5+lxZqG5R26eCQv/SEI7UYw
|
19
|
+
O/dqEjT9PZ4B9DM6P859LG9xBvj/+cOBs8ViEUU/ExY0rPSZoZT1Ks37cCjj2mrC
|
20
|
+
ZBShvFcL
|
22
21
|
-----END CERTIFICATE-----
|
data/lib/capistrano/s3.rb
CHANGED
@@ -2,6 +2,7 @@ require "capistrano"
|
|
2
2
|
require "capistrano/s3/publisher"
|
3
3
|
require "capistrano/s3/version"
|
4
4
|
require "capistrano/s3/defaults"
|
5
|
+
require "capistrano/s3/mime_types"
|
5
6
|
|
6
7
|
if Gem::Specification.find_by_name('capistrano').version >= Gem::Version.new('3.0.0')
|
7
8
|
load File.expand_path('../tasks/capistrano_3.rb', __FILE__)
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'mime/types'
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
module S3
|
5
|
+
module MIMETypes
|
6
|
+
# List of supported MIME Types for CloudFront "Serving Compressed Files" feature
|
7
|
+
# - https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html#compressed-content-cloudfront-file-types
|
8
|
+
CF_MIME_TYPES = %w(
|
9
|
+
application/eot
|
10
|
+
application/font
|
11
|
+
application/font-sfnt
|
12
|
+
application/javascript
|
13
|
+
application/json
|
14
|
+
application/opentype
|
15
|
+
application/otf
|
16
|
+
application/pkcs7-mime
|
17
|
+
application/truetype
|
18
|
+
application/ttf
|
19
|
+
application/vnd.ms-fontobject
|
20
|
+
application/xhtml+xml
|
21
|
+
application/xml
|
22
|
+
application/xml+rss
|
23
|
+
application/x-font-opentype
|
24
|
+
application/x-font-truetype
|
25
|
+
application/x-font-ttf
|
26
|
+
application/x-httpd-cgi
|
27
|
+
application/x-javascript
|
28
|
+
application/x-mpegurl
|
29
|
+
application/x-opentype
|
30
|
+
application/x-otf
|
31
|
+
application/x-perl
|
32
|
+
application/x-ttf
|
33
|
+
font/eot
|
34
|
+
font/ttf
|
35
|
+
font/otf
|
36
|
+
font/opentype
|
37
|
+
image/svg+xml
|
38
|
+
text/css
|
39
|
+
text/csv
|
40
|
+
text/html
|
41
|
+
text/javascript
|
42
|
+
text/js
|
43
|
+
text/plain
|
44
|
+
text/richtext
|
45
|
+
text/tab-separated-values
|
46
|
+
text/xml
|
47
|
+
text/x-script
|
48
|
+
text/x-component
|
49
|
+
text/x-java-source
|
50
|
+
).map { |name| MIME::Types[name].first }.compact
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'aws-sdk'
|
2
2
|
require 'mime/types'
|
3
3
|
require 'fileutils'
|
4
|
+
require 'capistrano/s3/mime_types'
|
4
5
|
|
5
6
|
module Capistrano
|
6
7
|
module S3
|
@@ -137,8 +138,10 @@ module Capistrano
|
|
137
138
|
end
|
138
139
|
|
139
140
|
def self.put_object(s3, bucket, target_path, path, file, only_gzip, extra_options)
|
141
|
+
prefer_cf_mime_types = extra_options[:prefer_cf_mime_types] || false
|
142
|
+
|
140
143
|
base_name = File.basename(file)
|
141
|
-
mime_type = mime_type_for_file(base_name)
|
144
|
+
mime_type = mime_type_for_file(base_name, prefer_cf_mime_types)
|
142
145
|
options = {
|
143
146
|
:bucket => bucket,
|
144
147
|
:key => self.add_prefix(path, prefix: target_path),
|
@@ -149,12 +152,19 @@ module Capistrano
|
|
149
152
|
options.merge!(build_redirect_hash(path, extra_options[:redirect]))
|
150
153
|
options.merge!(extra_options[:write] || {})
|
151
154
|
|
155
|
+
object_write_options = extra_options[:object_write] || {}
|
156
|
+
object_write_options.each do |pattern, object_options|
|
157
|
+
if File.fnmatch(pattern, options[:key])
|
158
|
+
options.merge!(object_options)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
152
162
|
if mime_type
|
153
163
|
options.merge!(build_content_type_hash(mime_type))
|
154
164
|
|
155
165
|
if mime_type.sub_type == "gzip"
|
156
166
|
options.merge!(build_gzip_content_encoding_hash)
|
157
|
-
options.merge!(build_gzip_content_type_hash(file, mime_type))
|
167
|
+
options.merge!(build_gzip_content_type_hash(file, mime_type, prefer_cf_mime_types))
|
158
168
|
|
159
169
|
# upload as original file name
|
160
170
|
options.merge!(key: self.add_prefix(self.orig_name(path), prefix: target_path)) if only_gzip
|
@@ -182,18 +192,27 @@ module Capistrano
|
|
182
192
|
File.exist?(self.gzip_name(file))
|
183
193
|
end
|
184
194
|
|
185
|
-
def self.build_gzip_content_type_hash(file, mime_type)
|
195
|
+
def self.build_gzip_content_type_hash(file, mime_type, prefer_cf_mime_types)
|
186
196
|
orig_name = self.orig_name(file)
|
187
|
-
orig_mime = mime_type_for_file(orig_name)
|
197
|
+
orig_mime = mime_type_for_file(orig_name, prefer_cf_mime_types)
|
188
198
|
|
189
199
|
return {} unless orig_mime && File.exist?(orig_name)
|
190
200
|
|
191
201
|
{ :content_type => orig_mime.content_type }
|
192
202
|
end
|
193
203
|
|
194
|
-
def self.mime_type_for_file(file)
|
195
|
-
|
196
|
-
|
204
|
+
def self.mime_type_for_file(file, prefer_cf_mime_types)
|
205
|
+
types = MIME::Types.type_for(file)
|
206
|
+
|
207
|
+
if prefer_cf_mime_types
|
208
|
+
intersection = types & Capistrano::S3::MIMETypes::CF_MIME_TYPES
|
209
|
+
|
210
|
+
unless intersection.empty?
|
211
|
+
types = intersection
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
types.first
|
197
216
|
end
|
198
217
|
|
199
218
|
def self.gzip_name(file)
|
@@ -21,7 +21,7 @@ module Capistrano
|
|
21
21
|
|
22
22
|
desc "Upload files to the bucket in the current state"
|
23
23
|
task :upload_files do
|
24
|
-
extra_options = { :write => bucket_write_options, :redirect => redirect_options }
|
24
|
+
extra_options = { :write => bucket_write_options, :redirect => redirect_options, :object_write => object_write_options, :prefer_cf_mime_types => prefer_cf_mime_types }
|
25
25
|
S3::Publisher.publish!(region, access_key_id, secret_access_key,
|
26
26
|
bucket, deployment_path, target_path, distribution_id, invalidations, exclusions, only_gzip, extra_options)
|
27
27
|
end
|
@@ -18,7 +18,7 @@ namespace :deploy do
|
|
18
18
|
|
19
19
|
desc "Upload files to the bucket in the current state"
|
20
20
|
task :upload_files do
|
21
|
-
extra_options = { :write => fetch(:bucket_write_options), :redirect => fetch(:redirect_options) }
|
21
|
+
extra_options = { :write => fetch(:bucket_write_options), :redirect => fetch(:redirect_options), :object_write => fetch(:object_write_options), :prefer_cf_mime_types => fetch(:prefer_cf_mime_types) }
|
22
22
|
Capistrano::S3::Publisher.publish!(fetch(:region), fetch(:access_key_id), fetch(:secret_access_key),
|
23
23
|
fetch(:bucket), fetch(:deployment_path), fetch(:target_path), fetch(:distribution_id), fetch(:invalidations), fetch(:exclusions), fetch(:only_gzip), extra_options, fetch(:stage))
|
24
24
|
end
|
data/spec/publisher_spec.rb
CHANGED
@@ -71,5 +71,83 @@ describe Capistrano::S3::Publisher do
|
|
71
71
|
Capistrano::S3::Publisher.publish!('s3.amazonaws.com', 'abc', '123', 'mybucket.amazonaws.com', 'spec/sample', '', 'cf123', [], exclude_paths, false, {}, 'staging')
|
72
72
|
end
|
73
73
|
end
|
74
|
+
|
75
|
+
context "write options" do
|
76
|
+
it "sets bucket write options to all files" do
|
77
|
+
headers = { cache_control: 'no-cache' }
|
78
|
+
extra_options = { write: headers }
|
79
|
+
|
80
|
+
Aws::S3::Client.any_instance.expects(:put_object).with() { |options| contains(options, headers) }.times(3)
|
81
|
+
Capistrano::S3::Publisher.publish!('s3.amazonaws.com', 'abc', '123', 'mybucket.amazonaws.com', 'spec/sample-write', '', 'cf123', [], [], false, extra_options, 'staging')
|
82
|
+
end
|
83
|
+
|
84
|
+
it "sets object write options to a single file" do
|
85
|
+
headers = { cache_control: 'no-cache', acl: :private }
|
86
|
+
extra_options = {
|
87
|
+
object_write: {
|
88
|
+
'index.html' => headers
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:key] == 'index.html' && contains(options, headers) }.once
|
93
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:key] != 'index.html' && !contains(options, headers) }.twice
|
94
|
+
Capistrano::S3::Publisher.publish!('s3.amazonaws.com', 'abc', '123', 'mybucket.amazonaws.com', 'spec/sample-write', '', 'cf123', [], [], false, extra_options, 'staging')
|
95
|
+
end
|
96
|
+
|
97
|
+
it "sets object write options to a directory" do
|
98
|
+
asset_headers = { cache_control: 'max-age=3600' }
|
99
|
+
index_headers = { cache_control: 'no-cache' }
|
100
|
+
extra_options = {
|
101
|
+
object_write: {
|
102
|
+
'assets/**' => asset_headers,
|
103
|
+
'index.html' => index_headers
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:key] == 'index.html' && !contains(options, asset_headers) && contains(options, index_headers) }.once
|
108
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:key] != 'index.html' && !contains(options, index_headers) && contains(options, asset_headers) }.twice
|
109
|
+
Capistrano::S3::Publisher.publish!('s3.amazonaws.com', 'abc', '123', 'mybucket.amazonaws.com', 'spec/sample-write', '', 'cf123', [], [], false, extra_options, 'staging')
|
110
|
+
end
|
111
|
+
|
112
|
+
it "sets object write permissions in the order of definition" do
|
113
|
+
asset_headers = { cache_control: 'max-age=3600' }
|
114
|
+
js_headers = { cache_control: 'no-cache' }
|
115
|
+
extra_options = { object_write: { 'assets/**' => asset_headers, 'assets/script.js' => js_headers } }
|
116
|
+
|
117
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:key] == 'assets/script.js' && !contains(options, asset_headers) && contains(options, js_headers) }.once
|
118
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:key] == 'assets/style.css' && !contains(options, js_headers) && contains(options, asset_headers) }.once
|
119
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:key] == 'index.html' && !contains(options, js_headers) && !contains(options, asset_headers) }.once
|
120
|
+
Capistrano::S3::Publisher.publish!('s3.amazonaws.com', 'abc', '123', 'mybucket.amazonaws.com', 'spec/sample-write', '', 'cf123', [], [], false, extra_options, 'staging')
|
121
|
+
end
|
122
|
+
|
123
|
+
it "overwrites object write permissions with wrong ordering" do
|
124
|
+
js_headers = { cache_control: 'no-cache' }
|
125
|
+
asset_headers = { cache_control: 'max-age=3600' }
|
126
|
+
extra_options = {
|
127
|
+
object_write: {
|
128
|
+
'assets/script.js' => js_headers,
|
129
|
+
'assets/**' => asset_headers
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:key] != 'index.html' && !contains(options, js_headers) && contains(options, asset_headers) }.twice
|
134
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:key] == 'index.html' && !contains(options, js_headers) && !contains(options, asset_headers) }.once
|
135
|
+
Capistrano::S3::Publisher.publish!('s3.amazonaws.com', 'abc', '123', 'mybucket.amazonaws.com', 'spec/sample-write', '', 'cf123', [], [], false, extra_options, 'staging')
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "MIME types" do
|
140
|
+
it "sets best match MIME type by default" do
|
141
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:content_type] == 'application/ecmascript' }.once
|
142
|
+
Capistrano::S3::Publisher.publish!('s3.amazonaws.com', 'abc', '123', 'mybucket.amazonaws.com', 'spec/sample-mime', '', 'cf123', [], [], false, {}, 'staging')
|
143
|
+
end
|
144
|
+
|
145
|
+
it "sets CloudFront preferred MIME type if needed" do
|
146
|
+
extra_options = { prefer_cf_mime_types: true }
|
147
|
+
|
148
|
+
Aws::S3::Client.any_instance.expects(:put_object).with { |options| options[:content_type] == 'application/javascript' }.once
|
149
|
+
Capistrano::S3::Publisher.publish!('s3.amazonaws.com', 'abc', '123', 'mybucket.amazonaws.com', 'spec/sample-mime', '', 'cf123', [], [], false, extra_options, 'staging')
|
150
|
+
end
|
151
|
+
end
|
74
152
|
end
|
75
153
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
const test = 'test';
|
@@ -0,0 +1 @@
|
|
1
|
+
const test = 'test';
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-s3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean-Philippe Doyle
|
@@ -15,32 +15,27 @@ bindir: bin
|
|
15
15
|
cert_chain:
|
16
16
|
- |
|
17
17
|
-----BEGIN CERTIFICATE-----
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
xZEuzpB16YCvQreL1v3+67m12C5FPA33mw18ZkUHjKuCKlsWG6zYyTc/6YkNR4FI
|
38
|
-
jh7+6DnwQjHoyQfzwrFSN5vtdyY2tbJXHD8Kkxjj8VgUjhgTEJR7WTjSkUExEY5B
|
39
|
-
RHL9HAJPC8rqojm6npCdZ950en9r8oUyPmdZlZY86US0T6CmC5sPJyYHEsERoiUx
|
40
|
-
k20KJFF3jMIlNf6AWXy8t/1ot/hUUJKZIqzNow4oamKSpqiEA6NDH2lY2iY41mL6
|
41
|
-
Mg==
|
18
|
+
MIIDYjCCAkqgAwIBAgIBATANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDDCJqZWFu
|
19
|
+
cGhpbGlwcGUuZG95bGUvREM9Z21haWwvREM9Y29tMB4XDTE5MDEwMzIzNDA1OFoX
|
20
|
+
DTI0MDEwMjIzNDA1OFowLTErMCkGA1UEAwwiamVhbnBoaWxpcHBlLmRveWxlL0RD
|
21
|
+
PWdtYWlsL0RDPWNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6Z
|
22
|
+
1CIdnc0gZAIISOGc3Xn6G1nRh/DPco4smZeA3zvi0i1eaL3KlWD2K38x5uEyTuMN
|
23
|
+
Eu4533cKuOZhjt6IBDG5kC8+Af21GV1R19Cvf/yka6LHkQlB9uARNKuOlAnmhTLO
|
24
|
+
cBnJ4k+14bg3Kj0GqgiMQxNWgcXCpWYPIutsjNwTv8l+Q8Cz6ochLl1VYifj7x41
|
25
|
+
BmuvYsNX6lLPT2Wn/VnSh8jx4YG4cMu8asexGrxvrZh0FMbSH+8YZTlPNIVLB0K5
|
26
|
+
I+T8T1NkH7Oqtozsa30XFEgSWcVA845m4T/XqtFzfm+fwqs9zm6EiJ1hdCo9Pe9c
|
27
|
+
CYGYjXc17CzMvs5h3YkCAwEAAaOBjDCBiTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE
|
28
|
+
sDAdBgNVHQ4EFgQUa6PNSYrB10QT+XWYeZszhB7Iy8UwJwYDVR0RBCAwHoEcamVh
|
29
|
+
bnBoaWxpcHBlLmRveWxlQGdtYWlsLmNvbTAnBgNVHRIEIDAegRxqZWFucGhpbGlw
|
30
|
+
cGUuZG95bGVAZ21haWwuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQAgO4ZWrs7jiVwB
|
31
|
+
rjuziOlVkE0pQYIL04DYqFHh+OUXehbla3ez6yXrJDYzmGssG9gWw2x7zLJDzMGS
|
32
|
+
Nuu5LJb6fLt7ngeNkT2VrX8BAi6SNOBkclDbaG2no8Of0/1Ckic0edeRhR2O2WiO
|
33
|
+
Ss4Bjfz1DIeMWXQ6XohtG2lW2hdHdkqZEz9CjOHtW9+oUZkEvE/x0zxW/xV1dy0E
|
34
|
+
wLg21KGfGL5oeHjZugRKz6VH9DchvEjlNdaagy3ew5+lxZqG5R26eCQv/SEI7UYw
|
35
|
+
O/dqEjT9PZ4B9DM6P859LG9xBvj/+cOBs8ViEUU/ExY0rPSZoZT1Ks37cCjj2mrC
|
36
|
+
ZBShvFcL
|
42
37
|
-----END CERTIFICATE-----
|
43
|
-
date:
|
38
|
+
date: 2019-01-07 00:00:00.000000000 Z
|
44
39
|
dependencies:
|
45
40
|
- !ruby/object:Gem::Dependency
|
46
41
|
name: aws-sdk
|
@@ -176,6 +171,7 @@ files:
|
|
176
171
|
- certs/j15e.pem
|
177
172
|
- lib/capistrano/s3.rb
|
178
173
|
- lib/capistrano/s3/defaults.rb
|
174
|
+
- lib/capistrano/s3/mime_types.rb
|
179
175
|
- lib/capistrano/s3/publisher.rb
|
180
176
|
- lib/capistrano/s3/version.rb
|
181
177
|
- lib/capistrano/tasks/capistrano_2.rb
|
@@ -183,6 +179,10 @@ files:
|
|
183
179
|
- spec/publisher_spec.rb
|
184
180
|
- spec/sample-2/.well-known/test.txt
|
185
181
|
- spec/sample-2/public/.htaccess
|
182
|
+
- spec/sample-mime/script.js
|
183
|
+
- spec/sample-write/assets/script.js
|
184
|
+
- spec/sample-write/assets/style.css
|
185
|
+
- spec/sample-write/index.html
|
186
186
|
- spec/sample/fonts/cantarell-regular-webfont.eot
|
187
187
|
- spec/sample/fonts/cantarell-regular-webfont.eot.gz
|
188
188
|
- spec/sample/fonts/cantarell-regular-webfont.svg
|
@@ -211,8 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: '0'
|
213
213
|
requirements: []
|
214
|
-
|
215
|
-
rubygems_version: 2.7.8
|
214
|
+
rubygems_version: 3.0.2
|
216
215
|
signing_key:
|
217
216
|
specification_version: 4
|
218
217
|
summary: Build and deploy a static website to Amazon S3
|
@@ -220,6 +219,10 @@ test_files:
|
|
220
219
|
- spec/publisher_spec.rb
|
221
220
|
- spec/sample-2/.well-known/test.txt
|
222
221
|
- spec/sample-2/public/.htaccess
|
222
|
+
- spec/sample-mime/script.js
|
223
|
+
- spec/sample-write/assets/script.js
|
224
|
+
- spec/sample-write/assets/style.css
|
225
|
+
- spec/sample-write/index.html
|
223
226
|
- spec/sample/fonts/cantarell-regular-webfont.eot
|
224
227
|
- spec/sample/fonts/cantarell-regular-webfont.eot.gz
|
225
228
|
- spec/sample/fonts/cantarell-regular-webfont.svg
|
metadata.gz.sig
CHANGED
Binary file
|