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.
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.1.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-07 00:00:00.000000000 Z
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.13'
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.13'
27
+ version: '0.15'
28
28
  - !ruby/object:Gem::Dependency
29
- name: dotenv
29
+ name: ks
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '2.2'
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: '2.2'
41
+ version: 0.0.1
42
42
  - !ruby/object:Gem::Dependency
43
- name: ks
43
+ name: dotenv
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: 0.0.1
49
- type: :runtime
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: 0.0.1
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
- - lib/wetransfer.rb
162
- - lib/wetransfer/client.rb
163
- - lib/wetransfer/connection.rb
164
- - lib/wetransfer/item.rb
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
@@ -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
@@ -1,14 +0,0 @@
1
- module WeTransfer
2
- class Item
3
- attr_accessor :id,
4
- :content_identifier,
5
- :local_identifier,
6
- :multipart_parts,
7
- :multipart_id,
8
- :name,
9
- :size,
10
- :upload_url,
11
- :upload_id,
12
- :path
13
- end
14
- end
@@ -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
@@ -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