slack-ruby-client 0.1.0 → 0.2.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 +9 -5
- data/.travis.yml +11 -0
- data/CHANGELOG.md +10 -0
- data/CONTRIBUTING.md +34 -36
- data/README.md +65 -3
- data/RELEASING.md +2 -2
- data/examples/hi_real_time/hi.rb +1 -1
- data/examples/hi_real_time_and_web/hi.rb +1 -1
- data/lib/slack-ruby-client.rb +1 -0
- data/lib/slack/real_time/client.rb +21 -3
- data/lib/slack/real_time/config.rb +30 -0
- data/lib/slack/real_time/socket.rb +4 -2
- data/lib/slack/version.rb +1 -1
- data/lib/slack/web/client.rb +10 -0
- data/lib/slack/web/config.rb +1 -1
- data/lib/slack/web/faraday/connection.rb +6 -3
- data/spec/slack/real_time/client_spec.rb +114 -7
- data/spec/slack/real_time/socket_spec.rb +7 -3
- data/spec/slack/web/client_spec.rb +58 -0
- data/spec/support/real_time/connected_client.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59058e21912e23e38cc9fe877b7edbb463b07c5b
|
4
|
+
data.tar.gz: beb3d5ee788708f684f10430764a7c9c8a70263e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7df8114e487363c6e5cd5b4ea6a650247ffe4c0062c58b472f2a715888246c1d906658531db405a544ac5952923dade5bb1241a71b4b64a200310e5ac5d0e2a7
|
7
|
+
data.tar.gz: 1d180b4b25cf3c8cd514e40ebe2bb98bab04d0e0f2588f1ac733f61f97de0f1a3e1115266cec3d1b5bbf64e6ee22ce24b6630c1207956042e6eb72f494360ca0
|
data/.rubocop_todo.yml
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
-
# on 2015-07-
|
2
|
+
# on 2015-07-30 11:21:36 +0200 using RuboCop version 0.32.1.
|
3
3
|
# The point is for the user to remove these configuration records
|
4
4
|
# one by one as the offenses are removed from the code base.
|
5
5
|
# Note that changes in the inspected code, or installation of new
|
6
6
|
# versions of RuboCop, may require this file to be generated again.
|
7
7
|
|
8
|
-
# Offense count:
|
8
|
+
# Offense count: 2
|
9
|
+
Metrics/AbcSize:
|
10
|
+
Max: 21
|
11
|
+
|
12
|
+
# Offense count: 102
|
9
13
|
# Configuration parameters: AllowURI, URISchemes.
|
10
14
|
Metrics/LineLength:
|
11
15
|
Max: 153
|
@@ -13,9 +17,9 @@ Metrics/LineLength:
|
|
13
17
|
# Offense count: 3
|
14
18
|
# Configuration parameters: CountComments.
|
15
19
|
Metrics/MethodLength:
|
16
|
-
Max:
|
20
|
+
Max: 19
|
17
21
|
|
18
|
-
# Offense count:
|
22
|
+
# Offense count: 32
|
19
23
|
Style/Documentation:
|
20
24
|
Enabled: false
|
21
25
|
|
@@ -29,6 +33,6 @@ Style/FileName:
|
|
29
33
|
Style/MethodName:
|
30
34
|
Enabled: false
|
31
35
|
|
32
|
-
# Offense count:
|
36
|
+
# Offense count: 3
|
33
37
|
Style/ModuleFunction:
|
34
38
|
Enabled: false
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
### 0.2.0 (7/31/2015)
|
2
|
+
|
3
|
+
* [#2](https://github.com/dblock/slack-ruby-client/pull/2): `Slack::RealTime::Socket` now pings frames every 30s, as recommended by Slack - [@samdoiron](https://github.com/samdoiron).
|
4
|
+
* [#3](https://github.com/dblock/slack-ruby-client/issues/3): RealTime client WebSocket frame ping frequency is now configurable with `Slack::RealTime::Client.websocket_ping` - [@dblock](https://github.com/dblock).
|
5
|
+
* [#3](https://github.com/dblock/slack-ruby-client/issues/3): RealTime client WebSocket proxy is now configurable with `Slack::RealTime::Client.websocket_proxy` - [@dblock](https://github.com/dblock).
|
6
|
+
* [#3](https://github.com/dblock/slack-ruby-client/issues/3): Added global `Slack::Web::Client` and `Slack::RealTime::Client` configuration options via `Slack::Web::Client.configure` and `Slack::RealTime::Client.configure` - [@dblock](https://github.com/dblock).
|
7
|
+
* Exposed `Slack::RealTime::Client.url`, `team`, `self`, `users`, `channels`, `groups`, `ims` and `bots` - [@dblock](https://github.com/dblock).
|
8
|
+
* Default user-agent for `Slack::Web::Client` now includes a slash, eg. _Slack Ruby Client/0.1.1_ - [@dblock](https://github.com/dblock).
|
9
|
+
* Fix: set `Slack::Web::Client` connection options for `ca_path`, `ca_file`, and `proxy` - [@dblock](https://github.com/dblock).
|
10
|
+
|
1
11
|
### 0.1.0 (7/25/2015)
|
2
12
|
|
3
13
|
* Initial public release with Web and RealTime Messaging API support - [@dblock](https://github.com/dblock).
|
data/CONTRIBUTING.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Contributing to Slack
|
1
|
+
# Contributing to Slack-Ruby-Client
|
2
2
|
|
3
3
|
This project is work of [many contributors](https://github.com/dblock/slack-ruby-client/graphs/contributors).
|
4
4
|
|
@@ -6,7 +6,7 @@ You're encouraged to submit [pull requests](https://github.com/dblock/slack-ruby
|
|
6
6
|
|
7
7
|
In the examples below, substitute your Github username for `contributor` in URLs.
|
8
8
|
|
9
|
-
|
9
|
+
### Fork the Project
|
10
10
|
|
11
11
|
Fork the [project on Github](https://github.com/dblock/slack-ruby-client) and check out your copy.
|
12
12
|
|
@@ -16,7 +16,7 @@ cd slack-ruby-client
|
|
16
16
|
git remote add upstream https://github.com/dblock/slack-ruby-client.git
|
17
17
|
```
|
18
18
|
|
19
|
-
|
19
|
+
### Bundle Install and Test
|
20
20
|
|
21
21
|
Ensure that you can build the project and run tests.
|
22
22
|
|
@@ -25,9 +25,9 @@ bundle install
|
|
25
25
|
bundle exec rake
|
26
26
|
```
|
27
27
|
|
28
|
-
|
28
|
+
### Run Examples in Development
|
29
29
|
|
30
|
-
|
30
|
+
Sign up for Slack, create a private slack group for yourself.
|
31
31
|
|
32
32
|
Create a new Bot Integration under [services/new/bot](http://slack.com/services/new/bot).
|
33
33
|
|
@@ -35,11 +35,11 @@ Create a new Bot Integration under [services/new/bot](http://slack.com/services/
|
|
35
35
|
|
36
36
|
On the next screen, note the API token.
|
37
37
|
|
38
|
-
|
38
|
+
To run [the example in examples/hi_real_time](examples/hi_real_time/hi.rb), open a terminal, cd into _examples/hi_real_time_, run `bundle install`, followed by `SLACK_API_TOKEN=<your API token> bundle exec ruby hi.rb`.
|
39
39
|
|
40
|
-
|
40
|
+
## Contribute Code
|
41
41
|
|
42
|
-
|
42
|
+
### Create a Topic Branch
|
43
43
|
|
44
44
|
Make sure your fork is up-to-date and create a topic branch for your feature or bug fix.
|
45
45
|
|
@@ -49,32 +49,31 @@ git pull upstream master
|
|
49
49
|
git checkout -b my-feature-branch
|
50
50
|
```
|
51
51
|
|
52
|
-
|
52
|
+
### Write Tests
|
53
53
|
|
54
|
-
Try to write a test that reproduces the problem you're trying to fix or describes a feature that you want to build.
|
55
|
-
Add to [spec](spec).
|
54
|
+
Try to write a test that reproduces the problem you're trying to fix or describes a feature that you want to build. Add tests to [spec](spec).
|
56
55
|
|
57
56
|
We definitely appreciate pull requests that highlight or reproduce a problem, even without a fix.
|
58
57
|
|
59
|
-
|
58
|
+
### Write Code
|
60
59
|
|
61
60
|
Implement your feature or bug fix.
|
62
61
|
|
63
|
-
Ruby style is enforced with [Rubocop](https://github.com/bbatsov/rubocop).
|
64
|
-
Run `bundle exec rubocop` and fix any style issues highlighted.
|
62
|
+
Ruby style is enforced with [Rubocop](https://github.com/bbatsov/rubocop). Run `bundle exec rubocop` and fix any style issues highlighted, auto-correct issues when possible with `bundle exec rubocop -a`. To silence generally ingored issues, including line lengths or code complexity metrics, run `bundle exec rubocop --auto-gen-config`.
|
65
63
|
|
66
64
|
Make sure that `bundle exec rake` completes without errors.
|
67
65
|
|
68
|
-
|
66
|
+
### Write Documentation
|
69
67
|
|
70
68
|
Document any external behavior in the [README](README.md).
|
71
69
|
|
72
|
-
|
70
|
+
### Update Changelog
|
73
71
|
|
74
|
-
Add a line to [CHANGELOG](CHANGELOG.md) under *Next Release*.
|
75
|
-
Make it look like every other line, including your name and link to your Github account.
|
72
|
+
Add a line to [CHANGELOG](CHANGELOG.md) under *Next Release*. Don't remove *Your contribution here*.
|
76
73
|
|
77
|
-
|
74
|
+
Make it look like every other line, including a link to the issue being fixed, your name and link to your Github account.
|
75
|
+
|
76
|
+
### Commit Changes
|
78
77
|
|
79
78
|
Make sure git knows your name and email address:
|
80
79
|
|
@@ -90,28 +89,17 @@ git add ...
|
|
90
89
|
git commit
|
91
90
|
```
|
92
91
|
|
93
|
-
|
92
|
+
### Push
|
94
93
|
|
95
94
|
```
|
96
95
|
git push origin my-feature-branch
|
97
96
|
```
|
98
97
|
|
99
|
-
|
100
|
-
|
101
|
-
Go to https://github.com/contributor/slack-ruby-client and select your feature branch.
|
102
|
-
Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days.
|
103
|
-
|
104
|
-
## Rebase
|
105
|
-
|
106
|
-
If you've been working on a change for a while, rebase with upstream/master.
|
98
|
+
### Make a Pull Request
|
107
99
|
|
108
|
-
|
109
|
-
git fetch upstream
|
110
|
-
git rebase upstream/master
|
111
|
-
git push origin my-feature-branch -f
|
112
|
-
```
|
100
|
+
Go to https://github.com/contributor/slack-ruby-client and select your feature branch. Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days.
|
113
101
|
|
114
|
-
|
102
|
+
### Update CHANGELOG Again
|
115
103
|
|
116
104
|
Update the [CHANGELOG](CHANGELOG.md) with the pull request number. A typical entry looks as follows.
|
117
105
|
|
@@ -126,11 +114,21 @@ git commit --amend
|
|
126
114
|
git push origin my-feature-branch -f
|
127
115
|
```
|
128
116
|
|
129
|
-
|
117
|
+
### Rebase
|
118
|
+
|
119
|
+
If you've been working on a change for a while, rebase with upstream/master.
|
120
|
+
|
121
|
+
```
|
122
|
+
git fetch upstream
|
123
|
+
git rebase upstream/master
|
124
|
+
git push origin my-feature-branch -f
|
125
|
+
```
|
126
|
+
|
127
|
+
### Check on Your Pull Request
|
130
128
|
|
131
129
|
Go back to your pull request after a few minutes and see whether it passed muster with Travis-CI. Everything should look green, otherwise fix issues and amend your commit as described above.
|
132
130
|
|
133
|
-
|
131
|
+
### Be Patient
|
134
132
|
|
135
133
|
It's likely that your change will not be merged and that the nitpicky maintainers will ask you to do more, or fix seemingly benign problems. Hang on there!
|
136
134
|
|
data/README.md
CHANGED
@@ -52,6 +52,28 @@ See a fully working example in [examples/hi_web](examples/hi_web/hi.rb).
|
|
52
52
|
|
53
53
|
Refer to the [Slack Web API Method Reference](https://api.slack.com/methods) for the list of all available functions.
|
54
54
|
|
55
|
+
You can configure the Web client either globally or via the initializer.
|
56
|
+
|
57
|
+
```ruby
|
58
|
+
Slack::Web::Client.config do |config|
|
59
|
+
config.user_agent = 'Slack Ruby Client/1.0'
|
60
|
+
end
|
61
|
+
```
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
client = Slack::Web::Client.new(user_agent: 'Slack Ruby Client/1.0')
|
65
|
+
```
|
66
|
+
|
67
|
+
The following settings are supported.
|
68
|
+
|
69
|
+
setting | description
|
70
|
+
-------------|-------------------------------------------------------------------------------------------------
|
71
|
+
user_agent | User-agent, defaults to _Slack Ruby Client/version_.
|
72
|
+
proxy | Optional HTTP proxy.
|
73
|
+
ca_path | Optional SSL certificates path.
|
74
|
+
ca_file | Optional SSL certificates file.
|
75
|
+
endpoint | Slack endpoint, default is _https://slack.com/api_.
|
76
|
+
|
55
77
|
### RealTime Client
|
56
78
|
|
57
79
|
The Real Time Messaging API is a WebSocket-based API that allows you to receive events from Slack in real time and send messages as user.
|
@@ -60,7 +82,7 @@ The Real Time Messaging API is a WebSocket-based API that allows you to receive
|
|
60
82
|
client = Slack::RealTime::Client.new
|
61
83
|
|
62
84
|
client.on :hello do
|
63
|
-
puts
|
85
|
+
puts "Successfully connected, welcome '#{client.self['name']}' to the '#{client.team['name']}' team at https://#{client.team['domain']}.slack.com."
|
64
86
|
end
|
65
87
|
|
66
88
|
client.on :message do |data|
|
@@ -75,19 +97,59 @@ end
|
|
75
97
|
client.start!
|
76
98
|
```
|
77
99
|
|
78
|
-
You can
|
100
|
+
You can send typing indicators with `typing`.
|
79
101
|
|
80
102
|
```ruby
|
81
103
|
client.typing channel: data['channel']
|
82
104
|
```
|
83
105
|
|
106
|
+
You can send a ping with `ping`.
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
client.ping
|
110
|
+
```
|
111
|
+
|
112
|
+
The client exposes the properties of [rtm.start](https://api.slack.com/methods/rtm.start) upon a successful connection.
|
113
|
+
|
114
|
+
property | description
|
115
|
+
---------|-------------------------------------------------------------------------------------------------
|
116
|
+
url | A WebSocket Message Server URL.
|
117
|
+
self | Details on the authenticated user.
|
118
|
+
team | Details on the authenticated user's team.
|
119
|
+
users | A list of user objects, one for every member of the team.
|
120
|
+
channels | A list of channel objects, one for every channel visible to the authenticated user.
|
121
|
+
groups | A list of group objects, one for every group the authenticated user is in.
|
122
|
+
ims | A list of IM objects, one for every direct message channel visible to the authenticated user.
|
123
|
+
bots | Details of the integrations set up on this team.
|
124
|
+
|
125
|
+
You can configure the RealTime client either globally or via the initializer.
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
Slack::RealTime::Client.config do |config|
|
129
|
+
config.websocket_ping = 42
|
130
|
+
end
|
131
|
+
```
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
client = Slack::RealTime::Client.new(websocket_ping: 42)
|
135
|
+
```
|
136
|
+
|
137
|
+
The following settings are supported.
|
138
|
+
|
139
|
+
setting | description
|
140
|
+
----------------|-----------------------------------------------------------------------------------------------------
|
141
|
+
websocket_ping | The number of seconds that indicates how often the WebSocket should send ping frames, default is 30.
|
142
|
+
websocket_proxy | Connect via proxy, include `:origin` and `:headers`.
|
143
|
+
|
144
|
+
Note that the RealTime client uses a Web client to obtain the WebSocket URL via [rtm.start](https://api.slack.com/methods/rtm.start), configure Web client options via `Slack::Web::Client.configure` as described above.
|
145
|
+
|
84
146
|
See a fullly working example in [examples/hi_real_time](examples/hi_real_time/hi.rb).
|
85
147
|
|
86
148
|
![](examples/hi_real_time/hi.gif)
|
87
149
|
|
88
150
|
### Combinging RealTime and Web Clients
|
89
151
|
|
90
|
-
Since the
|
152
|
+
Since the Web client is used to obtain the RealTime client's WebSocket URL, you can continue using the Web client in combination with the RealTime client.
|
91
153
|
|
92
154
|
```ruby
|
93
155
|
client = Slack::RealTime::Client.new
|
data/RELEASING.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# Releasing
|
1
|
+
# Releasing Slack-Ruby-Client
|
2
2
|
|
3
|
-
There're no
|
3
|
+
There're no hard rules about when to release slack-ruby-client. Release bug fixes frequenty, features not so frequently and breaking API changes rarely.
|
4
4
|
|
5
5
|
### Release
|
6
6
|
|
data/examples/hi_real_time/hi.rb
CHANGED
@@ -8,7 +8,7 @@ end
|
|
8
8
|
client = Slack::RealTime::Client.new
|
9
9
|
|
10
10
|
client.on :hello do
|
11
|
-
puts
|
11
|
+
puts "Successfully connected, welcome '#{client.self['name']}' to the '#{client.team['name']}' team at https://#{client.team['domain']}.slack.com."
|
12
12
|
end
|
13
13
|
|
14
14
|
client.on :message do |data|
|
@@ -8,7 +8,7 @@ end
|
|
8
8
|
client = Slack::RealTime::Client.new
|
9
9
|
|
10
10
|
client.on :hello do
|
11
|
-
puts
|
11
|
+
puts "Successfully connected, welcome '#{client.self['name']}' to the '#{client.team['name']}' team at https://#{client.team['domain']}.slack.com."
|
12
12
|
end
|
13
13
|
|
14
14
|
client.on :message do |data|
|
data/lib/slack-ruby-client.rb
CHANGED
@@ -10,13 +10,17 @@ module Slack
|
|
10
10
|
include Api::Typing
|
11
11
|
|
12
12
|
attr_accessor :web_client
|
13
|
+
attr_accessor(*Config::ATTRIBUTES)
|
13
14
|
|
14
|
-
def initialize
|
15
|
+
def initialize(options = {})
|
15
16
|
@callbacks = {}
|
16
17
|
@web_client = Slack::Web::Client.new
|
18
|
+
Slack::RealTime::Config::ATTRIBUTES.each do |key|
|
19
|
+
send("#{key}=", options[key] || Slack::RealTime.config.send(key))
|
20
|
+
end
|
17
21
|
end
|
18
22
|
|
19
|
-
[:url, :team, :self, :users, :channels, :ims, :bots].each do |attr|
|
23
|
+
[:url, :team, :self, :users, :channels, :groups, :ims, :bots].each do |attr|
|
20
24
|
define_method attr do
|
21
25
|
@options[attr.to_s] if @options
|
22
26
|
end
|
@@ -32,7 +36,11 @@ module Slack
|
|
32
36
|
fail ClientAlreadyStartedError if started?
|
33
37
|
EM.run do
|
34
38
|
@options = web_client.rtm_start
|
35
|
-
|
39
|
+
|
40
|
+
socket_options = {}
|
41
|
+
socket_options[:ping] = websocket_ping if websocket_ping
|
42
|
+
socket_options[:proxy] = websocket_proxy if websocket_proxy
|
43
|
+
@socket = Slack::RealTime::Socket.new(@options['url'], socket_options)
|
36
44
|
|
37
45
|
@socket.connect! do |ws|
|
38
46
|
ws.on :open do |event|
|
@@ -59,6 +67,16 @@ module Slack
|
|
59
67
|
@socket && @socket.connected?
|
60
68
|
end
|
61
69
|
|
70
|
+
class << self
|
71
|
+
def configure
|
72
|
+
block_given? ? yield(Config) : Config
|
73
|
+
end
|
74
|
+
|
75
|
+
def config
|
76
|
+
Config
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
62
80
|
protected
|
63
81
|
|
64
82
|
def send_json(data)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Slack
|
2
|
+
module RealTime
|
3
|
+
module Config
|
4
|
+
extend self
|
5
|
+
|
6
|
+
ATTRIBUTES = [
|
7
|
+
:websocket_ping,
|
8
|
+
:websocket_proxy
|
9
|
+
]
|
10
|
+
|
11
|
+
attr_accessor(*Config::ATTRIBUTES)
|
12
|
+
|
13
|
+
def reset
|
14
|
+
self.websocket_ping = 30
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def configure
|
20
|
+
block_given? ? yield(Config) : Config
|
21
|
+
end
|
22
|
+
|
23
|
+
def config
|
24
|
+
Config
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Slack::RealTime::Config.reset
|
@@ -2,9 +2,11 @@ module Slack
|
|
2
2
|
module RealTime
|
3
3
|
class Socket
|
4
4
|
attr_accessor :url
|
5
|
+
attr_accessor :options
|
5
6
|
|
6
|
-
def initialize(url)
|
7
|
+
def initialize(url, options = {})
|
7
8
|
@url = url
|
9
|
+
@options = options
|
8
10
|
end
|
9
11
|
|
10
12
|
def send_data(data)
|
@@ -14,7 +16,7 @@ module Slack
|
|
14
16
|
def connect!(&_block)
|
15
17
|
return if connected?
|
16
18
|
|
17
|
-
@ws = Faye::WebSocket::Client.new(url)
|
19
|
+
@ws = Faye::WebSocket::Client.new(url, nil, options)
|
18
20
|
|
19
21
|
@ws.on :close do |event|
|
20
22
|
close(event)
|
data/lib/slack/version.rb
CHANGED
data/lib/slack/web/client.rb
CHANGED
data/lib/slack/web/config.rb
CHANGED
@@ -15,7 +15,7 @@ module Slack
|
|
15
15
|
|
16
16
|
def reset
|
17
17
|
self.endpoint = 'https://slack.com/api/'
|
18
|
-
self.user_agent = "Slack Ruby Client
|
18
|
+
self.user_agent = "Slack Ruby Client/#{Slack::VERSION}"
|
19
19
|
self.ca_path = `openssl version -a | grep OPENSSLDIR | awk '{print $2}'|sed -e 's/\"//g'`
|
20
20
|
self.ca_file = "#{ca_path}/ca-certificates.crt"
|
21
21
|
end
|
@@ -6,11 +6,14 @@ module Slack
|
|
6
6
|
|
7
7
|
def connection
|
8
8
|
options = {
|
9
|
-
headers: { 'Accept' => 'application/json; charset=utf-8'
|
10
|
-
url: endpoint
|
9
|
+
headers: { 'Accept' => 'application/json; charset=utf-8' }
|
11
10
|
}
|
12
11
|
|
13
|
-
|
12
|
+
options[:headers]['User-Agent'] = user_agent if user_agent
|
13
|
+
options[:proxy] = proxy if proxy
|
14
|
+
options[:ssl] = { ca_path: ca_path, ca_file: ca_file }
|
15
|
+
|
16
|
+
::Faraday::Connection.new(endpoint, options) do |connection|
|
14
17
|
connection.use ::Faraday::Request::Multipart
|
15
18
|
connection.use ::Faraday::Request::UrlEncoded
|
16
19
|
connection.use ::Faraday::Response::RaiseError
|
@@ -2,20 +2,48 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
|
4
4
|
let(:client) { Slack::RealTime::Client.new }
|
5
|
-
let(:ws) { double(Faye::WebSocket::Client) }
|
5
|
+
let(:ws) { double(Faye::WebSocket::Client, on: true) }
|
6
6
|
let(:url) { 'wss://ms173.slack-msgs.com/websocket/lqcUiAvrKTP-uuid=' }
|
7
|
-
|
7
|
+
before do
|
8
|
+
allow(EM).to receive(:run).and_yield
|
9
|
+
end
|
8
10
|
context 'started' do
|
9
11
|
describe '#start!' do
|
12
|
+
let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
|
10
13
|
before do
|
11
|
-
allow(
|
12
|
-
allow(Slack::RealTime::Socket).to receive(:new).with(url).and_return(socket)
|
14
|
+
allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30).and_return(socket)
|
13
15
|
allow(socket).to receive(:connect!).and_yield(ws)
|
14
|
-
allow(ws).to receive(:on)
|
15
16
|
client.start!
|
16
17
|
end
|
17
|
-
|
18
|
-
|
18
|
+
context 'properties provided upon connection' do
|
19
|
+
it 'sets url' do
|
20
|
+
expect(client.url).to eq url
|
21
|
+
end
|
22
|
+
it 'sets team' do
|
23
|
+
expect(client.team['domain']).to eq 'dblockdotorg'
|
24
|
+
end
|
25
|
+
it 'sets self' do
|
26
|
+
expect(client.self['id']).to eq 'U07518DTL'
|
27
|
+
end
|
28
|
+
it 'sets users' do
|
29
|
+
expect(client.users.count).to eq 7
|
30
|
+
expect(client.users.first['id']).to eq 'U07KECJ77'
|
31
|
+
end
|
32
|
+
it 'sets channels' do
|
33
|
+
expect(client.channels.count).to eq 8
|
34
|
+
expect(client.channels.first['name']).to eq 'demo'
|
35
|
+
end
|
36
|
+
it 'sets ims' do
|
37
|
+
expect(client.ims.count).to eq 2
|
38
|
+
expect(client.ims.first['user']).to eq 'USLACKBOT'
|
39
|
+
end
|
40
|
+
it 'sets bots' do
|
41
|
+
expect(client.bots.count).to eq 5
|
42
|
+
expect(client.bots.first['name']).to eq 'bot'
|
43
|
+
end
|
44
|
+
it 'sets groups' do
|
45
|
+
expect(client.groups.count).to eq 0
|
46
|
+
end
|
19
47
|
end
|
20
48
|
it 'uses web client to fetch url' do
|
21
49
|
expect(client.web_client).to be_a Slack::Web::Client
|
@@ -48,4 +76,83 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
48
76
|
end
|
49
77
|
end
|
50
78
|
end
|
79
|
+
context 'with defaults' do
|
80
|
+
describe '#initialize' do
|
81
|
+
it 'sets ping' do
|
82
|
+
expect(client.websocket_ping).to eq 30
|
83
|
+
end
|
84
|
+
it "doesn't set proxy" do
|
85
|
+
expect(client.websocket_proxy).to be nil
|
86
|
+
end
|
87
|
+
Slack::RealTime::Config::ATTRIBUTES.each do |key|
|
88
|
+
it "sets #{key}" do
|
89
|
+
expect(client.send(key)).to eq Slack::RealTime::Config.send(key)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
context 'with custom settings' do
|
95
|
+
describe '#initialize' do
|
96
|
+
Slack::RealTime::Config::ATTRIBUTES.each do |key|
|
97
|
+
context key do
|
98
|
+
let(:client) { Slack::RealTime::Client.new(key => 'custom') }
|
99
|
+
it "sets #{key}" do
|
100
|
+
expect(client.send(key)).to_not eq Slack::RealTime::Config.send(key)
|
101
|
+
expect(client.send(key)).to eq 'custom'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
context 'global config' do
|
108
|
+
after do
|
109
|
+
Slack::RealTime::Client.config.reset
|
110
|
+
end
|
111
|
+
let(:client) { Slack::RealTime::Client.new }
|
112
|
+
context 'ping' do
|
113
|
+
before do
|
114
|
+
Slack::RealTime::Client.configure do |config|
|
115
|
+
config.websocket_ping = 15
|
116
|
+
end
|
117
|
+
end
|
118
|
+
describe '#initialize' do
|
119
|
+
it 'sets ping' do
|
120
|
+
expect(client.websocket_ping).to eq 15
|
121
|
+
end
|
122
|
+
it 'creates a connection with custom ping' do
|
123
|
+
expect(Faye::WebSocket::Client).to receive(:new).with(url, nil, ping: 15).and_return(ws)
|
124
|
+
client.start!
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
context 'proxy' do
|
129
|
+
before do
|
130
|
+
Slack::RealTime::Client.configure do |config|
|
131
|
+
config.websocket_proxy = {
|
132
|
+
origin: 'http://username:password@proxy.example.com',
|
133
|
+
headers: { 'User-Agent' => 'ruby' }
|
134
|
+
}
|
135
|
+
end
|
136
|
+
end
|
137
|
+
describe '#initialize' do
|
138
|
+
it 'sets proxy' do
|
139
|
+
expect(client.websocket_proxy).to eq(
|
140
|
+
origin: 'http://username:password@proxy.example.com',
|
141
|
+
headers: { 'User-Agent' => 'ruby' }
|
142
|
+
)
|
143
|
+
end
|
144
|
+
it 'creates a connection with custom proxy' do
|
145
|
+
expect(Faye::WebSocket::Client).to receive(:new).with(
|
146
|
+
url,
|
147
|
+
nil,
|
148
|
+
ping: 30,
|
149
|
+
proxy: {
|
150
|
+
origin: 'http://username:password@proxy.example.com',
|
151
|
+
headers: { 'User-Agent' => 'ruby' }
|
152
|
+
}).and_return(ws)
|
153
|
+
client.start!
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
51
158
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
RSpec.describe Slack::RealTime::Socket do
|
4
4
|
context 'with url' do
|
5
5
|
let(:url) { 'wss://ms174.slack-msgs.com/websocket/xyz' }
|
6
|
-
let(:socket) { Slack::RealTime::Socket.new(url) }
|
6
|
+
let(:socket) { Slack::RealTime::Socket.new(url, ping: 42) }
|
7
7
|
let(:ws) { double(Faye::WebSocket::Client) }
|
8
8
|
describe '#initialize' do
|
9
9
|
it 'sets url' do
|
@@ -12,13 +12,17 @@ RSpec.describe Slack::RealTime::Socket do
|
|
12
12
|
end
|
13
13
|
describe '#connect!' do
|
14
14
|
before do
|
15
|
-
allow(
|
15
|
+
allow(ws).to receive(:on).with(:close)
|
16
16
|
end
|
17
17
|
it 'connects' do
|
18
|
-
|
18
|
+
allow(Faye::WebSocket::Client).to receive(:new).and_return(ws)
|
19
19
|
socket.connect!
|
20
20
|
expect(socket.instance_variable_get('@ws')).to eq ws
|
21
21
|
end
|
22
|
+
it 'pings every 30s' do
|
23
|
+
expect(Faye::WebSocket::Client).to receive(:new).with(url, nil, ping: 42).and_return(ws)
|
24
|
+
socket.connect!
|
25
|
+
end
|
22
26
|
end
|
23
27
|
describe '#disconnect!' do
|
24
28
|
it 'closes and nils the websocket' do
|
@@ -28,4 +28,62 @@ RSpec.describe Slack::Web::Client do
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
31
|
+
context 'global config' do
|
32
|
+
after do
|
33
|
+
Slack::Web::Client.config.reset
|
34
|
+
end
|
35
|
+
let(:client) { Slack::Web::Client.new }
|
36
|
+
context 'user-agent' do
|
37
|
+
before do
|
38
|
+
Slack::Web::Client.configure do |config|
|
39
|
+
config.user_agent = 'custom/user-agent'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
describe '#initialize' do
|
43
|
+
it 'sets user-agent' do
|
44
|
+
expect(client.user_agent).to eq 'custom/user-agent'
|
45
|
+
end
|
46
|
+
it 'creates a connection with the custom user-agent' do
|
47
|
+
expect(client.send(:connection).headers).to eq(
|
48
|
+
'Accept' => 'application/json; charset=utf-8',
|
49
|
+
'User-Agent' => 'custom/user-agent'
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
context 'proxy' do
|
55
|
+
before do
|
56
|
+
Slack::Web::Client.configure do |config|
|
57
|
+
config.proxy = 'http://localhost:8080'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
describe '#initialize' do
|
61
|
+
it 'sets proxy' do
|
62
|
+
expect(client.proxy).to eq 'http://localhost:8080'
|
63
|
+
end
|
64
|
+
it 'creates a connection with the proxy' do
|
65
|
+
expect(client.send(:connection).proxy.uri.to_s).to eq 'http://localhost:8080'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
context 'SSL options' do
|
70
|
+
before do
|
71
|
+
Slack::Web::Client.configure do |config|
|
72
|
+
config.ca_path = '/ca_path'
|
73
|
+
config.ca_file = '/ca_file'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
describe '#initialize' do
|
77
|
+
it 'sets ca_path and ca_file' do
|
78
|
+
expect(client.ca_path).to eq '/ca_path'
|
79
|
+
expect(client.ca_file).to eq '/ca_file'
|
80
|
+
end
|
81
|
+
it 'creates a connection with ssl options' do
|
82
|
+
ssl = client.send(:connection).ssl
|
83
|
+
expect(ssl.ca_path).to eq '/ca_path'
|
84
|
+
expect(ssl.ca_file).to eq '/ca_file'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
31
89
|
end
|
@@ -5,7 +5,7 @@ RSpec.shared_context 'connected client' do
|
|
5
5
|
let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
|
6
6
|
before do
|
7
7
|
allow(EM).to receive(:run).and_yield
|
8
|
-
allow(Slack::RealTime::Socket).to receive(:new).with(url).and_return(socket)
|
8
|
+
allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30).and_return(socket)
|
9
9
|
allow(socket).to receive(:connect!).and_yield(ws)
|
10
10
|
allow(ws).to receive(:on)
|
11
11
|
client.start!
|
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.2.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: 2015-07-
|
11
|
+
date: 2015-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -200,6 +200,7 @@ files:
|
|
200
200
|
- lib/slack/real_time/api/ping.rb
|
201
201
|
- lib/slack/real_time/api/typing.rb
|
202
202
|
- lib/slack/real_time/client.rb
|
203
|
+
- lib/slack/real_time/config.rb
|
203
204
|
- lib/slack/real_time/socket.rb
|
204
205
|
- lib/slack/version.rb
|
205
206
|
- lib/slack/web/api/endpoints.rb
|