swift_file 0.0.2 → 0.0.3
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.
- data/README.md +12 -8
- data/bin/swift_file +32 -13
- data/lib/swift_file.rb +0 -1
- data/lib/swift_file/swift_upload.rb +56 -29
- data/lib/swift_file/version.rb +1 -1
- data/spec/swift_file_spec.rb +4 -3
- data/swift_file.gemspec +2 -1
- metadata +20 -4
data/README.md
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
# SwiftFile
|
2
2
|
|
3
|
-
|
3
|
+
This gem provides an interface for uploading files to the [SwiftFile](https://www.swiftfile.net) service. There is support for uploading via the command line via the supplied executable `swift_file` as well as a basic API for adding support to your own classes.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
|
7
|
+
Most likely you will want to simply install the gem:
|
8
|
+
|
9
|
+
$ gem install swift_file
|
10
|
+
|
11
|
+
Or to use this in your projects, add this line to your application's Gemfile:
|
8
12
|
|
9
13
|
gem 'swift_file'
|
10
14
|
|
@@ -12,13 +16,13 @@ And then execute:
|
|
12
16
|
|
13
17
|
$ bundle
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
$ gem install swift_file
|
18
|
-
|
19
|
-
## Usage
|
19
|
+
## Command-line Usage
|
20
|
+
`swift_file -h`
|
20
21
|
|
21
|
-
|
22
|
+
Usage: swift_file [options] file1 file2 ...
|
23
|
+
-g, --group GROUP Add this file to a group
|
24
|
+
-e, --expires EXPIRY Set the length of time until this file expires [1m 1w 1d 1h]
|
25
|
+
-p[PASSWORD] Supply a password to encrypt the file.
|
22
26
|
|
23
27
|
## Contributing
|
24
28
|
|
data/bin/swift_file
CHANGED
@@ -1,38 +1,57 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require "optparse"
|
3
|
+
require "highline/import"
|
3
4
|
require "swift_file"
|
4
|
-
require "pp"
|
5
5
|
|
6
6
|
options = {}
|
7
7
|
|
8
8
|
optparse = OptionParser.new do|opts|
|
9
|
-
opts.banner = "Usage: swift_file [options]
|
9
|
+
opts.banner = "Usage: swift_file [options] file1 file2 ..."
|
10
10
|
|
11
11
|
options[:group] = nil
|
12
12
|
opts.on( '-g', '--group GROUP', 'Add this file to a group' ) do |group|
|
13
13
|
options[:group] = group
|
14
14
|
end
|
15
15
|
|
16
|
+
options[:expiry] = nil
|
17
|
+
opts.on( '-e', '--expires EXPIRY', "Set the length of time until this file expires [#{SwiftFile::SwiftUpload::SWIFTFILE_EXPIRY_OPTIONS.join(' ')}]" ) do |expiry|
|
18
|
+
options[:expiry] = expiry
|
19
|
+
end
|
20
|
+
|
16
21
|
options[:password] = nil
|
17
|
-
opts.on( '-p', '
|
18
|
-
options[:password] =
|
22
|
+
opts.on( '-p[PASSWORD]', 'Supply a password to encrypt the file.' ) do |password|
|
23
|
+
options[:password] = password
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
22
|
-
|
27
|
+
# Check if user has (correctly) supplied the -p flag without the password
|
28
|
+
password_opt_supplied = ARGV.include?('-p')
|
29
|
+
|
30
|
+
begin
|
31
|
+
optparse.parse!
|
32
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
|
33
|
+
puts "ERROR: #{e}"
|
34
|
+
end
|
35
|
+
|
36
|
+
if options[:password] == nil && password_opt_supplied
|
37
|
+
# FIXME: highline is not behaving on my installation, and
|
38
|
+
# disabling echo causes an infinte loop of errors
|
39
|
+
options[:password] = ask("Enter a password: ") # { |q| q.echo = false }
|
40
|
+
end
|
23
41
|
|
24
42
|
begin
|
43
|
+
if ARGV.empty?
|
44
|
+
raise "no files supplied"
|
45
|
+
end
|
25
46
|
|
26
|
-
|
47
|
+
sf = SwiftFile::SwiftUpload.new(options)
|
27
48
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
:password => options[:password]
|
32
|
-
})
|
49
|
+
ARGV.each do |filepath|
|
50
|
+
sf.add_file File.new(filepath)
|
51
|
+
end
|
33
52
|
|
34
|
-
sf.
|
53
|
+
sf.transfer
|
35
54
|
puts sf.url
|
36
|
-
rescue
|
55
|
+
rescue => e
|
37
56
|
puts "ERROR: #{e}"
|
38
57
|
end
|
data/lib/swift_file.rb
CHANGED
@@ -2,56 +2,83 @@ require 'curb'
|
|
2
2
|
|
3
3
|
module SwiftFile
|
4
4
|
class SwiftUpload
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
SWIFTFILE_HOST = 'https://www.swiftfile.net'
|
6
|
+
SWIFTFILE_ENDPOINT = ''
|
7
|
+
SWIFTFILE_COOKIE = '/tmp/swift_file.cookie'
|
8
|
+
SWIFTFILE_EXPIRY_OPTIONS = %w(1m 1w 1d 1h)
|
9
|
+
SWIFTFILE_EXPIRY_DEFAULT = '1d'
|
8
10
|
|
9
|
-
attr_accessor :
|
11
|
+
attr_accessor :files, :group, :expiry, :url
|
10
12
|
|
11
13
|
def initialize(params)
|
12
|
-
|
13
|
-
|
14
|
+
@files = params[:files] || []
|
15
|
+
@group = params[:group] || ''
|
16
|
+
@password = params[:password] || ''
|
17
|
+
|
18
|
+
if params[:expiry] && SWIFTFILE_EXPIRY_OPTIONS.include?(params[:expiry])
|
19
|
+
@expiry = params[:expiry]
|
14
20
|
else
|
15
|
-
|
21
|
+
@expiry = SWIFTFILE_EXPIRY_DEFAULT
|
16
22
|
end
|
23
|
+
end
|
17
24
|
|
18
|
-
|
19
|
-
@
|
25
|
+
def add_file(file)
|
26
|
+
@files << file unless @files.include?(file)
|
20
27
|
end
|
21
28
|
|
29
|
+
def transfer
|
30
|
+
if @files.empty?
|
31
|
+
raise 'No files supplied for uploed'
|
32
|
+
end
|
33
|
+
|
34
|
+
# start a session by requesting the url via GET
|
35
|
+
begin
|
36
|
+
client.perform
|
37
|
+
rescue Curl::Err => e
|
38
|
+
raise "Connection failed: #{e}"
|
39
|
+
end
|
22
40
|
|
23
|
-
|
24
|
-
|
25
|
-
|
41
|
+
# post the file and capture the resulting url
|
42
|
+
begin
|
43
|
+
client.multipart_form_post = true
|
44
|
+
client.http_post(form)
|
26
45
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
Curl::PostField.content('file_group_expiration', '1m')
|
34
|
-
)
|
46
|
+
@url = client.last_effective_url
|
47
|
+
rescue Curl::Err => e
|
48
|
+
raise "Upload failed: #{e}"
|
49
|
+
ensure
|
50
|
+
client.close
|
51
|
+
end
|
35
52
|
|
36
|
-
@url = client.last_effective_url
|
37
53
|
@url
|
38
54
|
end
|
39
55
|
|
40
|
-
##
|
41
|
-
private
|
42
56
|
|
57
|
+
private
|
43
58
|
def client
|
44
59
|
if !@client
|
45
|
-
url = "#{
|
60
|
+
url = "#{SWIFTFILE_HOST}/#{SWIFTFILE_ENDPOINT}"
|
46
61
|
@client = Curl::Easy.new(url) do |curl|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
62
|
+
# curl.verbose= true
|
63
|
+
curl.follow_location = true
|
64
|
+
curl.enable_cookies = true
|
65
|
+
curl.cookiejar = SWIFTFILE_COOKIE
|
66
|
+
curl.cookiefile = SWIFTFILE_COOKIE
|
51
67
|
end
|
52
68
|
end
|
53
|
-
|
54
69
|
@client
|
55
70
|
end
|
71
|
+
|
72
|
+
def form
|
73
|
+
fields = []
|
74
|
+
@files.each_with_index do |file, idx|
|
75
|
+
fields << Curl::PostField.file("file#{idx+1}", "#{file.path}")
|
76
|
+
end
|
77
|
+
|
78
|
+
fields << Curl::PostField.content('file_group[name]', @group)
|
79
|
+
fields << Curl::PostField.content('file_group[password]', @password)
|
80
|
+
fields << Curl::PostField.content('file_group_expiration', @expiry)
|
81
|
+
fields
|
82
|
+
end
|
56
83
|
end
|
57
84
|
end
|
data/lib/swift_file/version.rb
CHANGED
data/spec/swift_file_spec.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe SwiftFile do
|
4
4
|
it "should be able to upload test file" do
|
5
5
|
f = File.new(File.dirname(__FILE__) + '/test_file.txt', 'rb')
|
6
|
-
|
6
|
+
files = Array[f]
|
7
|
+
sf = SwiftFile::SwiftUpload.new({:files => files})
|
7
8
|
|
8
|
-
sf.
|
9
|
+
sf.transfer
|
9
10
|
sf.url.should =~ /^https/
|
10
11
|
end
|
11
12
|
end
|
data/swift_file.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swift_file
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: highline
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.6'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.6'
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: curb
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +50,7 @@ dependencies:
|
|
34
50
|
requirements:
|
35
51
|
- - ! '>='
|
36
52
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0
|
53
|
+
version: '0'
|
38
54
|
type: :runtime
|
39
55
|
prerelease: false
|
40
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +58,7 @@ dependencies:
|
|
42
58
|
requirements:
|
43
59
|
- - ! '>='
|
44
60
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0
|
61
|
+
version: '0'
|
46
62
|
description: Upload a file to the SwiftFile service
|
47
63
|
email:
|
48
64
|
- mdeltito@contextllc.com
|