slack-ruby-client 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop_todo.yml +5 -5
- data/.travis.yml +12 -14
- data/CHANGELOG.md +4 -0
- data/README.md +1 -1
- data/examples/hi_real_time/hi.rb +1 -2
- data/examples/hi_real_time_async_celluloid/Gemfile +6 -0
- data/examples/hi_real_time_async_celluloid/Procfile +2 -0
- data/examples/hi_real_time_async_celluloid/hi.rb +36 -0
- data/examples/hi_real_time_async_eventmachine/Gemfile +6 -0
- data/examples/hi_real_time_async_eventmachine/Procfile +2 -0
- data/examples/hi_real_time_async_eventmachine/hi.rb +36 -0
- data/lib/slack/real_time/client.rb +28 -30
- data/lib/slack/real_time/concurrency/celluloid.rb +11 -10
- data/lib/slack/real_time/concurrency/eventmachine.rb +2 -2
- data/lib/slack/real_time/socket.rb +3 -3
- data/lib/slack/version.rb +1 -1
- data/spec/integration/integration_spec.rb +1 -1
- data/spec/slack/real_time/client_spec.rb +3 -3
- data/spec/slack/real_time/concurrency/celluloid_spec.rb +3 -27
- data/spec/support/real_time/concurrency/mock.rb +2 -2
- data/spec/support/real_time/connected_client.rb +2 -2
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cddbe0828a85f10ae1f1ba5750ebb7c2092ce320
|
4
|
+
data.tar.gz: 5e65e541eb3dc373a49772ab0b5584ed043e848c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b529246891dca92b7134462247c88a5b72730e5ebf1806fd15fcf55e72e709ce8134898c15aaeb777931a3f62c7b00c86579d877e3c234abc8ac0bee4883249
|
7
|
+
data.tar.gz: 0a7a750afdcef449823797818ea192a02093908b140e4db145f64369151e4a1a4ead6503f22372b2239d918cc20f6212daae7d4e81eaa099f94e886325e3c2f4
|
data/.gitignore
CHANGED
data/.rubocop_todo.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2016-05-
|
3
|
+
# on 2016-05-03 16:35:06 -0400 using RuboCop version 0.35.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
@@ -28,13 +28,13 @@ Metrics/AbcSize:
|
|
28
28
|
# Offense count: 2
|
29
29
|
# Configuration parameters: CountComments.
|
30
30
|
Metrics/ClassLength:
|
31
|
-
Max:
|
31
|
+
Max: 156
|
32
32
|
|
33
33
|
# Offense count: 2
|
34
34
|
Metrics/CyclomaticComplexity:
|
35
35
|
Max: 9
|
36
36
|
|
37
|
-
# Offense count:
|
37
|
+
# Offense count: 595
|
38
38
|
# Configuration parameters: AllowURI, URISchemes.
|
39
39
|
Metrics/LineLength:
|
40
40
|
Max: 288
|
@@ -48,7 +48,7 @@ Metrics/MethodLength:
|
|
48
48
|
Metrics/PerceivedComplexity:
|
49
49
|
Max: 11
|
50
50
|
|
51
|
-
# Offense count:
|
51
|
+
# Offense count: 55
|
52
52
|
# Configuration parameters: Exclude.
|
53
53
|
Style/Documentation:
|
54
54
|
Enabled: false
|
@@ -59,7 +59,7 @@ Style/FileName:
|
|
59
59
|
Exclude:
|
60
60
|
- 'lib/slack-ruby-client.rb'
|
61
61
|
|
62
|
-
# Offense count:
|
62
|
+
# Offense count: 100
|
63
63
|
# Configuration parameters: AllowedVariables.
|
64
64
|
Style/GlobalVars:
|
65
65
|
Enabled: false
|
data/.travis.yml
CHANGED
@@ -2,17 +2,19 @@ language: ruby
|
|
2
2
|
|
3
3
|
cache: bundler
|
4
4
|
|
5
|
-
rvm:
|
6
|
-
- 2.3.0
|
7
|
-
- 2.2
|
8
|
-
- 2.1
|
9
|
-
- 2.0
|
10
|
-
- rbx-2
|
11
|
-
- jruby-19mode
|
12
|
-
- ruby-head
|
13
|
-
- jruby-head
|
14
|
-
|
15
5
|
matrix:
|
6
|
+
include:
|
7
|
+
- rvm: 2.3.0
|
8
|
+
env: CONCURRENCY=celluloid-io
|
9
|
+
- rvm: 2.3.0
|
10
|
+
env: CONCURRENCY=faye-websocket
|
11
|
+
- rvm: 2.2
|
12
|
+
- rvm: 2.1
|
13
|
+
- rvm: 2.0
|
14
|
+
- rvm: rbx-2
|
15
|
+
- rvm: jruby-19mode
|
16
|
+
- rvm: ruby-head
|
17
|
+
- rvm: jruby-head
|
16
18
|
allow_failures:
|
17
19
|
- rvm: ruby-head
|
18
20
|
- rvm: jruby-head
|
@@ -21,7 +23,3 @@ matrix:
|
|
21
23
|
|
22
24
|
git:
|
23
25
|
submodules: false
|
24
|
-
|
25
|
-
env:
|
26
|
-
- CONCURRENCY=celluloid-io
|
27
|
-
- CONCURRENCY=faye-websocket
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
### 0.7.2 (5/5/2016)
|
2
|
+
|
3
|
+
* [#84](https://github.com/dblock/slack-ruby-client/issues/84): Fix: Celluloid concurrency doesn't parallelize the connection setup - [@dblock](https://github.com/dblock).
|
4
|
+
|
1
5
|
### 0.7.1 (5/2/2016)
|
2
6
|
|
3
7
|
* [#82](https://github.com/dblock/slack-ruby-client/pull/82): Fix `usergroups.users.{list,update}` and `files.comments.{add,edit,delete}` APIs - [@masatomo](https://github.com/masatomo).
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ A Ruby client for the Slack [Web](https://api.slack.com/web) and [RealTime Messa
|
|
18
18
|
|
19
19
|
## Stable Release
|
20
20
|
|
21
|
-
You're reading the documentation for the **stable** release of slack-ruby-client, 0.7.
|
21
|
+
You're reading the documentation for the **stable** release of slack-ruby-client, 0.7.2. See [UPGRADING](UPGRADING.md) when upgrading from an older version.
|
22
22
|
|
23
23
|
## Installation
|
24
24
|
|
data/examples/hi_real_time/hi.rb
CHANGED
@@ -3,7 +3,7 @@ require 'slack-ruby-client'
|
|
3
3
|
Slack.configure do |config|
|
4
4
|
config.token = ENV['SLACK_API_TOKEN']
|
5
5
|
config.logger = Logger.new(STDOUT)
|
6
|
-
config.logger.level = Logger::
|
6
|
+
config.logger.level = Logger::INFO
|
7
7
|
fail 'Missing ENV[SLACK_API_TOKEN]!' unless config.token
|
8
8
|
end
|
9
9
|
|
@@ -28,7 +28,6 @@ end
|
|
28
28
|
|
29
29
|
client.on :close do |_data|
|
30
30
|
puts 'Connection closing, exiting.'
|
31
|
-
EM.stop
|
32
31
|
end
|
33
32
|
|
34
33
|
client.on :closed do |_data|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'slack-ruby-client'
|
2
|
+
|
3
|
+
fail 'Missing ENV[SLACK_API_TOKENS]!' unless ENV.key?('SLACK_API_TOKENS')
|
4
|
+
|
5
|
+
$stdout.sync = true
|
6
|
+
logger = Logger.new($stdout)
|
7
|
+
logger.level = Logger::DEBUG
|
8
|
+
|
9
|
+
ENV['SLACK_API_TOKENS'].split.each do |token|
|
10
|
+
logger.info "Starting #{token[0..12]} ..."
|
11
|
+
|
12
|
+
client = Slack::RealTime::Client.new(token: token)
|
13
|
+
|
14
|
+
client.on :hello do
|
15
|
+
logger.info "Successfully connected, welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
|
16
|
+
end
|
17
|
+
|
18
|
+
client.on :message do |data|
|
19
|
+
logger.info data
|
20
|
+
|
21
|
+
client.typing channel: data.channel
|
22
|
+
|
23
|
+
case data.text
|
24
|
+
when 'bot hi' then
|
25
|
+
client.message channel: data.channel, text: "Hi <@#{data.user}>!"
|
26
|
+
when /^bot/ then
|
27
|
+
client.message channel: data.channel, text: "Sorry <@#{data.user}>, what?"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
client.start_async
|
32
|
+
end
|
33
|
+
|
34
|
+
loop do
|
35
|
+
Thread.pass
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'slack-ruby-client'
|
2
|
+
|
3
|
+
fail 'Missing ENV[SLACK_API_TOKENS]!' unless ENV.key?('SLACK_API_TOKENS')
|
4
|
+
|
5
|
+
$stdout.sync = true
|
6
|
+
logger = Logger.new($stdout)
|
7
|
+
logger.level = Logger::DEBUG
|
8
|
+
|
9
|
+
ENV['SLACK_API_TOKENS'].split.each do |token|
|
10
|
+
logger.info "Starting #{token[0..12]} ..."
|
11
|
+
|
12
|
+
client = Slack::RealTime::Client.new(token: token)
|
13
|
+
|
14
|
+
client.on :hello do
|
15
|
+
logger.info "Successfully connected, welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
|
16
|
+
end
|
17
|
+
|
18
|
+
client.on :message do |data|
|
19
|
+
logger.info data
|
20
|
+
|
21
|
+
client.typing channel: data.channel
|
22
|
+
|
23
|
+
case data.text
|
24
|
+
when 'bot hi' then
|
25
|
+
client.message channel: data.channel, text: "Hi <@#{data.user}>!"
|
26
|
+
when /^bot/ then
|
27
|
+
client.message channel: data.channel, text: "Sorry <@#{data.user}>, what?"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
client.start_async
|
32
|
+
end
|
33
|
+
|
34
|
+
loop do
|
35
|
+
Thread.pass
|
36
|
+
end
|
@@ -45,18 +45,18 @@ module Slack
|
|
45
45
|
end
|
46
46
|
|
47
47
|
# Start RealTime client and block until it disconnects.
|
48
|
-
# @yieldparam [Websocket::Driver] driver
|
49
48
|
def start!(&block)
|
50
|
-
|
51
|
-
socket
|
49
|
+
@callback = block if block_given?
|
50
|
+
@socket = build_socket
|
51
|
+
@socket.start_sync(self)
|
52
52
|
end
|
53
53
|
|
54
54
|
# Start RealTime client and return immediately.
|
55
55
|
# The RealTime::Client will run in the background.
|
56
|
-
# @yieldparam [Websocket::Driver] driver
|
57
56
|
def start_async(&block)
|
58
|
-
|
59
|
-
socket
|
57
|
+
@callback = block if block_given?
|
58
|
+
@socket = build_socket
|
59
|
+
@socket.start_async(self)
|
60
60
|
end
|
61
61
|
|
62
62
|
def stop!
|
@@ -78,31 +78,9 @@ module Slack
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
|
82
|
-
|
83
|
-
# @return [Slack::RealTime::Socket]
|
84
|
-
def build_socket
|
85
|
-
fail ClientAlreadyStartedError if started?
|
86
|
-
start = web_client.rtm_start(start_options)
|
87
|
-
data = Slack::Messages::Message.new(start)
|
88
|
-
@url = data.url
|
89
|
-
@store = @store_class.new(data) if @store_class
|
90
|
-
socket_class.new(@url, socket_options)
|
91
|
-
end
|
92
|
-
|
93
|
-
def socket_options
|
94
|
-
socket_options = {}
|
95
|
-
socket_options[:ping] = websocket_ping if websocket_ping
|
96
|
-
socket_options[:proxy] = websocket_proxy if websocket_proxy
|
97
|
-
socket_options[:logger] = logger
|
98
|
-
socket_options
|
99
|
-
end
|
100
|
-
|
101
|
-
def run_loop(socket)
|
102
|
-
@socket = socket
|
103
|
-
|
81
|
+
def run_loop
|
104
82
|
@socket.connect! do |driver|
|
105
|
-
|
83
|
+
@callback.call(driver) if @callback
|
106
84
|
|
107
85
|
driver.on :open do |event|
|
108
86
|
logger.debug("#{self.class}##{__method__}") { event.class.name }
|
@@ -124,6 +102,26 @@ module Slack
|
|
124
102
|
end
|
125
103
|
end
|
126
104
|
|
105
|
+
protected
|
106
|
+
|
107
|
+
# @return [Slack::RealTime::Socket]
|
108
|
+
def build_socket
|
109
|
+
fail ClientAlreadyStartedError if started?
|
110
|
+
start = web_client.rtm_start(start_options)
|
111
|
+
data = Slack::Messages::Message.new(start)
|
112
|
+
@url = data.url
|
113
|
+
@store = @store_class.new(data) if @store_class
|
114
|
+
socket_class.new(@url, socket_options)
|
115
|
+
end
|
116
|
+
|
117
|
+
def socket_options
|
118
|
+
socket_options = {}
|
119
|
+
socket_options[:ping] = websocket_ping if websocket_ping
|
120
|
+
socket_options[:proxy] = websocket_proxy if websocket_proxy
|
121
|
+
socket_options[:logger] = logger
|
122
|
+
socket_options
|
123
|
+
end
|
124
|
+
|
127
125
|
attr_reader :callbacks
|
128
126
|
def socket_class
|
129
127
|
concurrency::Socket
|
@@ -22,18 +22,17 @@ module Slack
|
|
22
22
|
|
23
23
|
def initialize(*args)
|
24
24
|
super
|
25
|
-
@driver = build_driver
|
26
25
|
end
|
27
26
|
|
28
|
-
# @yieldparam [WebSocket::Driver] driver
|
29
27
|
def connect!
|
30
28
|
super
|
31
|
-
|
32
|
-
driver.start
|
33
|
-
future.run_loop
|
29
|
+
run_loop
|
34
30
|
end
|
35
31
|
|
36
32
|
def run_loop
|
33
|
+
@socket = build_socket
|
34
|
+
@connected = @socket.connect
|
35
|
+
driver.start
|
37
36
|
loop { read } if socket
|
38
37
|
rescue EOFError
|
39
38
|
# connection closed
|
@@ -50,10 +49,13 @@ module Slack
|
|
50
49
|
socket.write(data)
|
51
50
|
end
|
52
51
|
|
53
|
-
def start_async
|
54
|
-
|
52
|
+
def start_async(client)
|
53
|
+
@client = client
|
54
|
+
Actor.new(future.run_client_loop)
|
55
|
+
end
|
55
56
|
|
56
|
-
|
57
|
+
def run_client_loop
|
58
|
+
@client.run_loop
|
57
59
|
end
|
58
60
|
|
59
61
|
def connected?
|
@@ -89,8 +91,7 @@ module Slack
|
|
89
91
|
end
|
90
92
|
|
91
93
|
def connect
|
92
|
-
@
|
93
|
-
@connected = @socket.connect
|
94
|
+
@driver = build_driver
|
94
95
|
end
|
95
96
|
end
|
96
97
|
end
|
@@ -41,15 +41,15 @@ module Slack
|
|
41
41
|
!driver.nil?
|
42
42
|
end
|
43
43
|
|
44
|
-
def start_sync(
|
45
|
-
thread = start_async(
|
44
|
+
def start_sync(client)
|
45
|
+
thread = start_async(client)
|
46
46
|
thread.join if thread
|
47
47
|
rescue Interrupt
|
48
48
|
thread.exit if thread
|
49
49
|
end
|
50
50
|
|
51
51
|
# @return [#join]
|
52
|
-
def start_async
|
52
|
+
def start_async(_client)
|
53
53
|
fail NotImplementedError, "Expected #{self.class} to implement #{__method__}."
|
54
54
|
end
|
55
55
|
|
data/lib/slack/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
RSpec.describe 'integration test', skip: !ENV['SLACK_API_TOKEN'] && 'missing SLACK_API_TOKEN' do
|
3
|
+
RSpec.describe 'integration test', skip: (!ENV['SLACK_API_TOKEN'] || !ENV['CONCURRENCY']) && 'missing SLACK_API_TOKEN and/or CONCURRENCY' do
|
4
4
|
around do |ex|
|
5
5
|
WebMock.allow_net_connect!
|
6
6
|
VCR.turned_off { ex.run }
|
@@ -51,7 +51,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
51
51
|
before do
|
52
52
|
allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
|
53
53
|
allow(socket).to receive(:connect!)
|
54
|
-
allow(socket).to receive(:start_sync)
|
54
|
+
allow(socket).to receive(:start_sync)
|
55
55
|
client.start!
|
56
56
|
end
|
57
57
|
context 'properties provided upon connection' do
|
@@ -254,7 +254,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
254
254
|
before do
|
255
255
|
allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
|
256
256
|
allow(socket).to receive(:connect!)
|
257
|
-
allow(socket).to receive(:start_sync)
|
257
|
+
allow(socket).to receive(:start_sync)
|
258
258
|
end
|
259
259
|
it 'calls rtm_start with start options' do
|
260
260
|
expect(client.web_client).to receive(:rtm_start).with(simple_latest: true).and_call_original
|
@@ -282,7 +282,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
282
282
|
before do
|
283
283
|
allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
|
284
284
|
allow(socket).to receive(:connect!)
|
285
|
-
allow(socket).to receive(:start_sync)
|
285
|
+
allow(socket).to receive(:start_sync)
|
286
286
|
end
|
287
287
|
it 'instantiates the correct store class' do
|
288
288
|
client.start!
|
@@ -16,20 +16,8 @@ begin
|
|
16
16
|
end
|
17
17
|
|
18
18
|
describe '#connect!' do
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
xit 'connects' do
|
24
|
-
expect(socket.driver).to receive(:start)
|
25
|
-
|
26
|
-
socket.connect!
|
27
|
-
end
|
28
|
-
|
29
|
-
xit 'pings every 30s' do
|
30
|
-
expect(driver).to receive(:client).with(socket).and_return(ws)
|
31
|
-
socket.connect!
|
32
|
-
end
|
19
|
+
pending 'connects'
|
20
|
+
pending 'pings every 30s'
|
33
21
|
end
|
34
22
|
|
35
23
|
describe '#disconnect!' do
|
@@ -40,19 +28,7 @@ begin
|
|
40
28
|
end
|
41
29
|
end
|
42
30
|
|
43
|
-
|
44
|
-
let(:driver) { socket.driver }
|
45
|
-
before do
|
46
|
-
allow(driver).to receive(:start)
|
47
|
-
allow(subject).to receive(:run_loop)
|
48
|
-
socket.connect!
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'sends data' do
|
52
|
-
expect(driver).to receive(:text).with('data')
|
53
|
-
subject.send_data('data')
|
54
|
-
end
|
55
|
-
end
|
31
|
+
pending 'send_data'
|
56
32
|
end
|
57
33
|
end
|
58
34
|
rescue LoadError
|
@@ -8,8 +8,8 @@ RSpec.shared_context 'connected client' do |opts|
|
|
8
8
|
config.concurrency = Slack::RealTime::Concurrency::Mock
|
9
9
|
end
|
10
10
|
allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
|
11
|
-
allow(socket).to receive(:start_sync)
|
12
|
-
allow(socket).to receive(:connect!)
|
11
|
+
allow(socket).to receive(:start_sync)
|
12
|
+
allow(socket).to receive(:connect!)
|
13
13
|
allow(ws).to receive(:on)
|
14
14
|
client.start!
|
15
15
|
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.7.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Doubrovkine
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -259,6 +259,12 @@ files:
|
|
259
259
|
- examples/hi_real_time_and_web/hi.rb
|
260
260
|
- examples/hi_real_time_async/Gemfile
|
261
261
|
- examples/hi_real_time_async/hi.rb
|
262
|
+
- examples/hi_real_time_async_celluloid/Gemfile
|
263
|
+
- examples/hi_real_time_async_celluloid/Procfile
|
264
|
+
- examples/hi_real_time_async_celluloid/hi.rb
|
265
|
+
- examples/hi_real_time_async_eventmachine/Gemfile
|
266
|
+
- examples/hi_real_time_async_eventmachine/Procfile
|
267
|
+
- examples/hi_real_time_async_eventmachine/hi.rb
|
262
268
|
- examples/hi_web/Gemfile
|
263
269
|
- examples/hi_web/hi.gif
|
264
270
|
- examples/hi_web/hi.rb
|
@@ -434,7 +440,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
434
440
|
version: 1.3.6
|
435
441
|
requirements: []
|
436
442
|
rubyforge_project:
|
437
|
-
rubygems_version: 2.
|
443
|
+
rubygems_version: 2.5.1
|
438
444
|
signing_key:
|
439
445
|
specification_version: 4
|
440
446
|
summary: Slack Web and RealTime API client.
|