wetransfer 0.4.4 → 0.9.0.beta
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 +5 -5
- data/.rspec +1 -2
- data/.rubocop.yml +1 -1
- data/.travis.yml +3 -2
- data/Guardfile +11 -0
- data/README.md +81 -38
- data/V2_README.md +53 -0
- data/examples/create_collection.rb +13 -0
- data/examples/create_transfer.rb +1 -1
- data/lib/we_transfer_client.rb +86 -120
- data/lib/we_transfer_client/board_builder.rb +33 -0
- data/lib/we_transfer_client/boards.rb +74 -0
- data/lib/we_transfer_client/future_board.rb +32 -0
- data/lib/we_transfer_client/future_file.rb +28 -0
- data/lib/we_transfer_client/future_link.rb +28 -0
- data/lib/we_transfer_client/future_transfer.rb +11 -5
- data/lib/we_transfer_client/remote_board.rb +47 -0
- data/lib/we_transfer_client/remote_file.rb +55 -0
- data/lib/we_transfer_client/remote_link.rb +9 -0
- data/lib/we_transfer_client/remote_transfer.rb +24 -1
- data/lib/we_transfer_client/transfer_builder.rb +3 -10
- data/lib/we_transfer_client/transfers.rb +73 -0
- data/lib/we_transfer_client/version.rb +2 -2
- data/spec/board_integration_spec.rb +68 -0
- data/spec/features/add_items_to_board_spec.rb +55 -0
- data/spec/features/create_board_spec.rb +46 -0
- data/spec/features/get_board_spec.rb +34 -0
- data/spec/features/transfer_spec.rb +41 -0
- data/spec/fixtures/Japan-01.jpg +0 -0
- data/spec/fixtures/Japan-02.jpg +0 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/transfer_integration_spec.rb +54 -0
- data/spec/we_transfer_client/board_builder_spec.rb +66 -0
- data/spec/we_transfer_client/boards_spec.rb +56 -0
- data/spec/we_transfer_client/future_board_spec.rb +98 -0
- data/spec/we_transfer_client/future_file_spec.rb +48 -0
- data/spec/we_transfer_client/future_link_spec.rb +44 -0
- data/spec/we_transfer_client/future_transfer_spec.rb +30 -13
- data/spec/we_transfer_client/remote_board_spec.rb +92 -0
- data/spec/we_transfer_client/remote_file_spec.rb +91 -0
- data/spec/we_transfer_client/remote_link_spec.rb +33 -0
- data/spec/we_transfer_client/remote_transfer_spec.rb +101 -0
- data/spec/we_transfer_client/transfer_builder_spec.rb +48 -51
- data/spec/we_transfer_client/transfers_spec.rb +45 -0
- data/spec/we_transfer_client_spec.rb +51 -3
- data/wetransfer.gemspec +11 -5
- metadata +67 -27
- data/lib/we_transfer_client/future_file_item.rb +0 -16
- data/lib/we_transfer_client/future_web_item.rb +0 -18
- data/lib/we_transfer_client/remote_item.rb +0 -2
- data/spec/integration_spec.rb +0 -160
- data/spec/we_transfer_client/future_file_item_spec.rb +0 -39
- data/spec/we_transfer_client/future_web_item_spec.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7468f64daedd22e57348b1b49eda5ddafff70ece961d9df55d8ed65ac650215d
|
4
|
+
data.tar.gz: 2c3ac8123e0fb9fee36a03c9825bbc7eb6d32ce3aa25b00fa006c495e3c86e52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 764953ea92911bd49d59ce59f68a2286bd7c389c5522ca92876413559ff610099fd43c4c7b5e1c8baaf35d1d4d7ac967da19960a5c8b2306ea90fb526d35d337
|
7
|
+
data.tar.gz: cddcbb08cb73f71e4b3aa3ae40743822ec0158f03d2bd52e783758b761b8e05936305704149d4dd22270019e909b2c0334c76962bbf80e9a3c61c1a630adbcb2
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
inherit_gem:
|
2
|
-
wetransfer_style: ruby/default.yml
|
2
|
+
wetransfer_style: ruby/default.yml
|
data/.travis.yml
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
group :red_green_refactor, halt_on_fail: true do
|
2
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
3
|
+
watch(%r{^spec/.+_spec\.rb$})
|
4
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
5
|
+
end
|
6
|
+
|
7
|
+
guard :rubocop, cmd: 'bundle exec rubocop' do
|
8
|
+
watch(%r{^lib/(.+)\.rb$})
|
9
|
+
watch(%r{^spec/(.+)\.rb$})
|
10
|
+
end
|
11
|
+
end
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# WeTransfer Ruby SDK
|
2
2
|
|
3
|
-
|
3
|
+
The Ruby SDK that makes interacting with WeTransfer's Public API a breeze
|
4
|
+
|
5
|
+
This gem can be used to create transfers (as seen on WeTransfer.com) and boards (as seen in our [iOS app](https://itunes.apple.com/app/apple-store/id765359021?pt=10422800&ct=wetransfer-developer-portal&mt=8) and [Android app](https://play.google.com/store/apps/details?id=com.wetransfer.app.live&referrer=utm_source%3Dwetransfer%26utm_medium%3Ddeveloper-portal) ) alike.
|
4
6
|
|
5
7
|
For your API key and additional info please visit our [developer portal](https://developers.wetransfer.com).
|
6
8
|
|
@@ -9,12 +11,13 @@ For your API key and additional info please visit our [developer portal](https:/
|
|
9
11
|
## Table of Contents
|
10
12
|
|
11
13
|
1. [Installation](#installation)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
1. [Getting started](#getting-started)
|
15
|
+
1. [Transfers](#transfers)
|
16
|
+
1. [Boards](#boards)
|
17
|
+
1. [Development](#development)
|
18
|
+
1. [Contributing](#contributing)
|
19
|
+
1. [License](#license)
|
20
|
+
1. [Code of Conduct](#code-of-conduct)
|
18
21
|
|
19
22
|
## Installation
|
20
23
|
|
@@ -26,82 +29,122 @@ gem 'wetransfer'
|
|
26
29
|
|
27
30
|
And then execute:
|
28
31
|
|
29
|
-
|
32
|
+
bundle install
|
30
33
|
|
31
34
|
Or install it yourself as:
|
32
35
|
|
33
|
-
|
34
|
-
|
35
|
-
## Usage
|
36
|
+
gem install wetransfer
|
36
37
|
|
37
|
-
|
38
|
+
## Getting started
|
38
39
|
|
39
40
|
You'll need to retrieve an API key from [our developer portal](https://developers.wetransfer.com).
|
40
41
|
|
41
|
-
Be sure to not commit this key to Github! If you do though,
|
42
|
+
Be sure to not commit this key to Github! If you do though, you can always revoke it and create a new key from within the portal.
|
42
43
|
|
43
|
-
For configuring and storing secrets - like this API key - there are a variety of solutions. The smoothest here is creating a
|
44
|
+
For configuring and storing secrets - like this API key - there are a variety of solutions. The smoothest here is creating a `.env` file, and use a gem like [dotenv](https://github.com/bkeepers/dotenv).
|
44
45
|
|
45
46
|
Now that you've got a wonderful WeTransfer API key, create a .env file in your project folder:
|
46
47
|
|
47
|
-
|
48
|
+
touch .env
|
49
|
+
|
50
|
+
You don't want the contents of this file to leave your system. Ever.
|
51
|
+
|
52
|
+
If the `.env` file is new, make sure to add it to your `.gitignore`, using the following command:
|
53
|
+
|
54
|
+
echo .env >> .gitignore
|
48
55
|
|
49
|
-
|
56
|
+
Open the file in your text editor and add this line:
|
50
57
|
|
51
|
-
|
58
|
+
WT_API_KEY=<your api key>
|
52
59
|
|
53
|
-
|
60
|
+
Make sure to replace `<your api key>` by your actual api key. Don't include the pointy brackets!
|
54
61
|
|
55
|
-
Great! Now you can go to your project file and
|
62
|
+
Great! Now you can go to your project file and use the client.
|
63
|
+
|
64
|
+
## Transfers
|
65
|
+
|
66
|
+
A transfer is a collection of files that can be created once, and downloaded until it expires. Once a transfer is ready for sharing, it is closed for modifications.
|
56
67
|
|
57
68
|
```ruby
|
58
69
|
# In your project file:
|
59
70
|
require 'we_transfer_client'
|
60
71
|
|
61
|
-
|
72
|
+
client = WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
|
62
73
|
```
|
63
74
|
|
64
|
-
Now that you've got the client set up you can use `
|
75
|
+
Now that you've got the client set up you can use `create_transfer_and_upload_files` to, well, create a transfer, and upload all files!
|
65
76
|
|
66
77
|
```ruby
|
67
|
-
transfer =
|
78
|
+
transfer = client.create_transfer_and_upload_files(message: 'All the Things') do |upload|
|
68
79
|
upload.add_file_at(path: '/path/to/local/file.jpg')
|
69
80
|
upload.add_file_at(path: '/path/to/another/local/file.jpg')
|
70
|
-
upload.add_file(name: 'README.txt', io: StringIO.new("
|
71
|
-
upload.add_web_url(url: "https://www.the.url.you.want.to.share.com", title: "title of the url"))
|
81
|
+
upload.add_file(name: 'README.txt', io: StringIO.new("You should read All the Things!"))
|
72
82
|
end
|
73
83
|
|
74
|
-
transfer
|
84
|
+
# To get a link to your transfer, call `url` on your transfer object:
|
85
|
+
transfer.url => "https://we.tl/t-123234="
|
75
86
|
```
|
76
87
|
|
77
|
-
The upload will be performed at the end of the block.
|
88
|
+
The upload will be performed at the end of the block. Depending on your file sizes and network connection speed, this might take some time.
|
89
|
+
|
90
|
+
What are you waiting for? Open that link in your browser! Chop chop.
|
91
|
+
|
92
|
+
## Boards
|
93
|
+
|
94
|
+
A board is a collection of files and links, but it is open for modifications. Like your portfolio: While working, you can make adjustments to it. A board is a fantastic place for showcasing your work in progress.
|
95
|
+
|
96
|
+
Boards need a WeTransfer Client to be present, just like transfers.
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
# In your project file:
|
100
|
+
require 'we_transfer_client'
|
101
|
+
|
102
|
+
client = WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
|
103
|
+
```
|
104
|
+
|
105
|
+
After you create your client, you can
|
106
|
+
|
107
|
+
### Create a board and upload items
|
108
|
+
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
board = client.create_board(name: 'Meow', description: 'On Cats') do |items|
|
112
|
+
items.add_file(name: 'big file.jpg', io: File.open('/path/to/huge_file.jpg', 'rb')items.add_file_at(path: '/path/to/another/file.txt')
|
113
|
+
items.add_web_url(url: 'http://wepresent.wetransfer.com', title: 'Time well spent')
|
114
|
+
end
|
115
|
+
|
116
|
+
puts board.url # => "https://we.tl/b-923478"
|
117
|
+
```
|
118
|
+
|
119
|
+
You've just created a board. It is visible on the internet, to share it with anyone.
|
78
120
|
|
79
121
|
## Development
|
122
|
+
|
80
123
|
You'll need to retrieve an API key from [our developer portal](https://developers.wetransfer.com), and as described above, store it in a local `.env` file. As always, do not commit this file to github! :)
|
81
124
|
|
82
125
|
After forking and cloning down the repo, run `bundle install` to install dependencies. Then, run `bundle exec rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
83
126
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
$ bundle install
|
88
|
-
```
|
127
|
+
git clone <your fork> ./wetransfer_ruby_sdk
|
128
|
+
cd wetransfer_ruby_sdk
|
129
|
+
bundle install
|
89
130
|
|
90
131
|
To install this gem onto your local machine, run `bundle exec rake install`.
|
91
132
|
|
92
133
|
To execute to ruby specs, run:
|
93
134
|
|
94
|
-
|
95
|
-
$ bundle exec rspec
|
96
|
-
```
|
135
|
+
bundle exec rspec
|
97
136
|
|
98
137
|
Please note that we use rubocop to lint this gem -- be sure to run it prior to submitting a PR for maximum mergeability.
|
99
138
|
|
100
|
-
|
139
|
+
bundle exec rubocop
|
140
|
+
|
141
|
+
If any violations can be handled by rubocop, you can run auto-fix and it'll handle them for you, though do run the tests again and make sure it hasn't done something... unexpected.
|
142
|
+
|
143
|
+
bundle exec rubocop -a
|
101
144
|
|
102
|
-
|
145
|
+
For more convenience you also can run Guard, this checks all the tests and runs rubocop every time you save your files.
|
103
146
|
|
104
|
-
|
147
|
+
bundle exec guard
|
105
148
|
|
106
149
|
Hooray!
|
107
150
|
|
@@ -115,4 +158,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
115
158
|
|
116
159
|
## Code of Conduct
|
117
160
|
|
118
|
-
Everyone interacting in the WeTransfer Ruby SDK project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/WeTransfer/wetransfer_ruby_sdk/blob/master/.github/CODE_OF_CONDUCT.md).
|
161
|
+
Everyone interacting in the WeTransfer Ruby SDK project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/WeTransfer/wetransfer_ruby_sdk/blob/master/.github/CODE_OF_CONDUCT.md).
|
data/V2_README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
The process
|
2
|
+
|
3
|
+
In the v2 version of the Ruby SDK we have added a new feature, mutable transfers called boards.
|
4
|
+
|
5
|
+
Boards excists next to the transfers and will be mutable, so you can add new files or web_links to your board.
|
6
|
+
|
7
|
+
|
8
|
+
To use the ruby sdk you have to Initailize a new client with your API-Key:
|
9
|
+
|
10
|
+
```
|
11
|
+
client = WeTransfer::Client.new(api_key: 'your-special-api-key')
|
12
|
+
```
|
13
|
+
|
14
|
+
### Initailize a Board
|
15
|
+
|
16
|
+
Once you created that new client you can call methods to create a new board, empty or as a block:
|
17
|
+
|
18
|
+
```
|
19
|
+
board = client.create_board(name: 'File Collection', description: 'A collection of files')
|
20
|
+
```
|
21
|
+
or:
|
22
|
+
```
|
23
|
+
board = client.create_board(name: 'Dog Collection', description: 'A collection of dogs') do |item|
|
24
|
+
item.add_file(name: 'dalmatian.jpg', io: File.open('path/to/dalmatian.jpg', 'r'))
|
25
|
+
item.add_file(name: 'beagle.jpg', io: File.open('path/to/beagle.jpg', 'r'))
|
26
|
+
item.add_file(name: 'great_dane.jpg', io: File.open('path/to/great_dane.jpg', 'r'))
|
27
|
+
item.add_web_url(url: 'http://www.wetransfer.com', title: 'WeTransfer Website')
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
31
|
+
### Initialize a Transfer
|
32
|
+
|
33
|
+
For initializing a transfer the process is like this:
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
transfer = @client.create_transfer(name: "Dog transfer", description: "Have a look at my dogs") do |upload|
|
37
|
+
upload.add_file(name: 'chihuahua.jpg', io: File.open('path/to/chihuahua.jpg', 'r'))
|
38
|
+
upload.add_file(name: 'chow_chow.jpg', io: File.open('path/to/chow_chow.jpg', 'r'))
|
39
|
+
end
|
40
|
+
|
41
|
+
transfer.shortened_url => "https://we.tl/SSBsb3ZlIHJ1Ynk="
|
42
|
+
```
|
43
|
+
|
44
|
+
Note: For initializing a transfer you have to pass all the files directly so the backend knows what you are uploading.
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
### uploading the files
|
49
|
+
|
50
|
+
For both the transfer and board, the files are not in you transfer or collection, yet.
|
51
|
+
|
52
|
+
The files need to be uploaded and finalized
|
53
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative 'we_transfer_client'
|
2
|
+
require 'dotenv'
|
3
|
+
Dotenv.load
|
4
|
+
|
5
|
+
client = WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
|
6
|
+
transfer = client.create_transfer(name: 'My amazing transfer', description: 'Hi there!') do |builder|
|
7
|
+
builder.add_file(name: File.basename(__FILE__), io: File.open(__FILE__, 'rb'))
|
8
|
+
builder.add_file(name: 'amazing.txt', io: StringIO.new('This is unbelievable'))
|
9
|
+
builder.add_file(name: 'huge.bin', io: File.open('/path/to/local/file.jpg', 'rb'))
|
10
|
+
builder.add_file_at(path: __FILE__)
|
11
|
+
end
|
12
|
+
|
13
|
+
puts transfer.shortened_url
|
data/examples/create_transfer.rb
CHANGED
@@ -2,7 +2,7 @@ require_relative 'we_transfer_client'
|
|
2
2
|
require 'dotenv'
|
3
3
|
Dotenv.load
|
4
4
|
|
5
|
-
client =
|
5
|
+
client = WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
|
6
6
|
transfer = client.create_transfer(name: 'My amazing transfer', description: 'Hi there!') do |builder|
|
7
7
|
builder.add_file(name: File.basename(__FILE__), io: File.open(__FILE__, 'rb'))
|
8
8
|
builder.add_file(name: 'amazing.txt', io: StringIO.new('This is unbelievable'))
|
data/lib/we_transfer_client.rb
CHANGED
@@ -1,142 +1,108 @@
|
|
1
1
|
require 'faraday'
|
2
2
|
require 'logger'
|
3
|
-
require 'ks'
|
4
|
-
require 'securerandom'
|
5
3
|
require 'json'
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
def create_transfer(name:, description:)
|
30
|
-
builder = TransferBuilder.new
|
31
|
-
yield(builder)
|
32
|
-
future_transfer = FutureTransfer.new(name: name, description: description, items: builder.items)
|
33
|
-
create_and_upload(future_transfer)
|
34
|
-
end
|
35
|
-
|
36
|
-
def create_empty_transfer(name:, description:)
|
37
|
-
future_transfer = FutureTransfer.new(name: name, description: description, items: [])
|
38
|
-
create_and_upload(future_transfer)
|
39
|
-
end
|
40
|
-
|
41
|
-
def create_and_upload(xfer)
|
42
|
-
authorize_if_no_bearer_token!
|
43
|
-
response = faraday.post(
|
44
|
-
'/v1/transfers',
|
45
|
-
JSON.pretty_generate(xfer.to_create_transfer_params),
|
46
|
-
auth_headers.merge('Content-Type' => 'application/json')
|
47
|
-
)
|
48
|
-
ensure_ok_status!(response)
|
49
|
-
create_transfer_response = JSON.parse(response.body, symbolize_names: true)
|
50
|
-
|
51
|
-
remote_transfer = hash_to_struct(create_transfer_response, RemoteTransfer)
|
52
|
-
remote_transfer.items = remote_transfer.items.map do |remote_item_hash|
|
53
|
-
hash_to_struct(remote_item_hash, RemoteItem)
|
5
|
+
require_relative 'we_transfer_client/version'
|
6
|
+
require_relative 'we_transfer_client/transfer_builder'
|
7
|
+
require_relative 'we_transfer_client/board_builder'
|
8
|
+
require_relative 'we_transfer_client/future_file'
|
9
|
+
require_relative 'we_transfer_client/future_link'
|
10
|
+
require_relative 'we_transfer_client/future_transfer'
|
11
|
+
require_relative 'we_transfer_client/future_board'
|
12
|
+
require_relative 'we_transfer_client/remote_transfer'
|
13
|
+
require_relative 'we_transfer_client/remote_board'
|
14
|
+
require_relative 'we_transfer_client/remote_link'
|
15
|
+
require_relative 'we_transfer_client/remote_file'
|
16
|
+
require_relative 'we_transfer_client/transfers'
|
17
|
+
require_relative 'we_transfer_client/boards'
|
18
|
+
|
19
|
+
module WeTransfer
|
20
|
+
class Client
|
21
|
+
include WeTransfer::Client::Transfers
|
22
|
+
include WeTransfer::Client::Boards
|
23
|
+
|
24
|
+
class Error < StandardError
|
54
25
|
end
|
55
26
|
|
56
|
-
|
57
|
-
|
58
|
-
create_transfer_response.fetch(:items).each do |remote_item|
|
59
|
-
local_item = item_id_map.fetch(remote_item.fetch(:local_identifier))
|
60
|
-
next unless local_item.is_a?(FutureFileItem)
|
61
|
-
remote_item_id = remote_item.fetch(:id)
|
27
|
+
NULL_LOGGER = Logger.new(nil)
|
62
28
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
29
|
+
def initialize(api_key:, logger: NULL_LOGGER)
|
30
|
+
@api_url_base = 'https://dev.wetransfer.com'
|
31
|
+
@api_key = api_key.to_str
|
32
|
+
@bearer_token = nil
|
33
|
+
@logger = logger
|
34
|
+
end
|
69
35
|
|
70
|
-
|
71
|
-
|
72
|
-
'{}',
|
73
|
-
auth_headers.merge('Content-Type' => 'application/json')
|
74
|
-
)
|
75
|
-
ensure_ok_status!(complete_response)
|
36
|
+
def upload_file(object:, file:, io:)
|
37
|
+
put_io_in_parts(object: object, file: file, io: io)
|
76
38
|
end
|
77
|
-
remote_transfer
|
78
|
-
end
|
79
39
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
struct_class.new(**struct_attrs)
|
84
|
-
end
|
40
|
+
def complete_file!(object:, file:)
|
41
|
+
object.prepare_file_completion(client: self, file: file)
|
42
|
+
end
|
85
43
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
response = JSON.parse(response.body, symbolize_names: true)
|
44
|
+
def check_for_file_duplicates(files, new_file)
|
45
|
+
if files.select { |file| file.name == new_file.name }.size != 1
|
46
|
+
raise ArgumentError, 'Duplicate file entry'
|
47
|
+
end
|
48
|
+
end
|
92
49
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
50
|
+
def put_io_in_parts(object:, file:, io:)
|
51
|
+
(1..file.multipart.part_numbers).each do |part_n_one_based|
|
52
|
+
upload_url, chunk_size = object.prepare_file_upload(client: self, file: file, part_number: part_n_one_based)
|
53
|
+
part_io = StringIO.new(io.read(chunk_size))
|
54
|
+
part_io.rewind
|
55
|
+
response = faraday.put(
|
56
|
+
upload_url,
|
57
|
+
part_io,
|
58
|
+
'Content-Type' => 'binary/octet-stream',
|
59
|
+
'Content-Length' => part_io.size.to_s
|
60
|
+
)
|
61
|
+
ensure_ok_status!(response)
|
62
|
+
end
|
63
|
+
{success: true, message: 'File Uploaded'}
|
98
64
|
end
|
99
|
-
end
|
100
65
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
66
|
+
def faraday
|
67
|
+
Faraday.new(@api_url_base) do |c|
|
68
|
+
c.response :logger, @logger
|
69
|
+
c.adapter Faraday.default_adapter
|
70
|
+
c.headers = { 'User-Agent' => "WetransferRubySdk/#{WeTransfer::VERSION} Ruby #{RUBY_VERSION}"}
|
71
|
+
end
|
106
72
|
end
|
107
|
-
end
|
108
73
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
74
|
+
def authorize_if_no_bearer_token!
|
75
|
+
return if @bearer_token
|
76
|
+
response = faraday.post('/v2/authorize', '{}', 'Content-Type' => 'application/json', 'X-API-Key' => @api_key)
|
77
|
+
ensure_ok_status!(response)
|
78
|
+
@bearer_token = JSON.parse(response.body, symbolize_names: true)[:token]
|
79
|
+
if @bearer_token.nil? || @bearer_token.empty?
|
80
|
+
raise Error, "The authorization call returned #{response.body} and no usable :token key could be found there"
|
81
|
+
end
|
116
82
|
end
|
117
|
-
end
|
118
83
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
84
|
+
def auth_headers
|
85
|
+
raise 'No bearer token retrieved yet' unless @bearer_token
|
86
|
+
{
|
87
|
+
'X-API-Key' => @api_key,
|
88
|
+
'Authorization' => ('Bearer %s' % @bearer_token),
|
89
|
+
}
|
90
|
+
end
|
126
91
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
92
|
+
def ensure_ok_status!(response)
|
93
|
+
case response.status
|
94
|
+
when 200..299
|
95
|
+
true
|
96
|
+
when 400..499
|
97
|
+
@logger.error response
|
98
|
+
raise Error, "Response had a #{response.status} code, the server will not accept this request even if retried"
|
99
|
+
when 500..504
|
100
|
+
@logger.error response
|
101
|
+
raise Error, "Response had a #{response.status} code, we could retry"
|
102
|
+
else
|
103
|
+
@logger.error response
|
104
|
+
raise Error, "Response had a #{response.status} code, no idea what to do with that"
|
105
|
+
end
|
140
106
|
end
|
141
107
|
end
|
142
108
|
end
|