gitlab-triage 0.3.0 → 0.4.0

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: 9f66d8205af90c7d802349af07f84b1dd4479e8fda279f2cbcd6732fca07e19a
4
- data.tar.gz: 2c2915b5044889177e1fab61d9a7c30755a5629bd95352b044aaf43c794dd9cb
3
+ metadata.gz: f135ad3ee8a932b96aa63b996b47c3dfb4c144a8294087492c75b206fd9cc0a5
4
+ data.tar.gz: 0af305681bc53fdd8d3b7f0a8eb86889d1da37bef53b24d837b067c336d02142
5
5
  SHA512:
6
- metadata.gz: 7032c596be646b9119be23d50f29538734b810b7b1565c7ff814e672f6d444a8c1f666779764e4ef83a1cc915d49a8fb2a99747b9921ef9653f6c06a90ec30e4
7
- data.tar.gz: 865d9321ce3ae41de914ef51daf621eb3208e77029e192e58166ac481ff612793801d4d9ad1d2e5e4f6dfd8180ec0c1f3eebbe37f559e60300e1e917af5e1f40
6
+ metadata.gz: 4e415ad62d834aaf20ca0f567bdd135fc36d8e9c8cd92251410aab5464232c227af6032adcbba9bc7ca955bbbc72e4192f495dc56ecc1f18d2fac249cc96fd42
7
+ data.tar.gz: 8a6b44160f809fb5b4fc3ef5bcd0d09f7b12dba043d543a27c8b4ce31549b2b9cb32317bd205bcd23faaf445a3fca27bf80af9a937f52dfd2c96073530600ebb
data/.gitlab-ci.yml CHANGED
@@ -19,7 +19,7 @@ stages:
19
19
  before_script:
20
20
  - gem install bundler
21
21
  - bundle --version
22
- - bundle install --jobs $(nproc) --retry 3 --quiet
22
+ - bundle update --jobs $(nproc) --retry 3 --quiet
23
23
 
24
24
  ###################
25
25
  ## Prepare stage ##
data/Gemfile CHANGED
@@ -2,3 +2,9 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in gitlab-rubocop.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ # Pin these dependencies, otherwise a new rule could break the CI pipelines
8
+ gem 'rubocop', '0.51.0'
9
+ gem 'rubocop-rspec', '1.19.0'
10
+ end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![pipeline status](https://gitlab.com/gitlab-org/triage/badges/master/pipeline.svg)](https://gitlab.com/gitlab-org/triage/commits/master)
1
+ [![pipeline status](https://gitlab.com/gitlab-org/gitlab-triage/badges/master/pipeline.svg)](https://gitlab.com/gitlab-org/gitlab-triage/commits/master)
2
2
 
3
3
  # GitLab Triage Project
4
4
 
@@ -45,7 +45,7 @@ resource_rules:
45
45
  interval: 5
46
46
  state: opened
47
47
  label:
48
- - No label
48
+ - No Label
49
49
  actions:
50
50
  labels:
51
51
  - needs attention
@@ -86,6 +86,7 @@ Available condition types:
86
86
  - [`upvotes` condition](#upvotes-condition)
87
87
  - [`labels` condition](#labels-condition)
88
88
  - [`forbidden_labels` condition](#forbidden-labels-condition)
89
+ - [`author_member` condition](#author-member-condition)
89
90
 
90
91
  ##### Date condition
91
92
 
@@ -188,6 +189,30 @@ conditions:
188
189
  - awaiting feedback
189
190
  ```
190
191
 
192
+ ##### Author Member condition
193
+
194
+ This condition determines whether the author of a resource is a member of the specified group or project.
195
+
196
+ This is useful for determining whether Issues or Merge Requests have been raised by a Community Contributor.
197
+
198
+ Accepts a hash of fields.
199
+
200
+ | Field | Type | Values | Required |
201
+ | --------- | ---- | ---- | -------- |
202
+ | `source` | string | `group`, `project` | yes |
203
+ | `condition` | string | `member_of`, `not_member_of` | yes |
204
+ | `source_id` | integer | integer | yes |
205
+
206
+ Example:
207
+
208
+ ```yml
209
+ conditions:
210
+ author:
211
+ source: group
212
+ condition: not_member_of
213
+ source_id: 9970
214
+ ```
215
+
191
216
  #### Actions field
192
217
 
193
218
  Used to declare an action to be carried out on a resource if **all** conditions are satisfied.
@@ -3,6 +3,7 @@ require 'active_support/all'
3
3
  require_relative 'limiters/date_conditions_limiter'
4
4
  require_relative 'limiters/votes_conditions_limiter'
5
5
  require_relative 'limiters/forbidden_labels_conditions_limiter'
6
+ require_relative 'limiters/author_member_conditions_limiter'
6
7
  require_relative 'command_builders/comment_command_builder'
7
8
  require_relative 'command_builders/label_command_builder'
8
9
  require_relative 'command_builders/remove_label_command_builder'
@@ -99,6 +100,7 @@ module Gitlab
99
100
  results << Limiters::DateConditionsLimiter.new(resource, conditions[:date]).calculate if conditions[:date]
100
101
  results << Limiters::VotesConditionsLimiter.new(resource, conditions[:upvotes]).calculate if conditions[:upvotes]
101
102
  results << Limiters::ForbiddenLabelsConditionsLimiter.new(resource, conditions[:forbidden_labels]).calculate if conditions[:forbidden_labels]
103
+ results << Limiters::AuthorMemberConditionsLimiter.new(resource, conditions[:author_member], { host_url: host_url, api_version: api_version, token: options.token, network: network }).calculate if conditions[:author]
102
104
  !results.uniq.include?(false)
103
105
  end
104
106
  end
@@ -148,7 +150,7 @@ module Gitlab
148
150
  get_url = UrlBuilders::UrlBuilder.new(
149
151
  host_url: host_url,
150
152
  api_version: api_version,
151
- project_id: options.project_id,
153
+ source_id: options.project_id,
152
154
  resource_type: resource_type,
153
155
  params: params
154
156
  ).build
@@ -163,7 +165,7 @@ module Gitlab
163
165
  post_url = UrlBuilders::UrlBuilder.new(
164
166
  host_url: host_url,
165
167
  api_version: api_version,
166
- project_id: options.project_id,
168
+ source_id: options.project_id,
167
169
  resource_type: resource_type,
168
170
  resource_id: resource['iid'],
169
171
  sub_resource_type: 'notes'
@@ -0,0 +1,84 @@
1
+ require_relative 'base_conditions_limiter'
2
+ require_relative '../url_builders/url_builder'
3
+
4
+ module Gitlab
5
+ module Triage
6
+ module Limiters
7
+ class AuthorMemberConditionsLimiter < BaseConditionsLimiter
8
+ SOURCES = %w[project group].freeze
9
+ CONDITIONS = %w[member_of not_member_of].freeze
10
+
11
+ def initialize(resource, condition, net = {})
12
+ @net = net
13
+ @network = net[:network]
14
+ super(resource, condition)
15
+ end
16
+
17
+ def self.limiter_parameters
18
+ [
19
+ {
20
+ name: :source,
21
+ type: String,
22
+ values: SOURCES
23
+ },
24
+ {
25
+ name: :condition,
26
+ type: String,
27
+ values: CONDITIONS
28
+ },
29
+ {
30
+ name: :source_id,
31
+ type: Numeric
32
+ }
33
+ ]
34
+ end
35
+
36
+ def initialize_variables(condition)
37
+ @source = condition[:source].to_sym
38
+ @condition = condition[:condition].to_sym
39
+ @source_id = condition[:source_id]
40
+ end
41
+
42
+ def resource_value
43
+ @resource[:author][:username]
44
+ end
45
+
46
+ def condition_value
47
+ members.map do |member|
48
+ member[:username]
49
+ end
50
+ end
51
+
52
+ def calculate
53
+ case @condition
54
+ when :member_of
55
+ condition_value.include?(resource_value)
56
+ when :not_member_of
57
+ !condition_value.include?(resource_value)
58
+ end
59
+ end
60
+
61
+ def members
62
+ @members ||= @network.query_api(@net[:token], member_url)
63
+ end
64
+
65
+ def member_url
66
+ UrlBuilders::UrlBuilder.new(net_opts).build
67
+ end
68
+
69
+ private
70
+
71
+ def net_opts
72
+ {
73
+ host_url: @net[:host_url],
74
+ api_version: @net[:api_version],
75
+ resource_type: 'members',
76
+ source: @source == :group ? 'groups' : 'projects',
77
+ source_id: @source_id,
78
+ params: { per_page: 100 }
79
+ }
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -5,7 +5,8 @@ module Gitlab
5
5
  def initialize(options)
6
6
  @host_url = options.fetch(:host_url)
7
7
  @api_version = options.fetch(:api_version)
8
- @project_id = options.fetch(:project_id)
8
+ @source = options.fetch(:source, 'projects')
9
+ @source_id = options.fetch(:source_id)
9
10
  @resource_type = options.fetch(:resource_type)
10
11
  @sub_resource_type = options.fetch(:sub_resource_type, nil)
11
12
  @resource_id = options.fetch(:resource_id, nil)
@@ -27,7 +28,7 @@ module Gitlab
27
28
  end
28
29
 
29
30
  def base_url
30
- "#{host_with_api_url}/projects/#{CGI.escape(@project_id.to_s)}/#{@resource_type}"
31
+ "#{host_with_api_url}/#{@source}/#{CGI.escape(@source_id.to_s)}/#{@resource_type}"
31
32
  end
32
33
 
33
34
  def params_string
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module Triage
3
- VERSION = '0.3.0'.freeze
3
+ VERSION = '0.4.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-triage
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-12 00:00:00.000000000 Z
11
+ date: 2018-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -127,6 +127,7 @@ files:
127
127
  - lib/gitlab/triage/filter_builders/base_filter_builder.rb
128
128
  - lib/gitlab/triage/filter_builders/multi_filter_builder.rb
129
129
  - lib/gitlab/triage/filter_builders/single_filter_builder.rb
130
+ - lib/gitlab/triage/limiters/author_member_conditions_limiter.rb
130
131
  - lib/gitlab/triage/limiters/base_conditions_limiter.rb
131
132
  - lib/gitlab/triage/limiters/date_conditions_limiter.rb
132
133
  - lib/gitlab/triage/limiters/forbidden_labels_conditions_limiter.rb
@@ -162,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
163
  version: '0'
163
164
  requirements: []
164
165
  rubyforge_project:
165
- rubygems_version: 2.7.3
166
+ rubygems_version: 2.7.7
166
167
  signing_key:
167
168
  specification_version: 4
168
169
  summary: GitLab triage automation project.