tokite 0.2.1 → 0.3.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/README.md +7 -5
- data/app/jobs/tokite/notify_github_hook_event_job.rb +4 -0
- data/app/models/tokite/hook.rb +2 -0
- data/app/models/tokite/hook_event/pull_request_review.rb +54 -0
- data/app/models/tokite/hook_event/pull_request_review_comment.rb +35 -0
- data/app/models/tokite/rule.rb +2 -1
- data/app/models/tokite/search_query.rb +6 -4
- data/app/views/tokite/rules/_form.html.haml +13 -6
- data/config/initializers/slack_notifier.rb +7 -1
- data/lib/tasks/tokite.rake +3 -5
- data/lib/tokite/exception_logger.rb +15 -0
- data/lib/tokite/version.rb +1 -1
- data/schema/Schemafile +3 -0
- data/schema/tokite_repositories.schema +7 -0
- data/schema/tokite_rules.schema +12 -0
- data/schema/tokite_secure_user_tokens.schema +8 -0
- data/schema/tokite_users.schema +10 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61507370f117a063a32e900733d2aed4110f03db
|
4
|
+
data.tar.gz: 28fa71535585bcb3e540242c9129587997f5bacf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4f6e950763b194f47a781d8fd90aaa31f17a0e06eb19253daf73841c53286f457ba26d98e4f77acec4775a15c5a7e89c2b030074a5fb0fbf44e25a55f3a2c14
|
7
|
+
data.tar.gz: 7bae44d0e99c447ab6e02d1054a025176a858fcab9aab169eecf2c86294931df30a968d7391961141360085f11f456fb14989fffa4b3fa07b6cb5eb1d0b8e9e3
|
data/README.md
CHANGED
@@ -57,9 +57,10 @@ Tokite support only below events now.
|
|
57
57
|
|
58
58
|
<table>
|
59
59
|
<tr><th>Name</th><th>Example</th></tr>
|
60
|
-
<tr><td>Plain
|
61
|
-
<tr><td>Quoted
|
62
|
-
<tr><td>Regular expression</td><td>/hoge|fuga|moge/</td></tr>
|
60
|
+
<tr><td>Plain word</td><td>hoge fuga moge</td></tr>
|
61
|
+
<tr><td>Quoted word</td><td>"hoge fuga moge"</td></tr>
|
62
|
+
<tr><td>Regular expression word</td><td>/hoge|fuga|moge/</td></tr>
|
63
|
+
<tr><td>Exclude word</td><td> -/(hoge|fuga|moge)/ -user:hogelog</td></tr>
|
63
64
|
</table>
|
64
65
|
|
65
66
|
### Supported query field
|
@@ -68,8 +69,9 @@ Tokite support only below events now.
|
|
68
69
|
<tr><th>Name</th><th>Description</th><th>Example</th></tr>
|
69
70
|
<tr><td>repo:</td><td>Match repository name.</td><td>repo:hogelog/tokite</td></tr>
|
70
71
|
<tr><td>title:</td><td>Match pull_request or issues title.</td><td>title:Bug</td></tr>
|
71
|
-
<tr><td>event:</td><td>Match event type pull_request, issues
|
72
|
+
<tr><td>event:</td><td>Match event type pull_request, issues, issue_comment, pull_request_review, pull_request_review_comment.</td><td>event:/pull_request|issues|pull_request_review|pull_request_review_comment/</td></tr>
|
72
73
|
<tr><td>body:</td><td>Match body text.</td><td>body:"review please"</td></tr>
|
73
74
|
<tr><td>user:</td><td>Match user name.</td><td>user:hogelog</td></tr>
|
74
|
-
<tr><td>
|
75
|
+
<tr><td>review_state:</td><td>Match pull_request_review state.</td><td>review_state:/commented|approved|changes_requested/</td></tr>
|
76
|
+
<tr><td>unspecified</td><td>Match title or body field.</td><td>review please</td></tr>
|
75
77
|
</table>
|
@@ -1,9 +1,13 @@
|
|
1
|
+
require "tokite/exception_logger"
|
2
|
+
|
1
3
|
module Tokite
|
2
4
|
class NotifyGithubHookEventJob < ApplicationJob
|
3
5
|
queue_as :default
|
4
6
|
|
5
7
|
def perform(payload)
|
6
8
|
Rails.application.config.slack_notifier.ping(payload)
|
9
|
+
rescue Slack::Notifier::APIError => e
|
10
|
+
ExceptionLogger.log(e, level: :warn)
|
7
11
|
end
|
8
12
|
end
|
9
13
|
end
|
data/app/models/tokite/hook.rb
CHANGED
@@ -6,6 +6,8 @@ module Tokite
|
|
6
6
|
"pull_request" => HookEvent::PullRequest,
|
7
7
|
"issues" => HookEvent::Issues,
|
8
8
|
"issue_comment" => HookEvent::IssueComment,
|
9
|
+
"pull_request_review" => HookEvent::PullRequestReview,
|
10
|
+
"pull_request_review_comment" => HookEvent::PullRequestReviewComment,
|
9
11
|
}.freeze
|
10
12
|
|
11
13
|
def self.fire!(github_event, hook_params)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Tokite
|
2
|
+
module HookEvent
|
3
|
+
class PullRequestReview < BaseEvent
|
4
|
+
def fields
|
5
|
+
{
|
6
|
+
event: "pull_request_review",
|
7
|
+
repo: hook_params[:repository][:full_name],
|
8
|
+
body: hook_params[:review][:body],
|
9
|
+
user: hook_params[:review][:user][:login],
|
10
|
+
review_state: hook_params[:review][:state],
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def notify?
|
15
|
+
return false unless hook_params[:action] == "submitted"
|
16
|
+
if hook_params[:review][:state] == "commented"
|
17
|
+
hook_params[:review][:body]
|
18
|
+
else
|
19
|
+
true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def slack_text
|
24
|
+
repo = "<#{hook_params[:repository][:html_url]}|[#{hook_params[:repository][:full_name]}]>"
|
25
|
+
user = "<#{hook_params[:review][:user][:html_url]}|#{hook_params[:review][:user][:login]}>"
|
26
|
+
title = "<#{hook_params[:pull_request][:html_url]}|##{hook_params[:pull_request][:number]} #{hook_params[:pull_request][:title]}>"
|
27
|
+
case hook_params[:review][:state]
|
28
|
+
when "commented"
|
29
|
+
"#{repo} New comment by #{user} on pull request #{title}"
|
30
|
+
when "approved"
|
31
|
+
"#{repo} #{user} approved #{title}"
|
32
|
+
when "changes_requested"
|
33
|
+
"#{repo} #{user} requested changes #{title}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def slack_attachment
|
38
|
+
return unless hook_params[:review][:body]
|
39
|
+
case hook_params[:review][:state]
|
40
|
+
when "commented"
|
41
|
+
when "approved"
|
42
|
+
color = "good"
|
43
|
+
when "changes_requested"
|
44
|
+
color = "warning"
|
45
|
+
end
|
46
|
+
{
|
47
|
+
fallback: hook_params[:review][:body],
|
48
|
+
text: hook_params[:review][:body],
|
49
|
+
color: color,
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Tokite
|
2
|
+
module HookEvent
|
3
|
+
class PullRequestReviewComment < BaseEvent
|
4
|
+
def fields
|
5
|
+
{
|
6
|
+
event: "pull_request_review_comment",
|
7
|
+
repo: hook_params[:repository][:full_name],
|
8
|
+
body: hook_params[:comment][:body],
|
9
|
+
user: hook_params[:comment][:user][:login],
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def notify?
|
14
|
+
hook_params[:action] == "created"
|
15
|
+
end
|
16
|
+
|
17
|
+
def slack_text
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def slack_attachment
|
22
|
+
user = hook_params[:comment][:user][:login]
|
23
|
+
line = hook_params[:comment][:position]
|
24
|
+
path = hook_params[:comment][:path]
|
25
|
+
footer_url = hook_params[:comment][:html_url]
|
26
|
+
footer_text = "Comment by #{user} on line #{line} of #{path}"
|
27
|
+
{
|
28
|
+
fallback: "#{hook_params[:comment][:body]}\n#{footer_text}",
|
29
|
+
text: hook_params[:comment][:body],
|
30
|
+
footer: "<#{footer_url}|#{footer_text}>"
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/app/models/tokite/rule.rb
CHANGED
@@ -22,10 +22,11 @@ module Tokite
|
|
22
22
|
rule(:regexp_word) { slash >> regexp_char.repeat(1).as(:regexp_word) >> slash }
|
23
23
|
rule(:quot_word) { quot >> quoted_char.repeat(1).as(:word) >> quot }
|
24
24
|
rule(:plain_word) { (match('[^\s/"]') >> match('[^\s]').repeat).as(:word) }
|
25
|
+
rule(:exclude) { match('-').as(:exclude) }
|
25
26
|
rule(:field) { match('\w').repeat(1).as(:field) }
|
26
|
-
rule(:word) { (field >> str(':') >> space?).maybe >> (regexp_word | quot_word | plain_word) }
|
27
|
+
rule(:word) { exclude.maybe >> (field >> str(':') >> space?).maybe >> (regexp_word | quot_word | plain_word) }
|
27
28
|
|
28
|
-
rule(:query) { word >> (space >> word).repeat }
|
29
|
+
rule(:query) { space? >> word >> (space >> word).repeat >> space? }
|
29
30
|
root :query
|
30
31
|
end
|
31
32
|
|
@@ -54,11 +55,12 @@ module Tokite
|
|
54
55
|
end
|
55
56
|
if word[:regexp_word]
|
56
57
|
regexp = Regexp.compile(word[:regexp_word].to_s, Regexp::IGNORECASE)
|
57
|
-
targets.any?{|text| regexp.match?(text) }
|
58
|
+
matched = targets.any?{|text| regexp.match?(text) }
|
58
59
|
else
|
59
60
|
value = word[:word].to_s.downcase
|
60
|
-
targets.any?{|text| text.index(value) }
|
61
|
+
matched = targets.any?{|text| text.index(value) }
|
61
62
|
end
|
63
|
+
word[:exclude].present? ? !matched : matched
|
62
64
|
end
|
63
65
|
end
|
64
66
|
end
|
@@ -20,14 +20,17 @@
|
|
20
20
|
%th Name
|
21
21
|
%th Example
|
22
22
|
%tr
|
23
|
-
%td Plain
|
23
|
+
%td Plain word
|
24
24
|
%td hoge fuga moge
|
25
25
|
%tr
|
26
|
-
%td Quoted
|
26
|
+
%td Quoted word
|
27
27
|
%td "hoge fuga moge"
|
28
28
|
%tr
|
29
|
-
%td Regular expression
|
29
|
+
%td Regular expression word
|
30
30
|
%td /(hoge|fuga|moge)/
|
31
|
+
%tr
|
32
|
+
%td Exclude word
|
33
|
+
%td -/(hoge|fuga|moge)/ -user:hogelog
|
31
34
|
|
32
35
|
%h2 Supported query field
|
33
36
|
%table.table.is-bordered
|
@@ -45,8 +48,8 @@
|
|
45
48
|
%td title:Bug
|
46
49
|
%tr
|
47
50
|
%td event:
|
48
|
-
%td Match event type pull_request, issues
|
49
|
-
%td event:/
|
51
|
+
%td Match event type pull_request, issues, issue_comment, pull_request_review, pull_request_review_comment.
|
52
|
+
%td event:/pull_request|issues|pull_request_review|pull_request_review_comment/
|
50
53
|
%tr
|
51
54
|
%td body:
|
52
55
|
%td Match body text.
|
@@ -55,7 +58,11 @@
|
|
55
58
|
%td user:
|
56
59
|
%td Match user name.
|
57
60
|
%td user:hogelog
|
61
|
+
%tr
|
62
|
+
%td review_state:
|
63
|
+
%td Match pull_request_review state.
|
64
|
+
%td review_state:/commented|approved|changes_requested/
|
58
65
|
%tr
|
59
66
|
%td unspecified
|
60
67
|
%td Match title or body field.
|
61
|
-
%td
|
68
|
+
%td review please
|
@@ -1,5 +1,11 @@
|
|
1
1
|
if ENV["SLACK_WEBHOOK_URL"]
|
2
|
-
|
2
|
+
webhook_url = ENV["SLACK_WEBHOOK_URL"]
|
3
|
+
elsif Rails.env.test?
|
4
|
+
webhook_url = "https://example.com/notify"
|
5
|
+
end
|
6
|
+
|
7
|
+
if webhook_url
|
8
|
+
Tokite::Engine.config.slack_notifier = Slack::Notifier.new webhook_url do
|
3
9
|
if ENV["SLACK_ICON_EMOJI"]
|
4
10
|
defaults username: ENV.fetch("SLACK_NAME", "tokite"), icon_emoji: ENV["SLACK_ICON_EMOJI"]
|
5
11
|
else
|
data/lib/tasks/tokite.rake
CHANGED
@@ -25,13 +25,11 @@ namespace :tokite do
|
|
25
25
|
|
26
26
|
desc "Install schema"
|
27
27
|
task :install do
|
28
|
-
tokite_schema_dir = app_path("schema/tokite")
|
29
|
-
mkdir(tokite_schema_dir) unless Dir.exist?(tokite_schema_dir)
|
30
|
-
|
31
28
|
schema_dir = app_path("schema")
|
32
|
-
|
29
|
+
tokite_schema_dir = app_path("schema/tokite")
|
30
|
+
mkdir_p(tokite_schema_dir) unless Dir.exist?(tokite_schema_dir)
|
33
31
|
|
34
|
-
Dir.glob("#{engine_path("schema")}
|
32
|
+
Dir.glob("#{engine_path("schema")}/**/*.schema").each do |src_path|
|
35
33
|
basename = File.basename(src_path)
|
36
34
|
if File.exist?(File.join(tokite_schema_dir, basename))
|
37
35
|
puts "Skip install schema #{src_path}"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Tokite
|
2
|
+
class ExceptionLogger
|
3
|
+
def self.callbacks
|
4
|
+
@callbacks ||= []
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.configure(callback)
|
8
|
+
callbacks << callback
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.log(e, options = {})
|
12
|
+
callbacks.each{|callback| callback.call(e, options) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/tokite/version.rb
CHANGED
data/schema/Schemafile
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
create_table "tokite_repositories", force: :cascade do |t|
|
2
|
+
t.string "name", limit: 200, null: false
|
3
|
+
t.string "url", limit: 200, null: false
|
4
|
+
t.datetime "created_at", null: false
|
5
|
+
end
|
6
|
+
|
7
|
+
add_index "tokite_repositories", ["name"], name: "tokite_repositories_uniq_name", unique: true, using: :btree
|
@@ -0,0 +1,12 @@
|
|
1
|
+
create_table "tokite_rules", force: :cascade do |t|
|
2
|
+
t.integer "user_id", null: false
|
3
|
+
t.string "name", limit: 50, null: false
|
4
|
+
t.string "query", limit: 2000, null: false
|
5
|
+
t.string "channel", limit: 100, null: false
|
6
|
+
t.string "icon_emoji", limit: 20, null: false, default: ""
|
7
|
+
t.string "additional_text", limit: 200, null: false, default: ""
|
8
|
+
t.datetime "created_at", null: false
|
9
|
+
t.datetime "updated_at", null: false
|
10
|
+
end
|
11
|
+
|
12
|
+
add_index "tokite_rules", ["user_id", "name"], name: "tokite_rule_uniq_name", unique: true, using: :btree
|
@@ -0,0 +1,8 @@
|
|
1
|
+
create_table "tokite_secure_user_tokens", force: :cascade do |t|
|
2
|
+
t.integer "user_id", null: false
|
3
|
+
t.string "token", limit: 40, null: false
|
4
|
+
t.datetime "created_at", null: false
|
5
|
+
t.datetime "updated_at", null: false
|
6
|
+
end
|
7
|
+
|
8
|
+
add_index "tokite_secure_user_tokens", ["user_id"], name: "tokite_secure_user_token_uniq_user_id", unique: true, using: :btree
|
@@ -0,0 +1,10 @@
|
|
1
|
+
create_table "tokite_users", force: :cascade do |t|
|
2
|
+
t.string "provider", limit: 20, null: false
|
3
|
+
t.string "uid", limit: 40, null: false
|
4
|
+
t.string "name", limit: 40, null: false
|
5
|
+
t.string "image_url", limit: 200, null: false
|
6
|
+
t.datetime "created_at", null: false
|
7
|
+
t.datetime "updated_at", null: false
|
8
|
+
end
|
9
|
+
|
10
|
+
add_index "tokite_users", ["provider", "uid"], name: "tokite_user_uniq_provider_uid", unique: true, using: :btree
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tokite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hogelog
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -210,6 +210,8 @@ files:
|
|
210
210
|
- app/models/tokite/hook_event/issue_comment.rb
|
211
211
|
- app/models/tokite/hook_event/issues.rb
|
212
212
|
- app/models/tokite/hook_event/pull_request.rb
|
213
|
+
- app/models/tokite/hook_event/pull_request_review.rb
|
214
|
+
- app/models/tokite/hook_event/pull_request_review_comment.rb
|
213
215
|
- app/models/tokite/repository.rb
|
214
216
|
- app/models/tokite/revision.rb
|
215
217
|
- app/models/tokite/rule.rb
|
@@ -242,7 +244,13 @@ files:
|
|
242
244
|
- lib/tasks/yarn.rake
|
243
245
|
- lib/tokite.rb
|
244
246
|
- lib/tokite/engine.rb
|
247
|
+
- lib/tokite/exception_logger.rb
|
245
248
|
- lib/tokite/version.rb
|
249
|
+
- schema/Schemafile
|
250
|
+
- schema/tokite_repositories.schema
|
251
|
+
- schema/tokite_rules.schema
|
252
|
+
- schema/tokite_secure_user_tokens.schema
|
253
|
+
- schema/tokite_users.schema
|
246
254
|
homepage: https://github.com/hogelog/tokite/
|
247
255
|
licenses:
|
248
256
|
- MIT
|