effective_assets 1.7.1 → 1.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +49 -2
- data/active_admin/effective_assets.rb +7 -1
- data/app/controllers/effective/s3_uploads_controller.rb +2 -0
- data/app/helpers/effective_assets_s3_helper.rb +1 -1
- data/app/models/concerns/acts_as_asset_box.rb +33 -1
- data/app/models/effective/asset.rb +12 -19
- data/app/models/effective/delayed_job.rb +13 -1
- data/app/models/inputs/asset_box.rb +22 -1
- data/lib/effective_assets/version.rb +1 -1
- 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: b046d827dbdb53336ae75966f6e0b583d89eb392
|
4
|
+
data.tar.gz: df4319599899bb44a4ca80712f2825f9f02cf092
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eddcb8b9ddf413f78f399653b7fd8afe48ff51c332ec6bb354a99f43ade3362e64c16742bd295c09bdc90b0130b3355cba05f5276684abe5cbb429a68e02619d
|
7
|
+
data.tar.gz: fbf9f513853d9b99c1d216333c30eec15c0ee64c38a9feaf9176e0c4e893c4dcd3a467017eaeed28236a23f4792c0b2b965a9cc72e032efa7c1cea82ddca76b1
|
data/README.md
CHANGED
@@ -193,6 +193,8 @@ user.photos
|
|
193
193
|
|
194
194
|
### Validations
|
195
195
|
|
196
|
+
You can validate the presence and length of the assets with a simple syntax:
|
197
|
+
|
196
198
|
```ruby
|
197
199
|
class User
|
198
200
|
acts_as_asset_box :avatar => true, :photos => false, :videos => 2, :mp3s => 5..10
|
@@ -201,8 +203,18 @@ end
|
|
201
203
|
|
202
204
|
true means presence, false means no validations applied.
|
203
205
|
|
206
|
+
or a more involved syntax:
|
207
|
+
|
208
|
+
```ruby
|
209
|
+
class User
|
210
|
+
acts_as_asset_box avatar: [presence: true], photos: false, videos: [length: 2], mp3s: [length: 5..10]
|
211
|
+
end
|
212
|
+
```
|
213
|
+
|
204
214
|
The user in this example is only valid if exists an avatar, 2 videos, and 5..10 mp3s.
|
205
215
|
|
216
|
+
Procs are not supported.
|
217
|
+
|
206
218
|
### Form Input
|
207
219
|
|
208
220
|
There is a standard rails form input:
|
@@ -251,10 +263,10 @@ Use the custom form input for uploading (direct to S3) and attaching assets to t
|
|
251
263
|
= f.input :pictures, :as => :asset_box, :dialog => true, :dialog_url => '/admin/effective_assets' # Use the attach dialog
|
252
264
|
```
|
253
265
|
|
254
|
-
You may also upload secure (AWS: 'authenticated-read') assets with the same uploader
|
266
|
+
You may also upload secure (AWS: 'authenticated-read') assets with the same uploader:
|
255
267
|
|
256
268
|
```ruby
|
257
|
-
= f.input :pictures, :as => :asset_box, :
|
269
|
+
= f.input :pictures, :as => :asset_box, :private => true
|
258
270
|
```
|
259
271
|
|
260
272
|
There is also a mechanism for collecting additional information from the upload form which will be set in the `asset.extra` field.
|
@@ -305,6 +317,41 @@ The permitted parameters are:
|
|
305
317
|
:attachments_attributes => [:id, :asset_id, :attachable_type, :attachable_id, :position, :box, :_destroy]
|
306
318
|
```
|
307
319
|
|
320
|
+
### Amazon S3 Public / Private
|
321
|
+
|
322
|
+
When an asset is uploaded, it is created with an `aws_acl` of either `public-read` or `authenticated-read`.
|
323
|
+
|
324
|
+
When in `authenticated-read` mode, calling `@asset.url` will return a URL that is valid for just 60 minutes.
|
325
|
+
|
326
|
+
This privacy level can be configured in the following 3 ways:
|
327
|
+
|
328
|
+
1. The app wide default is set in `config/initializers/effective_assets.rb`. All Effective::Asset objects will be created with this ACL unless specified below.
|
329
|
+
|
330
|
+
2. When you call `acts_as_asset_box` on a model, the `:private` or `:public` keys will define the behavior for just this asset box.
|
331
|
+
|
332
|
+
```ruby
|
333
|
+
acts_as_asset_box :avatar => :private
|
334
|
+
acts_as_asset_box :avatar => :public
|
335
|
+
```
|
336
|
+
|
337
|
+
or, with validations:
|
338
|
+
|
339
|
+
```ruby
|
340
|
+
acts_as_asset_box :avatar => [presence: true, private: true]
|
341
|
+
acts_as_asset_box :avatar => [presence: true, public: true]
|
342
|
+
```
|
343
|
+
|
344
|
+
All assets uploaded into this box will be created with this ACL unless overridden below.
|
345
|
+
|
346
|
+
3. Set the ACL on the form upload field
|
347
|
+
|
348
|
+
```ruby
|
349
|
+
= f.input :avatar, :as => :asset_box, :private => true
|
350
|
+
= f.input :avatar, :as => :asset_box, :public => true
|
351
|
+
```
|
352
|
+
|
353
|
+
Has final say over the privacy setting when uploaded from this form.
|
354
|
+
|
308
355
|
|
309
356
|
### Image Processing and Resizing
|
310
357
|
|
@@ -97,7 +97,13 @@ if defined?(ActiveAdmin)
|
|
97
97
|
end
|
98
98
|
|
99
99
|
member_action :reprocess, :method => :get do
|
100
|
-
|
100
|
+
begin
|
101
|
+
Effective::Asset.find(params[:id]).reprocess!
|
102
|
+
flash[:success] = "Successfully reprocessed asset"
|
103
|
+
rescue => e
|
104
|
+
flash[:danger] = "Unable to process asset: #{e.message}"
|
105
|
+
end
|
106
|
+
|
101
107
|
redirect_to admin_effective_assets_path
|
102
108
|
end
|
103
109
|
end
|
@@ -82,6 +82,8 @@ module Effective
|
|
82
82
|
asset.aws_acl = opts[:aws_acl]
|
83
83
|
asset[:data] = opts[:title]
|
84
84
|
|
85
|
+
asset.processed = true unless asset.image?
|
86
|
+
|
85
87
|
# If our S3 Uploader has any issue uploading/saving the asset, destroy the placeholder empty one
|
86
88
|
asset.save ? true : (asset.try(:destroy) and false)
|
87
89
|
end
|
@@ -57,7 +57,7 @@ module EffectiveAssetsS3Helper
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def signature
|
60
|
-
|
60
|
+
raise 'effective_assets config.aws_secret_access_key is blank. Please provide a value in config/initializers/effective_assets.rb' if @options[:aws_secret_access_key].blank?
|
61
61
|
|
62
62
|
Base64.encode64(
|
63
63
|
OpenSSL::HMAC.digest(
|
@@ -26,6 +26,8 @@
|
|
26
26
|
module ActsAsAssetBox
|
27
27
|
extend ActiveSupport::Concern
|
28
28
|
|
29
|
+
VALIDATION_KEYS = [:presence, :length, :inclusion, :private, :public]
|
30
|
+
|
29
31
|
module ActiveRecord
|
30
32
|
def acts_as_asset_box(*options)
|
31
33
|
@acts_as_asset_box_opts = options || []
|
@@ -50,10 +52,40 @@ module ActsAsAssetBox
|
|
50
52
|
boxes.each do |box, validation|
|
51
53
|
self.send(:define_method, box) { effective_assets(box) }
|
52
54
|
|
53
|
-
|
55
|
+
# So we want to support 2 kinds of syntax here
|
56
|
+
# Syntax 1:
|
57
|
+
# acts_as_asset_box files: true # Presence
|
58
|
+
# acts_as_asset_box files: false # Nothing
|
59
|
+
# acts_as_asset_box files: 2 # Exactly 2 files
|
60
|
+
# acts_as_asset_box files: 5..10 # 5 to 10 photos
|
61
|
+
# acts_as_asset_box files: :private # AWS ACL private
|
62
|
+
# acts_as_asset_box files: :public # AWS ACL private
|
63
|
+
#
|
64
|
+
# Syntax 2:
|
65
|
+
# acts_as_asset_box files: [presence: true, length: 5..2, private: true], another: :private
|
66
|
+
|
67
|
+
if validation == true || validation == :presence
|
54
68
|
validates box, :asset_box_presence => true
|
55
69
|
elsif validation.kind_of?(Integer) or validation.kind_of?(Range)
|
56
70
|
validates box, :asset_box_length => validation
|
71
|
+
elsif validation == :private || validation == :public
|
72
|
+
# Do nothing
|
73
|
+
else
|
74
|
+
validations = Array(validation).first
|
75
|
+
|
76
|
+
if validations.kind_of?(Hash) != true
|
77
|
+
raise 'invalid parameters passed to acts_as_asset_box. Example Usage: acts_as_asset_box photos: [presence: true, length: 1..3, private: true]'
|
78
|
+
elsif (validations.keys - VALIDATION_KEYS).present?
|
79
|
+
raise "invalid key #{validations.keys - VALIDATION_KEYS} passed to acts_as_asset_box. Valid keys are: #{VALIDATION_KEYS}"
|
80
|
+
end
|
81
|
+
|
82
|
+
if validations[:presence]
|
83
|
+
validates box, :asset_box_presence => true
|
84
|
+
end
|
85
|
+
|
86
|
+
if validations[:length] || validations[:inclusion]
|
87
|
+
validates box, :asset_box_length => (validations[:length] || validations[:inclusion])
|
88
|
+
end
|
57
89
|
end
|
58
90
|
end
|
59
91
|
else
|
@@ -181,23 +181,17 @@ module Effective
|
|
181
181
|
end
|
182
182
|
|
183
183
|
def process!
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
data.cache_stored_file!
|
189
|
-
data.retrieve_from_cache!(data.cache_name)
|
190
|
-
data.recreate_versions!
|
191
|
-
save!
|
192
|
-
|
193
|
-
Rails.logger.info "Successfully processed ##{id}"
|
194
|
-
print "success"; puts ''
|
195
|
-
true
|
196
|
-
rescue => e
|
197
|
-
Rails.logger.info "Error: #{id} -> #{e.to_s}"
|
198
|
-
print "error: #{e.to_s}"; puts ''
|
199
|
-
false
|
184
|
+
if data.respond_to?(:aws_acl) && aws_acl.present?
|
185
|
+
data.aws_acl = self.aws_acl
|
186
|
+
data.versions.each { |_, data| data.aws_acl = self.aws_acl }
|
200
187
|
end
|
188
|
+
|
189
|
+
data.cache_stored_file!
|
190
|
+
data.retrieve_from_cache!(data.cache_name)
|
191
|
+
data.recreate_versions!
|
192
|
+
|
193
|
+
self.processed = true
|
194
|
+
save!
|
201
195
|
end
|
202
196
|
alias_method :reprocess!, :process!
|
203
197
|
|
@@ -242,11 +236,10 @@ module Effective
|
|
242
236
|
end
|
243
237
|
|
244
238
|
def enqueue_delayed_job
|
245
|
-
if !
|
246
|
-
Effective::DelayedJob.new.process_asset(
|
239
|
+
if !processed? && upload_file.present? && upload_file != 'placeholder'
|
240
|
+
Effective::DelayedJob.new.process_asset(id)
|
247
241
|
end
|
248
242
|
end
|
249
|
-
|
250
243
|
end
|
251
244
|
|
252
245
|
class AssetStringIO < StringIO
|
@@ -49,7 +49,19 @@ module Effective
|
|
49
49
|
handle_asynchronously :process_asset
|
50
50
|
|
51
51
|
def reprocess_asset(id)
|
52
|
-
|
52
|
+
Rails.logger.info "Processing ##{id}..."
|
53
|
+
print "Processing ##{id}..."
|
54
|
+
|
55
|
+
begin
|
56
|
+
Effective::Asset.find(id).reprocess!
|
57
|
+
|
58
|
+
Rails.logger.info "Successfully processed ##{id}"
|
59
|
+
print "success"; puts ''
|
60
|
+
rescue => e
|
61
|
+
Rails.logger.info "Error: #{id} -> #{e.to_s}"
|
62
|
+
print "error: #{e.to_s}"; puts ''
|
63
|
+
end
|
64
|
+
|
53
65
|
(GC.start rescue nil)
|
54
66
|
end
|
55
67
|
handle_asynchronously :reprocess_asset
|
@@ -157,7 +157,6 @@ module Inputs
|
|
157
157
|
:dialog_url => @template.effective_assets.effective_assets_path,
|
158
158
|
:disabled => false,
|
159
159
|
:file_types => [:any],
|
160
|
-
:aws_acl => EffectiveAssets.aws_acl,
|
161
160
|
:btn_label => "Upload..."
|
162
161
|
}.merge(opts).tap do |options|
|
163
162
|
options[:method] = method.to_s
|
@@ -165,6 +164,28 @@ module Inputs
|
|
165
164
|
options[:attachable_id] ||= (@object.try(:id) rescue nil)
|
166
165
|
options[:attachable_type] ||= @object.class.name.titleize.gsub(" ", "_").gsub('/', '_').downcase
|
167
166
|
|
167
|
+
# The logic for the AWS ACL is such that:
|
168
|
+
# 1.) If the :private or :aws_acl keys are set on the asset_box input, use those values
|
169
|
+
# 2.) If the :private or :public keys are set on the acts_as_asset_box declaration, use those values
|
170
|
+
# 3.) Fall back to default EffectiveAssets.aws_acl as per config file
|
171
|
+
|
172
|
+
uploader_private = (opts[:private] == true || opts[:public] == false || opts[:aws_acl] == EffectiveAssets::AWS_PRIVATE)
|
173
|
+
uploader_public = (opts[:private] == false || opts[:public] == true || opts[:aws_acl] == EffectiveAssets::AWS_PUBLIC)
|
174
|
+
object_private = ((@object.asset_boxes[method] == :private || @object.asset_boxes[method].first[:private] == true || @object.asset_boxes[method].first[:public] == false) rescue false)
|
175
|
+
object_public = ((@object.asset_boxes[method] == :public || @object.asset_boxes[method].first[:public] == true || @object.asset_boxes[method].first[:private] == false) rescue false)
|
176
|
+
|
177
|
+
if uploader_private
|
178
|
+
options[:aws_acl] = EffectiveAssets::AWS_PRIVATE
|
179
|
+
elsif uploader_public
|
180
|
+
options[:aws_acl] = EffectiveAssets::AWS_PUBLIC
|
181
|
+
elsif object_private
|
182
|
+
options[:aws_acl] = EffectiveAssets::AWS_PRIVATE
|
183
|
+
elsif object_public
|
184
|
+
options[:aws_acl] = EffectiveAssets::AWS_PUBLIC
|
185
|
+
else
|
186
|
+
options[:aws_acl] = EffectiveAssets.aws_acl
|
187
|
+
end
|
188
|
+
|
168
189
|
options[:uid] = "#{options[:attachable_type]}-#{options[:attachable_id]}-#{options[:method]}-#{Time.zone.now.to_f}".parameterize
|
169
190
|
options[:limit] = (options[:method] == options[:box] ? (options[:limit] || 10000) : 1)
|
170
191
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_assets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.7.
|
4
|
+
version: 1.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|