danger-gitlab_reviewbot 1.1.5 → 1.1.10

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
2
  SHA256:
3
- metadata.gz: a87855f2af8575497c523339ced8070408e9e2191bbf1eec2b4cf1ef0e431376
4
- data.tar.gz: 5d30b4bde8ad0ce2ccf8e95c5efb75899f1e3acf40cc8e806211da79e518acdd
3
+ metadata.gz: 41365a9bbcf6f88fbdb8bc3893a304d706443e9a2fdb2c651a9a9b658eaba5b6
4
+ data.tar.gz: '057559035a78f06554d7986ef7b57c968148f5e943f74dca9420ba81e5b880ea'
5
5
  SHA512:
6
- metadata.gz: 90895467fe4e12bf949f2bdc38bc72e2885aa0c77ec73cd3b7d47c4cfb0fe07f1f14641e159b47dc64fdbbd17b59d29bb49805794521305d077ae726c1063953
7
- data.tar.gz: 39ab6152e3916f0ab1e473c06ca5514608906174bf416a28d3ebe4be8ac249414020effbc57a61375335d5eee864bd122eb0b425fe01ef18bc07e2566a80bd7f
6
+ metadata.gz: f4273adbaedd45032d35ab4ebe989a92da1765f0e3438da87b3d06638a07507e47e3da220c55735cc7b0b156a75c0f86c44dbb498f56cec26f2e758fc8c0ea05
7
+ data.tar.gz: 14435237e8c507b4dfa01529d48d4ca84c1a318b566a33f49e520fdfbbd97ad1230edf1424ce9c7acb6c78324c8f80d52584a5340f440e23429d130b28c6d7e9
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- danger-gitlab_reviewbot (1.1.5)
4
+ danger-gitlab_reviewbot (1.1.7)
5
5
  danger-gitlab
6
6
  danger-plugin-api (~> 1.0)
7
7
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GitlabReviewbot
4
- VERSION = "1.1.5"
4
+ VERSION = "1.1.10"
5
5
  end
@@ -19,12 +19,33 @@ module Gitlab
19
19
  end
20
20
  end
21
21
 
22
- class Client < API
22
+ class ClientHelper
23
+ def initialize(client)
24
+ @client = client
25
+ end
26
+
27
+ def users_with_pending_mr_review(project_id)
28
+ outstanding_mrs = fetch_mrs_requiring_review(project_id)
29
+ all_assignees = outstanding_mrs.reduce([]) { |acc, mr| acc + mr.assignees - assignees_with_review(project_id, mr.iid, mr.assignees)}
30
+ assignees_id_map = all_assignees.each_with_object({}) do |a, acc|
31
+ aid = a["id"]
32
+ ausername = a["username"]
33
+ assignee = acc[aid] || User.new(aid, ausername)
34
+ assignee.review_count += 1
35
+ acc[aid] = assignee
36
+ end
37
+ assignees_id_map.values
38
+ end
39
+
40
+ def fetch_mrs_requiring_review(project_id)
41
+ @client.merge_requests(project_id, state: "opened", per_page: "100")
42
+ end
43
+
23
44
  def fetch_users_for_group(group_name)
24
- group_id = search_group(group_name)
45
+ group_id = search_group_with_path(group_name)
25
46
  return nil if group_id.nil?
26
47
 
27
- res = group_members(group_id)
48
+ res = @client.group_members(group_id, :per_page => 100)
28
49
 
29
50
  developer_access_level = 30
30
51
  res.select { |u| u.state == "active" && u.access_level >= developer_access_level }.map { |u| User.new(u.id, u.username) }
@@ -32,44 +53,28 @@ module Gitlab
32
53
 
33
54
  def assign_mr_to_users(project_id, mr_iid, users)
34
55
  user_ids = users.map(&:id)
35
- update_merge_request(project_id, mr_iid, "assignee_ids" => user_ids)
56
+ @client.update_merge_request(project_id, mr_iid, "assignee_ids" => user_ids)
57
+
36
58
  end
37
59
 
38
60
  def fetch_author_for_mr(project_id, mr_iid)
39
- res = merge_request(project_id, mr_iid)
61
+ res = @client.merge_request(project_id, mr_iid)
40
62
  User.new(res.author.id, res.author.name)
41
63
  end
42
64
 
43
- def fetch_mrs_requiring_review(project_id)
44
- merge_requests(project_id, state: "opened", per_page: "100").reject { |mr| mr.merge_status == "can_be_merged" }
45
- end
46
-
47
65
  def find_user_with_username(username)
48
- users({ username: username }).map { |u| User.new(u.id, u.username) }
49
- end
50
-
51
- def users_with_pending_mr_review(project_id)
52
- outstanding_mrs = fetch_mrs_requiring_review(project_id)
53
- all_assignees = outstanding_mrs.reduce([]) { |acc, mr| acc + mr.assignees }
54
- assignees_id_map = all_assignees.each_with_object({}) do |a, acc|
55
- aid = a["id"]
56
- ausername = a["username"]
57
- assignee = acc[aid] || User.new(aid, ausername)
58
- assignee.review_count += 1
59
- acc[aid] = assignee
60
- end
61
- assignees_id_map.values
66
+ @client.users({ username: username }).map { |u| User.new(u.id, u.username) }
62
67
  end
63
68
 
64
69
  def fetch_mr_reviewers(project_id, mr_iid)
65
- merge_request(project_id, mr_iid).assignees.map { |u| User.new(u["id"], u["username"]) }
70
+ @client.merge_request(project_id, mr_iid).assignees.map { |u| User.new(u["id"], u["username"]) }
66
71
  end
67
72
 
68
73
  private
69
74
 
70
- def search_group(group_name)
75
+ def search_group_with_path(group_name)
71
76
  short_name = group_name.split("/").last
72
- res = group_search(short_name)
77
+ res = @client.group_search(short_name)
73
78
  res = res.find { |i| i.full_path == group_name }
74
79
 
75
80
  if res.nil?
@@ -78,5 +83,28 @@ module Gitlab
78
83
  res.id
79
84
  end
80
85
  end
86
+
87
+ def assignees_with_review(project_id, mr_iid, gusers)
88
+ approvals = @client.merge_request_approval_state(project_id, mr_iid)
89
+ approved_by = approvals.rules.reduce([]) { |acc, r| acc + r['approved_by'] }
90
+ gusers.filter { |u| approved_by.index { |au| au['id'] == u['id'] } != nil }
91
+ end
92
+
93
+ end
94
+
95
+ class Client < API
96
+
97
+ def client_helper
98
+ @client_helper ||= ClientHelper.new(self)
99
+ end
100
+
101
+ def method_missing(method, *args)
102
+ if client_helper.respond_to?(method)
103
+ client_helper.send(method, *args)
104
+ else
105
+ super
106
+ end
107
+ end
108
+
81
109
  end
82
110
  end
@@ -27,7 +27,7 @@ module Danger
27
27
  all_assignees.map(&:username)
28
28
  end
29
29
 
30
- def assignees(_amount)
30
+ def assignees(amount)
31
31
  raise "To be implemented in the subclasses"
32
32
  end
33
33
 
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path("spec_helper", __dir__)
4
+
5
+
6
+ module Danger
7
+ describe Gitlab::Client do
8
+ before do
9
+ #
10
+ # @sam = Gitlab::User.new(1, "Sam")
11
+ # @tom = Gitlab::User.new(2, "Tom")
12
+ # @nic = Gitlab::User.new(3, "Nic")
13
+ # @luke = Gitlab::User.new(4, "Luke")
14
+ @mock_client = double(Gitlab::Client)
15
+ @client_helper = Gitlab::ClientHelper.new(@mock_client)
16
+ @sam = Gitlab::User.new(1, "Sam")
17
+ @tom = Gitlab::User.new(2, "Tom")
18
+ @nic = Gitlab::User.new(3, "Nic")
19
+ @assignees = [{'id' => 1, 'username' => "Sam"},
20
+ {'id' => 2, 'username' => "Tom"},
21
+ {'id' => 3, 'username' => "Nic"}]
22
+ end
23
+
24
+ it "Correctly calculates users with pending reviews" do
25
+ already_reviewed = [@assignees[0]]
26
+
27
+ allow(@mock_client).to receive(:merge_requests).with(10, {:per_page=>"100", :state=>"opened"}).and_return([Gitlab::ObjectifiedHash.new({'id' => 110, 'assignees' => @assignees})])
28
+ allow(@mock_client).to receive(:merge_request_approval_state).with(10, 110).and_return(Gitlab::ObjectifiedHash.new({'rules' => [{'approved_by' => already_reviewed}]}))
29
+
30
+ expect(@client_helper.users_with_pending_mr_review(10)).to be == [@tom, @nic]
31
+ end
32
+
33
+ it "Correctly calculates users with pending reviews (multi rule)" do
34
+ allow(@mock_client).to receive(:merge_requests).with(10, {:per_page=>"100", :state=>"opened"}).and_return([Gitlab::ObjectifiedHash.new({'id' => 110, 'assignees' => @assignees})])
35
+ allow(@mock_client).to receive(:merge_request_approval_state).with(10, 110).and_return(Gitlab::ObjectifiedHash.new({'rules' => [{'approved_by' => [{'id' => 1, 'username' => "Sam"}]}, {'approved_by' => [{'id' => 2, 'username' => "Tom"}]}]}))
36
+
37
+ expect(@client_helper.users_with_pending_mr_review(10)).to be == [@nic]
38
+ end
39
+
40
+ it "Fetches only active developer users for group" do
41
+ active_users = [Gitlab::ObjectifiedHash.new({'id' => 1, 'username' => 'Sam', 'state' => 'active', 'access_level' => 30}),
42
+ Gitlab::ObjectifiedHash.new({'id' => 2, 'username' => 'Tom', 'state' => 'active', 'access_level' => 50})]
43
+ inactive_users = [Gitlab::ObjectifiedHash.new({'id' => 3, 'username' => 'OldSam', 'state' => 'inactive', 'access_level' => 30})]
44
+ non_developer_users = [Gitlab::ObjectifiedHash.new({'id' => 4, 'username' => 'Reporter', 'state' => 'active', 'access_level' => 20})]
45
+ allow(@mock_client).to receive(:group_search).with("mygroup").and_return([Gitlab::ObjectifiedHash.new({'id' => 10, 'full_path' => "mygroup"})])
46
+ allow(@mock_client).to receive(:group_members).with(10).and_return(active_users + inactive_users + non_developer_users)
47
+ expect(@client_helper.fetch_users_for_group("mygroup")).to be == [@sam, @tom]
48
+ end
49
+ end
50
+ end
51
+
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,7 @@ require "pry"
10
10
 
11
11
  require "rspec"
12
12
  require "danger"
13
+ require File.expand_path("../lib/gitlab_reviewbot/gitlab", __dir__)
13
14
 
14
15
  if `git remote -v` == ""
15
16
  puts "You cannot run tests without setting a local git remote on this repo"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-gitlab_reviewbot
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Gallonetto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-15 00:00:00.000000000 Z
11
+ date: 2021-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -218,6 +218,7 @@ files:
218
218
  - lib/gitlab_reviewbot/strategies/least_busy.rb
219
219
  - lib/gitlab_reviewbot/strategies/random.rb
220
220
  - lib/gitlab_reviewbot/strategies/strategy.rb
221
+ - spec/gitlab_ext_spec.rb
221
222
  - spec/gitlab_reviewbot_spec.rb
222
223
  - spec/least_busy_strategy_spec.rb
223
224
  - spec/random_strategy_spec.rb
@@ -246,6 +247,7 @@ signing_key:
246
247
  specification_version: 4
247
248
  summary: A review raffle bot for Gitlab.
248
249
  test_files:
250
+ - spec/gitlab_ext_spec.rb
249
251
  - spec/gitlab_reviewbot_spec.rb
250
252
  - spec/least_busy_strategy_spec.rb
251
253
  - spec/random_strategy_spec.rb