slack-ruby-bot 0.10.4 → 0.10.5
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/.rubocop_todo.yml +12 -68
- data/CHANGELOG.md +8 -0
- data/README.md +11 -0
- data/lib/slack-ruby-bot/client.rb +2 -2
- data/lib/slack-ruby-bot/commands/about.rb +1 -1
- data/lib/slack-ruby-bot/commands/base.rb +27 -21
- data/lib/slack-ruby-bot/mvc/controller/base.rb +14 -10
- data/lib/slack-ruby-bot/rspec/support/fixtures/slack/migration_in_progress.yml +28 -0
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_message.rb +18 -12
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_messages.rb +38 -0
- data/lib/slack-ruby-bot/rspec/support/spec_helpers.rb +10 -0
- data/lib/slack-ruby-bot/version.rb +1 -1
- data/spec/slack-ruby-bot/commands/aliases_spec.rb +4 -1
- data/spec/slack-ruby-bot/commands/commands_command_classes_spec.rb +1 -1
- data/spec/slack-ruby-bot/commands/commands_regexp_spec.rb +16 -0
- data/spec/slack-ruby-bot/commands/commands_spec.rb +6 -6
- data/spec/slack-ruby-bot/rspec/respond_with_slack_message_spec.rb +49 -0
- data/spec/slack-ruby-bot/rspec/respond_with_slack_messages_spec.rb +45 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3a131c7f852f22c4039f8a40e25a7a914d40a0f
|
4
|
+
data.tar.gz: 1f31b3ef7089c492712d5cc5bc0edec6947a7e5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d721d75a37a031b6e12003f47a4ba68e7e60be61abd26f2b76999768448b18ef8ab7bc01394aab7047978ef7ee5845ea79a11540232fe7abc2d508c44076188
|
7
|
+
data.tar.gz: '09ca8c66e5ffe883faa832208fe341379131ed710f7ed6945959564d92ce2a9e8ed2196f96a262aace493b043c7d4852f3f6d25bc82dc5e698c754ee7b869328'
|
data/.rubocop_todo.yml
CHANGED
@@ -1,22 +1,11 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2017-
|
3
|
+
# on 2017-10-15 13:34:54 -0700 using RuboCop version 0.38.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
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
# Offense count: 4
|
10
|
-
# Cop supports --auto-correct.
|
11
|
-
# Configuration parameters: Include, TreatCommentsAsGroupSeparators.
|
12
|
-
# Include: **/Gemfile, **/gems.rb
|
13
|
-
Bundler/OrderedGems:
|
14
|
-
Exclude:
|
15
|
-
- 'examples/inventory/Gemfile'
|
16
|
-
- 'examples/market/Gemfile'
|
17
|
-
- 'examples/minimal/Gemfile'
|
18
|
-
- 'examples/weather/Gemfile'
|
19
|
-
|
20
9
|
# Offense count: 1
|
21
10
|
Lint/HandleExceptions:
|
22
11
|
Exclude:
|
@@ -24,19 +13,19 @@ Lint/HandleExceptions:
|
|
24
13
|
|
25
14
|
# Offense count: 6
|
26
15
|
Metrics/AbcSize:
|
27
|
-
Max:
|
16
|
+
Max: 40
|
28
17
|
|
29
|
-
# Offense count:
|
30
|
-
# Configuration parameters: CountComments
|
31
|
-
Metrics/
|
32
|
-
Max:
|
18
|
+
# Offense count: 1
|
19
|
+
# Configuration parameters: CountComments.
|
20
|
+
Metrics/ClassLength:
|
21
|
+
Max: 104
|
33
22
|
|
34
23
|
# Offense count: 2
|
35
24
|
Metrics/CyclomaticComplexity:
|
36
25
|
Max: 13
|
37
26
|
|
38
|
-
# Offense count:
|
39
|
-
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes
|
27
|
+
# Offense count: 218
|
28
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
|
40
29
|
# URISchemes: http, https
|
41
30
|
Metrics/LineLength:
|
42
31
|
Max: 147
|
@@ -44,13 +33,13 @@ Metrics/LineLength:
|
|
44
33
|
# Offense count: 10
|
45
34
|
# Configuration parameters: CountComments.
|
46
35
|
Metrics/MethodLength:
|
47
|
-
Max:
|
36
|
+
Max: 19
|
48
37
|
|
49
38
|
# Offense count: 2
|
50
39
|
Metrics/PerceivedComplexity:
|
51
40
|
Max: 13
|
52
41
|
|
53
|
-
# Offense count:
|
42
|
+
# Offense count: 31
|
54
43
|
Style/Documentation:
|
55
44
|
Enabled: false
|
56
45
|
|
@@ -59,58 +48,13 @@ Style/DoubleNegation:
|
|
59
48
|
Exclude:
|
60
49
|
- 'lib/slack-ruby-bot/commands/base.rb'
|
61
50
|
|
62
|
-
# Offense count:
|
63
|
-
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts
|
64
|
-
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
|
51
|
+
# Offense count: 1
|
52
|
+
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts.
|
65
53
|
Style/FileName:
|
66
54
|
Exclude:
|
67
|
-
- 'Dangerfile'
|
68
55
|
- 'lib/slack-ruby-bot.rb'
|
69
56
|
|
70
|
-
# Offense count: 2
|
71
|
-
# Cop supports --auto-correct.
|
72
|
-
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
73
|
-
# SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent
|
74
|
-
Style/IndentHeredoc:
|
75
|
-
Exclude:
|
76
|
-
- 'lib/slack-ruby-bot/commands/help.rb'
|
77
|
-
- 'spec/slack-ruby-bot/commands/help_spec.rb'
|
78
|
-
|
79
57
|
# Offense count: 1
|
80
|
-
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
81
|
-
# SupportedStyles: module_function, extend_self
|
82
58
|
Style/ModuleFunction:
|
83
59
|
Exclude:
|
84
60
|
- 'lib/slack-ruby-bot/config.rb'
|
85
|
-
|
86
|
-
# Offense count: 3
|
87
|
-
# Cop supports --auto-correct.
|
88
|
-
Style/MultilineIfModifier:
|
89
|
-
Exclude:
|
90
|
-
- 'lib/slack-ruby-bot/app.rb'
|
91
|
-
- 'lib/slack-ruby-bot/client.rb'
|
92
|
-
- 'lib/slack-ruby-bot/commands/base.rb'
|
93
|
-
|
94
|
-
# Offense count: 5
|
95
|
-
# Cop supports --auto-correct.
|
96
|
-
# Configuration parameters: PreferredDelimiters.
|
97
|
-
Style/PercentLiteralDelimiters:
|
98
|
-
Exclude:
|
99
|
-
- 'lib/slack-ruby-bot/server.rb'
|
100
|
-
- 'spec/slack-ruby-bot/commands/aliases_spec.rb'
|
101
|
-
- 'spec/slack-ruby-bot/hooks/hook_support_spec.rb'
|
102
|
-
- 'spec/slack-ruby-bot/server_spec.rb'
|
103
|
-
|
104
|
-
# Offense count: 3
|
105
|
-
# Cop supports --auto-correct.
|
106
|
-
# Configuration parameters: SupportedStyles.
|
107
|
-
# SupportedStyles: percent, brackets
|
108
|
-
Style/SymbolArray:
|
109
|
-
EnforcedStyle: brackets
|
110
|
-
|
111
|
-
# Offense count: 2
|
112
|
-
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
113
|
-
# SupportedStyles: snake_case, normalcase, non_integer
|
114
|
-
Style/VariableNumber:
|
115
|
-
Exclude:
|
116
|
-
- 'spec/slack-ruby-bot/hooks/set_spec.rb'
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
### 0.10.5 (10/15/2017)
|
2
|
+
|
3
|
+
* Refactored `SlackRubyBot::MVC::Controller::Base`, consolidated ivar handling, centralized object allocations and DRYed up the code - [@chuckremes](https://github.com/chuckremes).
|
4
|
+
* [#157](https://github.com/slack-ruby/slack-ruby-bot/pull/157): Added `respond_with_slack_messages` expectation - [@gcraig99](https://github.com/gcraig99).
|
5
|
+
* [#160](https://github.com/slack-ruby/slack-ruby-bot/pull/160): Fixed `respond_with_slack_message(s)` expectation failures - [@gcraig99](https://github.com/gcraig99).
|
6
|
+
* [#163](https://github.com/slack-ruby/slack-ruby-bot/pull/163): Allow `command` to accept regular expressions - [@kstole](https://github.com/kstole).
|
7
|
+
* [#166](https://github.com/slack-ruby/slack-ruby-bot/pull/166): Allow special characters and capitals in bot aliases - [@kstole](https://github.com/kstole).
|
8
|
+
|
1
9
|
### 0.10.4 (07/05/2017)
|
2
10
|
|
3
11
|
* [#149](https://github.com/slack-ruby/slack-ruby-bot/pull/149): Add `logger` configuration to set a custom logger - [@upscent](https://github.com/upscent).
|
data/README.md
CHANGED
@@ -82,6 +82,16 @@ end
|
|
82
82
|
|
83
83
|
Command match data includes `match['bot']`, `match['command']` and `match['expression']`. The `bot` match always checks against the `SlackRubyBot::Config.user` and `SlackRubyBot::Config.user_id` values obtained when the bot starts.
|
84
84
|
|
85
|
+
The `command` method can take strings, which will have be escaped with `Regexp.escape`, and regular expressions.
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
class CallBot < SlackRubyBot::Bot
|
89
|
+
command 'string with spaces', /some\s*regex+\?*/ do |client, data, match|
|
90
|
+
client.say(channel: data.channel, text: match['command'])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
85
95
|
Operators are 1-letter long and are similar to commands. They don't require addressing a bot nor separating an operator from its arguments. The following class responds to `=2+2`.
|
86
96
|
|
87
97
|
```ruby
|
@@ -547,6 +557,7 @@ Slack-ruby-bot ships with a number of shared RSpec behaviors that can be used in
|
|
547
557
|
|
548
558
|
* [behaves like a slack bot](lib/slack-ruby-bot/rspec/support/slack-ruby-bot/it_behaves_like_a_slack_bot.rb): A bot quacks like a Slack Ruby bot.
|
549
559
|
* [respond with slack message](lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_message.rb): The bot responds with a message.
|
560
|
+
* [respond with slack messages](lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_messages.rb): The bot responds with a multiple messages.
|
550
561
|
* [respond with error](lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_error.rb): An exception is raised inside a bot command.
|
551
562
|
|
552
563
|
Require `slack-ruby-bot/rspec` in your `spec_helper.rb` along with the following dependencies in Gemfile.
|
@@ -14,8 +14,8 @@ module SlackRubyBot
|
|
14
14
|
[
|
15
15
|
SlackRubyBot::Config.user,
|
16
16
|
self.self ? self.self.name : nil,
|
17
|
-
aliases,
|
18
|
-
SlackRubyBot::Config.aliases,
|
17
|
+
aliases ? aliases.map(&:downcase) : nil,
|
18
|
+
SlackRubyBot::Config.aliases ? SlackRubyBot::Config.aliases.map(&:downcase) : nil,
|
19
19
|
self.self && self.self.id ? "<@#{self.self.id.downcase}>" : nil,
|
20
20
|
SlackRubyBot::Config.user_id ? "<@#{SlackRubyBot::Config.user_id.downcase}>" : nil,
|
21
21
|
self.self && self.self.id ? "<@#{self.self.id.downcase}>:" : nil,
|
@@ -2,7 +2,7 @@ module SlackRubyBot
|
|
2
2
|
module Commands
|
3
3
|
class Default < Base
|
4
4
|
command 'about'
|
5
|
-
match(
|
5
|
+
match(/^#{bot_matcher}$/u)
|
6
6
|
|
7
7
|
def self.call(client, data, _match)
|
8
8
|
client.say(channel: data.channel, text: SlackRubyBot::ABOUT, gif: 'selfie')
|
@@ -35,7 +35,7 @@ module SlackRubyBot
|
|
35
35
|
CommandsHelper.instance.capture_help(self, &block)
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
38
|
+
def command_name_from_class
|
39
39
|
name ? name.split(':').last.downcase : object_id.to_s
|
40
40
|
end
|
41
41
|
|
@@ -45,14 +45,14 @@ module SlackRubyBot
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def command(*values, &block)
|
48
|
-
values = values.map { |value| Regexp.escape(value) }.join('|')
|
49
|
-
match Regexp.new("
|
48
|
+
values = values.map { |value| value.is_a?(Regexp) ? value.source : Regexp.escape(value) }.join('|')
|
49
|
+
match Regexp.new("^#{bot_matcher}[\\s]+(?<command>#{values})([\\s]+(?<expression>.*)|)$", Regexp::IGNORECASE), &block
|
50
50
|
end
|
51
51
|
|
52
52
|
def invoke(client, data)
|
53
53
|
finalize_routes!
|
54
54
|
expression, text = parse(client, data)
|
55
|
-
|
55
|
+
return false unless expression
|
56
56
|
routes.each_pair do |route, options|
|
57
57
|
match_method = options[:match_method]
|
58
58
|
case match_method
|
@@ -65,36 +65,42 @@ module SlackRubyBot
|
|
65
65
|
match = expression.scan(route)
|
66
66
|
next unless match.any?
|
67
67
|
end
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
elsif respond_to?(:call)
|
73
|
-
send(:call, client, data, match) if permitted?(client, data, match)
|
74
|
-
else
|
75
|
-
raise NotImplementedError, data.text
|
76
|
-
end
|
77
|
-
break
|
78
|
-
end if expression
|
79
|
-
called
|
68
|
+
call_command(client, data, match, options[:block])
|
69
|
+
return true
|
70
|
+
end
|
71
|
+
false
|
80
72
|
end
|
81
73
|
|
82
74
|
def match(match, &block)
|
83
75
|
self.routes ||= ActiveSupport::OrderedHash.new
|
84
|
-
self.routes[match] = { match_method: :match,
|
76
|
+
self.routes[match] = { match_method: :match, block: block }
|
85
77
|
end
|
86
78
|
|
87
79
|
def scan(match, &block)
|
88
80
|
self.routes ||= ActiveSupport::OrderedHash.new
|
89
|
-
self.routes[match] = { match_method: :scan,
|
81
|
+
self.routes[match] = { match_method: :scan, block: block }
|
82
|
+
end
|
83
|
+
|
84
|
+
def bot_matcher
|
85
|
+
'(?<bot>\S*)'
|
90
86
|
end
|
91
87
|
|
92
88
|
private
|
93
89
|
|
90
|
+
def call_command(client, data, match, block)
|
91
|
+
if block
|
92
|
+
block.call(client, data, match) if permitted?(client, data, match)
|
93
|
+
elsif respond_to?(:call)
|
94
|
+
send(:call, client, data, match) if permitted?(client, data, match)
|
95
|
+
else
|
96
|
+
raise NotImplementedError, data.text
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
94
100
|
def parse(client, data)
|
95
101
|
text = data.text
|
96
102
|
return text unless direct_message?(data) && message_from_another_user?(data)
|
97
|
-
return text if
|
103
|
+
return text if message_begins_with_bot_mention?(text, client.names)
|
98
104
|
["#{client.name} #{text}", text]
|
99
105
|
end
|
100
106
|
|
@@ -106,14 +112,14 @@ module SlackRubyBot
|
|
106
112
|
data.user && data.user != SlackRubyBot.config.user_id
|
107
113
|
end
|
108
114
|
|
109
|
-
def
|
115
|
+
def message_begins_with_bot_mention?(text, bot_names)
|
110
116
|
bot_names = bot_names.join('|')
|
111
117
|
!!text.downcase.match(/\A(#{bot_names})\s|\A(#{bot_names})\z/)
|
112
118
|
end
|
113
119
|
|
114
120
|
def finalize_routes!
|
115
121
|
return if routes && routes.any?
|
116
|
-
command
|
122
|
+
command command_name_from_class
|
117
123
|
end
|
118
124
|
|
119
125
|
# Intended to be overridden by subclasses to hook in an
|
@@ -9,24 +9,31 @@ module SlackRubyBot
|
|
9
9
|
alias abstract? abstract
|
10
10
|
|
11
11
|
def controllers
|
12
|
-
|
12
|
+
get_or_set_ivar(:@controllers, [])
|
13
13
|
end
|
14
14
|
|
15
15
|
def command_class
|
16
|
-
|
16
|
+
get_or_set_ivar(:@command_class, Class.new(SlackRubyBot::Commands::Base))
|
17
17
|
end
|
18
18
|
|
19
19
|
def aliases
|
20
|
-
|
20
|
+
get_or_set_ivar(:@aliases, Hash.new { |h, k| h[k] = [] })
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_or_set_ivar(name, value)
|
24
|
+
unless (ivar = Base.instance_variable_get(name))
|
25
|
+
ivar = value
|
26
|
+
Base.instance_variable_set(name, ivar)
|
27
|
+
end
|
28
|
+
ivar
|
21
29
|
end
|
22
30
|
|
23
31
|
def reset!
|
24
32
|
# Remove any earlier anonymous classes from prior calls so we don't leak them
|
25
33
|
Commands::Base.command_classes.delete(Controller::Base.command_class) if Base.command_class
|
26
34
|
|
27
|
-
|
28
|
-
Base.instance_variable_set(:@
|
29
|
-
Base.instance_variable_set(:@controllers, [])
|
35
|
+
Base.instance_variable_set(:@command_class, nil)
|
36
|
+
Base.instance_variable_set(:@controllers, nil)
|
30
37
|
end
|
31
38
|
|
32
39
|
# Define a controller as abstract. See internal_methods for more
|
@@ -46,10 +53,7 @@ module SlackRubyBot
|
|
46
53
|
|
47
54
|
def register_controller(controller)
|
48
55
|
# Only used to keep a reference around so the instance object doesn't get garbage collected
|
49
|
-
|
50
|
-
Base.instance_variable_set(:@aliases, Hash.new { |h, k| h[k] = [] }) unless aliases
|
51
|
-
controller_ary = Base.instance_variable_get(:@controllers)
|
52
|
-
controller_ary << controller
|
56
|
+
controllers << controller
|
53
57
|
klass = controller.class
|
54
58
|
|
55
59
|
methods = (klass.public_instance_methods(true) -
|
@@ -1,5 +1,33 @@
|
|
1
1
|
---
|
2
2
|
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://slack.com/api/rtm.connect
|
6
|
+
body:
|
7
|
+
string: token=token
|
8
|
+
response:
|
9
|
+
status:
|
10
|
+
code: 200
|
11
|
+
message: OK
|
12
|
+
body:
|
13
|
+
encoding: UTF-8
|
14
|
+
string: '{"ok":false,"error":"migration_in_progress"}'
|
15
|
+
http_version:
|
16
|
+
recorded_at: Tue, 28 Apr 2015 12:55:22 GMT
|
17
|
+
- request:
|
18
|
+
method: post
|
19
|
+
uri: https://slack.com/api/rtm.connect
|
20
|
+
body:
|
21
|
+
string: token=token
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
body:
|
27
|
+
encoding: UTF-8
|
28
|
+
string: '{"ok":false,"error":"unknown"}'
|
29
|
+
http_version:
|
30
|
+
recorded_at: Tue, 28 Apr 2015 12:55:22 GMT
|
3
31
|
- request:
|
4
32
|
method: post
|
5
33
|
uri: https://slack.com/api/rtm.start
|
@@ -1,27 +1,33 @@
|
|
1
1
|
require 'rspec/expectations'
|
2
|
-
|
3
2
|
RSpec::Matchers.define :respond_with_slack_message do |expected|
|
3
|
+
include SlackRubyBot::SpecHelpers
|
4
4
|
match do |actual|
|
5
|
-
client =
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
client = respond_to?(:client) ? send(:client) : SlackRubyBot::Client.new
|
6
|
+
def client.test_messages
|
7
|
+
@test_received_messages
|
8
|
+
end
|
9
|
+
|
10
|
+
def client.say(options = {})
|
11
|
+
super
|
12
|
+
@test_received_messages = @test_received_messages.nil? ? [] : @test_received_messages
|
13
|
+
@test_received_messages.push options
|
14
|
+
end
|
10
15
|
|
11
16
|
message_command = SlackRubyBot::Hooks::Message.new
|
12
17
|
channel, user, message = parse(actual)
|
13
18
|
|
14
19
|
allow(Giphy).to receive(:random) if defined?(Giphy)
|
15
20
|
|
16
|
-
|
21
|
+
allow(client).to receive(:message)
|
17
22
|
message_command.call(client, Hashie::Mash.new(text: message, channel: channel, user: user))
|
23
|
+
@messages = client.test_messages
|
24
|
+
expect(client).to have_received(:message).with(hash_including(channel: channel, text: expected)).once
|
18
25
|
true
|
19
26
|
end
|
20
27
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
[actual[:channel] || 'channel', actual[:user] || 'user', actual[:message]]
|
28
|
+
failure_message do |_actual|
|
29
|
+
message = "expected to receive message with text: #{expected} once,\n received:"
|
30
|
+
message += @messages.count.zero? ? 'No response messages received' : @messages.inspect
|
31
|
+
message
|
26
32
|
end
|
27
33
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
RSpec::Matchers.define :respond_with_slack_messages do |expected|
|
3
|
+
include SlackRubyBot::SpecHelpers
|
4
|
+
match do |actual|
|
5
|
+
raise ArgumentError, 'respond_with_slack_messages expects an array of ordered responses' unless expected.respond_to? :each
|
6
|
+
client = respond_to?(:client) ? send(:client) : SlackRubyBot::Client.new
|
7
|
+
def client.test_messages
|
8
|
+
@test_received_messages
|
9
|
+
end
|
10
|
+
|
11
|
+
def client.say(options = {})
|
12
|
+
super
|
13
|
+
@test_received_messages = @test_received_messages.nil? ? [] : @test_received_messages
|
14
|
+
@test_received_messages.push options
|
15
|
+
end
|
16
|
+
|
17
|
+
message_command = SlackRubyBot::Hooks::Message.new
|
18
|
+
channel, user, message = parse(actual)
|
19
|
+
|
20
|
+
allow(Giphy).to receive(:random) if defined?(Giphy)
|
21
|
+
|
22
|
+
allow(client).to receive(:message)
|
23
|
+
message_command.call(client, Hashie::Mash.new(text: message, channel: channel, user: user))
|
24
|
+
@messages = client.test_messages
|
25
|
+
@responses = []
|
26
|
+
expected.each do |exp|
|
27
|
+
@responses.push(expect(client).to(have_received(:message).with(hash_including(channel: channel, text: exp)).once))
|
28
|
+
end
|
29
|
+
true
|
30
|
+
end
|
31
|
+
failure_message do |_actual|
|
32
|
+
message = ''
|
33
|
+
expected.each do |exp|
|
34
|
+
message += "Expected text: #{exp}, got #{@messages[expected.index(exp)] || 'No Response'}\n" unless @responses[expected.index(exp)]
|
35
|
+
end
|
36
|
+
message
|
37
|
+
end
|
38
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
describe SlackRubyBot do
|
2
2
|
def client
|
3
|
-
SlackRubyBot::Client.new aliases: %w
|
3
|
+
SlackRubyBot::Client.new aliases: %w[:emoji: alias каспаров B0?.@(*^$]
|
4
4
|
end
|
5
5
|
it 'responds to emoji' do
|
6
6
|
expect(message: ':emoji: hi').to respond_with_slack_message('Hi <@user>!')
|
@@ -11,4 +11,7 @@ describe SlackRubyBot do
|
|
11
11
|
it 'responds to a non-English alias' do
|
12
12
|
expect(message: 'каспаров hi').to respond_with_slack_message('Hi <@user>!')
|
13
13
|
end
|
14
|
+
it 'responds to an alias with special characters' do
|
15
|
+
expect(message: 'B0?.@(*^$ hi').to respond_with_slack_message('Hi <@user>!')
|
16
|
+
end
|
14
17
|
end
|
@@ -38,7 +38,7 @@ describe SlackRubyBot::Commands::Base do
|
|
38
38
|
command_classes = SlackRubyBot::Commands::Base.command_classes
|
39
39
|
anon_class = Class.new(SlackRubyBot::Commands::Base)
|
40
40
|
expect(command_classes).to include anon_class
|
41
|
-
expect(command_classes.find { |obj| obj == anon_class }.object_id.to_s).to eq anon_class.
|
41
|
+
expect(command_classes.find { |obj| obj == anon_class }.object_id.to_s).to eq anon_class.command_name_from_class
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
describe SlackRubyBot::Commands do
|
2
|
+
let! :command do
|
3
|
+
Class.new(SlackRubyBot::Commands::Base) do
|
4
|
+
command(/some\s*regex+\?*/) do |client, data, match|
|
5
|
+
client.say(channel: data.channel, text: "#{match[:command]}: #{match[:expression]}")
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
def app
|
10
|
+
SlackRubyBot::App.new
|
11
|
+
end
|
12
|
+
it 'handles regular expressions' do
|
13
|
+
expect(message: "#{SlackRubyBot.config.user} some regex works here").to respond_with_slack_message('some regex: works here')
|
14
|
+
expect(message: "#{SlackRubyBot.config.user} some RegEx?? yep").to respond_with_slack_message('some RegEx??: yep')
|
15
|
+
end
|
16
|
+
end
|
@@ -27,11 +27,11 @@ describe SlackRubyBot::Commands do
|
|
27
27
|
end
|
28
28
|
it 'checks that bot mentioned in message' do
|
29
29
|
bot_names = ['rubybot', '<@deadbeef>', '<@deadbeef>:', 'rubybot:']
|
30
|
-
expect(command.send(:
|
31
|
-
expect(command.send(:
|
32
|
-
expect(command.send(:
|
33
|
-
expect(command.send(:
|
34
|
-
expect(command.send(:
|
35
|
-
expect(command.send(:
|
30
|
+
expect(command.send(:message_begins_with_bot_mention?, 'rubybot', bot_names)).to be true
|
31
|
+
expect(command.send(:message_begins_with_bot_mention?, 'rubybot ', bot_names)).to be true
|
32
|
+
expect(command.send(:message_begins_with_bot_mention?, 'rubybotbot', bot_names)).to be false
|
33
|
+
expect(command.send(:message_begins_with_bot_mention?, 'rubybot:', bot_names)).to be true
|
34
|
+
expect(command.send(:message_begins_with_bot_mention?, 'rubybot: ', bot_names)).to be true
|
35
|
+
expect(command.send(:message_begins_with_bot_mention?, 'rubybot:bot', bot_names)).to be false
|
36
36
|
end
|
37
37
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
describe RSpec do
|
2
|
+
let! :command do
|
3
|
+
Class.new(SlackRubyBot::Commands::Base) do
|
4
|
+
command 'single message with as_user' do |client, data, _match|
|
5
|
+
client.say(text: 'single response', channel: data.channel, as_user: true)
|
6
|
+
end
|
7
|
+
command 'single message' do |client, data, _match|
|
8
|
+
client.say(text: 'single response', channel: data.channel)
|
9
|
+
end
|
10
|
+
command 'respond 5 times' do |client, data, _match|
|
11
|
+
5.times do |i|
|
12
|
+
client.say(text: "response #{i}", channel: data.channel)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def app
|
19
|
+
SlackRubyBot::App.new
|
20
|
+
end
|
21
|
+
it 'respond_with_single_message_using_regex_match' do
|
22
|
+
expect(message: "#{SlackRubyBot.config.user} single message")
|
23
|
+
.to respond_with_slack_message(/single response/i)
|
24
|
+
end
|
25
|
+
it 'respond_with_single_message_using_partial_regex_match' do
|
26
|
+
expect(message: "#{SlackRubyBot.config.user} single message")
|
27
|
+
.to respond_with_slack_message(/si[n|N]gle/)
|
28
|
+
end
|
29
|
+
it 'not_respond_with_single_message_using_bad_regex_match' do
|
30
|
+
expect(message: "#{SlackRubyBot.config.user} single message")
|
31
|
+
.not_to respond_with_slack_message(/si[g|G]gle/)
|
32
|
+
end
|
33
|
+
it 'respond_with_single_message_using_string_match' do
|
34
|
+
expect(message: "#{SlackRubyBot.config.user} single message")
|
35
|
+
.to respond_with_slack_message('single response')
|
36
|
+
end
|
37
|
+
it 'respond_with_single_message_using_regex_match_with_extra_args' do
|
38
|
+
expect(message: "#{SlackRubyBot.config.user} single message with as_user")
|
39
|
+
.to respond_with_slack_message(/single response/i)
|
40
|
+
end
|
41
|
+
it 'respond_with_multiple_messages_looking_for_single_match' do
|
42
|
+
expect(message: "#{SlackRubyBot.config.user} respond 5 times")
|
43
|
+
.to respond_with_slack_message('response 1')
|
44
|
+
end
|
45
|
+
it 'respond_with_multiple_messages_no_match' do
|
46
|
+
expect(message: "#{SlackRubyBot.config.user} respond 5 times")
|
47
|
+
.not_to respond_with_slack_message('response 7')
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
describe RSpec do
|
2
|
+
let! :command do
|
3
|
+
Class.new(SlackRubyBot::Commands::Base) do
|
4
|
+
command 'respond with as_user' do |client, data, _match|
|
5
|
+
5.times do |i|
|
6
|
+
client.say(text: "response #{i}", channel: data.channel, as_user: true)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
command 'respond 5 times' do |client, data, _match|
|
10
|
+
5.times do |i|
|
11
|
+
client.say(text: "response #{i}", channel: data.channel)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def app
|
18
|
+
SlackRubyBot::App.new
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'respond_with_multiple_messages_using_regex_matches' do
|
22
|
+
expected_responses = []
|
23
|
+
5.times { |i| expected_responses.push(/response #{i}/i) }
|
24
|
+
expect(message: "#{SlackRubyBot.config.user} respond 5 times")
|
25
|
+
.to respond_with_slack_messages(expected_responses)
|
26
|
+
end
|
27
|
+
it 'respond_with_multiple_messages_using_string_matches' do
|
28
|
+
expected_responses = []
|
29
|
+
5.times { |i| expected_responses.push("response #{i}") }
|
30
|
+
expect(message: "#{SlackRubyBot.config.user} respond 5 times")
|
31
|
+
.to respond_with_slack_messages(expected_responses)
|
32
|
+
end
|
33
|
+
it 'not_respond_with_multiple_messages_using_string_matches' do
|
34
|
+
expected_responses = []
|
35
|
+
6.times { |i| expected_responses.push("response #{i}") }
|
36
|
+
expect(message: "#{SlackRubyBot.config.user} respond 5 times")
|
37
|
+
.not_to respond_with_slack_messages(expected_responses)
|
38
|
+
end
|
39
|
+
it 'respond_with_multiple_messages_using_string_matches_with_extra_arg' do
|
40
|
+
expected_responses = []
|
41
|
+
5.times { |i| expected_responses.push("response #{i}") }
|
42
|
+
expect(message: "#{SlackRubyBot.config.user} respond with as_user")
|
43
|
+
.to respond_with_slack_messages(expected_responses)
|
44
|
+
end
|
45
|
+
end
|
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.10.
|
4
|
+
version: 0.10.5
|
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-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -190,8 +190,10 @@ files:
|
|
190
190
|
- lib/slack-ruby-bot/rspec/support/slack-ruby-bot/not_respond.rb
|
191
191
|
- lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_error.rb
|
192
192
|
- lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_message.rb
|
193
|
+
- lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_messages.rb
|
193
194
|
- lib/slack-ruby-bot/rspec/support/slack_api_key.rb
|
194
195
|
- lib/slack-ruby-bot/rspec/support/slack_ruby_bot_configure.rb
|
196
|
+
- lib/slack-ruby-bot/rspec/support/spec_helpers.rb
|
195
197
|
- lib/slack-ruby-bot/rspec/support/vcr.rb
|
196
198
|
- lib/slack-ruby-bot/server.rb
|
197
199
|
- lib/slack-ruby-bot/support/commands_helper.rb
|
@@ -217,6 +219,7 @@ files:
|
|
217
219
|
- spec/slack-ruby-bot/commands/commands_permitted_spec.rb
|
218
220
|
- spec/slack-ruby-bot/commands/commands_precedence_spec.rb
|
219
221
|
- spec/slack-ruby-bot/commands/commands_regexp_escape_spec.rb
|
222
|
+
- spec/slack-ruby-bot/commands/commands_regexp_spec.rb
|
220
223
|
- spec/slack-ruby-bot/commands/commands_spaces_spec.rb
|
221
224
|
- spec/slack-ruby-bot/commands/commands_spec.rb
|
222
225
|
- spec/slack-ruby-bot/commands/commands_with_block_spec.rb
|
@@ -243,6 +246,8 @@ files:
|
|
243
246
|
- spec/slack-ruby-bot/hooks/set_spec.rb
|
244
247
|
- spec/slack-ruby-bot/mvc/controller/controller_to_command_spec.rb
|
245
248
|
- spec/slack-ruby-bot/rspec/respond_with_error_spec.rb
|
249
|
+
- spec/slack-ruby-bot/rspec/respond_with_slack_message_spec.rb
|
250
|
+
- spec/slack-ruby-bot/rspec/respond_with_slack_messages_spec.rb
|
246
251
|
- spec/slack-ruby-bot/server_spec.rb
|
247
252
|
- spec/slack-ruby-bot/support/commands_helper_spec.rb
|
248
253
|
- spec/slack-ruby-bot/support/loggable_spec.rb
|
@@ -268,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
268
273
|
version: 1.3.6
|
269
274
|
requirements: []
|
270
275
|
rubyforge_project:
|
271
|
-
rubygems_version: 2.6.
|
276
|
+
rubygems_version: 2.6.13
|
272
277
|
signing_key:
|
273
278
|
specification_version: 4
|
274
279
|
summary: The easiest way to write a Slack bot in Ruby.
|
@@ -283,6 +288,7 @@ test_files:
|
|
283
288
|
- spec/slack-ruby-bot/commands/commands_permitted_spec.rb
|
284
289
|
- spec/slack-ruby-bot/commands/commands_precedence_spec.rb
|
285
290
|
- spec/slack-ruby-bot/commands/commands_regexp_escape_spec.rb
|
291
|
+
- spec/slack-ruby-bot/commands/commands_regexp_spec.rb
|
286
292
|
- spec/slack-ruby-bot/commands/commands_spaces_spec.rb
|
287
293
|
- spec/slack-ruby-bot/commands/commands_spec.rb
|
288
294
|
- spec/slack-ruby-bot/commands/commands_with_block_spec.rb
|
@@ -309,6 +315,8 @@ test_files:
|
|
309
315
|
- spec/slack-ruby-bot/hooks/set_spec.rb
|
310
316
|
- spec/slack-ruby-bot/mvc/controller/controller_to_command_spec.rb
|
311
317
|
- spec/slack-ruby-bot/rspec/respond_with_error_spec.rb
|
318
|
+
- spec/slack-ruby-bot/rspec/respond_with_slack_message_spec.rb
|
319
|
+
- spec/slack-ruby-bot/rspec/respond_with_slack_messages_spec.rb
|
312
320
|
- spec/slack-ruby-bot/server_spec.rb
|
313
321
|
- spec/slack-ruby-bot/support/commands_helper_spec.rb
|
314
322
|
- spec/slack-ruby-bot/support/loggable_spec.rb
|