slack-ruby-bot 0.7.0 → 0.8.0
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 +4 -4
- data/.travis.yml +4 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile +2 -0
- data/README.md +53 -5
- data/UPGRADING.md +14 -2
- data/examples/market/Gemfile +1 -0
- data/examples/market/marketbot.rb +2 -0
- data/examples/minimal/Gemfile +1 -0
- data/examples/weather/Gemfile +1 -0
- data/examples/weather/weatherbot.rb +2 -0
- data/lib/slack-ruby-bot/about.rb +1 -1
- data/lib/slack-ruby-bot/app.rb +1 -1
- data/lib/slack-ruby-bot/commands/base.rb +2 -2
- data/lib/slack-ruby-bot/config.rb +1 -1
- data/lib/slack-ruby-bot/hooks.rb +2 -1
- data/lib/slack-ruby-bot/hooks/hello.rb +7 -3
- data/lib/slack-ruby-bot/hooks/hook_support.rb +37 -0
- data/lib/slack-ruby-bot/hooks/message.rb +2 -4
- data/lib/slack-ruby-bot/hooks/set.rb +45 -0
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_error.rb +11 -3
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_message.rb +10 -2
- data/lib/slack-ruby-bot/server.rb +15 -25
- data/lib/slack-ruby-bot/version.rb +1 -1
- data/slack-ruby-bot.gemspec +1 -2
- data/spec/slack-ruby-bot/commands/about_spec.rb +0 -3
- data/spec/slack-ruby-bot/commands/aliases_spec.rb +2 -8
- data/spec/slack-ruby-bot/commands/bot_spec.rb +2 -5
- data/spec/slack-ruby-bot/commands/commands_with_expression_spec.rb +1 -1
- data/spec/slack-ruby-bot/commands/direct_messages_spec.rb +2 -2
- data/spec/slack-ruby-bot/commands/empty_text_spec.rb +1 -6
- data/spec/slack-ruby-bot/commands/message_loop_spec.rb +6 -2
- data/spec/slack-ruby-bot/commands/nil_message_spec.rb +5 -4
- data/spec/slack-ruby-bot/commands/not_implemented_spec.rb +0 -3
- data/spec/slack-ruby-bot/commands/send_gif_spec.rb +5 -11
- data/spec/slack-ruby-bot/commands/send_message_spec.rb +1 -6
- data/spec/slack-ruby-bot/commands/send_message_with_gif_spec.rb +16 -20
- data/spec/slack-ruby-bot/commands/unknown_spec.rb +4 -5
- data/spec/slack-ruby-bot/hooks/hook_support_spec.rb +47 -0
- data/spec/slack-ruby-bot/hooks/message_spec.rb +10 -8
- data/spec/slack-ruby-bot/hooks/set_spec.rb +56 -0
- data/spec/slack-ruby-bot/rspec/respond_with_error_spec.rb +1 -1
- data/spec/slack-ruby-bot/server_spec.rb +5 -5
- data/spec/spec_helper.rb +1 -0
- metadata +11 -20
- data/lib/slack-ruby-bot/hooks/base.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8b86a027a9c17bbb4d3e69212493162aacfffca
|
4
|
+
data.tar.gz: 94ec098315fd7611325f567da9c5964d4847d47b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c97a004bbcfadbbd318158cc8ffe1d59637c7b0026139e771f655393cb362acd02adff508cff69a961781b5da25efa199756c326ca18f098fefc8f6ee85c4b6b
|
7
|
+
data.tar.gz: 15014981779338072114308822e4018d9bfc21b067f58689489ec2fffaec88b7fbf46a05a40a09d963c302da70d9312f9f0d08c42fe25a080ecfab2e78a171cc
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
### 0.8.0 (5/5/2016)
|
2
|
+
|
3
|
+
* [#32](https://github.com/dblock/slack-ruby-bot/issues/32): Don't include `faye-websocket` by default, support `celluloid-io` - [@dblock](https://github.com/dblock).
|
4
|
+
* [#54](https://github.com/dblock/slack-ruby-bot/pull/54): Improvements to Hook configuration - [@dramalho](https://github.com/dramalho).
|
5
|
+
|
1
6
|
### 0.7.0 (3/6/2016)
|
2
7
|
|
3
8
|
* Improved regular expression matching performance with less matching per command - [@dblock](https://github.com/dblock).
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -17,7 +17,7 @@ A generic Slack bot framework written in Ruby on top of [slack-ruby-client](http
|
|
17
17
|
|
18
18
|
## Stable Release
|
19
19
|
|
20
|
-
You're reading the documentation for the **stable** release of slack-ruby-bot
|
20
|
+
You're reading the documentation for the **stable** release of slack-ruby-bot 0.8.0. See [CHANGELOG](CHANGELOG.md) for a history of changes and [UPGRADING](UPGRADING.md) for how to upgrade to more recent versions.
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
@@ -26,9 +26,10 @@ You're reading the documentation for the **stable** release of slack-ruby-bot, 0
|
|
26
26
|
#### Gemfile
|
27
27
|
|
28
28
|
```ruby
|
29
|
-
source '
|
29
|
+
source 'https://rubygems.org'
|
30
30
|
|
31
31
|
gem 'slack-ruby-bot'
|
32
|
+
gem 'celluloid-io'
|
32
33
|
```
|
33
34
|
|
34
35
|
#### pongbot.rb
|
@@ -190,17 +191,39 @@ Get help.
|
|
190
191
|
|
191
192
|
### Hooks
|
192
193
|
|
193
|
-
Hooks are event handlers and respond to Slack RTM API [events](https://api.slack.com/events), such as [hello](lib/slack-ruby-bot/hooks/hello.rb) or [message](lib/slack-ruby-bot/hooks/message.rb). You can implement your own
|
194
|
+
Hooks are event handlers and respond to Slack RTM API [events](https://api.slack.com/events), such as [hello](lib/slack-ruby-bot/hooks/hello.rb) or [message](lib/slack-ruby-bot/hooks/message.rb). You can implement your own in a couple of ways:
|
195
|
+
|
196
|
+
#### Implement and register a Hook Handler
|
197
|
+
|
198
|
+
A Hook Handler is any object that respond to a `call` message, like a proc, instance of an object, class with a `call` class method, etc.
|
199
|
+
|
200
|
+
Hooks are registered onto the `SlackRubyBot::Server` instance, by way of a configuration hash
|
201
|
+
|
202
|
+
```ruby
|
203
|
+
SlackRubyBot::Server.new(hook_handlers: {
|
204
|
+
hello: MyBot::Hooks::UserChange.new
|
205
|
+
})
|
206
|
+
```
|
207
|
+
|
208
|
+
or at any time by pushing it to the `HookSet`
|
209
|
+
|
210
|
+
```ruby
|
211
|
+
# Push an object that implements the
|
212
|
+
server.hooks.add(:hello, MyBot::Hooks::UserChange.new)
|
213
|
+
|
214
|
+
# Push a lambda to handle the event
|
215
|
+
server.hooks.add(:hello, ->(client, data) { puts "Hello!" })
|
216
|
+
```
|
194
217
|
|
195
218
|
For example, the following hook handles [user_change](https://api.slack.com/events/user_change), an event sent when a team member updates their profile or data. This can be useful to update the local user cache when a user is renamed.
|
196
219
|
|
197
220
|
```ruby
|
198
221
|
module MyBot
|
199
222
|
module Hooks
|
200
|
-
|
223
|
+
class UserChange
|
201
224
|
extend SlackRubyBot::Hooks::Base
|
202
225
|
|
203
|
-
def
|
226
|
+
def call(client, data)
|
204
227
|
# data['user']['id'] contains the user ID
|
205
228
|
# data['user']['name'] contains the new user name
|
206
229
|
...
|
@@ -210,6 +233,23 @@ module MyBot
|
|
210
233
|
end
|
211
234
|
```
|
212
235
|
|
236
|
+
Hooks can also be written as blocks inside the `SlackBotRuby::Server` class, for example
|
237
|
+
|
238
|
+
```ruby
|
239
|
+
module MyBot
|
240
|
+
class MyServer < SlackRubyBot::Server
|
241
|
+
on 'hello' do |client, data|
|
242
|
+
# data['user']['id'] contains the user ID
|
243
|
+
# data['user']['name'] contains the new user name
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
```
|
248
|
+
|
249
|
+
These will get pushed into the hook set on initialization.
|
250
|
+
|
251
|
+
Either by configuration, explicit assignment or hook blocks, multiple handlers can exist for the same event type.
|
252
|
+
|
213
253
|
### Disable Animated GIFs
|
214
254
|
|
215
255
|
By default bots send animated GIFs in default commands and errors. To disable animated GIFs set `send_gifs` or `ENV['SLACK_RUBY_BOT_SEND_GIFS']` to `false`.
|
@@ -230,6 +270,14 @@ SlackRubyBot.configure do |config|
|
|
230
270
|
end
|
231
271
|
```
|
232
272
|
|
273
|
+
### Logging
|
274
|
+
|
275
|
+
By default bots set a logger to `STDOUT` with `DEBUG` level. The logger is used in both the RealTime and Web clients. Silence logger as follows.
|
276
|
+
|
277
|
+
```ruby
|
278
|
+
SlackRubyBot::Client.logger.level = Logger::WARN
|
279
|
+
```
|
280
|
+
|
233
281
|
### Advanced Integration
|
234
282
|
|
235
283
|
You may want to integrate a bot or multiple bots into other systems, in which case a globally configured bot may not work for you. You may create instances of [SlackRubyBot::Server](lib/slack-ruby-bot/server.rb) which accepts `token`, `aliases` and `send_gifs`.
|
data/UPGRADING.md
CHANGED
@@ -1,6 +1,20 @@
|
|
1
1
|
Upgrading SlackRubyBot
|
2
2
|
======================
|
3
3
|
|
4
|
+
### Upgrading to >= 0.8.0
|
5
|
+
|
6
|
+
#### Require a concurrency library
|
7
|
+
|
8
|
+
The `faye-websocket` library is no longer required by default. Add either `faye-websocket` or `celluiloid-io` to your `Gemfile` depending on which concurrency implementation you'd like to use. We recommend `celluloid-io` moving forward.
|
9
|
+
|
10
|
+
#### Hook::Base was removed, explicitly register any custom hook classes
|
11
|
+
|
12
|
+
Hook classes are now handled differently, namely they are explicitly registered into `SlackRubyBot::Server` via a configuration option (`hook_handlers`) or by passing a similar hash later on through the `add_hook_handlers` method. Including Hook classes directly into the server class is no longer needed.
|
13
|
+
|
14
|
+
A hook is actioned via a `call` message onto the handler object (this can be anything that responds to that), so you'll need to rename your method.
|
15
|
+
|
16
|
+
Finally, you can now register multiple hooks for the same event, so if you had any code to remove default hooks, you'll need to change it so you pass a configuration hash into `Server`
|
17
|
+
|
4
18
|
### Upgrading to >= 0.7.0
|
5
19
|
|
6
20
|
#### Simplify Match Expression Checking
|
@@ -175,5 +189,3 @@ def self.call(client, data, match)
|
|
175
189
|
send_message_with_gif client, data.channel, 'hello', 'hi'
|
176
190
|
end
|
177
191
|
```
|
178
|
-
|
179
|
-
|
data/examples/market/Gemfile
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'slack-ruby-bot'
|
2
2
|
require 'yahoo-finance'
|
3
3
|
|
4
|
+
SlackRubyBot::Client.logger.level = Logger::WARN
|
5
|
+
|
4
6
|
class MarketBot < SlackRubyBot::Bot
|
5
7
|
scan(/([A-Z]{2,5}+)/) do |client, data, stocks|
|
6
8
|
YahooFinance::Client.new.quotes(stocks, [:name, :symbol, :last_trade_price, :change, :change_in_percent]).each do |quote|
|
data/examples/minimal/Gemfile
CHANGED
data/examples/weather/Gemfile
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'slack-ruby-bot'
|
2
2
|
|
3
|
+
SlackRubyBot::Client.logger.level = Logger::WARN
|
4
|
+
|
3
5
|
class WeatherBot < SlackRubyBot::Bot
|
4
6
|
match(/^How is the weather in (?<location>\w*)\?$/i) do |client, data, match|
|
5
7
|
client.say(channel: data.channel, text: "The weather in #{match[:location]} is nice.")
|
data/lib/slack-ruby-bot/about.rb
CHANGED
data/lib/slack-ruby-bot/app.rb
CHANGED
@@ -2,7 +2,7 @@ module SlackRubyBot
|
|
2
2
|
class App < Server
|
3
3
|
def initialize(options = {})
|
4
4
|
SlackRubyBot.configure do |config|
|
5
|
-
config.token = ENV['SLACK_API_TOKEN'] ||
|
5
|
+
config.token = ENV['SLACK_API_TOKEN'] || raise("Missing ENV['SLACK_API_TOKEN'].")
|
6
6
|
config.aliases = ENV['SLACK_RUBY_BOT_ALIASES'].split(' ') if ENV['SLACK_RUBY_BOT_ALIASES']
|
7
7
|
end
|
8
8
|
Slack.configure do |config|
|
@@ -7,7 +7,7 @@ module SlackRubyBot
|
|
7
7
|
class << self
|
8
8
|
def send_message(client, channel, text, options = {})
|
9
9
|
logger.warn '[DEPRECATION] `send_message` is deprecated. Please use `client.say` instead.'
|
10
|
-
if text && text.length
|
10
|
+
if text && !text.length.empty?
|
11
11
|
client.say(options.merge(channel: channel, text: text))
|
12
12
|
else
|
13
13
|
client.say(options.merge(channel: channel, text: 'Nothing to see here.', gif: 'nothing'))
|
@@ -61,7 +61,7 @@ module SlackRubyBot
|
|
61
61
|
elsif respond_to?(:call)
|
62
62
|
send(:call, client, data, match)
|
63
63
|
else
|
64
|
-
|
64
|
+
raise NotImplementedError, data.text
|
65
65
|
end
|
66
66
|
break
|
67
67
|
end if expression
|
data/lib/slack-ruby-bot/hooks.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
module SlackRubyBot
|
2
2
|
module Hooks
|
3
|
-
|
4
|
-
|
3
|
+
class Hello
|
4
|
+
attr_accessor :logger
|
5
5
|
|
6
|
-
def
|
6
|
+
def initialize(logger)
|
7
|
+
self.logger = logger
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(client, _data)
|
7
11
|
return unless client && client.team
|
8
12
|
logger.info "Successfully connected to https://#{client.team.domain}.slack.com."
|
9
13
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SlackRubyBot
|
2
|
+
module Hooks
|
3
|
+
module HookSupport
|
4
|
+
def self.included(base)
|
5
|
+
base.cattr_accessor :hook_blocks
|
6
|
+
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def on(event_name, &block)
|
12
|
+
self.hook_blocks ||= {}
|
13
|
+
|
14
|
+
self.hook_blocks[event_name] ||= []
|
15
|
+
self.hook_blocks[event_name] << block
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Instance stuff
|
20
|
+
def hooks
|
21
|
+
@hooks ||= SlackRubyBot::Hooks::Set.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def flush_hook_blocks
|
25
|
+
return nil unless self.class.hook_blocks
|
26
|
+
|
27
|
+
add_hook_handlers(self.class.hook_blocks)
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_hook_handlers(handler_hash)
|
31
|
+
handler_hash.each do |hook, handlers|
|
32
|
+
Array(handlers).each { |handler| hooks.add(hook, handler) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
module SlackRubyBot
|
2
2
|
module Hooks
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
def message(client, data)
|
3
|
+
class Message
|
4
|
+
def call(client, data)
|
7
5
|
return if message_to_self_not_allowed? && message_to_self?(client, data)
|
8
6
|
data.text.strip! if data.text
|
9
7
|
result = child_command_classes.detect { |d| d.invoke(client, data) }
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module SlackRubyBot
|
2
|
+
module Hooks
|
3
|
+
class Set
|
4
|
+
attr_accessor :handlers, :client
|
5
|
+
|
6
|
+
def initialize(client = nil)
|
7
|
+
self.handlers = {}
|
8
|
+
self.client = client
|
9
|
+
|
10
|
+
@pending_flush = client.blank?
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(hook_name, handler)
|
14
|
+
if handlers[hook_name].present?
|
15
|
+
handlers[hook_name] << handler
|
16
|
+
else
|
17
|
+
handlers[hook_name] = [handler]
|
18
|
+
register_callback(hook_name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def client=(client)
|
23
|
+
@client = client
|
24
|
+
|
25
|
+
flush_handlers if @pending_flush
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def register_callback(hook_name)
|
31
|
+
return unless client # We'll delay this until client is set
|
32
|
+
|
33
|
+
client.on hook_name do |data|
|
34
|
+
handlers[hook_name].each do |handler|
|
35
|
+
handler.call(client, data)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def flush_handlers
|
41
|
+
handlers.keys.each { |hook| register_callback(hook) }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -2,12 +2,20 @@ require 'rspec/expectations'
|
|
2
2
|
|
3
3
|
RSpec::Matchers.define :respond_with_error do |error, error_message|
|
4
4
|
match do |actual|
|
5
|
-
channel, user, message = parse(actual)
|
6
5
|
allow(Giphy).to receive(:random)
|
6
|
+
|
7
|
+
client = if respond_to?(:client)
|
8
|
+
send(:client)
|
9
|
+
else
|
10
|
+
SlackRubyBot::Client.new
|
11
|
+
end
|
12
|
+
|
13
|
+
message_command = SlackRubyBot::Hooks::Message.new
|
14
|
+
channel, user, message = parse(actual)
|
15
|
+
|
7
16
|
begin
|
8
17
|
expect do
|
9
|
-
client
|
10
|
-
app.send(:message, client, Hashie::Mash.new(text: message, channel: channel, user: user))
|
18
|
+
message_command.call(client, Hashie::Mash.new(text: message, channel: channel, user: user))
|
11
19
|
end.to raise_error error, error_message
|
12
20
|
rescue RSpec::Expectations::ExpectationNotMetError => e
|
13
21
|
@error_message = e.message
|
@@ -2,11 +2,19 @@ require 'rspec/expectations'
|
|
2
2
|
|
3
3
|
RSpec::Matchers.define :respond_with_slack_message do |expected|
|
4
4
|
match do |actual|
|
5
|
+
client = if respond_to?(:client)
|
6
|
+
send(:client)
|
7
|
+
else
|
8
|
+
SlackRubyBot::Client.new
|
9
|
+
end
|
10
|
+
|
11
|
+
message_command = SlackRubyBot::Hooks::Message.new
|
12
|
+
|
5
13
|
channel, user, message = parse(actual)
|
6
14
|
allow(Giphy).to receive(:random)
|
7
|
-
|
15
|
+
|
8
16
|
expect(client).to receive(:message).with(channel: channel, text: expected)
|
9
|
-
|
17
|
+
message_command.call(client, Hashie::Mash.new(text: message, channel: channel, user: user))
|
10
18
|
true
|
11
19
|
end
|
12
20
|
|
@@ -1,23 +1,30 @@
|
|
1
1
|
module SlackRubyBot
|
2
2
|
class Server
|
3
3
|
include Loggable
|
4
|
-
|
4
|
+
|
5
5
|
attr_accessor :token, :aliases, :send_gifs
|
6
6
|
|
7
|
-
|
7
|
+
include SlackRubyBot::Hooks::HookSupport
|
8
8
|
|
9
|
-
|
10
|
-
include SlackRubyBot::Hooks::Message
|
9
|
+
TRAPPED_SIGNALS = %w(INT TERM).freeze
|
11
10
|
|
12
11
|
def initialize(options = {})
|
13
12
|
@token = options[:token]
|
14
13
|
@aliases = options[:aliases]
|
15
14
|
@send_gifs = options.key?(:send_gifs) ? !!options[:send_gifs] : true
|
15
|
+
|
16
|
+
# Hook Handling
|
17
|
+
flush_hook_blocks
|
18
|
+
|
19
|
+
add_hook_handlers options[:hook_handlers] || {
|
20
|
+
hello: SlackRubyBot::Hooks::Hello.new(logger),
|
21
|
+
message: SlackRubyBot::Hooks::Message.new
|
22
|
+
}
|
16
23
|
end
|
17
24
|
|
18
25
|
def run
|
19
26
|
loop do
|
20
|
-
|
27
|
+
handle_exceptions do
|
21
28
|
handle_signals
|
22
29
|
start!
|
23
30
|
end
|
@@ -41,11 +48,6 @@ module SlackRubyBot
|
|
41
48
|
client.stop! if @client
|
42
49
|
end
|
43
50
|
|
44
|
-
def hello!
|
45
|
-
return unless client.self && client.team
|
46
|
-
logger.info "Welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
|
47
|
-
end
|
48
|
-
|
49
51
|
def restart!(wait = 1)
|
50
52
|
@async ? start_async : start!
|
51
53
|
rescue StandardError => e
|
@@ -57,7 +59,7 @@ module SlackRubyBot
|
|
57
59
|
|
58
60
|
private
|
59
61
|
|
60
|
-
def
|
62
|
+
def handle_exceptions
|
61
63
|
yield
|
62
64
|
rescue Slack::Web::Api::Error => e
|
63
65
|
logger.error e
|
@@ -93,20 +95,8 @@ module SlackRubyBot
|
|
93
95
|
@client = nil
|
94
96
|
restart! unless @stopping
|
95
97
|
end
|
96
|
-
hooks.
|
97
|
-
|
98
|
-
begin
|
99
|
-
send hook, client, data
|
100
|
-
rescue StandardError => e
|
101
|
-
logger.error e
|
102
|
-
begin
|
103
|
-
client.message(channel: data['channel'], text: e.message) if data.key?('channel')
|
104
|
-
rescue
|
105
|
-
# ignore
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
98
|
+
hooks.client = client
|
99
|
+
|
110
100
|
client
|
111
101
|
end
|
112
102
|
end
|
data/slack-ruby-bot.gemspec
CHANGED
@@ -16,7 +16,6 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.summary = 'The easiest way to write a Slack bot in Ruby.'
|
17
17
|
s.add_dependency 'hashie'
|
18
18
|
s.add_dependency 'slack-ruby-client', '>= 0.6.0'
|
19
|
-
s.add_dependency 'faye-websocket'
|
20
19
|
s.add_dependency 'activesupport'
|
21
20
|
s.add_dependency 'giphy', '~> 2.0.2'
|
22
21
|
s.add_development_dependency 'rake'
|
@@ -24,5 +23,5 @@ Gem::Specification.new do |s|
|
|
24
23
|
s.add_development_dependency 'rack-test'
|
25
24
|
s.add_development_dependency 'vcr'
|
26
25
|
s.add_development_dependency 'webmock'
|
27
|
-
s.add_development_dependency 'rubocop', '0.
|
26
|
+
s.add_development_dependency 'rubocop', '0.38.0'
|
28
27
|
end
|
@@ -1,14 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe SlackRubyBot do
|
4
|
-
def
|
5
|
-
SlackRubyBot::
|
6
|
-
end
|
7
|
-
before do
|
8
|
-
ENV['SLACK_RUBY_BOT_ALIASES'] = ':emoji: alias каспаров'
|
9
|
-
end
|
10
|
-
after do
|
11
|
-
ENV.delete('SLACK_RUBY_BOT_ALIASES')
|
4
|
+
def client
|
5
|
+
SlackRubyBot::Client.new aliases: %w(:emoji: alias каспаров)
|
12
6
|
end
|
13
7
|
it 'responds to emoji' do
|
14
8
|
expect(message: ':emoji: hi').to respond_with_slack_message('Hi <@user>!')
|
@@ -8,14 +8,11 @@ describe SlackRubyBot::Bot do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
11
|
+
|
11
12
|
def app
|
12
13
|
SlackRubyBot::Bot.instance
|
13
14
|
end
|
14
|
-
|
15
|
-
it 'sends a message' do
|
16
|
-
expect(client).to receive(:message).with(channel: 'channel', text: 'message')
|
17
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} bot_spec message", channel: 'channel', user: 'user'))
|
18
|
-
end
|
15
|
+
|
19
16
|
it 'sends a message' do
|
20
17
|
expect(message: "#{SlackRubyBot.config.user} bot_spec message").to respond_with_slack_message('message')
|
21
18
|
end
|
@@ -8,7 +8,7 @@ describe SlackRubyBot::Commands do
|
|
8
8
|
k, v = match['expression'].split(/\W+/, 2)
|
9
9
|
client.say(channel: data.channel, text: "#{match[:command]}: #{k}=#{v}")
|
10
10
|
else
|
11
|
-
client.say(channel: data.channel, text:
|
11
|
+
client.say(channel: data.channel, text: (match[:command]).to_s)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -20,10 +20,10 @@ describe SlackRubyBot do
|
|
20
20
|
end
|
21
21
|
context 'it responds to direct name calling' do
|
22
22
|
it 'with bot name' do
|
23
|
-
expect(message:
|
23
|
+
expect(message: SlackRubyBot.config.user.to_s, channel: 'DEADBEEF').to respond_with_slack_message(SlackRubyBot::ABOUT)
|
24
24
|
end
|
25
25
|
it 'with bot name capitalized' do
|
26
|
-
expect(message:
|
26
|
+
expect(message: SlackRubyBot.config.user.upcase.to_s, channel: 'DEADBEEF').to respond_with_slack_message(SlackRubyBot::ABOUT)
|
27
27
|
end
|
28
28
|
it 'with bot user id' do
|
29
29
|
expect(message: "<@#{SlackRubyBot.config.user_id}>", channel: 'DEADBEEF').to respond_with_slack_message(SlackRubyBot::ABOUT)
|
@@ -10,13 +10,8 @@ describe SlackRubyBot::Commands do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
13
|
-
def app
|
14
|
-
SlackRubyBot::App.new
|
15
|
-
end
|
16
|
-
let(:client) { app.send(:client) }
|
17
13
|
it 'sends default text' do
|
18
14
|
allow(Giphy).to receive(:random)
|
19
|
-
expect(
|
20
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} empty_text", channel: 'channel', user: 'user'))
|
15
|
+
expect(message: "#{SlackRubyBot.config.user} empty_text", channel: 'channel', user: 'user').to respond_with_slack_message('')
|
21
16
|
end
|
22
17
|
end
|
@@ -4,15 +4,19 @@ describe SlackRubyBot::App do
|
|
4
4
|
def app
|
5
5
|
SlackRubyBot::App.new
|
6
6
|
end
|
7
|
+
|
7
8
|
let(:client) { subject.send(:client) }
|
9
|
+
let(:message_hook) { SlackRubyBot::Hooks::Message.new }
|
10
|
+
|
8
11
|
before do
|
9
12
|
allow(client).to receive(:self).and_return(Hashie::Mash.new('id' => 'UDEADBEEF'))
|
10
13
|
allow(Giphy).to receive(:random)
|
11
14
|
end
|
15
|
+
|
12
16
|
context 'default' do
|
13
17
|
it 'does not respond to self' do
|
14
18
|
expect(client).to_not receive(:message)
|
15
|
-
|
19
|
+
message_hook.call(client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} hi", channel: 'channel', user: 'UDEADBEEF'))
|
16
20
|
end
|
17
21
|
end
|
18
22
|
context 'with allow_message_loops=true' do
|
@@ -28,7 +32,7 @@ describe SlackRubyBot::App do
|
|
28
32
|
end
|
29
33
|
it 'responds to self' do
|
30
34
|
expect(client).to receive(:message)
|
31
|
-
|
35
|
+
message_hook.call(client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} hi", channel: 'channel', user: 'UDEADBEEF'))
|
32
36
|
end
|
33
37
|
end
|
34
38
|
end
|
@@ -10,13 +10,14 @@ describe SlackRubyBot::Commands do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
14
|
-
|
15
|
-
end
|
13
|
+
|
14
|
+
let(:app) { SlackRubyBot::App.new }
|
16
15
|
let(:client) { app.send(:client) }
|
16
|
+
let(:message_hook) { SlackRubyBot::Hooks::Message.new }
|
17
|
+
|
17
18
|
it 'ignores nil messages' do
|
18
19
|
allow(Giphy).to receive(:random)
|
19
20
|
expect(client).to_not receive(:message)
|
20
|
-
|
21
|
+
message_hook.call(client, Hashie::Mash.new(text: nil, channel: 'channel', user: 'user'))
|
21
22
|
end
|
22
23
|
end
|
@@ -6,9 +6,6 @@ describe SlackRubyBot::Commands::Base do
|
|
6
6
|
command 'not_implemented'
|
7
7
|
end
|
8
8
|
end
|
9
|
-
def app
|
10
|
-
SlackRubyBot::App.new
|
11
|
-
end
|
12
9
|
it 'raises not implemented' do
|
13
10
|
expect(message: "#{SlackRubyBot.config.user} not_implemented").to respond_with_error(NotImplementedError, 'rubybot not_implemented')
|
14
11
|
end
|
@@ -8,25 +8,19 @@ describe SlackRubyBot::Commands do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
12
|
-
SlackRubyBot::App.new
|
13
|
-
end
|
14
|
-
let(:client) { app.send(:client) }
|
11
|
+
|
15
12
|
let(:gif_image_url) { 'http://media2.giphy.com/media/pzOijFsdDrsS4/giphy.gif' }
|
16
13
|
it 'sends a gif' do
|
17
14
|
gif = Giphy::RandomGif.new('image_url' => gif_image_url)
|
18
15
|
expect(Giphy).to receive(:random).and_return(gif)
|
19
|
-
expect(
|
20
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_gif_spec message", channel: 'channel', user: 'user'))
|
16
|
+
expect(message: "#{SlackRubyBot.config.user} send_gif_spec message").to respond_with_slack_message(gif_image_url)
|
21
17
|
end
|
22
18
|
it 'eats up the error' do
|
23
|
-
expect(Giphy).to receive(:random) {
|
24
|
-
expect(
|
25
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_gif_spec message", channel: 'channel', user: 'user'))
|
19
|
+
expect(Giphy).to receive(:random) { raise 'oh no!' }
|
20
|
+
expect(message: "#{SlackRubyBot.config.user} send_gif_spec message").to respond_with_slack_message('')
|
26
21
|
end
|
27
22
|
it 'eats up nil gif' do
|
28
23
|
expect(Giphy).to receive(:random).and_return(nil)
|
29
|
-
expect(
|
30
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_gif_spec message", channel: 'channel', user: 'user'))
|
24
|
+
expect(message: "#{SlackRubyBot.config.user} send_gif_spec message").to respond_with_slack_message('')
|
31
25
|
end
|
32
26
|
end
|
@@ -8,12 +8,7 @@ describe SlackRubyBot::Commands do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
11
|
-
def app
|
12
|
-
SlackRubyBot::App.new
|
13
|
-
end
|
14
|
-
let(:client) { app.send(:client) }
|
15
11
|
it 'sends a message' do
|
16
|
-
expect(
|
17
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_message_spec message", channel: 'channel', user: 'user'))
|
12
|
+
expect(message: "#{SlackRubyBot.config.user} send_message_spec message").to respond_with_slack_message('message')
|
18
13
|
end
|
19
14
|
end
|
@@ -8,62 +8,58 @@ describe SlackRubyBot::Commands do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
11
|
-
def app
|
12
|
-
SlackRubyBot::App.new
|
13
|
-
end
|
14
|
-
let(:client) { app.send(:client) }
|
15
11
|
let(:gif_image_url) { 'http://media2.giphy.com/media/pzOijFsdDrsS4/giphy.gif' }
|
12
|
+
|
16
13
|
it 'sends a message with gif' do
|
17
14
|
gif = Giphy::RandomGif.new('image_url' => gif_image_url)
|
18
15
|
expect(Giphy).to receive(:random).and_return(gif)
|
19
|
-
expect(
|
20
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_message_with_gif_spec message", channel: 'channel', user: 'user'))
|
16
|
+
expect(message: "#{SlackRubyBot.config.user} send_message_with_gif_spec message").to respond_with_slack_message("message\n#{gif_image_url}")
|
21
17
|
end
|
18
|
+
|
22
19
|
it 'eats up the error' do
|
23
|
-
expect(Giphy).to receive(:random) {
|
24
|
-
expect(
|
25
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_message_with_gif_spec message", channel: 'channel', user: 'user'))
|
20
|
+
expect(Giphy).to receive(:random) { raise 'oh no!' }
|
21
|
+
expect(message: "#{SlackRubyBot.config.user} send_message_with_gif_spec message").to respond_with_slack_message('message')
|
26
22
|
end
|
23
|
+
|
27
24
|
it 'eats up nil gif' do
|
28
25
|
expect(Giphy).to receive(:random).and_return(nil)
|
29
|
-
expect(
|
30
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_message_with_gif_spec message", channel: 'channel', user: 'user'))
|
26
|
+
expect(message: "#{SlackRubyBot.config.user} send_message_with_gif_spec message").to respond_with_slack_message('message')
|
31
27
|
end
|
28
|
+
|
32
29
|
context 'send_gifs' do
|
33
30
|
context 'set to false via client' do
|
31
|
+
let(:client) { SlackRubyBot::Client.new }
|
32
|
+
|
34
33
|
before do
|
35
34
|
client.send_gifs = false
|
36
35
|
end
|
36
|
+
|
37
37
|
it 'does not send a gif' do
|
38
38
|
expect(Giphy).to_not receive(:random)
|
39
|
-
expect(
|
40
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_message_with_gif_spec message", channel: 'channel', user: 'user'))
|
41
|
-
end
|
42
|
-
after do
|
43
|
-
client.send_gifs = true
|
39
|
+
expect(message: "#{SlackRubyBot.config.user} send_message_with_gif_spec message").to respond_with_slack_message('message')
|
44
40
|
end
|
45
41
|
end
|
42
|
+
|
46
43
|
context 'set to false via config' do
|
47
44
|
before do
|
48
45
|
SlackRubyBot::Config.send_gifs = false
|
49
46
|
end
|
50
47
|
it 'does not send a gif' do
|
51
48
|
expect(Giphy).to_not receive(:random)
|
52
|
-
expect(
|
53
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_message_with_gif_spec message", channel: 'channel', user: 'user'))
|
49
|
+
expect(message: "#{SlackRubyBot.config.user} send_message_with_gif_spec message").to respond_with_slack_message('message')
|
54
50
|
end
|
55
51
|
after do
|
56
52
|
SlackRubyBot::Config.reset!
|
57
53
|
end
|
58
54
|
end
|
55
|
+
|
59
56
|
context 'set to false via SLACK_RUBY_BOT_SEND_GIFS' do
|
60
57
|
before do
|
61
58
|
ENV['SLACK_RUBY_BOT_SEND_GIFS'] = 'false'
|
62
59
|
end
|
63
60
|
it 'does not send a gif' do
|
64
61
|
expect(Giphy).to_not receive(:random)
|
65
|
-
expect(
|
66
|
-
app.send(:message, client, Hashie::Mash.new(text: "#{SlackRubyBot.config.user} send_message_with_gif_spec message", channel: 'channel', user: 'user'))
|
62
|
+
expect(message: "#{SlackRubyBot.config.user} send_message_with_gif_spec message").to respond_with_slack_message('message')
|
67
63
|
end
|
68
64
|
after do
|
69
65
|
ENV.delete 'SLACK_RUBY_BOT_SEND_GIFS'
|
@@ -1,10 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe SlackRubyBot::Commands::Unknown do
|
4
|
-
def app
|
5
|
-
SlackRubyBot::App.new
|
6
|
-
end
|
7
|
-
let(:client) { app.send(:client) }
|
8
4
|
it 'invalid command' do
|
9
5
|
expect(message: "#{SlackRubyBot.config.user} foobar").to respond_with_slack_message("Sorry <@user>, I don't understand that command!")
|
10
6
|
end
|
@@ -12,7 +8,10 @@ describe SlackRubyBot::Commands::Unknown do
|
|
12
8
|
expect(message: "<@#{SlackRubyBot.config.user_id}>: foobar").to respond_with_slack_message("Sorry <@user>, I don't understand that command!")
|
13
9
|
end
|
14
10
|
it 'does not respond to sad face' do
|
11
|
+
client = SlackRubyBot::Client.new
|
12
|
+
message_hook = SlackRubyBot::Hooks::Message.new
|
13
|
+
|
15
14
|
expect(SlackRubyBot::Commands::Base).to_not receive(:send_message)
|
16
|
-
|
15
|
+
message_hook.call(client, Hashie::Mash.new(text: ':((', channel: 'channel', user: 'user'))
|
17
16
|
end
|
18
17
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SlackRubyBot::Hooks::HookSupport do
|
4
|
+
subject do
|
5
|
+
Class.new do
|
6
|
+
include SlackRubyBot::Hooks::HookSupport
|
7
|
+
|
8
|
+
on 'hello' do |_ = nil, _ = nil|
|
9
|
+
'hello'
|
10
|
+
end
|
11
|
+
|
12
|
+
on 'hello' do |_ = nil, _ = nil|
|
13
|
+
'hello-2'
|
14
|
+
end
|
15
|
+
|
16
|
+
on 'goodbye' do |_ = nil, _ = nil|
|
17
|
+
'goodbye'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'hook code blocks' do
|
23
|
+
it "let's you define class level code blocks" do
|
24
|
+
expect(subject.hook_blocks.size).to eq(2)
|
25
|
+
expect(subject.hook_blocks.keys).to eq %w(hello goodbye)
|
26
|
+
|
27
|
+
expect(subject.hook_blocks['hello'].size).to eq(2)
|
28
|
+
expect(subject.hook_blocks['goodbye'].size).to eq(1)
|
29
|
+
|
30
|
+
expect(subject.hook_blocks['hello'].first.call).to eq('hello')
|
31
|
+
expect(subject.hook_blocks['hello'].last.call).to eq('hello-2')
|
32
|
+
expect(subject.hook_blocks['goodbye'].last.call).to eq('goodbye')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#flush_hook_blocks' do
|
37
|
+
it 'registers class hook blocks as hook handlers in set' do
|
38
|
+
object = subject.new
|
39
|
+
|
40
|
+
expect(object.hooks).to receive(:add).exactly(3).times.and_call_original
|
41
|
+
|
42
|
+
expect do
|
43
|
+
object.flush_hook_blocks
|
44
|
+
end.to change { object.hooks.handlers.size }.by(2)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,16 +1,18 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe SlackRubyBot::Hooks::Message do
|
4
|
-
let(:
|
4
|
+
let(:message_hook) { described_class.new }
|
5
|
+
|
5
6
|
describe '#child_command_classes' do
|
6
7
|
it 'returns only child command classes' do
|
7
|
-
child_command_classes =
|
8
|
+
child_command_classes = message_hook.send(:child_command_classes)
|
8
9
|
expect(child_command_classes).to include SlackRubyBot::Bot
|
9
10
|
expect(child_command_classes).to_not include SlackRubyBot::Commands::Hi
|
10
11
|
end
|
11
12
|
end
|
13
|
+
|
12
14
|
describe '#built_in_command_classes' do
|
13
|
-
let(:built_in_command_classes) {
|
15
|
+
let(:built_in_command_classes) { message_hook.send(:built_in_command_classes) }
|
14
16
|
it 'returns only built in command classes' do
|
15
17
|
expect(built_in_command_classes).to include SlackRubyBot::Commands::Hi
|
16
18
|
expect(built_in_command_classes).to include SlackRubyBot::Commands::Default
|
@@ -27,7 +29,7 @@ describe SlackRubyBot::Hooks::Message do
|
|
27
29
|
SlackRubyBot::Config.allow_message_loops = true
|
28
30
|
end
|
29
31
|
it do
|
30
|
-
expect(
|
32
|
+
expect(message_hook.send(:message_to_self_not_allowed?)).to be false
|
31
33
|
end
|
32
34
|
after do
|
33
35
|
SlackRubyBot::Config.reset!
|
@@ -38,7 +40,7 @@ describe SlackRubyBot::Hooks::Message do
|
|
38
40
|
SlackRubyBot::Config.allow_message_loops = false
|
39
41
|
end
|
40
42
|
it do
|
41
|
-
expect(
|
43
|
+
expect(message_hook.send(:message_to_self_not_allowed?)).to be true
|
42
44
|
end
|
43
45
|
after do
|
44
46
|
SlackRubyBot::Config.reset!
|
@@ -49,12 +51,12 @@ describe SlackRubyBot::Hooks::Message do
|
|
49
51
|
let(:client) { Hashie::Mash.new(self: { 'id' => 'U0K8CKKT1' }) }
|
50
52
|
context 'with message to self' do
|
51
53
|
it do
|
52
|
-
expect(
|
54
|
+
expect(message_hook.send(:message_to_self?, client, Hashie::Mash.new(user: 'U0K8CKKT1'))).to be true
|
53
55
|
end
|
54
56
|
end
|
55
57
|
context 'with message to another user' do
|
56
58
|
it do
|
57
|
-
expect(
|
59
|
+
expect(message_hook.send(:message_to_self?, client, Hashie::Mash.new(user: 'U0K8CKKT2'))).to be false
|
58
60
|
end
|
59
61
|
end
|
60
62
|
end
|
@@ -62,7 +64,7 @@ describe SlackRubyBot::Hooks::Message do
|
|
62
64
|
let(:client) { Hashie::Mash.new(self: { 'id' => 'U0K8CKKT1' }) }
|
63
65
|
it 'invokes a command' do
|
64
66
|
expect(SlackRubyBot::Commands::Unknown).to receive(:invoke)
|
65
|
-
|
67
|
+
message_hook.call(client, Hashie::Mash.new(user: 'U0K8CKKT2'))
|
66
68
|
end
|
67
69
|
end
|
68
70
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SlackRubyBot::Hooks::Set do
|
4
|
+
let(:client) { Slack::RealTime::Client.new }
|
5
|
+
|
6
|
+
context 'adding hooks' do
|
7
|
+
subject { described_class.new(client) }
|
8
|
+
|
9
|
+
it 'lets you add hook handlers' do
|
10
|
+
handler = ->(_, _) {}
|
11
|
+
|
12
|
+
expect do
|
13
|
+
subject.add(:message, handler)
|
14
|
+
end.to change(subject, :handlers)
|
15
|
+
|
16
|
+
expect(subject.handlers).to have_key(:message)
|
17
|
+
expect(subject.handlers[:message]).to eq [handler]
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'lets you add multiple handlers for the same hook' do
|
21
|
+
handler_1 = ->(_, _) {}
|
22
|
+
handler_2 = ->(_, _) {}
|
23
|
+
|
24
|
+
expect do
|
25
|
+
subject.add(:message, handler_1)
|
26
|
+
subject.add(:message, handler_2)
|
27
|
+
end.to change(subject, :handlers)
|
28
|
+
|
29
|
+
expect(subject.handlers).to have_key(:message)
|
30
|
+
expect(subject.handlers[:message]).to eq [handler_1, handler_2]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'Slack Client injection' do
|
35
|
+
subject { described_class.new }
|
36
|
+
|
37
|
+
it "doesn't barf when add callbacks prior to injecting client" do
|
38
|
+
expect do
|
39
|
+
subject.add(:hook, ->(_, _) {})
|
40
|
+
end.to_not raise_error
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'triggers hooks when client is configured later' do
|
44
|
+
handler = ->(_, _) {}
|
45
|
+
|
46
|
+
subject.add(:hook, handler)
|
47
|
+
|
48
|
+
expect(subject).to receive(:flush_handlers).once.and_call_original
|
49
|
+
expect(handler).to receive(:call).once
|
50
|
+
|
51
|
+
subject.client = client
|
52
|
+
|
53
|
+
client.send(:callback, { data: 1 }, :hook) # Abusing the callback method 100% :D
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -31,12 +31,12 @@ describe SlackRubyBot::Server do
|
|
31
31
|
expect(subject.send(:client).send_gifs?).to be true
|
32
32
|
end
|
33
33
|
it 'creates a client with a token' do
|
34
|
-
expect(client).to receive(:start!) {
|
34
|
+
expect(client).to receive(:start!) { raise 'expected' }
|
35
35
|
expect(Slack::RealTime::Client).to receive(:new).with(token: 'token', send_gifs: true, aliases: %w(foo bar)).and_return(client)
|
36
36
|
expect { subject.start! }.to raise_error RuntimeError, 'expected'
|
37
37
|
end
|
38
38
|
it 'asynchronously creates a client with a token' do
|
39
|
-
expect(client).to receive(:start_async) {
|
39
|
+
expect(client).to receive(:start_async) { raise 'expected' }
|
40
40
|
expect(Slack::RealTime::Client).to receive(:new).with(token: 'token', send_gifs: true, aliases: %w(foo bar)).and_return(client)
|
41
41
|
expect { subject.start_async }.to raise_error RuntimeError, 'expected'
|
42
42
|
end
|
@@ -61,9 +61,9 @@ describe SlackRubyBot::Server do
|
|
61
61
|
end.to raise_error Slack::Web::Api::Error, 'unknown'
|
62
62
|
end
|
63
63
|
[Faraday::Error::ConnectionFailed, Faraday::Error::TimeoutError, Faraday::Error::SSLError].each do |err|
|
64
|
-
it
|
65
|
-
expect(client).to receive(:start!) {
|
66
|
-
expect(client).to receive(:start!) {
|
64
|
+
it err.to_s do
|
65
|
+
expect(client).to receive(:start!) { raise err, 'Faraday' }
|
66
|
+
expect(client).to receive(:start!) { raise 'unknown' }
|
67
67
|
expect do
|
68
68
|
subject.run
|
69
69
|
end.to raise_error 'unknown'
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slack-ruby-bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.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: 2016-
|
11
|
+
date: 2016-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.6.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: faye-websocket
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: activesupport
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,14 +142,14 @@ dependencies:
|
|
156
142
|
requirements:
|
157
143
|
- - '='
|
158
144
|
- !ruby/object:Gem::Version
|
159
|
-
version: 0.
|
145
|
+
version: 0.38.0
|
160
146
|
type: :development
|
161
147
|
prerelease: false
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
163
149
|
requirements:
|
164
150
|
- - '='
|
165
151
|
- !ruby/object:Gem::Version
|
166
|
-
version: 0.
|
152
|
+
version: 0.38.0
|
167
153
|
description:
|
168
154
|
email: dblock@dblock.org
|
169
155
|
executables: []
|
@@ -211,9 +197,10 @@ files:
|
|
211
197
|
- lib/slack-ruby-bot/commands/unknown.rb
|
212
198
|
- lib/slack-ruby-bot/config.rb
|
213
199
|
- lib/slack-ruby-bot/hooks.rb
|
214
|
-
- lib/slack-ruby-bot/hooks/base.rb
|
215
200
|
- lib/slack-ruby-bot/hooks/hello.rb
|
201
|
+
- lib/slack-ruby-bot/hooks/hook_support.rb
|
216
202
|
- lib/slack-ruby-bot/hooks/message.rb
|
203
|
+
- lib/slack-ruby-bot/hooks/set.rb
|
217
204
|
- lib/slack-ruby-bot/rspec.rb
|
218
205
|
- lib/slack-ruby-bot/rspec/support/fixtures/slack/migration_in_progress.yml
|
219
206
|
- lib/slack-ruby-bot/rspec/support/slack-ruby-bot/it_behaves_like_a_slack_bot.rb
|
@@ -261,7 +248,9 @@ files:
|
|
261
248
|
- spec/slack-ruby-bot/commands/send_message_with_gif_spec.rb
|
262
249
|
- spec/slack-ruby-bot/commands/unknown_spec.rb
|
263
250
|
- spec/slack-ruby-bot/config_spec.rb
|
251
|
+
- spec/slack-ruby-bot/hooks/hook_support_spec.rb
|
264
252
|
- spec/slack-ruby-bot/hooks/message_spec.rb
|
253
|
+
- spec/slack-ruby-bot/hooks/set_spec.rb
|
265
254
|
- spec/slack-ruby-bot/rspec/respond_with_error_spec.rb
|
266
255
|
- spec/slack-ruby-bot/server_spec.rb
|
267
256
|
- spec/slack-ruby-bot/support/loggable_spec.rb
|
@@ -287,7 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
287
276
|
version: 1.3.6
|
288
277
|
requirements: []
|
289
278
|
rubyforge_project:
|
290
|
-
rubygems_version: 2.
|
279
|
+
rubygems_version: 2.5.1
|
291
280
|
signing_key:
|
292
281
|
specification_version: 4
|
293
282
|
summary: The easiest way to write a Slack bot in Ruby.
|
@@ -319,7 +308,9 @@ test_files:
|
|
319
308
|
- spec/slack-ruby-bot/commands/send_message_with_gif_spec.rb
|
320
309
|
- spec/slack-ruby-bot/commands/unknown_spec.rb
|
321
310
|
- spec/slack-ruby-bot/config_spec.rb
|
311
|
+
- spec/slack-ruby-bot/hooks/hook_support_spec.rb
|
322
312
|
- spec/slack-ruby-bot/hooks/message_spec.rb
|
313
|
+
- spec/slack-ruby-bot/hooks/set_spec.rb
|
323
314
|
- spec/slack-ruby-bot/rspec/respond_with_error_spec.rb
|
324
315
|
- spec/slack-ruby-bot/server_spec.rb
|
325
316
|
- spec/slack-ruby-bot/support/loggable_spec.rb
|