pushfile 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f5c2dc724ebfa455539c3017ba2a78f09ec5c7e9
4
+ data.tar.gz: d38a730ac57a7fffec72458afca9bd3e1da2bc02
5
+ SHA512:
6
+ metadata.gz: b2e7d9724aa09aea4a650ceb9326be8329a9295470a512a8124e200cb28e72b6c07f20f295aabd4a339c3f7c0ff3e2614d3ce0274299670478e66707d8b79c13
7
+ data.tar.gz: a70eff1d81494c37b5f4c5ed69fdd1eed3fb099b3667bc8ba954be190fb5c5dadf2b5ced016ef5b540792e6a11ce1e96e95c508c546b3df931da276a0053c2e3
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ config/pushfile.yml
2
+ .bundle
3
+ Gemfile.lock
data/CHANGELOG.md ADDED
File without changes
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'rerun'
7
+ gem 'rb-fsevent'
8
+ gem 'terminal-notifier'
9
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016 Fugroup
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # Pushfile Cloud File Uploader
2
+ Upload files to Rackspace Cloud or Amazon S3 by URL or file with automatic image resizing.
3
+
4
+ ### Installation
5
+ ```
6
+ gem install pushfile
7
+ ```
8
+ or add to Gemfile.
9
+
10
+ ### Settings
11
+ ```ruby
12
+ # The settings are stored in ./config/pushfile.yml
13
+ @settings = YAML.load_file(File.join(Dir.pwd, 'config', 'pushfile.yml')).deep_symbolize_keys
14
+
15
+ # The provider, amazon or rackspace
16
+ @provider = 'amazon'
17
+
18
+ # Mode, default is development
19
+ @mode = ENV['RACK_ENV'] || 'development'
20
+
21
+ # Debug
22
+ Pushfile.debug = false
23
+ ```
24
+ Create a config/pushfile.yml for your settings.
25
+
26
+ See [the example pushfile.yml](https://github.com/fugroup/pushfile/blob/master/config/pushfile.yml) for an example.
27
+
28
+ ### Usage
29
+ For more examples have a look at [the tests for Pushfile.](https://github.com/fugroup/pushfile/blob/master/test/upload_test.rb)
30
+ ```ruby
31
+ # Require pushfile if not using Bundler
32
+ require 'pushfile'
33
+
34
+ # Create an upload
35
+ u = Pushfile::Upload.new
36
+
37
+ # Actually upload file
38
+ u.create
39
+
40
+ # Get uploaded url with data
41
+ u.status # => Hash with urls and data
42
+
43
+ # Remove file from CDN
44
+ u.destroy(url)
45
+ ```
46
+
47
+ Created and maintained by [Fugroup Ltd.](https://www.fugroup.net) We are the creators of [CrowdfundHQ.](https://crowdfundhq.com)
48
+
49
+ `@authors: Vidar`
data/config.ru ADDED
@@ -0,0 +1,15 @@
1
+ Encoding.default_external = Encoding::UTF_8
2
+ Encoding.default_internal = Encoding::UTF_8
3
+
4
+ # Init the app
5
+ require './config/boot.rb'
6
+ require './app.rb'
7
+
8
+ # Set up middleware stack
9
+ app = Rack::Builder.new do
10
+ use Fuprint::Request
11
+ use Rack::PostBodyContentTypeParser
12
+ run App
13
+ end
14
+
15
+ run app
@@ -0,0 +1,23 @@
1
+ module Pushfile
2
+ module Amazon
3
+
4
+ # Set up amazon
5
+ def amazon
6
+ Fog::Storage.new(
7
+ :provider => 'AWS',
8
+ :aws_access_key_id => Pushfile.settings[:amazon_key],
9
+ :aws_secret_access_key => Pushfile.settings[:amazon_secret]
10
+ )
11
+ end
12
+
13
+ # Amazon cdn
14
+ def amazon_cdn
15
+ "#{Pushfile.settings[:amazon_cdn]}/#{Pushfile.settings[:amazon_container]}"
16
+ end
17
+
18
+ # Amazon container
19
+ def amazon_container
20
+ Pushfile.settings[:amazon_container]
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ module Pushfile
2
+ module Rackspace
3
+
4
+ # Set up rackspace
5
+ def rackspace
6
+ Fog::Storage.new(
7
+ :provider => 'Rackspace',
8
+ :rackspace_username => Pushfile.settings[:rackspace_username],
9
+ :rackspace_api_key => Pushfile.settings[:rackspace_key],
10
+ # Defaults to :dfw
11
+ :rackspace_region => :ord,
12
+ # :connection_options => {}
13
+ :rackspace_servicenet => @snet
14
+ )
15
+ end
16
+
17
+ # Rackspace cdn
18
+ def rackspace_cdn
19
+ Pushfile.settings[:rackspace_cdn]
20
+ end
21
+
22
+ # Rackspace container
23
+ def rackspace_container
24
+ Pushfile.settings[:rackspace_container]
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,71 @@
1
+ module Pushfile
2
+ module Data
3
+
4
+ # Setup methods.
5
+ # Currently ajax uploads, froala uploads and url uploads are supported.
6
+
7
+ # Set up data
8
+ def setup_data
9
+ # Fetch the image into a tempfile, and store
10
+ if @options['url']
11
+ url_upload
12
+
13
+ elsif @options['filename']
14
+ ajax_upload
15
+
16
+ # Do the froala file uploads
17
+ elsif @options['file']
18
+ froala_upload
19
+
20
+ end
21
+ end
22
+
23
+ # Ajax upload
24
+ def ajax_upload
25
+ filename = @options['filename']
26
+ type = @options['mimetype']
27
+ file = @options[:tempfile] || "/tmp/upload-#{filename}"
28
+
29
+ # Pass stream (typically request.body) to read chunks
30
+ if @options[:stream]
31
+ File.open(file, 'w') do |f|
32
+ f.binmode
33
+ while buffer = @options[:stream].read(51200)
34
+ f << buffer
35
+ end
36
+ end
37
+ end
38
+
39
+ {:filename => filename, :tempfile => File.new(file), :type => type}
40
+ end
41
+
42
+ # Froala upload
43
+ def froala_upload
44
+ tmpfile = @options['file'][:tempfile]
45
+ filename = @options['file'][:filename]
46
+ type = @options['file'][:type]
47
+
48
+ {:filename => filename, :tempfile => tmpfile, :type => type}
49
+ end
50
+
51
+ # URL upload
52
+ def url_upload
53
+ url = @options['url'].strip
54
+
55
+ file = Tempfile.new('tmp').tap do |file|
56
+ file.binmode # must be in binary mode
57
+ file.write RestClient.get(url)
58
+ file.rewind
59
+ end
60
+
61
+ filename = url.split('/').last
62
+ extension = filename.split('.').last.downcase rescue ''
63
+
64
+ # Mime type
65
+ type = Rack::Mime.mime_type(".#{extension}")
66
+
67
+ {:filename => filename, :type => type, :tempfile => file}
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,42 @@
1
+ module Pushfile
2
+ module Resize
3
+
4
+ autoload :MiniMagick, 'mini_magick'
5
+
6
+ # Resize file. Keeping aspect ratio.
7
+ def resize!
8
+ begin
9
+ image = MiniMagick::Image.open(@file.path)
10
+ image.resize("#{@width}x#{@height}")
11
+ rescue MiniMagick::Invalid
12
+ # Skip if file type can't be resized
13
+ rescue
14
+ # Pass on any error
15
+ else
16
+ image.write(@file.path) rescue nil
17
+ end
18
+ end
19
+
20
+ # Create thumbnail, same name but with _thumb at the end
21
+ def thumbnail!
22
+ begin
23
+ image = MiniMagick::Image.open(@file.path)
24
+ image.resize("#{Pushfile.settings[:images][:thumb][:width]}x")
25
+ rescue MiniMagick::Invalid
26
+ # Skip if file type can't be resized
27
+ @thumb = nil
28
+ Mailer.new.system_message("#{@file.path} #{@file.size}", "Can't resize").deliver rescue nil
29
+ rescue
30
+ @thumb = nil
31
+ Mailer.new.system_message("#{@file.path} #{@file.size}", "File not found or something else").deliver rescue nil
32
+ else
33
+ t = @name.split('.')
34
+ ext = t.pop
35
+ @thumb = t.join(".").concat("_thumb.#{ext}")
36
+
37
+ image.write("/tmp/#{@thumb}") rescue @thumb = nil
38
+ end
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,115 @@
1
+ module Pushfile
2
+ class Upload
3
+
4
+ include Pushfile::Data
5
+ include Pushfile::Resize
6
+ include Pushfile::Util
7
+ include Pushfile::Rackspace
8
+ include Pushfile::Amazon
9
+
10
+ # Image regexp
11
+ IMAGE_REGEX = /^.+(\.(jpg|jpeg|png|gif|bmp))$/i
12
+
13
+ attr_accessor :provider, :file, :timestamp, :name, :thumb, :type, :cdn, :container, :max, :status, :service, :width, :height, :data
14
+
15
+ def initialize(o = {})
16
+ # Set provider
17
+ @provider = o[:provider] || Pushfile.provider || 'amazon'
18
+
19
+ # Extract config
20
+ config = o.delete(:config) || :default
21
+
22
+ # Default options
23
+ o = {
24
+ :cdn => send("#{@provider}_cdn"),
25
+ :container => send("#{@provider}_container"),
26
+ :max => Pushfile.settings[:upload_limit],
27
+ :snet => Pushfile.mode == 'production',
28
+ :provider => @provider,
29
+ }.merge(o)
30
+
31
+ # Merge image config
32
+ o.merge!(Pushfile.settings[:images][config]) rescue nil
33
+
34
+ # Storing options
35
+ @options = o
36
+ @type = o[:type]
37
+ @cdn = o[:cdn]
38
+ @container = o[:container]
39
+ @snet = o[:snet]
40
+ @max = o[:max]
41
+ @width = o[:width]
42
+ @height = o[:height]
43
+ begin
44
+ @service = send(o[:provider])
45
+ rescue
46
+ @status = {:error => 'upload_cant_connect_to_cdn'}
47
+ end
48
+ @data = setup_data
49
+ end
50
+
51
+ # Create upload
52
+ def create
53
+ if @data.is_a?(String)
54
+ @file = File.open(@data)
55
+ @name = filename(@data)
56
+ else
57
+ @file = @data[:tempfile]
58
+ @name = filename(@data[:filename])
59
+ end
60
+
61
+ # Check if it's more than max or return error
62
+ if @max and @file.size > @max
63
+ return (@status = {:error => 'upload_file_size_is_too_big'})
64
+ end
65
+
66
+ # Resize file and create thumbnail for image
67
+ if @name =~ IMAGE_REGEX
68
+ resize! if @width or @height
69
+ thumbnail!
70
+ end
71
+
72
+ # Store timestamp and type
73
+ @timestamp = @data[:timestamp].nil? ? Time.now.to_i.to_s : @data[:timestamp].to_s
74
+ @type = @data[:type]
75
+
76
+ begin
77
+ # Upload file
78
+ @service.directories.new(:key => @container).files.create(
79
+ :content_type => @type,
80
+ :key => (@timestamp ? "#{@timestamp}_#{@name}" : @name),
81
+ :body => @file
82
+ )
83
+
84
+ # Upload thumbnail
85
+ if @thumb
86
+ @service.directories.new(:key => @container).files.create(
87
+ :content_type => @type,
88
+ :key => "#{@timestamp}_#{@thumb}",
89
+ :body => File.open("/tmp/#{@thumb}")
90
+ )
91
+ # Delete thumb file
92
+ File.delete("/tmp/#{@thumb}")
93
+ end
94
+ rescue => x
95
+ # Can't connect, report exception.
96
+ @status = {:error => 'upload_cant_connect_to_cdn'}
97
+
98
+ else
99
+ thumb_url = @thumb ? "#{@cdn}/#{@timestamp}_#{@thumb}" : nil
100
+ @status = {:url => "#{@cdn}/#{@timestamp}_#{@name}", :thumb_url => thumb_url, :size => @file.size, :mimetype => @type}
101
+ @status
102
+ end
103
+ end
104
+
105
+ # Destroy
106
+ def destroy(key)
107
+ begin
108
+ @service.directories.new(:key => @container).files.new(:key => key).destroy
109
+ rescue
110
+ @status = {:error => 'upload_cant_connect_to_cdn'}
111
+ end
112
+ end
113
+
114
+ end
115
+ end
@@ -0,0 +1,19 @@
1
+ module Pushfile
2
+ module Util
3
+
4
+ # Make sure the file name is valid
5
+ def filename(name)
6
+ # Replace space with underscore and downcase extension
7
+ pre, dot, ext = name.rpartition('.')
8
+ name = "#{pre.gsub(' ', '_')}.#{ext.downcase}"
9
+
10
+ # Remove illegal characters
11
+ # http://stackoverflow.com/questions/13517100/whats-the-difference-between-palpha-i-and-pl-i-in-ruby
12
+ name = name.gsub(%r{[^\p{L}\-\_\.0-9]}, '')
13
+
14
+ name
15
+ end
16
+
17
+
18
+ end
19
+ end
data/lib/pushfile.rb ADDED
@@ -0,0 +1,33 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require 'fog/rackspace'
4
+ require 'fog/aws'
5
+ require 'yaml'
6
+
7
+ # Pushfile Cloud File Upload with Image Resizing
8
+ # @homepage: https://github.com/fugroup/pushfile
9
+ # @author: Vidar <vidar@fugroup.net>, Fugroup Ltd.
10
+ # @license: MIT, contributions are welcome.
11
+ module Pushfile
12
+ class << self; attr_accessor :settings, :provider, :mode, :debug; end
13
+
14
+ # The settings are stored in ./config/pushfile.yml
15
+ @settings = YAML.load_file(File.join(Dir.pwd, 'config', 'pushfile.yml')).deep_symbolize_keys
16
+
17
+ # The provider, amazon or rackspace
18
+ @provider = 'amazon'
19
+
20
+ # Mode, default is development
21
+ @mode = ENV['RACK_ENV'] || 'development'
22
+
23
+ # Debug option
24
+ @debug = false
25
+
26
+ end
27
+
28
+ require_relative 'pushfile/data'
29
+ require_relative 'pushfile/resize'
30
+ require_relative 'pushfile/util'
31
+ require_relative 'providers/amazon'
32
+ require_relative 'providers/rackspace'
33
+ require_relative 'pushfile/upload'
data/pushfile.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'pushfile'
3
+ s.version = '0.0.1'
4
+ s.date = '2017-01-08'
5
+ s.summary = "Pushfile Cloud File Uploader"
6
+ s.description = "Upload files to Rackspace Cloud or Amazon S3 by URL or file with automatic image resizing."
7
+ s.authors = ["Fugroup Limited"]
8
+
9
+ s.add_runtime_dependency 'activesupport', '>= 0'
10
+ s.add_runtime_dependency 'fog-aws', '>= 0'
11
+ s.add_runtime_dependency 'fog-rackspace', '>= 0'
12
+ s.add_runtime_dependency 'mini_magick', '>= 0'
13
+
14
+ s.add_development_dependency 'sinatra', '>= 0'
15
+ s.add_development_dependency 'puma', '>= 0'
16
+ s.add_development_dependency 'erubis', '>= 0'
17
+ s.add_development_dependency 'futest', '>= 0'
18
+ s.add_development_dependency 'fuprint', '>= 0'
19
+ s.add_development_dependency 'rack-contrib', '>= 0'
20
+
21
+ s.email = 'mail@fugroup.net'
22
+ s.homepage = 'https://github.com/fugroup/pushfile'
23
+ s.license = 'MIT'
24
+
25
+ s.require_paths = ['lib']
26
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ f.match(%r{^(test|spec|features|config)/})
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,198 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pushfile
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Fugroup Limited
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: fog-aws
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fog-rackspace
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mini_magick
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sinatra
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: puma
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: erubis
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: futest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: fuprint
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rack-contrib
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Upload files to Rackspace Cloud or Amazon S3 by URL or file with automatic
154
+ image resizing.
155
+ email: mail@fugroup.net
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - CHANGELOG.md
162
+ - Gemfile
163
+ - LICENSE
164
+ - README.md
165
+ - config.ru
166
+ - lib/providers/amazon.rb
167
+ - lib/providers/rackspace.rb
168
+ - lib/pushfile.rb
169
+ - lib/pushfile/data.rb
170
+ - lib/pushfile/resize.rb
171
+ - lib/pushfile/upload.rb
172
+ - lib/pushfile/util.rb
173
+ - pushfile.gemspec
174
+ homepage: https://github.com/fugroup/pushfile
175
+ licenses:
176
+ - MIT
177
+ metadata: {}
178
+ post_install_message:
179
+ rdoc_options: []
180
+ require_paths:
181
+ - lib
182
+ required_ruby_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ required_rubygems_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ requirements: []
193
+ rubyforge_project:
194
+ rubygems_version: 2.6.8
195
+ signing_key:
196
+ specification_version: 4
197
+ summary: Pushfile Cloud File Uploader
198
+ test_files: []