stratosphere 0.0.1 → 0.0.2

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: 905b59e0f027db766423f0a7ba6debedb8052106
4
- data.tar.gz: 965b81ddfed6656d877256ba47f7fa4da78a2f7c
3
+ metadata.gz: 132dc7d64cf9c7b22c4c7219c5e8c45872f7f526
4
+ data.tar.gz: 2cfb6ee61a0c920716a8492c48c3aa8bcb27fb31
5
5
  SHA512:
6
- metadata.gz: 9268320ede2866543b7321ea05ee1517698589538c13325d0746dc020035e269b658c5225f0065bb80aaed5d237b6eeea0477425a44f7db9456092eab952c1ac
7
- data.tar.gz: e412e68dbb9f1a548f0fd9976866b10a6af972d8869eb071659b6e8b0eb7159f5ac46cb132b8bed84d74b40a664380b4ea87a0cdbd1a84edbdd27ad8841e7a23
6
+ metadata.gz: 823104776ae55b0bf60cbb81dc617b85803caf1cdb0a7daf45922d0ea6d313afcea8b4a73d73da1781ba86dc46fd20bf235621b77f7b41da46db62267ffd66bf
7
+ data.tar.gz: 2028921a8023d78c0710b74f2ac68b37b5ef5da26f38ec76d72278db17792591a05ee2f3357fd5f4de70fc869d8de309a578a0c975b2c4aff232441bfe339a8c
data/README.md CHANGED
@@ -40,7 +40,7 @@ brew install imagemagick
40
40
  If your using **Ubuntu** or other **Debian** based Linux distros you can install ImageMagick with:
41
41
 
42
42
  ```bash
43
- sudo apt-get install -y ImageMagick libmagickwand-dev
43
+ sudo apt-get install -y imagemagick libmagickwand-dev
44
44
  ```
45
45
 
46
46
  If your using **Amazon Linux**, **CentOS**, **Red Hat**, or other **RPM** based Linux distros you can install ImageMagick with:
@@ -136,7 +136,21 @@ Stratosphere.configure do |config|
136
136
  end
137
137
  ```
138
138
 
139
- To add a directory prefix to provide Stratosphere better, global insight to where your attachments will be stored in your S3 bucket you can add `config.dir_prefix = 'path/to/attachments'` to the `Stratosphere.configure` block above. Also if you are using Cloudfront to serve assets in you S3 bucket you can change the `config.domain` option to your CloudFront domain name or CNAME.
139
+ You can also add specification configuration per each Stratosphere model like so:
140
+
141
+ ```ruby
142
+ class Post < ActiveRecord::Base
143
+ # configuration options here will be merged with the global config
144
+ # from the Stratosphere initalizer.
145
+ has_attachment :image, type: :image, config: {
146
+ aws: {
147
+ s3_bucket: 'a-different-bucket-name'
148
+ }
149
+ }
150
+ end
151
+ ```
152
+
153
+ To add a directory prefix to provide Stratosphere a better, global insight to where your attachments will be stored in your S3 bucket you can add `config.dir_prefix = 'path/to/attachments'` to the `Stratosphere.configure` block above. Also if you are using Cloudfront to serve assets in you S3 bucket you can change the `config.domain` option to your CloudFront domain name or CNAME.
140
154
 
141
155
  ##### Attachment URLs
142
156
 
@@ -197,7 +211,7 @@ end
197
211
  ##### Image Cropping
198
212
 
199
213
  To crop your image attachment first make sure that you have at least one style set in your Model's `has_attachment` method. Cropping can be done simply making a PATCH request with the following parameters to the relative controller's `update` method:
200
-
214
+
201
215
  ```javascript
202
216
  {
203
217
  crop_params: [x, y, width, height]
@@ -245,10 +259,12 @@ end
245
259
 
246
260
  ## Example
247
261
 
248
- Coming Soon!
262
+ <a href="http://stratosphere.zacharygolba.com" target="_blank">Check out a live production RoR App with different attachment demonstrations.</a>
263
+
264
+ The source code for the example app is <a href="https://github.com/zacharygolba/stratosphere-demo" target="_blank">available here</a>.
249
265
 
250
266
  ## To Do
251
-
267
+
252
268
  - [ ] Better tests
253
269
  - [ ] Multiple attachment support per each ActiveRecord Model
254
270
  - [ ] Add additional cloud service providers (Google Cloud Storage, Azure Storage Box, Zencoder Video Encoding)
@@ -259,4 +275,4 @@ Coming Soon!
259
275
  2. Create your feature branch (`git checkout -b my-new-feature`)
260
276
  3. Commit your changes (`git commit -am 'Add some feature'`)
261
277
  4. Push to the branch (`git push origin my-new-feature`)
262
- 5. Create a new Pull Request
278
+ 5. Create a new Pull Request
@@ -28,4 +28,4 @@ window&&!window.InflectionJS&&(window.InflectionJS=null),InflectionJS={uncountab
28
28
  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29
29
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
30
  */
31
- window.Stratosphere=function(){"use strict";function e(e,t,n){var a=document.querySelectorAll("meta[name=csrf-token]")[0];this.file=null,this.csrfToken=a?a.getAttribute("content"):"",this.modelId=t,this.modelName=e,this.attachmentName=n}return e.activate=function(){var t=jQuery('*[data-stratosphere-enabled="true"]');if(t.length>0){var n=new e(t.data("modelName"),t.data("modelId"),t.data("attachmentName")),a=t.find("input[type='file']"),o=function(e){if(e){var o=t.find(".upload-controls"),r=t.find(".upload-progress"),i=r.find(".progress-bar");o.css("display","none"),r.css("display","block"),n.upload(e,i[0]).then(function(e){var n=!!e&&e.hasOwnProperty("url")&&e.hasOwnProperty("name")&&e.hasOwnProperty("type");n&&(t.find(".current-attachment a").html(e.name),t.find(".current-attachment a").attr("href",e.url),/^image\/.+/g.test(e.type)&&t.find(".current-attachment img").attr("src",e.url)),o.css("display",""),r.css("display","none"),t.find(".current-attachment").css("display","inline-block"),t.find('*[data-stratosphere-action="delete"]').css("display",""),a.val(""),setTimeout(function(){i[0].setAttribute("aria-valuenow","0"),i[0].style.width=0},500)},function(e){console.log(e)})}else n.file=null};t.find("button").on("click",function(e){var o=jQuery(e.target);e.preventDefault(),"upload"===o.data("stratosphereAction")&&a.trigger("click"),"delete"===o.data("stratosphereAction")&&window.confirm("Are you sure you want to delete this attachment?")&&n.deleteAttachment().then(function(){t.find(".current-attachment").css("display","none"),t.find('*[data-stratosphere-action="delete"]').css("display","none")})}),a.on("change",function(){o(a[0].files[0])})}},e.deactivate=function(){var e=jQuery('*[data-stratosphere-enabled="true"]');e.length>0&&(e.find("input[type='file']").off("change"),e.find("button").off("click"))},e.prototype.getUploadUrl=function(){var e=this;return new RSVP.Promise(function(t,n){e.file?jQuery.ajax({type:"GET",url:"/"+e.modelName.pluralize()+"/"+e.modelId+"/edit",data:{file_name:e.file.name,content_type:e.file.type,content_length:e.file.size,stratosphere_submitted:!0},headers:{"X-CSRF-Token":e.csrfToken}}).done(function(e,a,o){o.status>=200&&o.status<400?e.hasOwnProperty("url")?t(e.url):n(null):n(o)}):n(null)})},e.prototype.upload=function(e,t){var n=this;return null===t&&(t=null),this.file=e,new RSVP.Promise(function(a,o){n.getUploadUrl().then(function(r){var i=new XMLHttpRequest;if(i.open("PUT",r,!0),i.setRequestHeader("Accept","*/*"),i.setRequestHeader("Content-Type",e.type),i.onload=function(){i.status>=200&&i.status<400?n.updateModel().then(function(e){e?a({url:r.split("?")[0],name:n.file.name,type:n.file.type}):o(null)},function(){o(null)}):o(null)},t&&i.upload){var l=jQuery(i.upload);l.on("progress",function(e){if(e.originalEvent.lengthComputable){var n=e.originalEvent.loaded/e.originalEvent.total*100;t.setAttribute("aria-valuenow",""+n),t.style.width=n+"%"}}),l.on("load",function(){l.off("progress"),l.off("load")})}i.send(e)},function(){o(null)})})},e.prototype.updateModel=function(){var e=this;return new RSVP.Promise(function(t,n){if(e.file){var a={stratosphere_submitted:!0};a[e.attachmentName+"_file"]=e.file.name,a[e.attachmentName+"_content_type"]=e.file.type,a[e.attachmentName+"_content_length"]=e.file.size,jQuery.ajax({type:"PATCH",url:"/"+e.modelName.pluralize()+"/"+e.modelId,data:a,headers:{"X-CSRF-Token":e.csrfToken,"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}}).done(function(e,a,o){o.status>=200&&o.status<400?t(!0):n(o)})}else n(!1)})},e.prototype.deleteAttachment=function(){var e=this;return new RSVP.Promise(function(t,n){var a={stratosphere_submitted:!0};a[e.attachmentName+"_file"]=null,a[e.attachmentName+"_content_type"]=null,a[e.attachmentName+"_content_length"]=null,jQuery.ajax({type:"PATCH",url:"/"+e.modelName.pluralize()+"/"+e.modelId,data:a,headers:{"X-CSRF-Token":e.csrfToken,"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}}).done(function(e,a,o){200===o.status?t(!0):n(o)})})},e}(),window.jQuery?window.Turbolinks?(jQuery(document).on("page:change",function(){Stratosphere.activate()}),jQuery(document).on("page:before-unload",function(){Stratosphere.deactivate()})):jQuery(document).ready(function(){Stratosphere.activate()}):console.error("jQuery not detected. Make sure you include stratosphere/main after jquery.");
31
+ window.Stratosphere=function(){"use strict";function e(e,t,n){var a=document.querySelectorAll("meta[name=csrf-token]")[0];this.file=null,this.csrfToken=a?a.getAttribute("content"):"",this.modelId=t,this.modelName=e,this.attachmentName=n}return e.activate=function(){var t=jQuery('*[data-stratosphere-enabled="true"]');if(t.length>0){var n=new e(t.data("modelName"),t.data("modelId"),t.data("attachmentName")),a=t.find("input[type='file']"),o=function(e){if(e){var o=t.find(".upload-controls"),r=t.find(".upload-progress"),i=r.find(".progress-bar");o.css("display","none"),r.css("display","block"),n.upload(e,i[0]).then(function(e){var n=!!e&&e.hasOwnProperty("url")&&e.hasOwnProperty("name")&&e.hasOwnProperty("type");n&&(t.find(".current-attachment a").html(e.name),t.find(".current-attachment a").attr("href",e.url),/^image\/.+/g.test(e.type)&&t.find(".current-attachment img").attr("src",e.url)),o.css("display",""),r.css("display","none"),t.find(".current-attachment").css("display","inline-block"),t.find('*[data-stratosphere-action="delete"]').css("display",""),a.val(""),setTimeout(function(){i[0].setAttribute("aria-valuenow","0"),i[0].style.width=0},500)},function(e){console.log(e)})}else n.file=null};t.find("button").on("click",function(e){var o=jQuery(e.target);e.preventDefault(),"upload"===o.data("stratosphereAction")&&a.trigger("click"),"delete"===o.data("stratosphereAction")&&window.confirm("Are you sure you want to delete this attachment?")&&n.deleteAttachment().then(function(){t.find(".current-attachment").css("display","none"),t.find('*[data-stratosphere-action="delete"]').css("display","none")})}),a.on("change",function(){o(a[0].files[0])})}},e.deactivate=function(){var e=jQuery('*[data-stratosphere-enabled="true"]');e.length>0&&(e.find("input[type='file']").off("change"),e.find("button").off("click"))},e.prototype.getUploadUrl=function(){var e=this;return new RSVP.Promise(function(t,n){e.file?jQuery.ajax({type:"GET",url:"/"+e.modelName.pluralize()+"/"+e.modelId+"/edit",data:{file_name:e.file.name,content_type:e.file.type,content_length:e.file.size,stratosphere_submitted:!0},headers:{"X-CSRF-Token":e.csrfToken}}).done(function(e,a,o){o.status>=200&&o.status<400?e.hasOwnProperty("url")?t(e.url):n(null):n(o)}):n(null)})},e.prototype.upload=function(e,t){var n=this;return null===t&&(t=null),this.file=e,new RSVP.Promise(function(a,o){n.getUploadUrl().then(function(r){var i=new XMLHttpRequest;if(i.open("PUT",r,!0),i.setRequestHeader("Accept","*/*"),i.setRequestHeader("Content-Type",e.type),i.setRequestHeader("x-amz-acl", "public-read"),i.onload=function(){i.status>=200&&i.status<400?n.updateModel().then(function(e){e?a({url:r.split("?")[0],name:n.file.name,type:n.file.type}):o(null)},function(){o(null)}):o(null)},t&&i.upload){var l=jQuery(i.upload);l.on("progress",function(e){if(e.originalEvent.lengthComputable){var n=e.originalEvent.loaded/e.originalEvent.total*100;t.setAttribute("aria-valuenow",""+n),t.style.width=n+"%"}}),l.on("load",function(){l.off("progress"),l.off("load")})}i.send(e)},function(){o(null)})})},e.prototype.updateModel=function(){var e=this;return new RSVP.Promise(function(t,n){if(e.file){var a={stratosphere_submitted:!0};a[e.attachmentName+"_file"]=e.file.name,a[e.attachmentName+"_content_type"]=e.file.type,a[e.attachmentName+"_content_length"]=e.file.size,jQuery.ajax({type:"PATCH",url:"/"+e.modelName.pluralize()+"/"+e.modelId,data:a,headers:{"X-CSRF-Token":e.csrfToken,"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}}).done(function(e,a,o){o.status>=200&&o.status<400?t(!0):n(o)})}else n(!1)})},e.prototype.deleteAttachment=function(){var e=this;return new RSVP.Promise(function(t,n){var a={stratosphere_submitted:!0};a[e.attachmentName+"_file"]=null,a[e.attachmentName+"_content_type"]=null,a[e.attachmentName+"_content_length"]=null,jQuery.ajax({type:"PATCH",url:"/"+e.modelName.pluralize()+"/"+e.modelId,data:a,headers:{"X-CSRF-Token":e.csrfToken,"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}}).done(function(e,a,o){200===o.status?t(!0):n(o)})})},e}(),window.jQuery?window.Turbolinks?(jQuery(document).on("page:change",function(){Stratosphere.activate()}),jQuery(document).on("page:before-unload",function(){Stratosphere.deactivate()})):jQuery(document).ready(function(){Stratosphere.activate()}):console.error("jQuery not detected. Make sure you include stratosphere/main after jquery.");
@@ -169,6 +169,7 @@ window.Stratosphere = function() {
169
169
 
170
170
  xhr.setRequestHeader('Accept', '*/*');
171
171
  xhr.setRequestHeader('Content-Type', file.type);
172
+ xhr.setRequestHeader('x-amz-acl', 'public-read');
172
173
 
173
174
  xhr.onload = function() {
174
175
  if ( xhr.status >= 200 && xhr.status < 400 ) {
@@ -2,22 +2,34 @@ module Stratosphere
2
2
  class Attachment
3
3
  attr_accessor :base_path, :config, :file_name, :name, :size, :mime_type, :type, :owner, :file_store
4
4
 
5
+ def self.create_config(options={})
6
+ config = Stratosphere.config.to_hash
7
+
8
+ unless options.nil?
9
+ unless options[:aws].nil?
10
+ options[:aws] = config[:aws].merge(options[:aws])
11
+ end
12
+ config.merge!(options)
13
+ end
14
+ Stratosphere::Config.new(config)
15
+ end
16
+
5
17
  def initialize(owner, name, options={})
6
- @config = Stratosphere.config
7
- @name = name
8
- @owner = owner
9
- @file_name = @owner["#{@name}_file"]
10
- @file_size = @owner["#{@name}_content_length"]
11
- @mime_type = @owner["#{@name}_content_type"]
12
- @type = :attachment
13
- @file_store = Stratosphere::AWS::S3.new
18
+ @config = self.class.create_config(options[:config])
19
+ @name = name
20
+ @owner = owner
21
+ @file_name = @owner["#{@name}_file"]
22
+ @file_size = @owner["#{@name}_content_length"]
23
+ @mime_type = @owner["#{@name}_content_type"]
24
+ @type = :attachment
25
+ @file_store = Stratosphere::AWS::S3.new(@config)
14
26
  set_base_path
15
27
  end
16
-
28
+
17
29
  def set_base_path
18
30
  plural_attr = name.to_s.pluralize
19
31
  plural_model = owner.class.to_s.downcase.pluralize
20
-
32
+
21
33
  if config.dir_prefix
22
34
  prefix = config.dir_prefix[-1, 1] == '/' ? config.dir_prefix.slice(0, -1) : config.dir_prefix
23
35
  @base_path = "#{prefix}/#{plural_model}/#{plural_attr}/#{owner.id}"
@@ -25,7 +37,7 @@ module Stratosphere
25
37
  @base_path = "#{plural_model}/#{plural_attr}/#{owner.id}"
26
38
  end
27
39
  end
28
-
40
+
29
41
  def exists?
30
42
  !file_name.nil?
31
43
  end
@@ -48,4 +60,4 @@ module Stratosphere
48
60
  file_store.delete_objects base_path
49
61
  end
50
62
  end
51
- end
63
+ end
@@ -2,19 +2,19 @@ module Stratosphere
2
2
  module AWS
3
3
  class S3
4
4
  attr_accessor :credentials, :resource, :region, :bucket_name, :presigner
5
-
6
- def initialize
7
- key = Stratosphere.config.aws[:access_key]
8
- secret = Stratosphere.config.aws[:secret]
9
- @region = Stratosphere.config.aws[:region]
10
- @bucket_name = Stratosphere.config.aws[:s3_bucket]
5
+
6
+ def initialize(config={})
7
+ key = config.aws[:access_key]
8
+ secret = config.aws[:secret]
9
+ @region = config.aws[:region]
10
+ @bucket_name = config.aws[:s3_bucket]
11
11
  @credentials = Aws::Credentials.new(key, secret)
12
12
  @resource = Aws::S3::Resource.new(credentials: @credentials, region: @region)
13
13
  @presigner = Aws::S3::Presigner.new(region: @region)
14
14
  Aws.config[:region] = @region
15
15
  Aws.config[:credentials] = @credentials
16
16
  end
17
-
17
+
18
18
  def bucket
19
19
  resource.bucket bucket_name
20
20
  end
@@ -30,7 +30,10 @@ module Stratosphere
30
30
  end
31
31
 
32
32
  def presigned_upload(options={})
33
- params = options.keep_if { |k,v| [:key, :content_type, :content_length].include? k }.merge!(bucket: bucket_name)
33
+ unless options.has_key?(:acl)
34
+ options = options.merge({:acl => "public-read"})
35
+ end
36
+ params = options.keep_if { |k,v| [:key, :content_type, :content_length, :acl, :cache_control].include? k }.merge!(bucket: bucket_name)
34
37
  presigner.presigned_url(:put_object, params)
35
38
  end
36
39
  end
@@ -47,4 +50,4 @@ module Stratosphere
47
50
  end
48
51
  end
49
52
  end
50
- end
53
+ end
@@ -1,5 +1,20 @@
1
1
  module Stratosphere
2
2
  class Config
3
3
  attr_accessor :aws, :cloud, :domain, :dir_prefix
4
+
5
+ def initialize(options={})
6
+ @aws = options[:aws]
7
+ @cloud = options[:cloud]
8
+ @domain = options[:domain]
9
+ @dir_prefix = options[:dir_prefix]
10
+ end
11
+
12
+ def to_hash
13
+ hash = {}
14
+ self.instance_variables.each do |attr|
15
+ hash[attr.to_s.delete('@').to_sym] = self.instance_variable_get(attr)
16
+ end
17
+ hash
18
+ end
4
19
  end
5
- end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module Stratosphere
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stratosphere
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zachary
@@ -9,15 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-11 00:00:00.000000000 Z
12
+ date: 2015-09-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ">="
19
- - !ruby/object:Gem::Version
20
- version: 4.0.0
21
18
  - - "~>"
22
19
  - !ruby/object:Gem::Version
23
20
  version: '4.0'
@@ -25,9 +22,6 @@ dependencies:
25
22
  prerelease: false
26
23
  version_requirements: !ruby/object:Gem::Requirement
27
24
  requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- version: 4.0.0
31
25
  - - "~>"
32
26
  - !ruby/object:Gem::Version
33
27
  version: '4.0'
@@ -35,9 +29,6 @@ dependencies:
35
29
  name: aws-sdk
36
30
  requirement: !ruby/object:Gem::Requirement
37
31
  requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 2.0.22
41
32
  - - "~>"
42
33
  - !ruby/object:Gem::Version
43
34
  version: '2.0'
@@ -45,9 +36,6 @@ dependencies:
45
36
  prerelease: false
46
37
  version_requirements: !ruby/object:Gem::Requirement
47
38
  requirements:
48
- - - ">="
49
- - !ruby/object:Gem::Version
50
- version: 2.0.22
51
39
  - - "~>"
52
40
  - !ruby/object:Gem::Version
53
41
  version: '2.0'
@@ -55,22 +43,16 @@ dependencies:
55
43
  name: rmagick
56
44
  requirement: !ruby/object:Gem::Requirement
57
45
  requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: 2.13.4
61
46
  - - "~>"
62
47
  - !ruby/object:Gem::Version
63
- version: '2.13'
48
+ version: '2.0'
64
49
  type: :runtime
65
50
  prerelease: false
66
51
  version_requirements: !ruby/object:Gem::Requirement
67
52
  requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: 2.13.4
71
53
  - - "~>"
72
54
  - !ruby/object:Gem::Version
73
- version: '2.13'
55
+ version: '2.0'
74
56
  description: In today's day and age we have Dropbox, Google Drive, iCloud, etc. Shouldn't
75
57
  file uploading and attachment handling be easier and alot faster in Ruby on Rails
76
58
  Applications? Stratosphere makes it easy to upload directly to cloud storage providers
@@ -145,7 +127,6 @@ files:
145
127
  - test/dummy/config/locales/en.yml
146
128
  - test/dummy/config/routes.rb
147
129
  - test/dummy/config/secrets.yml
148
- - test/dummy/log/test.log
149
130
  - test/dummy/public/404.html
150
131
  - test/dummy/public/422.html
151
132
  - test/dummy/public/500.html
@@ -153,7 +134,7 @@ files:
153
134
  - test/integration/navigation_test.rb
154
135
  - test/stratosphere_test.rb
155
136
  - test/test_helper.rb
156
- homepage: https://github.com/zacharygolba/stratosphere
137
+ homepage: http://stratosphere.zacharygolba.com
157
138
  licenses:
158
139
  - MIT
159
140
  metadata: {}
@@ -165,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
146
  requirements:
166
147
  - - ">="
167
148
  - !ruby/object:Gem::Version
168
- version: '0'
149
+ version: 2.0.0
169
150
  required_rubygems_version: !ruby/object:Gem::Requirement
170
151
  requirements:
171
152
  - - ">="
@@ -173,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
154
  version: '0'
174
155
  requirements: []
175
156
  rubyforge_project:
176
- rubygems_version: 2.4.5
157
+ rubygems_version: 2.4.5.1
177
158
  signing_key:
178
159
  specification_version: 4
179
160
  summary: Lightning fast, easy-to-use, magic attachment handling for Ruby on Rails
@@ -206,7 +187,6 @@ test_files:
206
187
  - test/dummy/config/routes.rb
207
188
  - test/dummy/config/secrets.yml
208
189
  - test/dummy/config.ru
209
- - test/dummy/log/test.log
210
190
  - test/dummy/public/404.html
211
191
  - test/dummy/public/422.html
212
192
  - test/dummy/public/500.html
File without changes