pushfile 0.0.1

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 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: []