dragonfly-s3_data_store 1.0.2 → 1.0.3
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 +4 -4
- data/README.md +10 -4
- data/lib/dragonfly/s3_data_store/version.rb +1 -1
- data/lib/dragonfly/s3_data_store.rb +12 -8
- data/spec/s3_data_store_spec.rb +44 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7958747f8087147274b566b9a03b588016e1951c
|
4
|
+
data.tar.gz: baf40e36ace3f506553d1c227bfdae3e53a705ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a5a60312800230e4dcacd84486003e61114fab36c7a2922f28097f260dee1917b5f5f37de8fe930e32e12dcd298b56ebc65a079d1dba7f5134b72f1100f8763
|
7
|
+
data.tar.gz: 6b8c30b5863c92c0485f91f4d4b492149e559525a990b9cd44473e610fe2bb63158022327e7d8c8df2e45ba87afd8371bd6c663a665b3822a6a91ad254d84336
|
data/README.md
CHANGED
@@ -9,10 +9,11 @@ gem 'dragonfly-s3_data_store'
|
|
9
9
|
```
|
10
10
|
|
11
11
|
## Usage
|
12
|
-
|
13
|
-
In your dragonfly config block (with default options):
|
12
|
+
Configuration (remember the require)
|
14
13
|
|
15
14
|
```ruby
|
15
|
+
require 'dragonfly/s3_data_store'
|
16
|
+
|
16
17
|
Dragonfly.app.configure do
|
17
18
|
# ...
|
18
19
|
|
@@ -36,6 +37,7 @@ end
|
|
36
37
|
:url_scheme # defaults to "http"
|
37
38
|
:url_host # defaults to "<bucket-name>.s3.amazonaws.com", or "s3.amazonaws.com/<bucket-name>" if not a valid subdomain
|
38
39
|
:use_iam_profile # boolean - if true, no need for access_key_id or secret_access_key
|
40
|
+
:root_path # store all content under a subdirectory - uids will be relative to this - defaults to nil
|
39
41
|
```
|
40
42
|
|
41
43
|
### Per-storage options
|
@@ -48,8 +50,12 @@ or
|
|
48
50
|
```ruby
|
49
51
|
class MyModel
|
50
52
|
dragonfly_accessor :photo do
|
51
|
-
|
52
|
-
|
53
|
+
storage_options do |attachment|
|
54
|
+
{
|
55
|
+
path: "some/path/#{some_instance_method}/#{rand(100)}",
|
56
|
+
headers: {"x-amz-acl" => "public-read-write"}
|
57
|
+
}
|
58
|
+
end
|
53
59
|
end
|
54
60
|
end
|
55
61
|
```
|
@@ -31,9 +31,10 @@ module Dragonfly
|
|
31
31
|
@url_scheme = opts[:url_scheme] || 'http'
|
32
32
|
@url_host = opts[:url_host]
|
33
33
|
@use_iam_profile = opts[:use_iam_profile]
|
34
|
+
@root_path = opts[:root_path]
|
34
35
|
end
|
35
36
|
|
36
|
-
attr_accessor :bucket_name, :access_key_id, :secret_access_key, :region, :storage_headers, :url_scheme, :url_host, :use_iam_profile
|
37
|
+
attr_accessor :bucket_name, :access_key_id, :secret_access_key, :region, :storage_headers, :url_scheme, :url_host, :use_iam_profile, :root_path
|
37
38
|
|
38
39
|
def write(content, opts={})
|
39
40
|
ensure_configured
|
@@ -45,7 +46,7 @@ module Dragonfly
|
|
45
46
|
|
46
47
|
rescuing_socket_errors do
|
47
48
|
content.file do |f|
|
48
|
-
storage.put_object(bucket_name, uid, f, full_storage_headers(headers, content.meta))
|
49
|
+
storage.put_object(bucket_name, full_path(uid), f, full_storage_headers(headers, content.meta))
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
@@ -54,27 +55,27 @@ module Dragonfly
|
|
54
55
|
|
55
56
|
def read(uid)
|
56
57
|
ensure_configured
|
57
|
-
response = rescuing_socket_errors{ storage.get_object(bucket_name, uid) }
|
58
|
+
response = rescuing_socket_errors{ storage.get_object(bucket_name, full_path(uid)) }
|
58
59
|
[response.body, headers_to_meta(response.headers)]
|
59
60
|
rescue Excon::Errors::NotFound => e
|
60
61
|
nil
|
61
62
|
end
|
62
63
|
|
63
64
|
def destroy(uid)
|
64
|
-
rescuing_socket_errors{ storage.delete_object(bucket_name, uid) }
|
65
|
+
rescuing_socket_errors{ storage.delete_object(bucket_name, full_path(uid)) }
|
65
66
|
rescue Excon::Errors::NotFound, Excon::Errors::Conflict => e
|
66
67
|
Dragonfly.warn("#{self.class.name} destroy error: #{e}")
|
67
68
|
end
|
68
69
|
|
69
70
|
def url_for(uid, opts={})
|
70
|
-
if opts
|
71
|
-
storage.get_object_https_url(bucket_name, uid, opts[:expires])
|
71
|
+
if opts[:expires]
|
72
|
+
storage.get_object_https_url(bucket_name, full_path(uid), opts[:expires])
|
72
73
|
else
|
73
74
|
scheme = opts[:scheme] || url_scheme
|
74
75
|
host = opts[:host] || url_host || (
|
75
76
|
bucket_name =~ SUBDOMAIN_PATTERN ? "#{bucket_name}.s3.amazonaws.com" : "s3.amazonaws.com/#{bucket_name}"
|
76
77
|
)
|
77
|
-
"#{scheme}://#{host}/#{uid}"
|
78
|
+
"#{scheme}://#{host}/#{full_path(uid)}"
|
78
79
|
end
|
79
80
|
end
|
80
81
|
|
@@ -135,6 +136,10 @@ module Dragonfly
|
|
135
136
|
"#{Time.now.strftime '%Y/%m/%d/%H/%M/%S'}/#{rand(1000)}/#{name.gsub(/[^\w.]+/, '_')}"
|
136
137
|
end
|
137
138
|
|
139
|
+
def full_path(uid)
|
140
|
+
File.join *[root_path, uid].compact
|
141
|
+
end
|
142
|
+
|
138
143
|
def full_storage_headers(headers, meta)
|
139
144
|
storage_headers.merge(meta_to_headers(meta)).merge(headers)
|
140
145
|
end
|
@@ -165,4 +170,3 @@ module Dragonfly
|
|
165
170
|
|
166
171
|
end
|
167
172
|
end
|
168
|
-
|
data/spec/s3_data_store_spec.rb
CHANGED
@@ -165,7 +165,51 @@ describe Dragonfly::S3DataStore do
|
|
165
165
|
expect{ @data_store.write(content) }.not_to raise_error
|
166
166
|
end
|
167
167
|
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe "root_path" do
|
171
|
+
before do
|
172
|
+
content.name = "something.png"
|
173
|
+
@data_store.root_path = "some/path"
|
174
|
+
end
|
175
|
+
|
176
|
+
it "stores files in the provided sub directory" do
|
177
|
+
@data_store.storage.should_receive(:put_object).with(BUCKET_NAME, /^some\/path\/.*\/something\.png$/, anything, anything)
|
178
|
+
@data_store.write(content)
|
179
|
+
end
|
168
180
|
|
181
|
+
it "finds files in the provided sub directory" do
|
182
|
+
mock_response = double("response", body: "", headers: {})
|
183
|
+
uid = @data_store.write(content)
|
184
|
+
@data_store.storage.should_receive(:get_object).with(BUCKET_NAME, /^some\/path\/.*\/something\.png$/).and_return(mock_response)
|
185
|
+
@data_store.read(uid)
|
186
|
+
end
|
187
|
+
|
188
|
+
it "does not alter the uid" do
|
189
|
+
uid = @data_store.write(content)
|
190
|
+
uid.should include("something.png")
|
191
|
+
uid.should_not include("some/path")
|
192
|
+
end
|
193
|
+
|
194
|
+
it "destroys files in the provided sub directory" do
|
195
|
+
uid = @data_store.write(content)
|
196
|
+
@data_store.storage.should_receive(:delete_object).with(BUCKET_NAME, /^some\/path\/.*\/something\.png$/)
|
197
|
+
@data_store.destroy(uid)
|
198
|
+
end
|
199
|
+
|
200
|
+
describe "url_for" do
|
201
|
+
before do
|
202
|
+
@uid = @data_store.write(content)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "returns the uid prefixed with the root_path" do
|
206
|
+
@data_store.url_for(@uid).should =~ /some\/path\/.*\/something\.png/
|
207
|
+
end
|
208
|
+
|
209
|
+
it "gives an expiring url" do
|
210
|
+
@data_store.url_for(@uid, :expires => 1301476942).should =~ /\/some\/path\/.*\/something\.png\?AWSAccessKeyId=/
|
211
|
+
end
|
212
|
+
end
|
169
213
|
end
|
170
214
|
|
171
215
|
describe "autocreating the bucket" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dragonfly-s3_data_store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dragonfly
|