danger-gitlab_reviewbot 1.1.0 → 1.1.1
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/Gemfile.lock +14 -11
- data/danger-gitlab_reviewbot.gemspec +5 -2
- data/lib/gitlab_reviewbot/gem_version.rb +1 -1
- data/lib/gitlab_reviewbot/plugin.rb +29 -7
- data/lib/gitlab_reviewbot/strategies/least_busy.rb +1 -1
- data/lib/gitlab_reviewbot/strategies/strategy.rb +4 -4
- data/spec/gitlab_reviewbot_spec.rb +13 -4
- data/spec/least_busy_strategy_spec.rb +25 -2
- data/spec/random_strategy_spec.rb +3 -20
- metadata +37 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59b8a17d363eab75e1676896ea925e3e64691b910d1b19db8b65325d0acbdedc
|
4
|
+
data.tar.gz: 49458b9d7dc3ddb3948280301a6d79bc1d146d5bdf6c26f81242a765649d132b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1d53b11855e07c588d35fd904a7f25ad9c27038dd5eede51bacfdfd8f8489fe85d35fbc9df2b0ef7243d4696123503cc8842e97ddea7bc3e679ffe5dbaf981f
|
7
|
+
data.tar.gz: 3c5bd67cd8c0f61951d3a2aefa36721849ff1ef544e929508de6291abce66970e64863cc8a6db2c14794c4818966d5e9b902c96145dcf2368e0508afa1842dd8
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
danger-gitlab_reviewbot (1.1.
|
4
|
+
danger-gitlab_reviewbot (1.1.1)
|
5
5
|
danger-gitlab
|
6
6
|
danger-plugin-api (~> 1.0)
|
7
7
|
|
@@ -11,6 +11,7 @@ GEM
|
|
11
11
|
addressable (2.7.0)
|
12
12
|
public_suffix (>= 2.0.2, < 5.0)
|
13
13
|
ast (2.4.0)
|
14
|
+
awesome_print (1.8.0)
|
14
15
|
claide (1.0.3)
|
15
16
|
claide-plugins (0.9.2)
|
16
17
|
cork
|
@@ -67,7 +68,6 @@ GEM
|
|
67
68
|
httparty (0.18.0)
|
68
69
|
mime-types (~> 3.0)
|
69
70
|
multi_xml (>= 0.5.2)
|
70
|
-
jaro_winkler (1.5.4)
|
71
71
|
kramdown (2.2.1)
|
72
72
|
rexml
|
73
73
|
kramdown-parser-gfm (1.1.0)
|
@@ -76,7 +76,7 @@ GEM
|
|
76
76
|
rb-fsevent (>= 0.9.3)
|
77
77
|
rb-inotify (>= 0.9.7)
|
78
78
|
lumberjack (1.2.4)
|
79
|
-
method_source (
|
79
|
+
method_source (0.9.2)
|
80
80
|
mime-types (3.3.1)
|
81
81
|
mime-types-data (~> 3.2015)
|
82
82
|
mime-types-data (3.2020.0512)
|
@@ -95,9 +95,11 @@ GEM
|
|
95
95
|
parallel (1.19.1)
|
96
96
|
parser (2.7.1.2)
|
97
97
|
ast (~> 2.4.0)
|
98
|
-
pry (0.
|
99
|
-
coderay (~> 1.1)
|
100
|
-
method_source (~>
|
98
|
+
pry (0.12.2)
|
99
|
+
coderay (~> 1.1.0)
|
100
|
+
method_source (~> 0.9.0)
|
101
|
+
pry-nav (0.3.0)
|
102
|
+
pry (>= 0.9.10, < 0.13.0)
|
101
103
|
public_suffix (4.0.5)
|
102
104
|
rainbow (3.0.0)
|
103
105
|
rake (13.0.1)
|
@@ -112,15 +114,14 @@ GEM
|
|
112
114
|
rspec-mocks (~> 3.9.0)
|
113
115
|
rspec-core (3.9.2)
|
114
116
|
rspec-support (~> 3.9.3)
|
115
|
-
rspec-expectations (3.9.
|
117
|
+
rspec-expectations (3.9.2)
|
116
118
|
diff-lcs (>= 1.2.0, < 2.0)
|
117
119
|
rspec-support (~> 3.9.0)
|
118
120
|
rspec-mocks (3.9.1)
|
119
121
|
diff-lcs (>= 1.2.0, < 2.0)
|
120
122
|
rspec-support (~> 3.9.0)
|
121
123
|
rspec-support (3.9.3)
|
122
|
-
rubocop (0.
|
123
|
-
jaro_winkler (~> 1.5.1)
|
124
|
+
rubocop (0.83.0)
|
124
125
|
parallel (~> 1.10)
|
125
126
|
parser (>= 2.7.0.1)
|
126
127
|
rainbow (>= 2.2.2, < 4.0)
|
@@ -142,12 +143,14 @@ PLATFORMS
|
|
142
143
|
ruby
|
143
144
|
|
144
145
|
DEPENDENCIES
|
146
|
+
awesome_print
|
145
147
|
bundler (~> 2.1)
|
146
148
|
danger-gitlab_reviewbot!
|
147
|
-
guard
|
148
|
-
guard-rspec
|
149
|
+
guard
|
150
|
+
guard-rspec
|
149
151
|
listen (= 3.0.7)
|
150
152
|
pry
|
153
|
+
pry-nav
|
151
154
|
rake
|
152
155
|
rspec
|
153
156
|
rubocop
|
@@ -33,8 +33,8 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency "yard"
|
34
34
|
|
35
35
|
# Makes testing easy via `bundle exec guard`
|
36
|
-
spec.add_development_dependency 'guard'
|
37
|
-
spec.add_development_dependency 'guard-rspec'
|
36
|
+
spec.add_development_dependency 'guard'
|
37
|
+
spec.add_development_dependency 'guard-rspec'
|
38
38
|
|
39
39
|
# If you want to work on older builds of ruby
|
40
40
|
spec.add_development_dependency 'listen', '3.0.7'
|
@@ -47,4 +47,7 @@ Gem::Specification.new do |spec|
|
|
47
47
|
#
|
48
48
|
# This will stop test execution and let you inspect the results
|
49
49
|
spec.add_development_dependency 'pry'
|
50
|
+
spec.add_development_dependency 'pry-nav'
|
51
|
+
spec.add_development_dependency 'awesome_print'
|
52
|
+
|
50
53
|
end
|
@@ -44,17 +44,36 @@ module Danger
|
|
44
44
|
# * Danger::AssignStrategies::LeastBusyStrategy - assign the N users with the least amount of open MRs
|
45
45
|
# to review
|
46
46
|
#
|
47
|
-
attr_writer :strategy
|
48
47
|
def strategy
|
49
|
-
@strategy
|
48
|
+
@strategy #|| Danger::AssignStrategies::RandomStrategy.new(client: gitlab.api, project: project_id, mr: mr_iid)
|
49
|
+
end
|
50
|
+
|
51
|
+
def strategy=(klass)
|
52
|
+
@strategy = klass.new(client: gitlab.api, project: project_id, mr: mr_iid)
|
53
|
+
end
|
54
|
+
|
55
|
+
def project_id
|
56
|
+
ENV['CI_PROJECT_ID']
|
57
|
+
end
|
58
|
+
|
59
|
+
def mr_iid
|
60
|
+
ENV['CI_MERGE_REQUEST_IID']
|
61
|
+
end
|
62
|
+
|
63
|
+
#Once a strategy is in place, adopt the conf methods
|
64
|
+
def method_missing(method, *args)
|
65
|
+
super unless method.to_s.start_with? 'strategy_'
|
66
|
+
if strategy.respond_to? method.to_s.delete_prefix('strategy_')
|
67
|
+
strategy.send(method.to_s.delete_prefix('strategy_'), *args)
|
68
|
+
else
|
69
|
+
super
|
70
|
+
end
|
50
71
|
end
|
51
72
|
|
52
73
|
# Call this method from the Dangerfile to assign reviewers to your merge requests
|
53
74
|
# @return The usernames list of assigned reviewes [Array<String>]
|
54
75
|
#
|
55
76
|
def assign!
|
56
|
-
project_id = ENV['CI_PROJECT_ID']
|
57
|
-
mr_iid = ENV['CI_MERGE_REQUEST_IID']
|
58
77
|
if mr_iid.nil?
|
59
78
|
raise "Env variable CI_MERGE_REQUEST_IID doesn't point to a valid merge request iid"
|
60
79
|
end
|
@@ -73,17 +92,20 @@ module Danger
|
|
73
92
|
# puts "Required: #{required_assignees_count}" if @verbose
|
74
93
|
|
75
94
|
# if required_assignees_count == 0
|
76
|
-
# puts "Nothing to do" if
|
95
|
+
# puts "Nothing to do" if verbose
|
77
96
|
# return
|
78
97
|
# end
|
79
98
|
|
80
|
-
|
99
|
+
@strategy.group_name = gitlab_group
|
81
100
|
|
82
|
-
assignees =
|
101
|
+
assignees = @strategy.assign! assignees_amount
|
83
102
|
|
84
103
|
puts "Assigning: #{assignees}" if verbose
|
85
104
|
return assignees
|
86
105
|
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
87
109
|
end
|
88
110
|
end
|
89
111
|
|
@@ -8,7 +8,7 @@ module Danger
|
|
8
8
|
author = fetch_author()
|
9
9
|
invalid_assignees = [ fetch_author() ] + fetch_assigned_reviewers()
|
10
10
|
|
11
|
-
users_with_reviews_pending = client.users_with_pending_mr_review(project_id)
|
11
|
+
users_with_reviews_pending = client.users_with_pending_mr_review(project_id).filter { |u| users_in_group.include? u }
|
12
12
|
users_without_reviews_pending = users_in_group.filter { |u| ! users_with_reviews_pending.include? u }
|
13
13
|
|
14
14
|
(users_with_reviews_pending + users_without_reviews_pending).filter { |u| u.id != author.id }
|
@@ -7,11 +7,10 @@ module Danger
|
|
7
7
|
attr_accessor :client
|
8
8
|
attr_accessor :excluded_users
|
9
9
|
|
10
|
-
def initialize(client:, project:, mr
|
10
|
+
def initialize(client:, project:, mr:)
|
11
11
|
@client = client
|
12
12
|
@project_id = project
|
13
13
|
@mr_iid = mr
|
14
|
-
@group_name = group
|
15
14
|
@excluded_users = []
|
16
15
|
end
|
17
16
|
|
@@ -39,9 +38,10 @@ module Danger
|
|
39
38
|
end
|
40
39
|
|
41
40
|
def fetch_users_in_group
|
42
|
-
|
43
|
-
client.fetch_users_for_group(@group_name).filter { |u| !
|
41
|
+
excluded = @excluded_users.map { |u| client.find_user_with_username(u) }
|
42
|
+
client.fetch_users_for_group(@group_name).filter { |u| ! excluded.include? u }
|
44
43
|
end
|
44
|
+
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -15,20 +15,21 @@ module Danger
|
|
15
15
|
|
16
16
|
@dangerfile = testing_dangerfile
|
17
17
|
@plugin = @dangerfile.gitlab_reviewbot
|
18
|
-
@plugin.strategy = Danger::AssignStrategies::RandomStrategy
|
19
18
|
@strategy_mock = instance_double(Danger::AssignStrategies::Strategy)
|
20
19
|
allow(Danger::AssignStrategies::RandomStrategy).to receive(:new).and_return(@strategy_mock)
|
20
|
+
allow(@strategy_mock).to receive(:group_name=).with('tech/ios')
|
21
|
+
@plugin.strategy = Danger::AssignStrategies::RandomStrategy
|
22
|
+
@plugin.gitlab_group = 'tech/ios'
|
23
|
+
|
21
24
|
end
|
22
25
|
|
23
26
|
it "Assign one reviewer" do
|
24
|
-
@plugin.gitlab_group = 'tech/ios'
|
25
27
|
|
26
28
|
expect(@strategy_mock).to receive(:assign!).with(1).and_return(['Sam'])
|
27
29
|
|
28
30
|
@plugin.assign!
|
29
31
|
end
|
30
32
|
it "Assign one reviewer" do
|
31
|
-
@plugin.gitlab_group = 'tech/ios'
|
32
33
|
|
33
34
|
expect(@strategy_mock).to receive(:assign!).with(1).and_return(['Sam'])
|
34
35
|
|
@@ -36,7 +37,6 @@ module Danger
|
|
36
37
|
end
|
37
38
|
|
38
39
|
it "Assign multiple reviewers" do
|
39
|
-
@plugin.gitlab_group = 'tech/ios'
|
40
40
|
@plugin.assignees_amount = 2
|
41
41
|
|
42
42
|
expect(@strategy_mock).to receive(:assign!).with(2).and_return(['Sam, Nic'])
|
@@ -44,6 +44,15 @@ module Danger
|
|
44
44
|
@plugin.assign!
|
45
45
|
end
|
46
46
|
|
47
|
+
it "Assigns strategy options" do
|
48
|
+
expect(@strategy_mock).to receive(:excluded_users=)
|
49
|
+
expect(@strategy_mock).to receive(:excluded_users).and_return([])
|
50
|
+
|
51
|
+
@plugin.strategy_excluded_users = ['Tom']
|
52
|
+
@plugin.strategy_excluded_users << 'Sam'
|
53
|
+
|
54
|
+
end
|
55
|
+
|
47
56
|
['CI_PROJECT_ID', 'CI_MERGE_REQUEST_IID'].each do |var|
|
48
57
|
it "Fails when required #{var} variables are not available" do
|
49
58
|
ENV[var] = nil
|
@@ -16,9 +16,11 @@ module Danger
|
|
16
16
|
@nic.review_count = 0
|
17
17
|
@members = [@author, @tom, @sam, @luke]
|
18
18
|
allow(@mock_client).to receive(:fetch_author_for_mr).and_return(@author)
|
19
|
-
allow(@mock_client).to receive(:fetch_users_for_group).with(
|
19
|
+
allow(@mock_client).to receive(:fetch_users_for_group).with("tech/ios").and_return(@members)
|
20
|
+
|
21
|
+
@strategy = AssignStrategies::LeastBusyStrategy.new(client: @mock_client, project: 10, mr: 110)
|
22
|
+
@strategy.group_name = "tech/ios"
|
20
23
|
|
21
|
-
@strategy = AssignStrategies::LeastBusyStrategy.new(client: @mock_client, project: 10, mr: 110, group: 2200)
|
22
24
|
end
|
23
25
|
|
24
26
|
it "Assign the one least busy" do
|
@@ -89,6 +91,27 @@ module Danger
|
|
89
91
|
|
90
92
|
@strategy.assign!(1)
|
91
93
|
end
|
94
|
+
|
95
|
+
it "honours excluded users" do
|
96
|
+
allow(@mock_client).to receive(:fetch_mr_reviewers).with(10, 110).and_return([])
|
97
|
+
@tom.review_count = 1
|
98
|
+
@sam.review_count = 4
|
99
|
+
@luke.review_count = 3
|
100
|
+
users_with_pending_mr_review = [@author, @sam, @tom, @luke]
|
101
|
+
expect(@mock_client).to receive(:users_with_pending_mr_review).and_return(users_with_pending_mr_review)
|
102
|
+
|
103
|
+
allow(@mock_client).to receive(:find_user_with_username).with('Tom').and_return(@tom)
|
104
|
+
@strategy.excluded_users = ['Tom']
|
105
|
+
|
106
|
+
expect(@mock_client).to receive(:assign_mr_to_users) do |project, mr, users|
|
107
|
+
expect(project).to be == 10
|
108
|
+
expect(mr).to be == 110
|
109
|
+
expect(users).to contain_exactly(@luke)
|
110
|
+
end
|
111
|
+
|
112
|
+
@strategy.assign!(1)
|
113
|
+
end
|
114
|
+
|
92
115
|
end
|
93
116
|
end
|
94
117
|
|
@@ -17,9 +17,10 @@ module Danger
|
|
17
17
|
@author = @lei
|
18
18
|
@members = [@author, @tom, @sam]
|
19
19
|
allow(@mock_client).to receive(:fetch_author_for_mr).and_return(@author)
|
20
|
-
allow(@mock_client).to receive(:fetch_users_for_group).with(
|
20
|
+
allow(@mock_client).to receive(:fetch_users_for_group).with("tech/ios").and_return(@members)
|
21
21
|
|
22
|
-
@strategy = AssignStrategies::RandomStrategy.new(client: @mock_client, project: 10, mr: 110
|
22
|
+
@strategy = AssignStrategies::RandomStrategy.new(client: @mock_client, project: 10, mr: 110)
|
23
|
+
@strategy.group_name = "tech/ios"
|
23
24
|
end
|
24
25
|
|
25
26
|
it "assign the right amount of reviewers" do
|
@@ -56,24 +57,6 @@ module Danger
|
|
56
57
|
@strategy.assign!(2)
|
57
58
|
end
|
58
59
|
|
59
|
-
it "honours excluded users" do
|
60
|
-
allow(@mock_client).to receive(:fetch_mr_reviewers).with(10, 110).and_return([])
|
61
|
-
allow(@mock_client).to receive(:find_user_with_username).with('Luke').and_return(@luke)
|
62
|
-
allow(@mock_client).to receive(:find_user_with_username).with('Nic').and_return(@nic)
|
63
|
-
allow(@mock_client).to receive(:fetch_users_for_group).with(2200).and_return(@members + [@nic, @luke])
|
64
|
-
@strategy.excluded_users = ['Nic', 'Luke']
|
65
|
-
|
66
|
-
expect(@mock_client).to receive(:assign_mr_to_users) do |project, mr, users|
|
67
|
-
expect(project).to be == 10
|
68
|
-
expect(mr).to be == 110
|
69
|
-
expect(users).to contain_exactly(@tom, @sam)
|
70
|
-
end
|
71
|
-
|
72
|
-
@strategy.assign!(2)
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
60
|
end
|
78
61
|
end
|
79
62
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danger-gitlab_reviewbot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabio Gallonetto
|
@@ -112,30 +112,30 @@ dependencies:
|
|
112
112
|
name: guard
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - "
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
117
|
+
version: '0'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
124
|
+
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: guard-rspec
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- - "
|
129
|
+
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
131
|
+
version: '0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- - "
|
136
|
+
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
138
|
+
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: listen
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,6 +164,34 @@ dependencies:
|
|
164
164
|
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: pry-nav
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: awesome_print
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
167
195
|
description: 'A review raffle bot for Gitlab '
|
168
196
|
email:
|
169
197
|
- fabio.gallonetto@curve.com
|