wetransfer 0.4.4 → 0.9.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +5 -5
  2. data/.rspec +1 -2
  3. data/.rubocop.yml +1 -1
  4. data/.travis.yml +3 -2
  5. data/Guardfile +11 -0
  6. data/README.md +81 -38
  7. data/V2_README.md +53 -0
  8. data/examples/create_collection.rb +13 -0
  9. data/examples/create_transfer.rb +1 -1
  10. data/lib/we_transfer_client.rb +86 -120
  11. data/lib/we_transfer_client/board_builder.rb +33 -0
  12. data/lib/we_transfer_client/boards.rb +74 -0
  13. data/lib/we_transfer_client/future_board.rb +32 -0
  14. data/lib/we_transfer_client/future_file.rb +28 -0
  15. data/lib/we_transfer_client/future_link.rb +28 -0
  16. data/lib/we_transfer_client/future_transfer.rb +11 -5
  17. data/lib/we_transfer_client/remote_board.rb +47 -0
  18. data/lib/we_transfer_client/remote_file.rb +55 -0
  19. data/lib/we_transfer_client/remote_link.rb +9 -0
  20. data/lib/we_transfer_client/remote_transfer.rb +24 -1
  21. data/lib/we_transfer_client/transfer_builder.rb +3 -10
  22. data/lib/we_transfer_client/transfers.rb +73 -0
  23. data/lib/we_transfer_client/version.rb +2 -2
  24. data/spec/board_integration_spec.rb +68 -0
  25. data/spec/features/add_items_to_board_spec.rb +55 -0
  26. data/spec/features/create_board_spec.rb +46 -0
  27. data/spec/features/get_board_spec.rb +34 -0
  28. data/spec/features/transfer_spec.rb +41 -0
  29. data/spec/fixtures/Japan-01.jpg +0 -0
  30. data/spec/fixtures/Japan-02.jpg +0 -0
  31. data/spec/spec_helper.rb +20 -0
  32. data/spec/transfer_integration_spec.rb +54 -0
  33. data/spec/we_transfer_client/board_builder_spec.rb +66 -0
  34. data/spec/we_transfer_client/boards_spec.rb +56 -0
  35. data/spec/we_transfer_client/future_board_spec.rb +98 -0
  36. data/spec/we_transfer_client/future_file_spec.rb +48 -0
  37. data/spec/we_transfer_client/future_link_spec.rb +44 -0
  38. data/spec/we_transfer_client/future_transfer_spec.rb +30 -13
  39. data/spec/we_transfer_client/remote_board_spec.rb +92 -0
  40. data/spec/we_transfer_client/remote_file_spec.rb +91 -0
  41. data/spec/we_transfer_client/remote_link_spec.rb +33 -0
  42. data/spec/we_transfer_client/remote_transfer_spec.rb +101 -0
  43. data/spec/we_transfer_client/transfer_builder_spec.rb +48 -51
  44. data/spec/we_transfer_client/transfers_spec.rb +45 -0
  45. data/spec/we_transfer_client_spec.rb +51 -3
  46. data/wetransfer.gemspec +11 -5
  47. metadata +67 -27
  48. data/lib/we_transfer_client/future_file_item.rb +0 -16
  49. data/lib/we_transfer_client/future_web_item.rb +0 -18
  50. data/lib/we_transfer_client/remote_item.rb +0 -2
  51. data/spec/integration_spec.rb +0 -160
  52. data/spec/we_transfer_client/future_file_item_spec.rb +0 -39
  53. data/spec/we_transfer_client/future_web_item_spec.rb +0 -39
@@ -1,3 +1,3 @@
1
- class WeTransferClient
2
- VERSION = '0.4.4'
1
+ module WeTransfer
2
+ VERSION = '0.9.0.beta'
3
3
  end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe WeTransfer::Client do
4
+ let(:small_file_name) { 'Japan-02.jpg' }
5
+ let(:big_file) { File.open(fixtures_dir + 'Japan-01.jpg', 'rb') }
6
+ let(:client) do
7
+ WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
8
+ end
9
+
10
+ it 'creates a board with files and web items as a block' do
11
+ # Create a board with three items, one small file, one multipart file, and one web url
12
+ board = client.create_board_and_upload_items(name: 'Test Board', description: 'Test description') do |b|
13
+ b.add_file(name: File.basename(__FILE__), io: File.open(__FILE__, 'rb'))
14
+ b.add_file(name: 'big file', io: big_file)
15
+ b.add_file_at(path: fixtures_dir + small_file_name)
16
+ b.add_web_url(url: 'http://www.wetransfer.com', title: 'WeTransfer Website')
17
+ end
18
+
19
+ # the board url is set
20
+ expect(board.url =~ %r|https://we.tl/b-|).to be_truthy
21
+
22
+ expect(board.items.map(&:class)).to eq([RemoteFile, RemoteFile, RemoteFile, RemoteLink])
23
+ expect(board.items[1].multipart.part_numbers).to be > 1
24
+ expect(board.items.count).to be(4)
25
+
26
+ # TODO: make these experimental steps public
27
+ # # Add two new items to the board, one small file and one web url
28
+ # client.add_items(board: board) do |b|
29
+ # b.add_file(name: File.basename(__FILE__), io: File.open(__FILE__, 'rb'))
30
+ # b.add_web_url(url: 'http://www.google.com', title: 'google')
31
+ # end
32
+ # expect(board.items.count).to be(6)
33
+
34
+ # # Check if the board includes 3 File items and 2 Link items
35
+ # expect(board.items.select { |i| i.type == 'file' }.count).to be(4)
36
+ # expect(board.items.select { |i| i.type == 'link' }.count).to be(2)
37
+
38
+ # # Upload the Files to the Board
39
+ # file_items = board.items.select { |i| i.type == 'file' }
40
+ # client.upload_file(object: board, file: file_items[0], io: File.open(__FILE__, 'rb'))
41
+ # client.upload_file(object: board, file: file_items[1], io: big_file)
42
+ # client.upload_file(object: board, file: file_items[2], io: File.open(fixtures_dir + small_file_name, 'rb'))
43
+ # client.upload_file(object: board, file: file_items[3], io: File.open(__FILE__, 'rb'))
44
+
45
+ # # Complete all the files of the board
46
+ # file_items.each do |item|
47
+ # client.complete_file!(object: board, file: item)
48
+ # end
49
+
50
+ # Do a get request to see if url is available
51
+ response = Faraday.get(board.url)
52
+
53
+ # that should redirect us...
54
+ expect(response.status).to eq(302)
55
+ # ... to a board in the wetransfer domain
56
+ expect(response['location']).to start_with('https://boards.wetransfer')
57
+
58
+ # Check for the Boards status to be downloadable
59
+ resulting_board = loop do
60
+ res = client.get_board(board: board)
61
+ break res if res.state != 'processing'
62
+ sleep 1
63
+ end
64
+
65
+ expect(resulting_board.state).to eq('downloadable')
66
+ expect(resulting_board.items.count).to be(4)
67
+ end
68
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe WeTransfer::Client::Boards do
4
+ let(:client) { WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY')) }
5
+ let(:board) do
6
+ client.create_board(name: 'Test Board', description: 'Test Descritpion')
7
+ end
8
+
9
+ describe '#add_items' do
10
+ before do
11
+ skip "this interface is still experimental"
12
+ end
13
+
14
+ it 'adds items to a board' do
15
+ client.add_items(board: board) do |b|
16
+ b.add_file(name: File.basename(__FILE__), io: File.open(__FILE__, 'rb'))
17
+ b.add_file_at(path: fixtures_dir + 'Japan-02.jpg')
18
+ b.add_web_url(url: 'http://www.google.com', title: 'google')
19
+ end
20
+ end
21
+
22
+ it 'fails when no block is given' do
23
+ expect {
24
+ client.add_items(board: board)
25
+ }.to raise_error ArgumentError, /No items/
26
+ end
27
+
28
+ it 'fails when no board is passed as keyword argument' do
29
+ expect {
30
+ client.add_items do |b|
31
+ b.add_file_at(path: fixtures_dir + 'Japan-01.jpg')
32
+ end
33
+ }.to raise_error ArgumentError, /board/
34
+ end
35
+
36
+ it 'fails when file is not found' do
37
+ expect {
38
+ client.add_items(board: board) do |b|
39
+ b.add_file(name: 'file_not_found.rb', io: File.open('/path/to/non-existent-file.rb', 'r'))
40
+ end
41
+ }.to raise_error Errno::ENOENT, /No such file/
42
+ end
43
+
44
+ it 'fails when board is not a existing remote board' do
45
+ new_board = RemoteBoard.new(id: 123456, state: 'proccessing', url: 'https://www.we.tl/123456', name: 'fake board')
46
+ expect {
47
+ client.add_items(board: new_board) do |b|
48
+ b.add_file(name: File.basename(__FILE__), io: File.open(__FILE__, 'rb'))
49
+ b.add_file_at(path: fixtures_dir + 'Japan-01.jpg')
50
+ b.add_web_url(url: 'http://www.google.com', title: 'google')
51
+ end
52
+ }.to raise_error WeTransfer::Client::Error, /404 code/
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe WeTransfer::Client::Boards do
4
+ let(:big_file) { File.open(fixtures_dir + 'Japan-01.jpg', 'r') }
5
+ let(:client) { WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY')) }
6
+
7
+ describe '#create_board' do
8
+ before {
9
+ skip "this interface is still experimental"
10
+ }
11
+
12
+ it 'creates a remote board' do
13
+ client.create_board(name: 'Test Board', description: 'Test Descritpion')
14
+ end
15
+
16
+ it 'creates a board with items' do
17
+ client.create_board(name: 'Test Board', description: 'Test descrition') do |b|
18
+ b.add_file(name: File.basename(__FILE__), io: File.open(__FILE__, 'rb'))
19
+ b.add_file(name: 'big file', io: big_file)
20
+ b.add_web_url(url: 'http://www.wetransfer.com', title: 'WeTransfer Website')
21
+ end
22
+ end
23
+
24
+ it 'fails when name is missing' do
25
+ expect {
26
+ client.create_board(name: '', description: 'Test Descritpion')
27
+ }.to raise_error WeTransfer::Client::Error, /400 code/
28
+ end
29
+
30
+ it 'fails when file path is wrong' do
31
+ expect {
32
+ client.create_board(name: 'Test Board', description: 'Test descrition') do |b|
33
+ b.add_file(name: 'file_not_found.rb', io: File.open('path/to/non-existing-file.rb', 'r'))
34
+ end
35
+ }.to raise_error Errno::ENOENT, /No such file/
36
+ end
37
+
38
+ it 'fails when file name is missing' do
39
+ expect {
40
+ client.create_board(name: 'Test Board', description: 'Test descrition') do |b|
41
+ b.add_file(name: '', io: File.open(__FILE__, 'rb'))
42
+ end
43
+ }.to raise_error WeTransfer::Client::Error, /400 code/
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe WeTransfer::Client::Boards do
4
+ let(:client) do
5
+ WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
6
+ end
7
+
8
+ let(:board) do
9
+ client.create_board(name: 'Test Board', description: 'Test Descritpion')
10
+ end
11
+
12
+ describe '#get_board' do
13
+ before do
14
+ skip "this interface is still experimental"
15
+ end
16
+
17
+ it 'it gets a exisiting board' do
18
+ client.get_board(board: board)
19
+ end
20
+
21
+ it 'fails when no board is given' do
22
+ expect {
23
+ client.get_board
24
+ }.to raise_error ArgumentError, /board/
25
+ end
26
+
27
+ it 'fails when board doenst exists' do
28
+ new_board = RemoteBoard.new(id: 123456, state: 'proccessing', url: 'https://www.we.tl/123456', name: 'fake board')
29
+ expect {
30
+ client.get_board(board: new_board)
31
+ }.to raise_error WeTransfer::Client::Error, /404 code/
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe WeTransfer::Client::Transfers do
4
+ let(:client) do
5
+ WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'), logger: test_logger)
6
+ end
7
+
8
+ let(:file_location) { fixtures_dir + 'Japan-02.jpg' }
9
+
10
+ let(:created_transfer) do
11
+ client.create_transfer(message: 'Test transfer') do |builder|
12
+ builder.add_file(name: File.basename(file_location), io: File.open(file_location, 'rb'))
13
+ end
14
+ end
15
+
16
+ describe "#create_transfer" do
17
+ before do
18
+ skip "this interface is still experimental"
19
+ end
20
+
21
+ it "is needed to add a file" do
22
+ expect { client.create_transfer(message: "Transfer name") }
23
+ .to raise_error(ArgumentError, /^No files were added/)
24
+ end
25
+
26
+ it "accepts a block to add files by their location" do
27
+ client.create_transfer(message: 'Test transfer') do |builder|
28
+ builder.add_file_at(path: file_location)
29
+ end
30
+ end
31
+
32
+ it "accepts a block to add files by their io" do
33
+ client.create_transfer(message: 'Test transfer') do |builder|
34
+ builder.add_file(name: File.basename(file_location), io: File.open(file_location, 'rb'))
35
+ end
36
+ end
37
+ end
38
+
39
+ describe "#complete_transfer"
40
+ describe "#get_transfer"
41
+ end
@@ -1,4 +1,6 @@
1
1
  require 'simplecov'
2
+ require 'securerandom'
3
+
2
4
  SimpleCov.start do
3
5
  add_filter '/spec/'
4
6
  end
@@ -12,8 +14,26 @@ require 'tempfile'
12
14
  require 'dotenv'
13
15
  Dotenv.load
14
16
 
17
+ module SpecHelpers
18
+ def fixtures_dir
19
+ __dir__ + '/fixtures/'
20
+ end
21
+
22
+ def test_logger
23
+ Logger.new($stderr).tap { |log| log.level = Logger::WARN }
24
+ end
25
+ end
26
+
15
27
  RSpec.configure do |config|
28
+ config.include SpecHelpers
29
+ config.extend SpecHelpers
30
+
16
31
  config.expect_with :rspec do |c|
17
32
  c.syntax = :expect
18
33
  end
34
+
35
+ config.filter_run :focus
36
+ config.run_all_when_everything_filtered = true
37
+ config.default_formatter = 'doc'
38
+ config.order = :random
19
39
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe WeTransfer::Client do
6
+ let(:client) { WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY')) }
7
+ let(:file_locations) { %w[Japan-01.jpg Japan-02.jpg] }
8
+
9
+ describe described_class::Transfers do
10
+ pending 'creates a transfer with multiple files' do
11
+ skip "this interface is still experimental"
12
+ transfer = client.create_transfer(message: 'Japan: 🏯 & 🎎') do |builder|
13
+ file_locations.each do |file_location|
14
+ builder.add_file(name: File.basename(file_location), io: File.open(fixtures_dir + file_location, 'rb'))
15
+ end
16
+ end
17
+
18
+ expect(transfer).to be_kind_of(RemoteTransfer)
19
+
20
+ # it has an url that is not available (yet)
21
+ expect(transfer.url).to be(nil)
22
+ # it has no files (yet)
23
+ expect(transfer.files.first.url).to be(nil)
24
+ # it is in an uploading state
25
+ expect(transfer.state).to eq('uploading')
26
+
27
+ # TODO: uncouple file_locations and transfer.files
28
+ file_locations.each_with_index do |location, index|
29
+ client.upload_file(
30
+ object: transfer,
31
+ file: transfer.files[index],
32
+ io: File.open(fixtures_dir + location, 'rb')
33
+ )
34
+ client.complete_file!(
35
+ object: transfer,
36
+ file: transfer.files[index]
37
+ )
38
+ end
39
+
40
+ result = client.complete_transfer(transfer: transfer)
41
+
42
+ # it has an url that is available
43
+ expect(result.url =~ %r|^https://we.tl/t-|).to be_truthy
44
+
45
+ # it is in a processing state
46
+ expect(result.state).to eq('processing')
47
+
48
+ response = Faraday.get(result.url)
49
+ # it hits the short-url with redirect
50
+ expect(response.status).to eq(302)
51
+ expect(response['location']).to start_with('https://wetransfer.com/')
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe BoardBuilder do
4
+ describe '#initialize' do
5
+ it 'initializes with an empty array' do
6
+ expect(subject.items.empty?).to be(true)
7
+ end
8
+ end
9
+
10
+ describe '#add_file' do
11
+ it 'returns an error when name is missing' do
12
+ expect {
13
+ subject.add_file(io: File.open(__FILE__, 'rb'))
14
+ }.to raise_error ArgumentError, /name/
15
+ end
16
+
17
+ it 'returns an error when io is missing' do
18
+ expect {
19
+ subject.add_file(name: 'file name')
20
+ }.to raise_error ArgumentError, /io/
21
+ end
22
+
23
+ it 'returns a error when file doesnt exists' do
24
+ expect {
25
+ subject.add_file(name: 'file name', io: File.open('foo', 'rb'))
26
+ }.to raise_error Errno::ENOENT
27
+ end
28
+
29
+ it 'adds a file when name and io is given' do
30
+ subject.add_file(name: 'file name', io: File.open(__FILE__, 'rb'))
31
+ expect(subject.items.first).to be_kind_of(FutureFile)
32
+ end
33
+ end
34
+
35
+ describe '#add_file_at' do
36
+ before do
37
+ skip "this interface is still experimental"
38
+ end
39
+
40
+ it 'adds a file from a path' do
41
+ subject.add_file_at(path: __FILE__)
42
+ expect(subject.items.first).to be_kind_of(FutureFile)
43
+ end
44
+
45
+ it 'throws a Error when file doesnt exists' do
46
+ expect {
47
+ subject.add_file_at(path: '/this/path/leads/to/nothing.exe')
48
+ }.to raise_error Errno::ENOENT
49
+ end
50
+
51
+ it 'should call #add_file' do
52
+ client = WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
53
+ client.create_board(name: 'Test board', description: 'A board description') do |b|
54
+ expect(b).to receive(:add_file).with(name: anything, io: kind_of(::IO))
55
+ b.add_file_at(path: __FILE__)
56
+ end
57
+ end
58
+ end
59
+
60
+ describe '#add_web_url' do
61
+ it 'adds a item to board when url and title are given' do
62
+ subject.add_web_url(url: 'http://www.wetransfer.com', title: 'wetransfer')
63
+ expect(subject.items.first).to be_kind_of(FutureLink)
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ require_relative '../../lib/we_transfer_client.rb'
4
+
5
+ describe WeTransfer::Client::Boards do
6
+ describe '#create_board_and_upload_items' do
7
+ it 'creates a board and uploads the files' do
8
+ client = WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
9
+ board = client.create_board_and_upload_items(name: 'test', description: 'test description') do |b|
10
+ b.add_file(name: File.basename(__FILE__), io: File.open(__FILE__, 'rb'))
11
+ b.add_web_url(url: 'http://www.wetransfer.com', title: 'WeTransfer Website')
12
+ end
13
+ expect(board).to be_kind_of(RemoteBoard)
14
+ expect(board.url).to start_with('https://we.tl/')
15
+ expect(board.state).to eq('downloadable')
16
+ end
17
+ end
18
+
19
+ describe "experimental features" do
20
+ before do
21
+ skip "this interface is still experimental"
22
+ end
23
+
24
+ describe '#create_board' do
25
+ it 'creates a board' do
26
+ client = WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
27
+ board = client.create_board(name: 'test', description: 'test description')
28
+ expect(board).to be_kind_of(RemoteBoard)
29
+ end
30
+ end
31
+
32
+ describe "#add_items" do
33
+ it 'adds items to an existing board' do
34
+ client = WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
35
+ board = client.create_board(name: 'test', description: 'test description')
36
+ updated_board = client.add_items(board: board) do |b|
37
+ b.add_file(name: File.basename(__FILE__), io: File.open(__FILE__, 'rb'))
38
+ b.add_web_url(url: 'http://www.wetransfer.com', title: 'WeTransfer Website')
39
+ end
40
+ expect(updated_board).to be_kind_of(RemoteBoard)
41
+ expect(updated_board.items.size).to eq(2)
42
+ expect(updated_board.items.map(&:class)).to eq([RemoteFile, RemoteLink])
43
+ end
44
+ end
45
+
46
+ describe "#get_board" do
47
+ it 'gets board' do
48
+ client = WeTransfer::Client.new(api_key: ENV.fetch('WT_API_KEY'))
49
+ board = client.create_board(name: 'test', description: 'test description')
50
+ board_request = client.get_board(board: board)
51
+
52
+ expect(board_request).to be_kind_of(RemoteBoard)
53
+ end
54
+ end
55
+ end
56
+ end