lita-github-pinger 0.4.7 → 0.4.8
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/lib/lita/handlers/github_pinger.rb +99 -50
- data/lita-github-pinger.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9a67b40aebdeb0cbae576e8296372045398781a
|
4
|
+
data.tar.gz: d3876e419ef7b89c484b816fdaa69947ab305798
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c16766a54c0d03486eaba195ee8d8b8107c9a3b7a7498db7b5c936cafb449d8fcf50d4e3b4dc7feecd68a6b78afd49bec125ffe69bdf6dc4c61700add8c29d70
|
7
|
+
data.tar.gz: 353f04a1c4bed25bf0856ce3f487a657e3e4d2dbabcf15d3754d733b9571162beda7f90a5a1167cf983253d81e15eba3a289bc59cb12bf412b899bf8af3efb94
|
@@ -2,79 +2,128 @@ module Lita
|
|
2
2
|
module Handlers
|
3
3
|
class GithubPinger < Handler
|
4
4
|
|
5
|
+
####
|
6
|
+
# ENGINEER NOTIFICATION PREFERENCES
|
7
|
+
####
|
8
|
+
|
9
|
+
# example entry: {
|
10
|
+
# :slack => "taylor"
|
11
|
+
# :github => "taylorlapeyre"
|
12
|
+
# :frequency => "only_mentions"
|
13
|
+
# :ping_location => "dm"
|
14
|
+
#}
|
15
|
+
#
|
16
|
+
# :ping_location can be...
|
17
|
+
# - "dm"
|
18
|
+
# - "eng-pr" (pings you in #eng-pr)
|
19
|
+
# default: "dm"
|
20
|
+
#
|
21
|
+
# :frequency can be
|
22
|
+
# - "all_discussion" (pings you about any comments on your PRs and @mentions)
|
23
|
+
# - "only_mentions" (will only ping you when you are explicitly @mentioned)
|
24
|
+
# - "off"
|
25
|
+
# default: "all_discussion"
|
5
26
|
config :engineers, type: Array, required: true
|
6
27
|
|
7
28
|
http.post("/ghping", :ghping)
|
8
29
|
|
9
30
|
def ghping(request, response)
|
10
31
|
puts "########## New GH PR Event! ##########"
|
11
|
-
|
12
32
|
body = MultiJson.load(request.body)
|
33
|
+
|
13
34
|
if body["comment"]
|
14
|
-
|
35
|
+
act_on_comment(body, response)
|
36
|
+
end
|
15
37
|
|
16
|
-
|
17
|
-
|
18
|
-
|
38
|
+
if body["action"] && body["action"] == "assigned"
|
39
|
+
act_on_assign(body, response)
|
40
|
+
end
|
41
|
+
end
|
19
42
|
|
20
|
-
|
21
|
-
|
43
|
+
def act_on_assign(body, response)
|
44
|
+
puts "Detected that someone got assigned to a pull request."
|
45
|
+
assignee = find_engineer(github: body["pull_request"]["assignee"])
|
46
|
+
assigner = find_engineer(github: body["pull_request"]["user"]["login"])
|
22
47
|
|
23
|
-
|
24
|
-
|
25
|
-
puts "Found pr owner #{pr_owner}"
|
48
|
+
puts "#{assignee} determined as the assignee."
|
49
|
+
puts "#{assigner} determined as assigner."
|
26
50
|
|
27
|
-
|
28
|
-
|
29
|
-
# commenting on his own PR
|
51
|
+
pr_url = body["pull_request"]["html_url"]
|
52
|
+
message = "*Heads up!* #{pr_owner[:slack]} has assigned you to review their pull request:\n#{pr_url}"
|
30
53
|
|
31
|
-
|
32
|
-
|
33
|
-
puts "Therefore, adding the PR owner to list of engineers to ping."
|
34
|
-
engineers_to_ping << pr_owner
|
35
|
-
end
|
54
|
+
puts "Sending DM to #{assignee}..."
|
55
|
+
send_dm(assignee[:slack], message)
|
36
56
|
|
37
|
-
|
38
|
-
|
39
|
-
puts "Found @mentions in the body of the comment! Extracting usernames... "
|
57
|
+
response
|
58
|
+
end
|
40
59
|
|
41
|
-
|
42
|
-
|
60
|
+
def act_on_comment(request, response)
|
61
|
+
puts "Detected a comment. Extracting data... "
|
43
62
|
|
44
|
-
|
45
|
-
|
63
|
+
comment_url = body["comment"]["html_url"]
|
64
|
+
comment = body["comment"]["body"]
|
65
|
+
context = body["pull_request"] || body["issue"]
|
46
66
|
|
47
|
-
|
67
|
+
commenter = find_engineer(github: body["comment"]["user"]["login"])
|
68
|
+
pr_owner = find_engineer(github: context["user"]["login"])
|
48
69
|
|
49
|
-
|
70
|
+
puts "Reacting to PR comment #{comment_url}"
|
71
|
+
puts "Found commenter #{commenter}"
|
72
|
+
puts "Found pr owner #{pr_owner}"
|
50
73
|
|
51
|
-
|
52
|
-
|
53
|
-
end
|
74
|
+
# Sanity Checks - might be a new engineer around that hasn't set up
|
75
|
+
# their config.
|
54
76
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
puts "looking at #{engineer}'s preferences..'"
|
59
|
-
next if engineer[:frequency] == "off"
|
60
|
-
|
61
|
-
case engineer[:ping_location]
|
62
|
-
when "dm", nil
|
63
|
-
puts "Preference was either 'dm' or nil, so sending DM."
|
64
|
-
private_message = "New PR comment from @#{commenter[:slack]}:\n"
|
65
|
-
private_message += "#{comment_url}\n#{comment}"
|
66
|
-
send_dm(engineer[:slack], private_message)
|
67
|
-
when "eng-pr", "eng_pr"
|
68
|
-
puts "Preference was either 'eng-pr' or 'eng_pr', so alerting #eng-pr."
|
69
|
-
public_message = "@#{engineer[:slack]}, new PR mention: "
|
70
|
-
public_message += "#{comment_url}\n#{comment}"
|
71
|
-
alert_eng_pr(public_message)
|
72
|
-
end
|
73
|
-
end
|
77
|
+
engineers_to_ping = []
|
78
|
+
# automatically include the creator of the PR, unless he's
|
79
|
+
# commenting on his own PR
|
74
80
|
|
75
|
-
|
81
|
+
if commenter != pr_owner && ["all_discussion", nil].include?(pr_owner[:frequency])
|
82
|
+
puts "PR owner was not the commenter, and has a :frequency of 'all_discussion' or nil"
|
83
|
+
puts "Therefore, adding the PR owner to list of engineers to ping."
|
84
|
+
engineers_to_ping << pr_owner
|
76
85
|
end
|
77
86
|
|
87
|
+
# Is anyone mentioned in this comment?
|
88
|
+
if comment.include?("@")
|
89
|
+
puts "Found @mentions in the body of the comment! Extracting usernames... "
|
90
|
+
|
91
|
+
# get each @mentioned engineer in the comment
|
92
|
+
mentions = comment.split("@")[1..-1].map { |snip| snip.split(" ").first }
|
93
|
+
|
94
|
+
puts "Done. Got #{mentions}"
|
95
|
+
puts "Converting usernames to engineers..."
|
96
|
+
|
97
|
+
mentioned_engineers = mentions.map { |username| find_engineer(github: username) }
|
98
|
+
|
99
|
+
puts "Done. Got #{mentioned_engineers}"
|
100
|
+
|
101
|
+
# add them to the list of usernames to ping
|
102
|
+
engineers_to_ping = engineers_to_ping.concat(mentioned_engineers).uniq.compact
|
103
|
+
end
|
104
|
+
|
105
|
+
puts "New list of engineers to ping: #{engineers_to_ping}."
|
106
|
+
puts "Starting pinging process for each engineer..."
|
107
|
+
engineers_to_ping.each do |engineer|
|
108
|
+
puts "looking at #{engineer}'s preferences..'"
|
109
|
+
next if engineer[:frequency] == "off"
|
110
|
+
|
111
|
+
case engineer[:ping_location]
|
112
|
+
when "dm", nil
|
113
|
+
puts "Preference was either 'dm' or nil, so sending DM."
|
114
|
+
private_message = "New PR comment from @#{commenter[:slack]}:\n"
|
115
|
+
private_message += "#{comment_url}\n#{comment}"
|
116
|
+
send_dm(engineer[:slack], private_message)
|
117
|
+
when "eng-pr", "eng_pr"
|
118
|
+
puts "Preference was either 'eng-pr' or 'eng_pr', so alerting #eng-pr."
|
119
|
+
public_message = "@#{engineer[:slack]}, new PR mention: "
|
120
|
+
public_message += "#{comment_url}\n#{comment}"
|
121
|
+
alert_eng_pr(public_message)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
puts "GitHub Hook successfully processed."
|
126
|
+
|
78
127
|
response
|
79
128
|
end
|
80
129
|
|
data/lita-github-pinger.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "lita-github-pinger"
|
3
|
-
spec.version = "0.4.
|
3
|
+
spec.version = "0.4.8"
|
4
4
|
spec.authors = ["Taylor Lapeyre"]
|
5
5
|
spec.email = ["taylorlapeyre@gmail.com"]
|
6
6
|
spec.description = "A Lita handler that detects github comment notifications and regurgitates a ping to the correct slack username."
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-github-pinger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taylor Lapeyre
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|