fastlane-plugin-slack_bot 0.4.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/fastlane/plugin/slack_bot/actions/post_to_slack.rb +4 -4
- data/lib/fastlane/plugin/slack_bot/actions/update_slack_message.rb +4 -4
- data/lib/fastlane/plugin/slack_bot/helper/slack_bot_attachments_helper.rb +113 -0
- data/lib/fastlane/plugin/slack_bot/helper/slack_bot_link_formatter_helper.rb +82 -0
- data/lib/fastlane/plugin/slack_bot/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 289a56616a3791c91d4aa9033fe725da23f086ba112f63f383617de611824aa9
|
4
|
+
data.tar.gz: 406ed9f6c5809ed39b6ea2024f9c998409bcb11711616006714fdfef28063441
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 821fbff8025635a8c8728e40ceccc52f54db653fc2aaa4ddeed6d7bb5aaec10d78798b19a88282c44ba8168fb0342da8804030bbbf715299827e0b38aca60f9e
|
7
|
+
data.tar.gz: d9bd6cc8c9aa8d0dd1704ddd583735f3400a38d2ac440b0a61ff63aa586b079d3b93b75d5f5770f28e523ef097abeaf4142b56ceaefaf77e1f08d0e99e959b2c
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
![![License]](https://img.shields.io/badge/license-MIT-green.svg?style=flat)
|
5
5
|
[![Gem Version](https://badge.fury.io/rb/fastlane-plugin-slack_bot.svg)](https://badge.fury.io/rb/fastlane-plugin-slack_bot)
|
6
6
|
![![RubyGem Download Badge]](https://ruby-gem-downloads-badge.herokuapp.com/fastlane-plugin-slack_bot?type=total)
|
7
|
-
[![Twitter: @manish](https://img.shields.io/badge/contact-@manish-blue.svg?style=flat)](https://twitter.com/
|
7
|
+
[![Twitter: @manish](https://img.shields.io/badge/contact-@manish-blue.svg?style=flat)](https://twitter.com/iammanishrathi)
|
8
8
|
|
9
9
|
A fastlane plugin to customize your automation workflow(s) with a **Slack Bot** 🤖 using the [Slack APIs](https://api.slack.com/)
|
10
10
|
|
@@ -175,7 +175,7 @@ Let’s post a message with custom slack bot username and icon
|
|
175
175
|
# share on Slack
|
176
176
|
post_to_slack(
|
177
177
|
message: "App successfully released!",
|
178
|
-
username: "Release Bot", # Overrides the bot's
|
178
|
+
username: "Release Bot", # Overrides the bot's username
|
179
179
|
icon_url: "https://fastlane.tools/assets/img/fastlane_icon.png" # Overrides the bot's icon
|
180
180
|
)
|
181
181
|
```
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'fastlane/action'
|
2
2
|
require_relative '../helper/slack_bot_helper'
|
3
|
+
require_relative '../helper/slack_bot_attachments_helper'
|
4
|
+
require_relative '../helper/slack_bot_link_formatter_helper'
|
3
5
|
|
4
6
|
module Fastlane
|
5
7
|
module Actions
|
@@ -9,10 +11,8 @@ module Fastlane
|
|
9
11
|
|
10
12
|
class PostToSlackAction < Action
|
11
13
|
def self.run(options)
|
12
|
-
require 'slack-notifier'
|
13
|
-
|
14
14
|
options[:message] = (options[:message].to_s || '').gsub('\n', "\n")
|
15
|
-
options[:message] =
|
15
|
+
options[:message] = Helper::SlackBotLinkFormatterHelper.format(options[:message])
|
16
16
|
options[:pretext] = options[:pretext].gsub('\n', "\n") unless options[:pretext].nil?
|
17
17
|
|
18
18
|
if options[:channel].to_s.length > 0
|
@@ -20,7 +20,7 @@ module Fastlane
|
|
20
20
|
slack_channel = ('#' + options[:channel]) unless ['#', 'C', '@'].include?(slack_channel[0]) # Add prefix(#) by default, if needed
|
21
21
|
end
|
22
22
|
|
23
|
-
slack_attachment =
|
23
|
+
slack_attachment = Helper::SlackBotAttachmentsHelper.generate_slack_attachments(options)
|
24
24
|
bot_username = options[:username]
|
25
25
|
bot_icon_url = options[:icon_url]
|
26
26
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'fastlane/action'
|
2
2
|
require_relative '../helper/slack_bot_helper'
|
3
|
+
require_relative '../helper/slack_bot_attachments_helper'
|
4
|
+
require_relative '../helper/slack_bot_link_formatter_helper'
|
3
5
|
|
4
6
|
module Fastlane
|
5
7
|
module Actions
|
@@ -8,12 +10,10 @@ module Fastlane
|
|
8
10
|
end
|
9
11
|
class UpdateSlackMessageAction < Action
|
10
12
|
def self.run(options)
|
11
|
-
require 'slack-notifier'
|
12
|
-
|
13
13
|
options[:message] = (options[:message].to_s || '').gsub('\n', "\n")
|
14
|
-
options[:message] =
|
14
|
+
options[:message] = Helper::SlackBotLinkFormatterHelper.format(options[:message])
|
15
15
|
options[:pretext] = options[:pretext].gsub('\n', "\n") unless options[:pretext].nil?
|
16
|
-
slack_attachment =
|
16
|
+
slack_attachment = Helper::SlackBotAttachmentsHelper.generate_slack_attachments(options)
|
17
17
|
|
18
18
|
begin
|
19
19
|
require 'excon'
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'fastlane_core/ui/ui'
|
2
|
+
require 'fastlane_core/env'
|
3
|
+
require_relative 'slack_bot_link_formatter_helper'
|
4
|
+
|
5
|
+
module Fastlane
|
6
|
+
UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
|
7
|
+
|
8
|
+
module Helper
|
9
|
+
class SlackBotAttachmentsHelper
|
10
|
+
# class methods that you define here become available in your action
|
11
|
+
# as `Helper::SlackBotAttachmentsHelper.your_method`
|
12
|
+
#
|
13
|
+
def self.show_message
|
14
|
+
UI.message("Hello from the slack_bot plugin attachments helper!")
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.generate_slack_attachments(options)
|
18
|
+
color = (options[:success] ? 'good' : 'danger')
|
19
|
+
should_add_payload = ->(payload_name) { options[:default_payloads].map(&:to_sym).include?(payload_name.to_sym) }
|
20
|
+
|
21
|
+
slack_attachment = {
|
22
|
+
fallback: options[:message],
|
23
|
+
text: options[:message],
|
24
|
+
pretext: options[:pretext],
|
25
|
+
color: color,
|
26
|
+
mrkdwn_in: ["pretext", "text", "fields", "message"],
|
27
|
+
fields: []
|
28
|
+
}
|
29
|
+
|
30
|
+
# custom user payloads
|
31
|
+
slack_attachment[:fields] += options[:payload].map do |k, v|
|
32
|
+
{
|
33
|
+
title: k.to_s,
|
34
|
+
value: SlackBotLinkFormatterHelper.format(v.to_s),
|
35
|
+
short: false
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
# Add the lane to the Slack message
|
40
|
+
# This might be nil, if slack is called as "one-off" action
|
41
|
+
if should_add_payload[:lane] && Actions.lane_context[Actions::SharedValues::LANE_NAME]
|
42
|
+
slack_attachment[:fields] << {
|
43
|
+
title: 'Lane',
|
44
|
+
value: Actions.lane_context[Actions::SharedValues::LANE_NAME],
|
45
|
+
short: true
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
# test_result
|
50
|
+
if should_add_payload[:test_result]
|
51
|
+
slack_attachment[:fields] << {
|
52
|
+
title: 'Result',
|
53
|
+
value: (options[:success] ? 'Success' : 'Error'),
|
54
|
+
short: true
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
# git branch
|
59
|
+
if Actions.git_branch && should_add_payload[:git_branch]
|
60
|
+
slack_attachment[:fields] << {
|
61
|
+
title: 'Git Branch',
|
62
|
+
value: Actions.git_branch,
|
63
|
+
short: true
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
# git_author
|
68
|
+
if Actions.git_author_email && should_add_payload[:git_author]
|
69
|
+
if FastlaneCore::Env.truthy?('FASTLANE_SLACK_HIDE_AUTHOR_ON_SUCCESS') && options[:success]
|
70
|
+
# We only show the git author if the build failed
|
71
|
+
else
|
72
|
+
slack_attachment[:fields] << {
|
73
|
+
title: 'Git Author',
|
74
|
+
value: Actions.git_author_email,
|
75
|
+
short: true
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# last_git_commit
|
81
|
+
if Actions.last_git_commit_message && should_add_payload[:last_git_commit]
|
82
|
+
slack_attachment[:fields] << {
|
83
|
+
title: 'Git Commit',
|
84
|
+
value: Actions.last_git_commit_message,
|
85
|
+
short: false
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
# last_git_commit_hash
|
90
|
+
if Actions.last_git_commit_hash(true) && should_add_payload[:last_git_commit_hash]
|
91
|
+
slack_attachment[:fields] << {
|
92
|
+
title: 'Git Commit Hash',
|
93
|
+
value: Actions.last_git_commit_hash(short: true),
|
94
|
+
short: false
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
# merge additional properties
|
99
|
+
deep_merge(slack_attachment, options[:attachment_properties])
|
100
|
+
end
|
101
|
+
|
102
|
+
# Adapted from https://stackoverflow.com/a/30225093/158525
|
103
|
+
def self.deep_merge(a, b)
|
104
|
+
merger = proc do |key, v1, v2|
|
105
|
+
Hash === v1 && Hash === v2 ?
|
106
|
+
v1.merge(v2, &merger) : Array === v1 && Array === v2 ?
|
107
|
+
v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2
|
108
|
+
end
|
109
|
+
a.merge(b, &merger)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'fastlane_core/ui/ui'
|
2
|
+
|
3
|
+
module Fastlane
|
4
|
+
UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
|
5
|
+
|
6
|
+
module Helper
|
7
|
+
# Fastlane is moving away 'slack-notifier' gem, https://github.com/fastlane/fastlane/pull/18512
|
8
|
+
# Duplicate of: https://github.com/stevenosloan/slack-notifier/blob/master/lib/slack-notifier/util/link_formatter.rb
|
9
|
+
class SlackBotLinkFormatterHelper
|
10
|
+
# http://rubular.com/r/19cNXW5qbH
|
11
|
+
HTML_PATTERN = %r{
|
12
|
+
<a
|
13
|
+
(?:.*?)
|
14
|
+
href=['"](.+?)['"]
|
15
|
+
(?:.*?)>
|
16
|
+
(.+?)
|
17
|
+
</a>
|
18
|
+
}x
|
19
|
+
|
20
|
+
# the path portion of a url can contain these characters
|
21
|
+
VALID_PATH_CHARS = '\w\-\.\~\/\?\#\='
|
22
|
+
|
23
|
+
# Attempt at only matching pairs of parens per
|
24
|
+
# the markdown spec http://spec.commonmark.org/0.27/#links
|
25
|
+
#
|
26
|
+
# http://rubular.com/r/y107aevxqT
|
27
|
+
MARKDOWN_PATTERN = %r{
|
28
|
+
\[ ([^\[\]]*?) \]
|
29
|
+
\( ((https?://.*?) | (mailto:.*?)) \)
|
30
|
+
(?! [#{VALID_PATH_CHARS}]* \) )
|
31
|
+
}x
|
32
|
+
|
33
|
+
class << self
|
34
|
+
def format string, opts={}
|
35
|
+
SlackBotLinkFormatterHelper.new(string, opts).formatted
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader :formats
|
40
|
+
|
41
|
+
def initialize string, formats: %i[html markdown]
|
42
|
+
@formats = formats
|
43
|
+
@orig = string.respond_to?(:scrub) ? string.scrub : string
|
44
|
+
end
|
45
|
+
|
46
|
+
# rubocop:disable Lint/RescueWithoutErrorClass
|
47
|
+
def formatted
|
48
|
+
return @orig unless @orig.respond_to?(:gsub)
|
49
|
+
|
50
|
+
sub_markdown_links(sub_html_links(@orig))
|
51
|
+
rescue => e
|
52
|
+
raise e unless RUBY_VERSION < "2.1" && e.message.include?("invalid byte sequence")
|
53
|
+
raise e, "#{e.message}. Consider including the 'string-scrub' gem to strip invalid characters"
|
54
|
+
end
|
55
|
+
# rubocop:enable Lint/RescueWithoutErrorClass
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def sub_html_links string
|
60
|
+
return string unless formats.include?(:html)
|
61
|
+
|
62
|
+
string.gsub(HTML_PATTERN) do
|
63
|
+
slack_link Regexp.last_match[1], Regexp.last_match[2]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def sub_markdown_links string
|
68
|
+
return string unless formats.include?(:markdown)
|
69
|
+
|
70
|
+
string.gsub(MARKDOWN_PATTERN) do
|
71
|
+
slack_link Regexp.last_match[2], Regexp.last_match[1]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def slack_link link, text=nil
|
76
|
+
"<#{link}" \
|
77
|
+
"#{text && !text.empty? ? "|#{text}" : ''}" \
|
78
|
+
">"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-slack_bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manish Rathi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -149,7 +149,9 @@ files:
|
|
149
149
|
- lib/fastlane/plugin/slack_bot/actions/file_upload_to_slack.rb
|
150
150
|
- lib/fastlane/plugin/slack_bot/actions/post_to_slack.rb
|
151
151
|
- lib/fastlane/plugin/slack_bot/actions/update_slack_message.rb
|
152
|
+
- lib/fastlane/plugin/slack_bot/helper/slack_bot_attachments_helper.rb
|
152
153
|
- lib/fastlane/plugin/slack_bot/helper/slack_bot_helper.rb
|
154
|
+
- lib/fastlane/plugin/slack_bot/helper/slack_bot_link_formatter_helper.rb
|
153
155
|
- lib/fastlane/plugin/slack_bot/version.rb
|
154
156
|
homepage: https://github.com/crazymanish/fastlane-plugin-slack_bot
|
155
157
|
licenses:
|