slack-notifier 2.2.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f5599f6fb6901d7b9c7009d6343288916829b97a
4
- data.tar.gz: 60d21036bd104a7bda04b8dbb9da0b4a0747a8b7
2
+ SHA256:
3
+ metadata.gz: 2b0deceb91f70d0812f01b82db70eacb8dbf01d4d1985ca02375ac13b36d829e
4
+ data.tar.gz: 5ec7d0eb36e91bbee6f510411646b4c57935aa661706b791e1dc0941fa66dbd9
5
5
  SHA512:
6
- metadata.gz: b6199f52c950a2470e651937f2f91ceb67abf95d0987b3c7cf441f9fe3e2e8b405a14a3570d110f367c308bdebafe7bd4f797661c9ce6f563d1ec5d54ea077bf
7
- data.tar.gz: 9b7efc69cbeaa137a68e6240f94a198e8932ec4ea7deb48b45d9b46b5091b8118a1ad511d455c4eb91de7d38471c5e54119f5122586d7fed6b9463b6b4525daa
6
+ metadata.gz: 0d42ebede5966444cf3101f9410f442e3fad0cdd3a9a7a25f67ff8c068c474bbd49f08d120070cca8652ffd351d68e99f90f648090b97469e3519761b167f513
7
+ data.tar.gz: 950d6e0ebc557de14b56b8ea5982e6057eb54530ec7b5b406f3c28ca22c3aaf26744c2ce6d69654b39bc75c8525d43204687b8adb97c331cf21c91f9629bd97f
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "uri"
3
4
  require "json"
4
5
 
@@ -42,9 +43,11 @@ module Slack
42
43
  payload = config.defaults.merge(payload)
43
44
 
44
45
  params[:http_options] = payload.delete(:http_options) if payload.key?(:http_options)
45
- params[:payload] = middleware.call(payload).to_json
46
46
 
47
- client.post endpoint, params
47
+ middleware.call(payload).map do |pld|
48
+ params[:payload] = pld.to_json
49
+ client.post endpoint, params
50
+ end
48
51
  end
49
52
 
50
53
  private
@@ -1,11 +1,17 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Slack
3
4
  class Notifier
4
5
  class Config
5
6
  def initialize
6
7
  @http_client = Util::HTTPClient
7
8
  @defaults = {}
8
- @middleware = [:format_message, :format_attachments, :at]
9
+ @middleware = %i[
10
+ format_message
11
+ format_attachments
12
+ at
13
+ channels
14
+ ]
9
15
  end
10
16
 
11
17
  def http_client client=nil
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Slack
3
4
  class Notifier
4
5
  class PayloadMiddleware
@@ -20,3 +21,4 @@ require_relative "payload_middleware/base"
20
21
  require_relative "payload_middleware/format_message"
21
22
  require_relative "payload_middleware/format_attachments"
22
23
  require_relative "payload_middleware/at"
24
+ require_relative "payload_middleware/channels"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Slack
3
4
  class Notifier
4
5
  class PayloadMiddleware
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Slack
4
+ class Notifier
5
+ class PayloadMiddleware
6
+ class Channels < Base
7
+ middleware_name :channels
8
+
9
+ def call payload={}
10
+ return payload unless payload[:channel].respond_to?(:to_ary)
11
+
12
+ payload[:channel].to_ary.map do |channel|
13
+ pld = payload.dup
14
+ pld[:channel] = channel
15
+ pld
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,22 +1,29 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Slack
3
4
  class Notifier
4
5
  class PayloadMiddleware
5
6
  class FormatAttachments < Base
6
7
  middleware_name :format_attachments
7
8
 
8
- options formats: [:html, :markdown]
9
+ options formats: %i[html markdown]
9
10
 
10
11
  def call payload={}
11
- attachments = payload.fetch(:attachments, payload["attachments"])
12
- wrap_array(attachments).each do |attachment|
12
+ payload = payload.dup
13
+ attachments = payload.delete(:attachments)
14
+ attachments ||= payload.delete("attachments")
15
+
16
+ attachments = wrap_array(attachments).map do |attachment|
13
17
  ["text", :text].each do |key|
14
18
  if attachment.key?(key)
15
19
  attachment[key] = Util::LinkFormatter.format(attachment[key], options)
16
20
  end
17
21
  end
22
+
23
+ attachment
18
24
  end
19
25
 
26
+ payload[:attachments] = attachments if attachments && !attachments.empty?
20
27
  payload
21
28
  end
22
29
 
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Slack
3
4
  class Notifier
4
5
  class PayloadMiddleware
5
6
  class FormatMessage < Base
6
7
  middleware_name :format_message
7
8
 
8
- options formats: [:html, :markdown]
9
+ options formats: %i[html markdown]
9
10
 
10
11
  def call payload={}
11
12
  return payload unless payload[:text]
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Slack
3
4
  class Notifier
4
5
  class PayloadMiddleware
@@ -25,10 +26,24 @@ module Slack
25
26
  end
26
27
 
27
28
  def call payload={}
28
- stack.inject payload do |pld, middleware|
29
- middleware.call(pld)
29
+ result = stack.inject payload do |pld, middleware|
30
+ as_array(pld).flat_map do |p|
31
+ middleware.call(p)
32
+ end
30
33
  end
34
+
35
+ as_array(result)
31
36
  end
37
+
38
+ private
39
+
40
+ def as_array args
41
+ if args.respond_to?(:to_ary)
42
+ args.to_ary
43
+ else
44
+ [args]
45
+ end
46
+ end
32
47
  end
33
48
  end
34
49
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Slack
3
4
  class Notifier
4
5
  module Util
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "net/http"
4
4
 
5
-
6
5
  module Slack
7
6
  class Notifier
8
7
  class APIError < StandardError; end
@@ -23,6 +22,7 @@ module Slack
23
22
  @params = params
24
23
  end
25
24
 
25
+ # rubocop:disable Layout/IndentHeredoc
26
26
  def call
27
27
  http_obj.request(request_obj).tap do |response|
28
28
  unless response.is_a?(Net::HTTPSuccess)
@@ -33,6 +33,7 @@ MSG
33
33
  end
34
34
  end
35
35
  end
36
+ # rubocop:enable Layout/IndentHeredoc
36
37
 
37
38
  private
38
39
 
@@ -1,38 +1,55 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Slack
3
4
  class Notifier
4
5
  module Util
5
6
  class LinkFormatter
6
7
  # http://rubular.com/r/19cNXW5qbH
7
- HTML_PATTERN = / <a (?:.*?) href=['"](.+?)['"] (?:.*?)> (.+?) <\/a> /x
8
+ HTML_PATTERN = %r{
9
+ <a
10
+ (?:.*?)
11
+ href=['"](.+?)['"]
12
+ (?:.*?)>
13
+ (.+?)
14
+ </a>
15
+ }x
16
+
17
+ # the path portion of a url can contain these characters
18
+ VALID_PATH_CHARS = '\w\-\.\~\/\?\#\='
8
19
 
9
- # http://rubular.com/r/guJbTK6x1f
10
- MARKDOWN_PATTERN = /\[ ([^\[\]]*?) \] \( ((https?:\/\/.*?) | (mailto:.*?)) \) /x
20
+ # Attempt at only matching pairs of parens per
21
+ # the markdown spec http://spec.commonmark.org/0.27/#links
22
+ #
23
+ # http://rubular.com/r/y107aevxqT
24
+ MARKDOWN_PATTERN = %r{
25
+ \[ ([^\[\]]*?) \]
26
+ \( ((https?://.*?) | (mailto:.*?)) \)
27
+ (?! [#{VALID_PATH_CHARS}]* \) )
28
+ }x
11
29
 
12
30
  class << self
13
31
  def format string, opts={}
14
- LinkFormatter.new(string, opts).formatted
32
+ LinkFormatter.new(string, **opts).formatted
15
33
  end
16
34
  end
17
35
 
18
36
  attr_reader :formats
19
37
 
20
- def initialize string, formats: [:html, :markdown]
38
+ def initialize string, formats: %i[html markdown]
21
39
  @formats = formats
22
40
  @orig = string.respond_to?(:scrub) ? string.scrub : string
23
41
  end
24
42
 
25
- # rubocop:disable Style/GuardClause
43
+ # rubocop:disable Lint/RescueWithoutErrorClass
26
44
  def formatted
45
+ return @orig unless @orig.respond_to?(:gsub)
46
+
27
47
  sub_markdown_links(sub_html_links(@orig))
28
48
  rescue => e
29
- if RUBY_VERSION < "2.1" && e.message.include?("invalid byte sequence")
30
- raise e, "#{e.message}. Consider including the 'string-scrub' gem to strip invalid characters"
31
- else
32
- raise e
33
- end
49
+ raise e unless RUBY_VERSION < "2.1" && e.message.include?("invalid byte sequence")
50
+ raise e, "#{e.message}. Consider including the 'string-scrub' gem to strip invalid characters"
34
51
  end
35
- # rubocop:enable Style/GuardClause
52
+ # rubocop:enable Lint/RescueWithoutErrorClass
36
53
 
37
54
  private
38
55
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Slack
3
4
  class Notifier
4
- VERSION = "2.2.1".freeze # rubocop:disable Style/RedundantFreeze
5
+ VERSION = "2.4.0".freeze # rubocop:disable Style/RedundantFreeze
5
6
  end
6
7
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  # encoding: utf-8
3
+
3
4
  require "spec_helper"
4
5
 
5
6
  RSpec.describe Slack::Notifier do
@@ -31,6 +32,9 @@ RSpec.describe Slack::Notifier do
31
32
  { text: "hello", channel: "hodor" } =>
32
33
  { payload: { text: "hello", channel: "hodor" } },
33
34
 
35
+ { text: nil, attachments: [{ text: "attachment message" }] } =>
36
+ { payload: { text: nil, attachments: [{ text: "attachment message" }] } },
37
+
34
38
  { text: "the message", channel: "foo", attachments: [{ color: "#000",
35
39
  text: "attachment message",
36
40
  fallback: "fallback message" }] } =>
@@ -50,9 +54,16 @@ RSpec.describe Slack::Notifier do
50
54
  { attachments: { color: "#000",
51
55
  text: "attachment message [hodor](http://winterfell.com)",
52
56
  fallback: "fallback message" } } =>
53
- { payload: { attachments: { color: "#000",
54
- text: "attachment message <http://winterfell.com|hodor>",
55
- fallback: "fallback message" } } },
57
+ { payload: { attachments: [{ color: "#000",
58
+ text: "attachment message <http://winterfell.com|hodor>",
59
+ fallback: "fallback message" }] } },
60
+
61
+ { attachments: { color: "#000",
62
+ text: nil,
63
+ fallback: "fallback message" } } =>
64
+ { payload: { attachments: [{ color: "#000",
65
+ text: nil,
66
+ fallback: "fallback message" }] } },
56
67
 
57
68
  { text: "hello", http_options: { timeout: 5 } } =>
58
69
  { http_options: { timeout: 5 }, payload: { text: "hello" } }
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  # encoding: utf-8
3
+
3
4
  require_relative "../../lib/slack-notifier"
4
5
 
5
6
  ruby = if defined?(JRUBY_VERSION)
@@ -10,5 +11,6 @@ end
10
11
  puts "testing with #{ruby}"
11
12
 
12
13
  notifier = Slack::Notifier.new ENV["SLACK_WEBHOOK_URL"], username: "notifier"
14
+ notifier.ping "hello", channel: ["#general", "#random"]
13
15
  notifier.ping "hello/こんにちは from notifier test script on #{ruby}\225"
14
16
  notifier.ping attachments: [{ color: "#1BF5AF", fallback: "fallback", text: "attachment" }]
@@ -46,17 +46,17 @@ RSpec.describe Slack::Notifier::Config do
46
46
  it "is [:format_message, :format_attachments, :at] if not set" do
47
47
  subject = described_class.new
48
48
 
49
- expect(subject.middleware).to eq [:format_message, :format_attachments, :at]
49
+ expect(subject.middleware).to eq %i[format_message format_attachments at channels]
50
50
  end
51
51
 
52
52
  it "takes an array or a splat of args" do
53
53
  subject = described_class.new
54
54
 
55
55
  subject.middleware :layer, :two
56
- expect(subject.middleware).to eq [:layer, :two]
56
+ expect(subject.middleware).to eq %i[layer two]
57
57
 
58
- subject.middleware [:one, :layer]
59
- expect(subject.middleware).to eq [:one, :layer]
58
+ subject.middleware %i[one layer]
59
+ expect(subject.middleware).to eq %i[one layer]
60
60
  end
61
61
 
62
62
  it "allows passing options to middleware stack" do
@@ -3,7 +3,7 @@
3
3
  RSpec.describe Slack::Notifier::PayloadMiddleware::At do
4
4
  it "can handle array at" do
5
5
  subject = described_class.new(:notifier)
6
- payload = { text: "hello", at: [:john, :ken, :here] }
6
+ payload = { text: "hello", at: %i[john ken here] }
7
7
 
8
8
  expect(subject.call(payload)).to eq text: "<@john> <@ken> <!here> hello"
9
9
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  RSpec.describe Slack::Notifier::PayloadMiddleware::Base do
3
4
  before(:each) do
4
5
  @registry_backup = Slack::Notifier::PayloadMiddleware.registry.dup
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Slack::Notifier::PayloadMiddleware::Channels do
4
+ it "leaves string channels alone" do
5
+ subject = described_class.new(:notifier)
6
+ payload = { text: "hello", channel: "hodor" }
7
+
8
+ expect(subject.call(payload)).to eq text: "hello", channel: "hodor"
9
+ end
10
+
11
+ it "splits payload into multiple if given an array of channels" do
12
+ subject = described_class.new(:notifier)
13
+ payload = { text: "hello", channel: %w[foo hodor] }
14
+
15
+ expect(subject.call(payload)).to eq [
16
+ { text: "hello", channel: "foo" },
17
+ { text: "hello", channel: "hodor" }
18
+ ]
19
+ end
20
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  RSpec.describe Slack::Notifier::PayloadMiddleware::FormatAttachments do
3
4
  it "passes the text of attachments through linkformatter with options[:formats]" do
4
5
  subject = described_class.new(:notifier, formats: [:html])
@@ -10,22 +11,34 @@ RSpec.describe Slack::Notifier::PayloadMiddleware::FormatAttachments do
10
11
  it "searches through string or symbol keys" do
11
12
  subject = described_class.new(:notifier)
12
13
  expect(Slack::Notifier::Util::LinkFormatter).to receive(:format)
13
- .with("hello", formats: [:html, :markdown])
14
+ .with("hello", formats: %i[html markdown])
14
15
  subject.call("attachments" => [{ "text" => "hello" }])
15
16
 
16
17
  subject = described_class.new(:notifier)
17
18
  expect(Slack::Notifier::Util::LinkFormatter).to receive(:format)
18
- .with("hello", formats: [:html, :markdown])
19
+ .with("hello", formats: %i[html markdown])
19
20
  subject.call(attachments: [{ text: "hello" }])
20
21
  end
21
22
 
22
23
  it "can handle a single attachment" do
23
24
  subject = described_class.new(:notifier)
24
25
  expect(Slack::Notifier::Util::LinkFormatter).to receive(:format)
25
- .with("hello", formats: [:html, :markdown])
26
+ .with("hello", formats: %i[html markdown])
26
27
  subject.call(attachments: { text: "hello" })
27
28
  end
28
29
 
30
+ it "wraps attachment into array if given as a single hash" do
31
+ params = {
32
+ attachments: { text: "hello" }
33
+ }
34
+ payload = {
35
+ attachments: [{ text: "hello" }]
36
+ }
37
+ subject = described_class.new(:notifier)
38
+
39
+ expect(subject.call(params)).to eq payload
40
+ end
41
+
29
42
  it "returns the payload unmodified if not :attachments key" do
30
43
  payload = { foo: :bar }
31
44
  subject = described_class.new(:notifier)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  RSpec.describe Slack::Notifier::PayloadMiddleware::FormatMessage do
3
4
  it "passes the text through linkformatter with options[:formats]" do
4
5
  subject = described_class.new(:notifier, formats: [:html])
@@ -8,7 +9,7 @@ RSpec.describe Slack::Notifier::PayloadMiddleware::FormatMessage do
8
9
 
9
10
  subject = described_class.new(:notifier)
10
11
  expect(Slack::Notifier::Util::LinkFormatter).to receive(:format)
11
- .with("hello", formats: [:html, :markdown])
12
+ .with("hello", formats: %i[html markdown])
12
13
  subject.call(text: "hello")
13
14
 
14
15
  subject = described_class.new(:notifier, formats: [:markdown])
@@ -1,9 +1,14 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  RSpec.describe Slack::Notifier::PayloadMiddleware::Stack do
3
4
  let(:return_one) do
4
5
  double(call: 1)
5
6
  end
6
7
 
8
+ let(:return_one_twice) do
9
+ double(call: [1, 1])
10
+ end
11
+
7
12
  let(:return_two) do
8
13
  double(call: 2)
9
14
  end
@@ -18,6 +23,7 @@ RSpec.describe Slack::Notifier::PayloadMiddleware::Stack do
18
23
  Slack::Notifier::PayloadMiddleware.send(:remove_instance_variable, :@registry)
19
24
 
20
25
  Slack::Notifier::PayloadMiddleware.register return_one, :return_one
26
+ Slack::Notifier::PayloadMiddleware.register return_one_twice, :return_one_twice
21
27
  Slack::Notifier::PayloadMiddleware.register return_two, :return_two
22
28
  Slack::Notifier::PayloadMiddleware.register return_three, :return_three
23
29
  end
@@ -87,7 +93,27 @@ RSpec.describe Slack::Notifier::PayloadMiddleware::Stack do
87
93
  expect(return_three).to receive(:call).with(1)
88
94
  expect(return_two).to receive(:call).with(3)
89
95
 
90
- expect(subject.call(5)).to eq 2
96
+ expect(subject.call(5)).to eq [2]
97
+ end
98
+
99
+ it "allows any middleware to return an array but other's don't need special behavior" do
100
+ allow(return_one_twice).to receive(:new).and_return(return_one_twice)
101
+ allow(return_two).to receive(:new).and_return(return_two)
102
+
103
+ subject = described_class.new(:notifier)
104
+ subject.set(:return_one_twice, :return_two)
105
+
106
+ expect(subject.call(5)).to eq [2, 2]
107
+ end
108
+
109
+ it "handles multiple middleware splitting payload" do
110
+ allow(return_one_twice).to receive(:new).and_return(return_one_twice)
111
+ allow(return_two).to receive(:new).and_return(return_two)
112
+
113
+ subject = described_class.new(:notifier)
114
+ subject.set(:return_one_twice, :return_one_twice, :return_two)
115
+
116
+ expect(subject.call(5)).to eq [2, 2, 2, 2]
91
117
  end
92
118
  end
93
119
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  RSpec.describe Slack::Notifier::PayloadMiddleware do
3
4
  before(:each) do
4
5
  @registry_backup = described_class.registry.dup
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  RSpec.describe Slack::Notifier::Util::HTTPClient do
3
4
  describe "::post" do
4
5
  it "initializes Util::HTTPClient with the given uri and params then calls" do
@@ -6,7 +7,7 @@ RSpec.describe Slack::Notifier::Util::HTTPClient do
6
7
 
7
8
  expect(described_class)
8
9
  .to receive(:new).with("uri", "params")
9
- .and_return(http_post_double)
10
+ .and_return(http_post_double)
10
11
  expect(http_post_double).to receive(:call)
11
12
 
12
13
  described_class.post "uri", "params"
@@ -1,7 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
  # encoding: utf-8
3
+
3
4
  # rubocop:disable Metrics/LineLength
4
5
  RSpec.describe Slack::Notifier::Util::LinkFormatter do
6
+ describe "initialize & formatted" do
7
+ it "can be initialized without format args" do
8
+ subject = described_class.new("Hello World")
9
+ expect(subject.formatted()).to eq("Hello World")
10
+ end
11
+
12
+ it "can be initialized with format args" do
13
+ subject = described_class.new("Hello World", formats: [:html])
14
+ expect(subject.formatted()).to eq("Hello World")
15
+ end
16
+ end
5
17
  describe "::format" do
6
18
  it "formats html links" do
7
19
  formatted = described_class.format("Hello World, enjoy <a href='http://example.com'>this</a>.")
@@ -56,7 +68,7 @@ RSpec.describe Slack::Notifier::Util::LinkFormatter do
56
68
  end
57
69
  end
58
70
 
59
- it 'doesn\'t replace valid Japanese' do
71
+ it "doesn't replace valid Japanese" do
60
72
  formatted = described_class.format("こんにちは")
61
73
  expect(formatted).to eq "こんにちは"
62
74
  end
@@ -71,6 +83,68 @@ RSpec.describe Slack::Notifier::Util::LinkFormatter do
71
83
  expect(formatted).to eq "<mailto:john@example.com|John>"
72
84
  end
73
85
 
86
+ it "handles links with trailing parentheses" do
87
+ formatted = described_class.format("Hello World, enjoy [foo(bar)](http://example.com/foo(bar))<a href='http://example.com/bar(foo)'>bar(foo)</a>")
88
+ expect(formatted).to include("http://example.com/foo(bar)|foo(bar)")
89
+ expect(formatted).to include("http://example.com/bar(foo)|bar(foo)")
90
+ end
91
+
92
+ it "formats a number of differently formatted links" do
93
+ input_output = {
94
+ "Hello World, enjoy [this](http://example.com)." =>
95
+ "Hello World, enjoy <http://example.com|this>.",
96
+
97
+ "Hello World, enjoy [[this](http://example.com) in brackets]." =>
98
+ "Hello World, enjoy [<http://example.com|this> in brackets].",
99
+
100
+ "Hello World, enjoy ([this](http://example.com) in parens)." =>
101
+ "Hello World, enjoy (<http://example.com|this> in parens).",
102
+
103
+ "Hello World, enjoy [](http://example.com)." =>
104
+ "Hello World, enjoy <http://example.com>.",
105
+
106
+ "Hello World, enjoy [link with query](http://example.com?foo=bar)." =>
107
+ "Hello World, enjoy <http://example.com?foo=bar|link with query>.",
108
+
109
+ "Hello World, enjoy [link with fragment](http://example.com/#foo-bar)." =>
110
+ "Hello World, enjoy <http://example.com/#foo-bar|link with fragment>.",
111
+
112
+ "Hello World, enjoy [link with parens](http://example.com/foo(bar)/baz)." =>
113
+ "Hello World, enjoy <http://example.com/foo(bar)/baz|link with parens>.",
114
+
115
+ "Hello World, enjoy [link with query](http://example.com/(parens)?foo=bar)." =>
116
+ "Hello World, enjoy <http://example.com/(parens)?foo=bar|link with query>.",
117
+
118
+ "Hello World, enjoy [link with parens](http://example.com/baz?bang=foo(bar))." =>
119
+ "Hello World, enjoy <http://example.com/baz?bang=foo(bar)|link with parens>.",
120
+
121
+ "Hello World, enjoy [link with fragment](http://example.com/(parens)#foo-bar)." =>
122
+ "Hello World, enjoy <http://example.com/(parens)#foo-bar|link with fragment>.",
123
+
124
+ "Hello World, enjoy [link with fragment](http://example.com/#foo-bar=(baz))." =>
125
+ "Hello World, enjoy <http://example.com/#foo-bar=(baz)|link with fragment>.",
126
+
127
+ "Hello World, enjoy [this](http://example.com?foo=bar)[this2](http://example2.com)." =>
128
+ "Hello World, enjoy <http://example.com?foo=bar|this><http://example2.com|this2>.",
129
+
130
+ "Hello World, enjoy [this](http://example.com?foo=bar) [this2](http://example2.com/#fragment)." =>
131
+ "Hello World, enjoy <http://example.com?foo=bar|this> <http://example2.com/#fragment|this2>.",
132
+
133
+ "Hello World, enjoy [this](http://example.com)<a href='http://example2.com'>this2</a>." =>
134
+ "Hello World, enjoy <http://example.com|this><http://example2.com|this2>.",
135
+
136
+ "Hello world, [John](mailto:john@example.com)." =>
137
+ "Hello world, <mailto:john@example.com|John>.",
138
+
139
+ "Hello World, enjoy [foo(bar)](http://example.com/foo(bar))<a href='http://example.com/bar(foo)'>bar(foo)</a>" =>
140
+ "Hello World, enjoy <http://example.com/foo(bar)|foo(bar)><http://example.com/bar(foo)|bar(foo)>"
141
+ }
142
+
143
+ input_output.each do |input, output|
144
+ expect(described_class.format(input)).to eq output
145
+ end
146
+ end
147
+
74
148
  context "with a configured stack" do
75
149
  it "only formats html if html is the only item in formats" do
76
150
  formatted = described_class.format("Hello World, enjoy [this](http://example.com)<a href='http://example2.com'>this2</a>.", formats: [:html])
@@ -84,14 +84,15 @@ RSpec.describe Slack::Notifier do
84
84
 
85
85
  expect(stack).to receive(:call)
86
86
  .with(channel: "default", user: "rocket")
87
- .and_return(test: "stack")
87
+ .and_return([test: "stack"])
88
88
 
89
89
  expect(mock_http).to receive(:post).with(
90
90
  URI.parse("http://example.com"),
91
91
  payload: '{"test":"stack"}'
92
92
  )
93
93
 
94
- subject.post
94
+ responses = subject.post
95
+ expect(responses).to eq([:posted])
95
96
  end
96
97
  end
97
98
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack-notifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Sloan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-29 00:00:00.000000000 Z
11
+ date: 2021-05-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: " A slim ruby wrapper for posting to slack webhooks "
14
14
  email:
@@ -22,6 +22,7 @@ files:
22
22
  - lib/slack-notifier/payload_middleware.rb
23
23
  - lib/slack-notifier/payload_middleware/at.rb
24
24
  - lib/slack-notifier/payload_middleware/base.rb
25
+ - lib/slack-notifier/payload_middleware/channels.rb
25
26
  - lib/slack-notifier/payload_middleware/format_attachments.rb
26
27
  - lib/slack-notifier/payload_middleware/format_message.rb
27
28
  - lib/slack-notifier/payload_middleware/stack.rb
@@ -34,6 +35,7 @@ files:
34
35
  - spec/lib/slack-notifier/config_spec.rb
35
36
  - spec/lib/slack-notifier/payload_middleware/at_spec.rb
36
37
  - spec/lib/slack-notifier/payload_middleware/base_spec.rb
38
+ - spec/lib/slack-notifier/payload_middleware/channels_spec.rb
37
39
  - spec/lib/slack-notifier/payload_middleware/format_attachments_spec.rb
38
40
  - spec/lib/slack-notifier/payload_middleware/format_message_spec.rb
39
41
  - spec/lib/slack-notifier/payload_middleware/stack_spec.rb
@@ -46,7 +48,7 @@ homepage: http://github.com/stevenosloan/slack-notifier
46
48
  licenses:
47
49
  - MIT
48
50
  metadata: {}
49
- post_install_message:
51
+ post_install_message:
50
52
  rdoc_options: []
51
53
  require_paths:
52
54
  - lib
@@ -61,9 +63,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
63
  - !ruby/object:Gem::Version
62
64
  version: '0'
63
65
  requirements: []
64
- rubyforge_project:
65
- rubygems_version: 2.5.2
66
- signing_key:
66
+ rubygems_version: 3.2.15
67
+ signing_key:
67
68
  specification_version: 4
68
69
  summary: A slim ruby wrapper for posting to slack webhooks
69
70
  test_files:
@@ -72,6 +73,7 @@ test_files:
72
73
  - spec/lib/slack-notifier/config_spec.rb
73
74
  - spec/lib/slack-notifier/payload_middleware/at_spec.rb
74
75
  - spec/lib/slack-notifier/payload_middleware/base_spec.rb
76
+ - spec/lib/slack-notifier/payload_middleware/channels_spec.rb
75
77
  - spec/lib/slack-notifier/payload_middleware/format_attachments_spec.rb
76
78
  - spec/lib/slack-notifier/payload_middleware/format_message_spec.rb
77
79
  - spec/lib/slack-notifier/payload_middleware/stack_spec.rb