danger-gitlab_reviewbot 1.1.6 → 1.1.8

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: 56b35c5cb823cb3e1355a0ab855c4f8745a7fed8d580d3df01a4ee8a05b204ef
4
- data.tar.gz: ba5391618aff949ecd6f50e0b33bcfe2db0ba63efa4b3d1394ba2456935c5115
3
+ metadata.gz: 4a7eaa5cd15e0c7c399b577b76461cf7eb3580b1d1350bcc0175c5126784fc1c
4
+ data.tar.gz: 17c5294182aad19fb6d68dcf6858ab313a1ed140a53acffa6ef815abdb4b5a48
5
5
  SHA512:
6
- metadata.gz: 5aa5f29bab94af692e58c6c4f4b67f63006d8be957a39a9b5666c21dbd4e7ce0d0799b213bdd6fca05e477342a21c4346e6821055f43948a263c80f942d99309
7
- data.tar.gz: 00b534deaef5d197c01b3743849b0131bed30c555f21c61e9143c74cd8040686bc61e05774992c8416742ab6dce5fc69e372b4e211f320472028a83dc266cf44
6
+ metadata.gz: b66136604fadac6c2d49a53739b5435a40a3634a269683d68af032a0bd5475a8070f3a6f8a49801bc537a167c4f3b5955fd97fa464ea9349c268056612526708
7
+ data.tar.gz: 776cc841222ceb2f057aa7c9bc4fda90b3dff2fddfa602c4863e036f71ab6af098a1a22b0606dda00a829d98edcd7da77d02bf68b4c3ab9adc299489d0471f4a
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.6"
4
+ VERSION = "1.1.8"
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.id, 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")
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
@@ -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.6
4
+ version: 1.1.8
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-16 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