slack-ruby-client 0.9.1 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +16 -11
- data/CHANGELOG.md +11 -0
- data/README.md +40 -12
- data/UPGRADING.md +1 -1
- data/bin/commands.rb +1 -0
- data/bin/commands/channels.rb +3 -0
- data/bin/commands/conversations.rb +178 -0
- data/bin/commands/groups.rb +1 -9
- data/bin/commands/im.rb +3 -0
- data/bin/commands/rtm.rb +1 -0
- data/bin/commands/users.rb +3 -1
- data/lib/slack-ruby-client.rb +6 -0
- data/lib/slack/real_time/client.rb +1 -1
- data/lib/slack/real_time/concurrency/celluloid.rb +1 -1
- data/lib/slack/version.rb +1 -1
- data/lib/slack/web/api/endpoints.rb +2 -0
- data/lib/slack/web/api/endpoints/channels.rb +13 -1
- data/lib/slack/web/api/endpoints/conversations.rb +301 -0
- data/lib/slack/web/api/endpoints/groups.rb +2 -13
- data/lib/slack/web/api/endpoints/im.rb +13 -1
- data/lib/slack/web/api/endpoints/rtm.rb +2 -0
- data/lib/slack/web/api/endpoints/users.rb +11 -1
- data/lib/slack/web/api/templates/command.erb +2 -2
- data/lib/slack/web/api/templates/method.erb +10 -0
- data/lib/slack/web/config.rb +7 -3
- data/lib/slack/web/faraday/connection.rb +1 -1
- data/lib/slack/web/pagination/cursor.rb +48 -0
- data/spec/fixtures/slack/web/paginated_users_list.yml +181 -0
- data/spec/slack/real_time/client_spec.rb +60 -62
- data/spec/slack/real_time/concurrency/celluloid_spec.rb +41 -31
- data/spec/slack/web/api/endpoints/conversations_spec.rb +100 -0
- data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +8 -0
- data/spec/slack/web/api/pagination/cursor_spec.rb +70 -0
- metadata +12 -3
@@ -7,45 +7,55 @@ begin
|
|
7
7
|
context 'with url' do
|
8
8
|
let(:url) { 'wss://echo.websocket.org/websocket/xyz' }
|
9
9
|
let(:logger) { ::Logger.new(STDOUT) }
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
|
11
|
+
[EOFError, Errno::EPIPE].each do |err|
|
12
|
+
context "finishing run_loop with #{err}" do
|
13
|
+
let(:test_socket) do
|
14
|
+
Class.new(described_class) do
|
15
|
+
def read
|
16
|
+
fail options[:err]
|
17
|
+
end
|
18
|
+
end
|
14
19
|
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
let(:socket) { test_socket.new(url, ping: 42, logger: logger) }
|
18
|
-
let(:driver) { WebSocket::Driver::Client }
|
19
|
-
let(:ws) { double(driver) }
|
20
|
-
subject { socket }
|
21
|
-
|
22
|
-
describe '#connect!' do
|
23
|
-
pending 'connects'
|
24
|
-
pending 'pings every 30s'
|
25
|
-
end
|
26
20
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
21
|
+
let(:socket) do
|
22
|
+
test_socket.new(url, ping: 42, logger: logger, err: err)
|
23
|
+
end
|
31
24
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
25
|
+
let(:driver) { WebSocket::Driver::Client }
|
26
|
+
let(:ws) { double(driver) }
|
27
|
+
subject { socket }
|
28
|
+
|
29
|
+
describe '#connect!' do
|
30
|
+
pending 'connects'
|
31
|
+
pending 'pings every 30s'
|
36
32
|
end
|
37
|
-
end
|
38
33
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
34
|
+
context 'with a driver' do
|
35
|
+
before do
|
36
|
+
socket.instance_variable_set('@driver', ws)
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#disconnect!' do
|
40
|
+
it 'closes and nils the websocket' do
|
41
|
+
expect(ws).to receive(:close)
|
42
|
+
socket.disconnect!
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'consumes data' do
|
47
|
+
it 'runs' do
|
48
|
+
expect(ws).to receive(:emit)
|
49
|
+
expect(ws).to receive(:start)
|
50
|
+
expect(logger).to receive(:debug).with("#{test_socket}#run_loop")
|
51
|
+
socket.run_loop
|
52
|
+
end
|
53
|
+
end
|
44
54
|
end
|
55
|
+
|
56
|
+
pending 'send_data'
|
45
57
|
end
|
46
58
|
end
|
47
|
-
|
48
|
-
pending 'send_data'
|
49
59
|
end
|
50
60
|
end
|
51
61
|
rescue LoadError
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# This file was auto-generated by lib/tasks/web.rake
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Slack::Web::Api::Endpoints::Conversations do
|
6
|
+
let(:client) { Slack::Web::Client.new }
|
7
|
+
context 'conversations_archive' do
|
8
|
+
it 'requires channel' do
|
9
|
+
expect { client.conversations_archive }.to raise_error ArgumentError, /Required arguments :channel missing/
|
10
|
+
end
|
11
|
+
end
|
12
|
+
context 'conversations_close' do
|
13
|
+
it 'requires channel' do
|
14
|
+
expect { client.conversations_close }.to raise_error ArgumentError, /Required arguments :channel missing/
|
15
|
+
end
|
16
|
+
end
|
17
|
+
context 'conversations_create' do
|
18
|
+
it 'requires name' do
|
19
|
+
expect { client.conversations_create }.to raise_error ArgumentError, /Required arguments :name missing/
|
20
|
+
end
|
21
|
+
end
|
22
|
+
context 'conversations_history' do
|
23
|
+
it 'requires channel' do
|
24
|
+
expect { client.conversations_history }.to raise_error ArgumentError, /Required arguments :channel missing/
|
25
|
+
end
|
26
|
+
end
|
27
|
+
context 'conversations_info' do
|
28
|
+
it 'requires channel' do
|
29
|
+
expect { client.conversations_info }.to raise_error ArgumentError, /Required arguments :channel missing/
|
30
|
+
end
|
31
|
+
end
|
32
|
+
context 'conversations_invite' do
|
33
|
+
it 'requires channel' do
|
34
|
+
expect { client.conversations_invite(users: 'W1234567890,U2345678901,U3456789012') }.to raise_error ArgumentError, /Required arguments :channel missing/
|
35
|
+
end
|
36
|
+
it 'requires users' do
|
37
|
+
expect { client.conversations_invite(channel: 'C1234567890') }.to raise_error ArgumentError, /Required arguments :users missing/
|
38
|
+
end
|
39
|
+
end
|
40
|
+
context 'conversations_join' do
|
41
|
+
it 'requires channel' do
|
42
|
+
expect { client.conversations_join }.to raise_error ArgumentError, /Required arguments :channel missing/
|
43
|
+
end
|
44
|
+
end
|
45
|
+
context 'conversations_kick' do
|
46
|
+
it 'requires channel' do
|
47
|
+
expect { client.conversations_kick(user: 'W1234567890') }.to raise_error ArgumentError, /Required arguments :channel missing/
|
48
|
+
end
|
49
|
+
it 'requires user' do
|
50
|
+
expect { client.conversations_kick(channel: 'C1234567890') }.to raise_error ArgumentError, /Required arguments :user missing/
|
51
|
+
end
|
52
|
+
end
|
53
|
+
context 'conversations_leave' do
|
54
|
+
it 'requires channel' do
|
55
|
+
expect { client.conversations_leave }.to raise_error ArgumentError, /Required arguments :channel missing/
|
56
|
+
end
|
57
|
+
end
|
58
|
+
context 'conversations_members' do
|
59
|
+
it 'requires channel' do
|
60
|
+
expect { client.conversations_members }.to raise_error ArgumentError, /Required arguments :channel missing/
|
61
|
+
end
|
62
|
+
end
|
63
|
+
context 'conversations_rename' do
|
64
|
+
it 'requires channel' do
|
65
|
+
expect { client.conversations_rename(name: ' ') }.to raise_error ArgumentError, /Required arguments :channel missing/
|
66
|
+
end
|
67
|
+
it 'requires name' do
|
68
|
+
expect { client.conversations_rename(channel: 'C1234567890') }.to raise_error ArgumentError, /Required arguments :name missing/
|
69
|
+
end
|
70
|
+
end
|
71
|
+
context 'conversations_replies' do
|
72
|
+
it 'requires channel' do
|
73
|
+
expect { client.conversations_replies(ts: '1234567890.123456') }.to raise_error ArgumentError, /Required arguments :channel missing/
|
74
|
+
end
|
75
|
+
it 'requires ts' do
|
76
|
+
expect { client.conversations_replies(channel: 'C1234567890') }.to raise_error ArgumentError, /Required arguments :ts missing/
|
77
|
+
end
|
78
|
+
end
|
79
|
+
context 'conversations_setPurpose' do
|
80
|
+
it 'requires channel' do
|
81
|
+
expect { client.conversations_setPurpose(purpose: 'My More Special Purpose') }.to raise_error ArgumentError, /Required arguments :channel missing/
|
82
|
+
end
|
83
|
+
it 'requires purpose' do
|
84
|
+
expect { client.conversations_setPurpose(channel: 'C1234567890') }.to raise_error ArgumentError, /Required arguments :purpose missing/
|
85
|
+
end
|
86
|
+
end
|
87
|
+
context 'conversations_setTopic' do
|
88
|
+
it 'requires channel' do
|
89
|
+
expect { client.conversations_setTopic(topic: 'Apply topically for best effects') }.to raise_error ArgumentError, /Required arguments :channel missing/
|
90
|
+
end
|
91
|
+
it 'requires topic' do
|
92
|
+
expect { client.conversations_setTopic(channel: 'C1234567890') }.to raise_error ArgumentError, /Required arguments :topic missing/
|
93
|
+
end
|
94
|
+
end
|
95
|
+
context 'conversations_unarchive' do
|
96
|
+
it 'requires channel' do
|
97
|
+
expect { client.conversations_unarchive }.to raise_error ArgumentError, /Required arguments :channel missing/
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -9,6 +9,14 @@ RSpec.describe Slack::Web::Api::Endpoints::Users do
|
|
9
9
|
expect(json.members.size).to eq 9
|
10
10
|
expect(json.members.first.presence).to eq 'away'
|
11
11
|
end
|
12
|
+
it 'list', vcr: { cassette_name: 'web/paginated_users_list' } do
|
13
|
+
members = []
|
14
|
+
client.users_list(presence: true, limit: 5) do |json|
|
15
|
+
expect(json.ok).to be true
|
16
|
+
members.concat json.members
|
17
|
+
end
|
18
|
+
expect(members.size).to eq 23
|
19
|
+
end
|
12
20
|
it 'info', vcr: { cassette_name: 'web/users_info' } do
|
13
21
|
json = client.users_info(user: '@aws')
|
14
22
|
expect(json.user.name).to eq 'aws'
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Slack::Web::Api::Pagination::Cursor do
|
4
|
+
let(:client) { Slack::Web::Client.new }
|
5
|
+
context 'default cursor' do
|
6
|
+
let(:cursor) { Slack::Web::Api::Pagination::Cursor.new(client, 'users_list', {}) }
|
7
|
+
it 'provides a default limit' do
|
8
|
+
expect(client).to receive(:users_list).with(limit: 100, cursor: nil)
|
9
|
+
cursor.first
|
10
|
+
end
|
11
|
+
it 'handles blank response metadata' do
|
12
|
+
expect(client).to receive(:users_list).once.and_return(Slack::Messages::Message.new)
|
13
|
+
cursor.to_a
|
14
|
+
end
|
15
|
+
it 'handles nil response metadata' do
|
16
|
+
expect(client).to receive(:users_list).once.and_return(Slack::Messages::Message.new(response_metadata: nil))
|
17
|
+
cursor.to_a
|
18
|
+
end
|
19
|
+
it 'paginates with a cursor inside response metadata' do
|
20
|
+
expect(client).to receive(:users_list).twice.and_return(
|
21
|
+
Slack::Messages::Message.new(response_metadata: { next_cursor: 'next' }),
|
22
|
+
Slack::Messages::Message.new
|
23
|
+
)
|
24
|
+
expect(cursor).not_to receive(:sleep)
|
25
|
+
cursor.to_a
|
26
|
+
end
|
27
|
+
context 'with rate limiting' do
|
28
|
+
let(:error) { Slack::Web::Api::Errors::TooManyRequestsError.new(nil) }
|
29
|
+
context 'with default max retries' do
|
30
|
+
it 'sleeps after a TooManyRequestsError' do
|
31
|
+
expect(client).to receive(:users_list).with(limit: 100, cursor: nil).ordered.and_return(Slack::Messages::Message.new(response_metadata: { next_cursor: 'next' }))
|
32
|
+
expect(client).to receive(:users_list).with(limit: 100, cursor: 'next').ordered.and_raise(error)
|
33
|
+
expect(error).to receive(:retry_after).once.ordered.and_return(9)
|
34
|
+
expect(cursor).to receive(:sleep).once.ordered.with(9)
|
35
|
+
expect(client).to receive(:users_list).with(limit: 100, cursor: 'next').ordered.and_return(Slack::Messages::Message.new)
|
36
|
+
cursor.to_a
|
37
|
+
end
|
38
|
+
end
|
39
|
+
context 'with a custom max_retries' do
|
40
|
+
let(:cursor) { Slack::Web::Api::Pagination::Cursor.new(client, 'users_list', max_retries: 4) }
|
41
|
+
it 'raises the error after hitting the max retries' do
|
42
|
+
expect(client).to receive(:users_list).with(limit: 100, cursor: nil).and_return(Slack::Messages::Message.new(response_metadata: { next_cursor: 'next' }))
|
43
|
+
expect(client).to receive(:users_list).with(limit: 100, cursor: 'next').exactly(5).times.and_raise(error)
|
44
|
+
expect(error).to receive(:retry_after).exactly(4).times.and_return(9)
|
45
|
+
expect(cursor).to receive(:sleep).exactly(4).times.with(9)
|
46
|
+
expect { cursor.to_a }.to raise_error(error)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
context 'with a custom limit' do
|
52
|
+
let(:cursor) { Slack::Web::Api::Pagination::Cursor.new(client, 'users_list', limit: 42) }
|
53
|
+
it 'overrides default limit' do
|
54
|
+
expect(client).to receive(:users_list).with(limit: 42, cursor: nil)
|
55
|
+
cursor.first
|
56
|
+
end
|
57
|
+
end
|
58
|
+
context 'with a custom sleep_interval' do
|
59
|
+
let(:cursor) { Slack::Web::Api::Pagination::Cursor.new(client, 'users_list', sleep_interval: 3) }
|
60
|
+
it 'sleeps between requests' do
|
61
|
+
expect(client).to receive(:users_list).exactly(3).times.and_return(
|
62
|
+
Slack::Messages::Message.new(response_metadata: { next_cursor: 'next_a' }),
|
63
|
+
Slack::Messages::Message.new(response_metadata: { next_cursor: 'next_b' }),
|
64
|
+
Slack::Messages::Message.new
|
65
|
+
)
|
66
|
+
expect(cursor).to receive(:sleep).with(3).twice
|
67
|
+
cursor.to_a
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slack-ruby-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Doubrovkine
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -235,6 +235,7 @@ files:
|
|
235
235
|
- bin/commands/bots.rb
|
236
236
|
- bin/commands/channels.rb
|
237
237
|
- bin/commands/chat.rb
|
238
|
+
- bin/commands/conversations.rb
|
238
239
|
- bin/commands/dnd.rb
|
239
240
|
- bin/commands/emoji.rb
|
240
241
|
- bin/commands/files.rb
|
@@ -311,6 +312,7 @@ files:
|
|
311
312
|
- lib/slack/web/api/endpoints/bots.rb
|
312
313
|
- lib/slack/web/api/endpoints/channels.rb
|
313
314
|
- lib/slack/web/api/endpoints/chat.rb
|
315
|
+
- lib/slack/web/api/endpoints/conversations.rb
|
314
316
|
- lib/slack/web/api/endpoints/dnd.rb
|
315
317
|
- lib/slack/web/api/endpoints/emoji.rb
|
316
318
|
- lib/slack/web/api/endpoints/files.rb
|
@@ -361,6 +363,7 @@ files:
|
|
361
363
|
- lib/slack/web/faraday/connection.rb
|
362
364
|
- lib/slack/web/faraday/request.rb
|
363
365
|
- lib/slack/web/faraday/response/raise_error.rb
|
366
|
+
- lib/slack/web/pagination/cursor.rb
|
364
367
|
- lib/slack_ruby_client.rb
|
365
368
|
- lib/tasks/git.rake
|
366
369
|
- lib/tasks/real_time.rake
|
@@ -374,6 +377,7 @@ files:
|
|
374
377
|
- spec/fixtures/slack/web/auth_test_success.yml
|
375
378
|
- spec/fixtures/slack/web/channels_info.yml
|
376
379
|
- spec/fixtures/slack/web/groups_info.yml
|
380
|
+
- spec/fixtures/slack/web/paginated_users_list.yml
|
377
381
|
- spec/fixtures/slack/web/rtm_connect.yml
|
378
382
|
- spec/fixtures/slack/web/rtm_start.yml
|
379
383
|
- spec/fixtures/slack/web/users_info.yml
|
@@ -403,6 +407,7 @@ files:
|
|
403
407
|
- spec/slack/web/api/endpoints/api_spec.rb
|
404
408
|
- spec/slack/web/api/endpoints/apps_permissions_spec.rb
|
405
409
|
- spec/slack/web/api/endpoints/bots_spec.rb
|
410
|
+
- spec/slack/web/api/endpoints/conversations_spec.rb
|
406
411
|
- spec/slack/web/api/endpoints/custom_specs/auth_spec.rb
|
407
412
|
- spec/slack/web/api/endpoints/custom_specs/channels_spec.rb
|
408
413
|
- spec/slack/web/api/endpoints/custom_specs/chat_spec.rb
|
@@ -431,6 +436,7 @@ files:
|
|
431
436
|
- spec/slack/web/api/mixins/channels_spec.rb
|
432
437
|
- spec/slack/web/api/mixins/groups_spec.rb
|
433
438
|
- spec/slack/web/api/mixins/users_spec.rb
|
439
|
+
- spec/slack/web/api/pagination/cursor_spec.rb
|
434
440
|
- spec/slack/web/client_spec.rb
|
435
441
|
- spec/spec_helper.rb
|
436
442
|
- spec/support/queue_with_timeout.rb
|
@@ -459,7 +465,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
459
465
|
version: 1.3.6
|
460
466
|
requirements: []
|
461
467
|
rubyforge_project:
|
462
|
-
rubygems_version: 2.6.
|
468
|
+
rubygems_version: 2.6.11
|
463
469
|
signing_key:
|
464
470
|
specification_version: 4
|
465
471
|
summary: Slack Web and RealTime API client.
|
@@ -469,6 +475,7 @@ test_files:
|
|
469
475
|
- spec/fixtures/slack/web/auth_test_success.yml
|
470
476
|
- spec/fixtures/slack/web/channels_info.yml
|
471
477
|
- spec/fixtures/slack/web/groups_info.yml
|
478
|
+
- spec/fixtures/slack/web/paginated_users_list.yml
|
472
479
|
- spec/fixtures/slack/web/rtm_connect.yml
|
473
480
|
- spec/fixtures/slack/web/rtm_start.yml
|
474
481
|
- spec/fixtures/slack/web/users_info.yml
|
@@ -498,6 +505,7 @@ test_files:
|
|
498
505
|
- spec/slack/web/api/endpoints/api_spec.rb
|
499
506
|
- spec/slack/web/api/endpoints/apps_permissions_spec.rb
|
500
507
|
- spec/slack/web/api/endpoints/bots_spec.rb
|
508
|
+
- spec/slack/web/api/endpoints/conversations_spec.rb
|
501
509
|
- spec/slack/web/api/endpoints/custom_specs/auth_spec.rb
|
502
510
|
- spec/slack/web/api/endpoints/custom_specs/channels_spec.rb
|
503
511
|
- spec/slack/web/api/endpoints/custom_specs/chat_spec.rb
|
@@ -526,6 +534,7 @@ test_files:
|
|
526
534
|
- spec/slack/web/api/mixins/channels_spec.rb
|
527
535
|
- spec/slack/web/api/mixins/groups_spec.rb
|
528
536
|
- spec/slack/web/api/mixins/users_spec.rb
|
537
|
+
- spec/slack/web/api/pagination/cursor_spec.rb
|
529
538
|
- spec/slack/web/client_spec.rb
|
530
539
|
- spec/spec_helper.rb
|
531
540
|
- spec/support/queue_with_timeout.rb
|