slack_message 2.1.0 → 2.2.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/CHANGELOG.md +8 -1
- data/Gemfile.lock +1 -1
- data/README.md +54 -5
- data/lib/slack_message/api.rb +18 -12
- data/lib/slack_message/dsl.rb +55 -22
- data/lib/slack_message.rb +18 -8
- data/slack_message.gemspec +1 -1
- data/spec/slack_message_spec.rb +45 -26
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 368533ab7e4dae44ffbef5ccf8afef048def96d964a6af64c294c23ba617dfa3
|
4
|
+
data.tar.gz: f9397472bbc5c5db81dd1c9d7715e5015f4ec455948e7a29afbb11ef8c8a3d01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5cce143a95d508694221f1c667428f850ce7aa537e73f61c1869498b68a5751afe2ac386215b96702a1a27bcad3758c474ba09870a1cd7a31a7c33a17ebd4d53
|
7
|
+
data.tar.gz: 7f81e1876f231899588b174c87c4a0a3ca3bcbc4057216092311b300cff7d23d6541083b5e481e811795042538e2e6713b1a9f5eb5f6eba345e79960335cad91
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## [
|
3
|
+
## [2.2.0] - 2021-11-20
|
4
|
+
- When sending text, it is now possible to mention users and have their user
|
5
|
+
IDs automatically converted using `<email@email.com>` within text nodes.
|
6
|
+
- It's now possible to override notification text.
|
7
|
+
- Errors received from the Slack API now raise `SlackMessage::ApiError`.
|
8
|
+
- Re-exposed a top-level method for getting user IDs, `SlackMessage.user_id`.
|
9
|
+
- Raising some better errors when no message payload is present.
|
10
|
+
- Using `build` now requires a profile, so configuration must exist.
|
4
11
|
|
5
12
|
## [2.1.0] - 2021-11-01
|
6
13
|
- Change to use Slack Apps for all profiles. This should allow growth toward
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -30,8 +30,8 @@ opinionated stances on how to make use of that API. For instance:
|
|
30
30
|
look it up as an email address.
|
31
31
|
* A few little hacks on the block syntax, such as adding a `blank_line` (which
|
32
32
|
doesn't exist in the API), or leading spaces.
|
33
|
-
* Configuration
|
34
|
-
should
|
33
|
+
* Configuration is kept as simple as possible. But, as much heavy lifting as
|
34
|
+
possible should occur just once via configuration and not on every call.
|
35
35
|
|
36
36
|
Usage
|
37
37
|
------------
|
@@ -238,6 +238,55 @@ SlackMessage.post_to('#general') do
|
|
238
238
|
end
|
239
239
|
```
|
240
240
|
|
241
|
+
#### Notifying Users
|
242
|
+
|
243
|
+
There are several supported ways to tag and notify users. Mentioned above, it's
|
244
|
+
possible to DM a user by email:
|
245
|
+
|
246
|
+
```ruby
|
247
|
+
SlackMessage.post_to('hello@joemastey.com') do
|
248
|
+
text "Hi there!"
|
249
|
+
end
|
250
|
+
```
|
251
|
+
|
252
|
+
You can also mention a user by email within a channel by wrapping their name
|
253
|
+
in tags:
|
254
|
+
|
255
|
+
```ruby
|
256
|
+
SlackMessage.post_to('#general') do
|
257
|
+
bot_name "CoffeeBot"
|
258
|
+
bot_icon ":coffee:"
|
259
|
+
|
260
|
+
text ":coffee: It's your turn to make coffee <hello@joemastey.com>."
|
261
|
+
end
|
262
|
+
```
|
263
|
+
|
264
|
+
Emails that are not wrapped in tags will be rendered as normal clickable email
|
265
|
+
addresses. Additionally, Slack will automatically convert a number of channel
|
266
|
+
names and tags you're probably already used to:
|
267
|
+
|
268
|
+
```ruby
|
269
|
+
SlackMessage.post_to('#general') do
|
270
|
+
bot_name "CoffeeBot"
|
271
|
+
bot_icon ":coffee:"
|
272
|
+
|
273
|
+
text "@here there's no coffee left!"
|
274
|
+
end
|
275
|
+
```
|
276
|
+
|
277
|
+
By default, the desktop notification for a message will be the text of the
|
278
|
+
message itself. However, you can customize desktop notifications if you prefer:
|
279
|
+
|
280
|
+
```ruby
|
281
|
+
SlackMessage.post_to('hello@joemastey.com') do
|
282
|
+
bot_name "CoffeeBot"
|
283
|
+
bot_icon ":coffee:"
|
284
|
+
|
285
|
+
notification_text "It's a coffee emergency!"
|
286
|
+
text "There's no coffee left!"
|
287
|
+
end
|
288
|
+
```
|
289
|
+
|
241
290
|
### Testing
|
242
291
|
|
243
292
|
You can do some basic testing against SlackMessage, at least if you use RSpec!
|
@@ -301,12 +350,12 @@ expand the DSL to include more useful features.
|
|
301
350
|
Some behaviors that are still planned but not yet added:
|
302
351
|
|
303
352
|
* some API documentation amirite?
|
304
|
-
*
|
353
|
+
* custom http_options in configuration
|
305
354
|
* more of BlockKit's options
|
306
|
-
* any interactive elements at all
|
355
|
+
* any interactive elements at all
|
307
356
|
* editing / updating messages
|
308
357
|
* multiple recipients
|
309
|
-
* more interesting return types for your message
|
358
|
+
* more interesting return types for your message
|
310
359
|
* richer text formatting (for instance, `ul` is currently a hack)
|
311
360
|
|
312
361
|
Contributing
|
data/lib/slack_message/api.rb
CHANGED
@@ -15,21 +15,23 @@ class SlackMessage::Api
|
|
15
15
|
end
|
16
16
|
|
17
17
|
if response.code != "200"
|
18
|
-
raise "Got an error back from the Slack API (HTTP #{response.code}):\n#{response.body}"
|
18
|
+
raise SlackMessage::ApiError, "Got an error back from the Slack API (HTTP #{response.code}):\n#{response.body}"
|
19
19
|
elsif response.body == ""
|
20
|
-
raise "Received empty 200 response from Slack when looking up user info. Check your API key."
|
20
|
+
raise SlackMessage::ApiError, "Received empty 200 response from Slack when looking up user info. Check your API key."
|
21
21
|
end
|
22
22
|
|
23
23
|
begin
|
24
24
|
payload = JSON.parse(response.body)
|
25
25
|
rescue
|
26
|
-
raise "Unable to parse JSON response from Slack API\n#{response.body}"
|
26
|
+
raise SlackMessage::ApiError, "Unable to parse JSON response from Slack API\n#{response.body}"
|
27
27
|
end
|
28
28
|
|
29
29
|
if payload.include?("error") && payload["error"] == "invalid_auth"
|
30
|
-
raise "Received an error because your authentication token isn't properly configured
|
30
|
+
raise SlackMessage::ApiError, "Received an error because your authentication token isn't properly configured."
|
31
|
+
elsif payload.include?("error") && payload["error"] == "users_not_found"
|
32
|
+
raise SlackMessage::ApiError, "Couldn't find a user with the email '#{email}'."
|
31
33
|
elsif payload.include?("error")
|
32
|
-
raise "Received error response from Slack during user lookup:\n#{response.body}"
|
34
|
+
raise SlackMessage::ApiError, "Received error response from Slack during user lookup:\n#{response.body}"
|
33
35
|
end
|
34
36
|
|
35
37
|
payload["user"]["id"]
|
@@ -40,9 +42,13 @@ class SlackMessage::Api
|
|
40
42
|
channel: target,
|
41
43
|
username: payload.custom_bot_name || profile[:name],
|
42
44
|
blocks: payload.render,
|
43
|
-
text: payload.
|
45
|
+
text: payload.custom_notification,
|
44
46
|
}
|
45
47
|
|
48
|
+
if params[:blocks].length == 0
|
49
|
+
raise ArgumentError, "Tried to send an entirely empty message."
|
50
|
+
end
|
51
|
+
|
46
52
|
icon = payload.custom_bot_icon || profile[:icon]
|
47
53
|
if icon =~ /^:\w+:$/
|
48
54
|
params[:icon_emoji] = icon
|
@@ -58,17 +64,17 @@ class SlackMessage::Api
|
|
58
64
|
|
59
65
|
# let's try to be helpful about error messages
|
60
66
|
if ["token_revoked", "token_expired", "invalid_auth", "not_authed"].include?(error)
|
61
|
-
raise "Couldn't send slack message because the API key for profile '#{profile[:handle]}' is wrong."
|
67
|
+
raise SlackMessage::ApiError, "Couldn't send slack message because the API key for profile '#{profile[:handle]}' is wrong."
|
62
68
|
elsif ["no_permission", "ekm_access_denied"].include?(error)
|
63
|
-
raise "Couldn't send slack message because the API key for profile '#{profile[:handle]}' isn't allowed to post messages."
|
69
|
+
raise SlackMessage::ApiError, "Couldn't send slack message because the API key for profile '#{profile[:handle]}' isn't allowed to post messages."
|
64
70
|
elsif error == "channel_not_found"
|
65
|
-
raise "Tried to send Slack message to non-existent channel or user '#{target}'"
|
71
|
+
raise SlackMessage::ApiError, "Tried to send Slack message to non-existent channel or user '#{target}'"
|
66
72
|
elsif error == "invalid_arguments"
|
67
|
-
raise "Tried to send Slack message with invalid payload."
|
73
|
+
raise SlackMessage::ApiError, "Tried to send Slack message with invalid payload."
|
68
74
|
elsif response.code == "302"
|
69
|
-
raise "Got 302 response while posting to Slack. Check your API key for profile '#{profile[:handle]}'."
|
75
|
+
raise SlackMessage::ApiError, "Got 302 response while posting to Slack. Check your API key for profile '#{profile[:handle]}'."
|
70
76
|
elsif response.code != "200"
|
71
|
-
raise "Got an error back from the Slack API (HTTP #{response.code}):\n#{response.body}"
|
77
|
+
raise SlackMessage::ApiError, "Got an error back from the Slack API (HTTP #{response.code}):\n#{response.body}"
|
72
78
|
end
|
73
79
|
|
74
80
|
response
|
data/lib/slack_message/dsl.rb
CHANGED
@@ -1,19 +1,21 @@
|
|
1
1
|
class SlackMessage::Dsl
|
2
|
-
attr_reader :body, :default_section, :custom_bot_name, :custom_bot_icon
|
3
|
-
attr_accessor :
|
2
|
+
attr_reader :body, :default_section, :custom_bot_name, :custom_bot_icon, :profile
|
3
|
+
attr_accessor :custom_notification
|
4
4
|
|
5
5
|
EMSPACE = " " # unicode emspace
|
6
6
|
|
7
|
-
def initialize(block)
|
7
|
+
def initialize(block, profile)
|
8
8
|
# Delegate missing methods to caller scope. Thanks 2008:
|
9
9
|
# https://www.dan-manges.com/blog/ruby-dsls-instance-eval-with-delegation
|
10
10
|
@caller_self = eval("self", block.binding)
|
11
11
|
|
12
|
-
@body
|
13
|
-
@
|
14
|
-
@
|
15
|
-
|
16
|
-
@
|
12
|
+
@body = []
|
13
|
+
@profile = profile
|
14
|
+
@default_section = Section.new(self)
|
15
|
+
|
16
|
+
@custom_bot_name = nil
|
17
|
+
@custom_bot_icon = nil
|
18
|
+
@custom_notification = nil
|
17
19
|
end
|
18
20
|
|
19
21
|
# allowable top-level entities within a block
|
@@ -56,9 +58,11 @@ class SlackMessage::Dsl
|
|
56
58
|
finalize_default_section
|
57
59
|
|
58
60
|
if text == "" || text.nil?
|
59
|
-
raise ArgumentError, "
|
61
|
+
raise ArgumentError, "Cannot create a context block without a value."
|
60
62
|
end
|
61
63
|
|
64
|
+
text = self.enrich_text(text)
|
65
|
+
|
62
66
|
@body.push({ type: "context", elements: [{
|
63
67
|
type: "mrkdwn", text: text
|
64
68
|
}]})
|
@@ -79,7 +83,7 @@ class SlackMessage::Dsl
|
|
79
83
|
|
80
84
|
# end delegation
|
81
85
|
|
82
|
-
#
|
86
|
+
# bot / notification overrides
|
83
87
|
|
84
88
|
def bot_name(name)
|
85
89
|
@custom_bot_name = name
|
@@ -89,6 +93,10 @@ class SlackMessage::Dsl
|
|
89
93
|
@custom_bot_icon = icon
|
90
94
|
end
|
91
95
|
|
96
|
+
def notification_text(msg)
|
97
|
+
@custom_notification = msg
|
98
|
+
end
|
99
|
+
|
92
100
|
# end bot name
|
93
101
|
|
94
102
|
def render
|
@@ -100,6 +108,22 @@ class SlackMessage::Dsl
|
|
100
108
|
@caller_self.send meth, *args, &blk
|
101
109
|
end
|
102
110
|
|
111
|
+
EMAIL_TAG_PATTERN = /<[^@ \t\r\n\<]+@[^@ \t\r\n]+\.[^@ \t\r\n]+>/
|
112
|
+
|
113
|
+
# replace emails w/ real user IDs
|
114
|
+
def enrich_text(text_body)
|
115
|
+
text_body.scan(EMAIL_TAG_PATTERN).each do |email_tag|
|
116
|
+
raw_email = email_tag.gsub(/[><]/, '')
|
117
|
+
user_id = SlackMessage::Api::user_id_for(raw_email, profile)
|
118
|
+
|
119
|
+
text_body.gsub!(email_tag, "<@#{user_id}>") if user_id
|
120
|
+
rescue SlackMessage::ApiError => e
|
121
|
+
# swallow errors for not-found users
|
122
|
+
end
|
123
|
+
|
124
|
+
text_body
|
125
|
+
end
|
126
|
+
|
103
127
|
private
|
104
128
|
|
105
129
|
# when doing things that would generate new top-levels, first try
|
@@ -123,9 +147,11 @@ class SlackMessage::Dsl
|
|
123
147
|
|
124
148
|
def text(msg)
|
125
149
|
if msg == "" || msg.nil?
|
126
|
-
raise ArgumentError, "
|
150
|
+
raise ArgumentError, "Cannot create a text node without a value."
|
127
151
|
end
|
128
152
|
|
153
|
+
msg = @parent.enrich_text(msg)
|
154
|
+
|
129
155
|
if @body.include?(:text)
|
130
156
|
@body[:text][:text] << "\n#{msg}"
|
131
157
|
|
@@ -135,19 +161,21 @@ class SlackMessage::Dsl
|
|
135
161
|
end
|
136
162
|
|
137
163
|
def ul(elements)
|
138
|
-
raise ArgumentError, "
|
164
|
+
raise ArgumentError, "Please pass an array when creating a ul." unless elements.respond_to?(:map)
|
139
165
|
|
140
|
-
text(
|
141
|
-
|
142
|
-
|
166
|
+
msg = elements.map { |text| "#{EMSPACE}• #{text}" }.join("\n")
|
167
|
+
msg = @parent.enrich_text(msg)
|
168
|
+
|
169
|
+
text(msg)
|
143
170
|
end
|
144
171
|
|
145
172
|
def ol(elements)
|
146
|
-
raise ArgumentError, "
|
173
|
+
raise ArgumentError, "Please pass an array when creating an ol." unless elements.respond_to?(:map)
|
174
|
+
|
175
|
+
msg = elements.map.with_index(1) { |text, idx| "#{EMSPACE}#{idx}. #{text}" }.join("\n")
|
176
|
+
msg = @parent.enrich_text(msg)
|
147
177
|
|
148
|
-
text(
|
149
|
-
elements.map.with_index(1) { |text, idx| "#{EMSPACE}#{idx}. #{text}" }.join("\n")
|
150
|
-
)
|
178
|
+
text(msg)
|
151
179
|
end
|
152
180
|
|
153
181
|
# styles: default, primary, danger
|
@@ -205,9 +233,10 @@ class SlackMessage::Dsl
|
|
205
233
|
|
206
234
|
def list_item(title, value)
|
207
235
|
if value == "" || value.nil?
|
208
|
-
raise ArgumentError, "
|
236
|
+
raise ArgumentError, "Can't create a list item for '#{title}' without a value."
|
209
237
|
end
|
210
238
|
|
239
|
+
value = @parent.enrich_text(value)
|
211
240
|
@list.add(title, value)
|
212
241
|
end
|
213
242
|
|
@@ -220,10 +249,14 @@ class SlackMessage::Dsl
|
|
220
249
|
end
|
221
250
|
|
222
251
|
def render
|
252
|
+
unless has_content?
|
253
|
+
raise ArgumentError, "Can't create a section with no content."
|
254
|
+
end
|
255
|
+
|
223
256
|
body[:fields] = @list.render if @list.any?
|
224
257
|
|
225
|
-
if body[:text] && body[:text][:text] && !@parent.
|
226
|
-
@parent.notification_text
|
258
|
+
if body[:text] && body[:text][:text] && !@parent.custom_notification
|
259
|
+
@parent.notification_text(body[:text][:text])
|
227
260
|
end
|
228
261
|
|
229
262
|
body
|
data/lib/slack_message.rb
CHANGED
@@ -3,6 +3,8 @@ module SlackMessage
|
|
3
3
|
require 'slack_message/api'
|
4
4
|
require 'slack_message/configuration'
|
5
5
|
|
6
|
+
class ApiError < RuntimeError; end
|
7
|
+
|
6
8
|
def self.configuration
|
7
9
|
Configuration
|
8
10
|
end
|
@@ -11,35 +13,43 @@ module SlackMessage
|
|
11
13
|
configuration.configure(&block)
|
12
14
|
end
|
13
15
|
|
16
|
+
def self.user_id(email, profile_name = :default)
|
17
|
+
profile = Configuration.profile(profile_name)
|
18
|
+
Api.user_id_for(email, profile)
|
19
|
+
end
|
20
|
+
|
14
21
|
def self.post_to(target, as: :default, &block)
|
15
|
-
|
22
|
+
profile = Configuration.profile(as)
|
23
|
+
|
24
|
+
payload = Dsl.new(block, profile).tap do |instance|
|
16
25
|
instance.instance_eval(&block)
|
17
26
|
end
|
18
27
|
|
19
|
-
profile = Configuration.profile(as)
|
20
28
|
target = Api::user_id_for(target, profile) if target =~ /^\S{1,}@\S{2,}\.\S{2,}$/
|
21
29
|
|
22
30
|
Api.post(payload, target, profile)
|
23
31
|
end
|
24
32
|
|
25
33
|
def self.post_as(profile_name, &block)
|
26
|
-
payload = Dsl.new(block).tap do |instance|
|
27
|
-
instance.instance_eval(&block)
|
28
|
-
end
|
29
|
-
|
30
34
|
profile = Configuration.profile(profile_name)
|
31
35
|
if profile[:default_channel].nil?
|
32
36
|
raise ArgumentError, "Sorry, you need to specify a default_channel for profile #{profile_name} to use post_as"
|
33
37
|
end
|
34
38
|
|
39
|
+
payload = Dsl.new(block, profile).tap do |instance|
|
40
|
+
instance.instance_eval(&block)
|
41
|
+
end
|
42
|
+
|
35
43
|
target = profile[:default_channel]
|
36
44
|
target = Api::user_id_for(target, profile) if target =~ /^\S{1,}@\S{2,}\.\S{2,}$/
|
37
45
|
|
38
46
|
Api.post(payload, target, profile)
|
39
47
|
end
|
40
48
|
|
41
|
-
def self.build(&block)
|
42
|
-
|
49
|
+
def self.build(profile_name = :default, &block)
|
50
|
+
profile = Configuration.profile(profile_name)
|
51
|
+
|
52
|
+
Dsl.new(block, profile).tap do |instance|
|
43
53
|
instance.instance_eval(&block)
|
44
54
|
end.send(:render)
|
45
55
|
end
|
data/slack_message.gemspec
CHANGED
data/spec/slack_message_spec.rb
CHANGED
@@ -1,31 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe SlackMessage do
|
4
|
-
describe "API convenience" do
|
5
|
-
before do
|
6
|
-
SlackMessage.configure do |config|
|
7
|
-
config.add_profile(name: 'default profile', api_token: 'abc123')
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
after do
|
12
|
-
SlackMessage.configuration.reset
|
13
|
-
end
|
14
|
-
|
15
|
-
it "can grab user IDs" do
|
16
|
-
profile = SlackMessage::Configuration.profile(:default)
|
17
|
-
allow(Net::HTTP).to receive(:start).and_return(
|
18
|
-
double(code: "200", body: '{ "user": { "id": "ABC123" }}')
|
19
|
-
)
|
20
|
-
|
21
|
-
result = SlackMessage::Api.user_id_for("hello@joemastey.com", profile)
|
22
|
-
expect(result).to eq("ABC123")
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
4
|
describe "DSL" do
|
27
5
|
describe "#build" do
|
28
6
|
it "renders some JSON" do
|
7
|
+
SlackMessage.configure do |config|
|
8
|
+
config.clear_profiles!
|
9
|
+
config.add_profile(name: 'default profile', api_token: 'abc123')
|
10
|
+
end
|
11
|
+
|
29
12
|
expected_output = [
|
30
13
|
{ type: "section",
|
31
14
|
text: { text: "foo", type: "mrkdwn" }
|
@@ -42,12 +25,9 @@ RSpec.describe SlackMessage do
|
|
42
25
|
end
|
43
26
|
|
44
27
|
describe "configuration" do
|
45
|
-
after do
|
46
|
-
SlackMessage.configuration.reset
|
47
|
-
end
|
48
|
-
|
49
28
|
it "lets you add and fetch profiles" do
|
50
29
|
SlackMessage.configure do |config|
|
30
|
+
config.clear_profiles!
|
51
31
|
config.add_profile(name: 'default profile', api_token: 'abc123')
|
52
32
|
config.add_profile(:nonstandard, name: 'another profile', api_token: 'abc123')
|
53
33
|
end
|
@@ -141,4 +121,43 @@ RSpec.describe SlackMessage do
|
|
141
121
|
}.to post_to_slack.with_content_matching(/foo/)
|
142
122
|
end
|
143
123
|
end
|
124
|
+
|
125
|
+
describe "API convenience" do
|
126
|
+
let(:profile) { SlackMessage::Configuration.profile(:default) }
|
127
|
+
|
128
|
+
before do
|
129
|
+
SlackMessage.configure do |config|
|
130
|
+
config.clear_profiles!
|
131
|
+
config.add_profile(name: 'default profile', api_token: 'abc123')
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it "can grab user IDs" do
|
136
|
+
allow(Net::HTTP).to receive(:start).and_return(
|
137
|
+
double(code: "200", body: '{ "user": { "id": "ABC123" }}')
|
138
|
+
)
|
139
|
+
|
140
|
+
result = SlackMessage::Api.user_id_for("hello@joemastey.com", profile)
|
141
|
+
expect(result).to eq("ABC123")
|
142
|
+
end
|
143
|
+
|
144
|
+
it "converts user IDs within text when tagged properly" do
|
145
|
+
allow(SlackMessage::Api).to receive(:user_id_for).and_return('ABC123')
|
146
|
+
|
147
|
+
expect {
|
148
|
+
SlackMessage.post_to('#general') { text("Working: <hello@joemastey.com> ") }
|
149
|
+
}.to post_to_slack.with_content_matching(/ABC123/)
|
150
|
+
|
151
|
+
expect {
|
152
|
+
SlackMessage.post_to('#general') { text("Not Tagged: hello@joemastey.com ") }
|
153
|
+
}.to post_to_slack.with_content_matching(/hello@joemastey.com/)
|
154
|
+
|
155
|
+
|
156
|
+
allow(SlackMessage::Api).to receive(:user_id_for).and_raise(SlackMessage::ApiError)
|
157
|
+
|
158
|
+
expect {
|
159
|
+
SlackMessage.post_to('#general') { text("Not User: <nuffin@nuffin.nuffin>") }
|
160
|
+
}.to post_to_slack.with_content_matching(/\<nuffin@nuffin.nuffin\>/)
|
161
|
+
end
|
162
|
+
end
|
144
163
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slack_message
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Mastey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|