stratosphere 0.0.1 → 0.0.2
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 +22 -6
- data/app/assets/javascripts/stratosphere/stratosphere.bundled.min.js +1 -1
- data/app/assets/javascripts/stratosphere/stratosphere.js +1 -0
- data/lib/stratosphere/attachment.rb +24 -12
- data/lib/stratosphere/aws.rb +12 -9
- data/lib/stratosphere/config.rb +16 -1
- data/lib/stratosphere/version.rb +1 -1
- metadata +7 -27
- data/test/dummy/log/test.log +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 132dc7d64cf9c7b22c4c7219c5e8c45872f7f526
|
4
|
+
data.tar.gz: 2cfb6ee61a0c920716a8492c48c3aa8bcb27fb31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
-
|
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
|
-
|
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
|
7
|
-
@name
|
8
|
-
@owner
|
9
|
-
@file_name
|
10
|
-
@file_size
|
11
|
-
@mime_type
|
12
|
-
@type
|
13
|
-
@file_store
|
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
|
data/lib/stratosphere/aws.rb
CHANGED
@@ -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 =
|
8
|
-
secret =
|
9
|
-
@region =
|
10
|
-
@bucket_name =
|
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
|
-
|
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
|
data/lib/stratosphere/config.rb
CHANGED
@@ -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
|
data/lib/stratosphere/version.rb
CHANGED
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.
|
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-
|
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.
|
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.
|
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:
|
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:
|
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
|
data/test/dummy/log/test.log
DELETED
File without changes
|