wetransfer 0.1.0 → 0.2.0
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/.travis.yml +2 -3
- data/README.md +11 -35
- data/examples/create_transfer.rb +13 -0
- data/lib/we_transfer_client.rb +194 -0
- data/lib/we_transfer_client/version.rb +3 -0
- data/spec/integration_spec.rb +98 -0
- data/wetransfer.gemspec +5 -8
- metadata +15 -25
- data/lib/wetransfer.rb +0 -16
- data/lib/wetransfer/client.rb +0 -126
- data/lib/wetransfer/connection.rb +0 -77
- data/lib/wetransfer/item.rb +0 -14
- data/lib/wetransfer/item_builder.rb +0 -59
- data/lib/wetransfer/transfer.rb +0 -30
- data/lib/wetransfer/transfer_builder.rb +0 -28
- data/lib/wetransfer/version.rb +0 -3
- data/spec/client_spec.rb +0 -82
- data/spec/connection_spec.rb +0 -74
- data/spec/item_builder_spec.rb +0 -104
- data/spec/spec_helper.rb +0 -24
- data/spec/test_server.rb +0 -208
- data/spec/wetransfer_spec.rb +0 -7
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wetransfer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noah Berman
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-05-
|
12
|
+
date: 2018-05-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -17,42 +17,42 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '0.
|
20
|
+
version: '0.15'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '0.
|
27
|
+
version: '0.15'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: ks
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 0.0.1
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 0.0.1
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: dotenv
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
49
|
-
type: :
|
48
|
+
version: '2.2'
|
49
|
+
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: '2.2'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: bundler
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -158,20 +158,10 @@ files:
|
|
158
158
|
- Rakefile
|
159
159
|
- bin/console
|
160
160
|
- bin/setup
|
161
|
-
-
|
162
|
-
- lib/
|
163
|
-
- lib/
|
164
|
-
-
|
165
|
-
- lib/wetransfer/item_builder.rb
|
166
|
-
- lib/wetransfer/transfer.rb
|
167
|
-
- lib/wetransfer/transfer_builder.rb
|
168
|
-
- lib/wetransfer/version.rb
|
169
|
-
- spec/client_spec.rb
|
170
|
-
- spec/connection_spec.rb
|
171
|
-
- spec/item_builder_spec.rb
|
172
|
-
- spec/spec_helper.rb
|
173
|
-
- spec/test_server.rb
|
174
|
-
- spec/wetransfer_spec.rb
|
161
|
+
- examples/create_transfer.rb
|
162
|
+
- lib/we_transfer_client.rb
|
163
|
+
- lib/we_transfer_client/version.rb
|
164
|
+
- spec/integration_spec.rb
|
175
165
|
- wetransfer.gemspec
|
176
166
|
homepage: https://developers.wetransfer.com
|
177
167
|
licenses:
|
data/lib/wetransfer.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'json'
|
3
|
-
require 'dotenv'
|
4
|
-
Dotenv.load
|
5
|
-
|
6
|
-
require 'wetransfer/version'
|
7
|
-
require 'wetransfer/client'
|
8
|
-
require 'wetransfer/transfer'
|
9
|
-
require 'wetransfer/transfer_builder'
|
10
|
-
require 'wetransfer/item'
|
11
|
-
require 'wetransfer/item_builder'
|
12
|
-
require 'wetransfer/connection'
|
13
|
-
|
14
|
-
module WeTransfer
|
15
|
-
|
16
|
-
end
|
data/lib/wetransfer/client.rb
DELETED
@@ -1,126 +0,0 @@
|
|
1
|
-
module WeTransfer
|
2
|
-
class Client
|
3
|
-
attr_accessor :api_key
|
4
|
-
attr_reader :api_connection
|
5
|
-
CHUNK_SIZE = 6_291_456
|
6
|
-
|
7
|
-
# Initializes a new Client object
|
8
|
-
def initialize(api_key:)
|
9
|
-
@api_path = ENV.fetch('WT_API_CONNECTION_PATH') { '' }
|
10
|
-
@api_key = api_key
|
11
|
-
@api_bearer_token ||= request_jwt
|
12
|
-
@api_connection ||= WeTransfer::Connection.new(client: self, api_bearer_token: @api_bearer_token)
|
13
|
-
end
|
14
|
-
|
15
|
-
def request_jwt
|
16
|
-
# Create a connection request without a bearer token for authorization
|
17
|
-
# since authorization is what you need to do to retrieve the token.
|
18
|
-
auth_connection = WeTransfer::Connection.new(client: self)
|
19
|
-
auth_connection.authorization_request
|
20
|
-
end
|
21
|
-
|
22
|
-
# If you pass in items to the transfer it'll create the transfer with them,
|
23
|
-
# otherwise it creates a "blank" transfer object. You can also leave off the
|
24
|
-
# name and description, and it will be auto-generated.
|
25
|
-
def create_transfer(name: nil, description: nil, items: [])
|
26
|
-
raise ArgumentError, 'The items field must be an array' unless items.is_a?(Array)
|
27
|
-
@transfer = build_transfer_object(name, description).transfer
|
28
|
-
items.any? ? create_transfer_with_items(items: items) : create_initial_transfer
|
29
|
-
@transfer
|
30
|
-
end
|
31
|
-
|
32
|
-
# Once you've created a "blank" transfer you can use this to add items to it.
|
33
|
-
# Items must have the structure defined in the README, otherwise information will be auto-generated for them.
|
34
|
-
def add_items(transfer:, items:)
|
35
|
-
@transfer ||= transfer
|
36
|
-
create_transfer_items(items: items)
|
37
|
-
send_items_to_transfer
|
38
|
-
upload_and_complete_items
|
39
|
-
@transfer
|
40
|
-
end
|
41
|
-
|
42
|
-
def create_transfer_with_items(items: [])
|
43
|
-
raise ArgumentError, 'Items array cannot be empty' if items.empty?
|
44
|
-
create_transfer_items(items: items)
|
45
|
-
create_initial_transfer
|
46
|
-
upload_and_complete_items
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def build_transfer_object(name, description)
|
52
|
-
transfer_builder = TransferBuilder.new
|
53
|
-
transfer_builder.name_description(name: name, description: description)
|
54
|
-
transfer_builder
|
55
|
-
end
|
56
|
-
|
57
|
-
def create_transfer_items(items:)
|
58
|
-
items.each do |item|
|
59
|
-
item_builder = ItemBuilder.new
|
60
|
-
item_builder.path(path: item)
|
61
|
-
item_builder.content_identifier
|
62
|
-
item_builder.local_identifier
|
63
|
-
item_builder.name
|
64
|
-
item_builder.size
|
65
|
-
@transfer.items.push(item_builder.item)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def create_initial_transfer
|
70
|
-
response = @api_connection.post_request(path: '/transfers', body: @transfer.transfer_params)
|
71
|
-
TransferBuilder.id(transfer: @transfer, id: response['id'])
|
72
|
-
TransferBuilder.shortened_url(transfer: @transfer, url: response['shortened_url'])
|
73
|
-
update_item_objects(response_items: response['items']) if response['items'].any?
|
74
|
-
end
|
75
|
-
|
76
|
-
def send_items_to_transfer
|
77
|
-
response = @api_connection.post_request(path: "/transfers/#{@transfer.id}/items", body: {items: @transfer.items_params})
|
78
|
-
update_item_objects(response_items: response)
|
79
|
-
end
|
80
|
-
|
81
|
-
def update_item_objects(response_items:)
|
82
|
-
response_items.each do |item|
|
83
|
-
item_object = @transfer.items.select { |t| t.name == item['name'] }.first
|
84
|
-
item_builder = ItemBuilder.new(item: item_object)
|
85
|
-
item_builder.id(item: item_object, id: item['id'])
|
86
|
-
item_builder.upload_url(item: item_object, url: item['upload_url'])
|
87
|
-
item_builder.multipart_parts(item: item_object, part_count: item['meta']['multipart_parts'])
|
88
|
-
item_builder.multipart_id(item: item_object, multi_id: item['meta']['multipart_upload_id'])
|
89
|
-
item_builder.upload_id(item: item_object, upload_id: item['upload_id'])
|
90
|
-
add_item_upload_url(item: item_builder.item) if item_builder.item.multipart_parts > 1
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def add_item_upload_url(item:)
|
95
|
-
upload_urls = []
|
96
|
-
item.multipart_parts.times do |part|
|
97
|
-
part += 1
|
98
|
-
response = @api_connection.get_request(path: "/files/#{item.id}/uploads/#{part}/#{item.multipart_id}")
|
99
|
-
upload_urls << response['upload_url']
|
100
|
-
end
|
101
|
-
item.upload_url = upload_urls
|
102
|
-
end
|
103
|
-
|
104
|
-
def upload_and_complete_items
|
105
|
-
upload_files
|
106
|
-
complete_transfer
|
107
|
-
end
|
108
|
-
|
109
|
-
def upload_files
|
110
|
-
@transfer.items.each do |item|
|
111
|
-
file_object = File.open(item.path)
|
112
|
-
item.upload_url.each do |url|
|
113
|
-
chunk = file_object.read(CHUNK_SIZE)
|
114
|
-
@api_connection.upload(file: chunk, url: url)
|
115
|
-
end
|
116
|
-
file_object.close
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def complete_transfer
|
121
|
-
@transfer.items.each do |item|
|
122
|
-
@api_connection.post_request(path: "/files/#{item.id}/uploads/complete")
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
module WeTransfer
|
2
|
-
class Connection
|
3
|
-
class ApiRequestError < StandardError; end
|
4
|
-
|
5
|
-
attr_reader :api_connection, :api_bearer_token, :api_key, :api_path
|
6
|
-
|
7
|
-
def initialize(client:, api_bearer_token: '')
|
8
|
-
@api_url = ENV.fetch('WT_API_URL') { 'https://dev.wetransfer.com' }
|
9
|
-
@api_key = client.api_key
|
10
|
-
@api_connection ||= create_api_connection_object!
|
11
|
-
@api_bearer_token = api_bearer_token
|
12
|
-
@api_path = ENV.fetch('WT_API_CONNECTION_PATH') { '' }
|
13
|
-
end
|
14
|
-
|
15
|
-
def authorization_request
|
16
|
-
response = @api_connection.post do |req|
|
17
|
-
req.url("#{@api_path}/authorize")
|
18
|
-
request_header_params(req: req)
|
19
|
-
end
|
20
|
-
response_validation!(response: response)
|
21
|
-
response['token']
|
22
|
-
end
|
23
|
-
|
24
|
-
def post_request(path:, body: nil)
|
25
|
-
response = @api_connection.post do |req|
|
26
|
-
req.url(@api_path + path)
|
27
|
-
request_header_params(req: req)
|
28
|
-
req.body = body.to_json unless body.nil?
|
29
|
-
end
|
30
|
-
response_validation!(response: response)
|
31
|
-
JSON.parse(response.body)
|
32
|
-
end
|
33
|
-
|
34
|
-
def get_request(path:)
|
35
|
-
response = @api_connection.get do |req|
|
36
|
-
req.url(@api_path + path)
|
37
|
-
request_header_params(req: req)
|
38
|
-
end
|
39
|
-
response_validation!(response: response)
|
40
|
-
JSON.parse(response.body)
|
41
|
-
end
|
42
|
-
|
43
|
-
def upload(file:, url:)
|
44
|
-
conn = Faraday.new(url: url) do |faraday|
|
45
|
-
faraday.request :multipart
|
46
|
-
faraday.adapter :net_http
|
47
|
-
end
|
48
|
-
resp = conn.put do |req|
|
49
|
-
req.headers['Content-Length'] = file.size.to_s
|
50
|
-
req.body = file
|
51
|
-
end
|
52
|
-
response_validation!(response: resp)
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def request_header_params(req:)
|
58
|
-
req.headers['X-API-Key'] = @api_key
|
59
|
-
req.headers['Authorization'] = 'Bearer ' + @api_bearer_token unless @api_bearer_token.nil?
|
60
|
-
req.headers['Content-Type'] = 'application/json'
|
61
|
-
end
|
62
|
-
|
63
|
-
# If you need extra logging for your requests, switch it on by setting WT_API_LOGGING_ON in your .env file.
|
64
|
-
def create_api_connection_object!
|
65
|
-
conn = Faraday.new(url: @api_url) do |faraday|
|
66
|
-
faraday.response :logger if ENV.fetch('WT_API_LOGGING_ON') { nil } # log requests to STDOUT if ENVVAR is present
|
67
|
-
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
|
68
|
-
end
|
69
|
-
conn
|
70
|
-
end
|
71
|
-
|
72
|
-
def response_validation!(response:)
|
73
|
-
raise ApiRequestError, response.reason_phrase if response.status == 401
|
74
|
-
raise ApiRequestError, response.reason_phrase if response.status == 403
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
data/lib/wetransfer/item.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
module WeTransfer
|
2
|
-
class ItemBuilder
|
3
|
-
class FileDoesNotExistError < ArgumentError; end
|
4
|
-
attr_reader :item
|
5
|
-
|
6
|
-
def initialize(item: nil)
|
7
|
-
@item = if item.nil?
|
8
|
-
Item.new
|
9
|
-
else
|
10
|
-
item
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def path(path:)
|
15
|
-
@item.path = path
|
16
|
-
end
|
17
|
-
|
18
|
-
def content_identifier
|
19
|
-
@item.content_identifier = 'file'
|
20
|
-
end
|
21
|
-
|
22
|
-
def local_identifier
|
23
|
-
# only take the file name and shorten it to 36 characters if it's longer
|
24
|
-
@item.local_identifier = @item.path.split('/').last.gsub(' ', '')[0..35]
|
25
|
-
end
|
26
|
-
|
27
|
-
def name
|
28
|
-
@item.name = @item.path.split('/').last
|
29
|
-
end
|
30
|
-
|
31
|
-
def size
|
32
|
-
@item.size = File.size(@item.path)
|
33
|
-
end
|
34
|
-
|
35
|
-
def id(item:, id:)
|
36
|
-
item.id = id
|
37
|
-
end
|
38
|
-
|
39
|
-
def upload_url(item:, url:)
|
40
|
-
item.upload_url = [url]
|
41
|
-
end
|
42
|
-
|
43
|
-
def multipart_parts(item:, part_count:)
|
44
|
-
item.multipart_parts = part_count
|
45
|
-
end
|
46
|
-
|
47
|
-
def multipart_id(item:, multi_id:)
|
48
|
-
item.multipart_id = multi_id
|
49
|
-
end
|
50
|
-
|
51
|
-
def upload_id(item:, upload_id:)
|
52
|
-
item.upload_id = upload_id
|
53
|
-
end
|
54
|
-
|
55
|
-
def validate_file
|
56
|
-
raise FileDoesNotExistError, "#{@item} does not exist" unless File.exist?(@item.path)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
data/lib/wetransfer/transfer.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module WeTransfer
|
2
|
-
class Transfer
|
3
|
-
attr_accessor :id, :name, :description, :shortened_url, :items
|
4
|
-
|
5
|
-
def initialize
|
6
|
-
@items = []
|
7
|
-
end
|
8
|
-
|
9
|
-
def transfer_params
|
10
|
-
{
|
11
|
-
name: name,
|
12
|
-
description: description,
|
13
|
-
items: items_params
|
14
|
-
}
|
15
|
-
end
|
16
|
-
|
17
|
-
def items_params
|
18
|
-
transfer_items = []
|
19
|
-
items.each do |item|
|
20
|
-
transfer_items << {
|
21
|
-
local_identifier: item.local_identifier,
|
22
|
-
content_identifier: item.content_identifier,
|
23
|
-
filename: item.name,
|
24
|
-
filesize: item.size
|
25
|
-
}
|
26
|
-
end
|
27
|
-
transfer_items
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module WeTransfer
|
2
|
-
class TransferBuilder
|
3
|
-
def initialize(transfer: nil)
|
4
|
-
@transfer = if transfer.nil?
|
5
|
-
Transfer.new
|
6
|
-
else
|
7
|
-
transfer
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def name_description(name: nil, description: nil)
|
12
|
-
@transfer.name = name || "File Transfer: #{Time.now.strftime('%d-%m-%Y')}"
|
13
|
-
@transfer.description = description || 'Transfer generated with WeTransfer Ruby SDK'
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.id(transfer:, id:)
|
17
|
-
transfer.id = id
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.shortened_url(transfer:, url:)
|
21
|
-
transfer.shortened_url = url
|
22
|
-
end
|
23
|
-
|
24
|
-
def transfer
|
25
|
-
@transfer
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|