gitlab-triage 1.9.0 → 1.10.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/.gitlab/merge_request_templates/Release.md +1 -1
- data/lib/gitlab/triage/api_query_builders/date_query_param_builder.rb +78 -0
- data/lib/gitlab/triage/engine.rb +8 -11
- data/lib/gitlab/triage/filters/merge_request_date_conditions_filter.rb +51 -5
- data/lib/gitlab/triage/policies/rule_policy.rb +1 -1
- data/lib/gitlab/triage/policies/summary_policy.rb +1 -1
- data/lib/gitlab/triage/policies_resources/rule_resources.rb +5 -6
- data/lib/gitlab/triage/policies_resources/summary_resources.rb +5 -6
- data/lib/gitlab/triage/validators/params_validator.rb +5 -3
- data/lib/gitlab/triage/version.rb +1 -1
- metadata +3 -3
- data/lib/gitlab/triage/filters/issuable_date_conditions_filter.rb +0 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ac5f595e5dffde9a3135eec982d931510615517b7512168291944252cd6f2ed
|
4
|
+
data.tar.gz: 3336902a5864b878ad60091442fd2047eeef620981ae4d8e40c73c0ca2394cb1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a5669015087540e47ea682b07a3282a7fbb49e3206cb635e71086fa180f82084908dc964c659d7faeca8e0a8cabe83a0b296e7835ea161f43c26887aa5066ec6
|
7
|
+
data.tar.gz: b6f348f4d5adf7e7685f97d10fdaf0545e0952a91ee74b0997cdcba10b7a0c0a9823ed14dde92188f749731fd7b870cc8700d3fbc7733128b219a51287504517
|
@@ -32,4 +32,4 @@ with the latest commit from https://gitlab.com/gitlab-org/gitlab-triage/commits/
|
|
32
32
|
- Checklist after merging:
|
33
33
|
- [ ] [Update the release notes for the newly created tag](docs/release_process.md#how-to).
|
34
34
|
|
35
|
-
/label ~"Engineering Productivity" ~"ep::triage"
|
35
|
+
/label ~"Engineering Productivity" ~"ep::triage" ~"tooling::workflow"
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require_relative '../validators/params_validator'
|
2
|
+
|
3
|
+
module Gitlab
|
4
|
+
module Triage
|
5
|
+
module APIQueryBuilders
|
6
|
+
class DateQueryParamBuilder
|
7
|
+
ATTRIBUTES = %w[updated_at created_at].freeze
|
8
|
+
CONDITIONS = %w[older_than newer_than].freeze
|
9
|
+
INTERVAL_TYPES = %w[days weeks months years].freeze
|
10
|
+
|
11
|
+
def self.filter_parameters
|
12
|
+
[
|
13
|
+
{
|
14
|
+
name: :attribute,
|
15
|
+
type: String,
|
16
|
+
values: ATTRIBUTES
|
17
|
+
},
|
18
|
+
{
|
19
|
+
name: :condition,
|
20
|
+
type: String,
|
21
|
+
values: CONDITIONS
|
22
|
+
},
|
23
|
+
{
|
24
|
+
name: :interval_type,
|
25
|
+
type: String,
|
26
|
+
values: INTERVAL_TYPES
|
27
|
+
},
|
28
|
+
{
|
29
|
+
name: :interval,
|
30
|
+
type: Numeric
|
31
|
+
}
|
32
|
+
]
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.applicable?(condition)
|
36
|
+
ATTRIBUTES.include?(condition[:attribute].to_s)
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize(condition_hash)
|
40
|
+
@attribute = condition_hash[:attribute].to_s
|
41
|
+
@interval_condition = condition_hash[:condition].to_sym
|
42
|
+
@interval_type = condition_hash[:interval_type]
|
43
|
+
@interval = condition_hash[:interval]
|
44
|
+
validate_condition(condition_hash)
|
45
|
+
end
|
46
|
+
|
47
|
+
def validate_condition(condition)
|
48
|
+
ParamsValidator.new(self.class.filter_parameters, condition).validate!
|
49
|
+
end
|
50
|
+
|
51
|
+
def param_name
|
52
|
+
prefix = attribute.delete_suffix('_at')
|
53
|
+
suffix =
|
54
|
+
case interval_condition
|
55
|
+
when :older_than
|
56
|
+
'before'
|
57
|
+
when :newer_than
|
58
|
+
'after'
|
59
|
+
end
|
60
|
+
|
61
|
+
"#{prefix}_#{suffix}"
|
62
|
+
end
|
63
|
+
|
64
|
+
def param_content
|
65
|
+
interval.public_send(interval_type).ago.to_date # rubocop:disable GitlabSecurity/PublicSend
|
66
|
+
end
|
67
|
+
|
68
|
+
def build_param
|
69
|
+
"&#{param_name}=#{param_content.strip}"
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
attr_reader :condition_hash, :attribute, :interval_condition, :interval_type, :interval
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/gitlab/triage/engine.rb
CHANGED
@@ -2,7 +2,6 @@ require 'active_support/all'
|
|
2
2
|
require 'active_support/inflector'
|
3
3
|
|
4
4
|
require_relative 'expand_condition'
|
5
|
-
require_relative 'filters/issuable_date_conditions_filter'
|
6
5
|
require_relative 'filters/merge_request_date_conditions_filter'
|
7
6
|
require_relative 'filters/votes_conditions_filter'
|
8
7
|
require_relative 'filters/forbidden_labels_conditions_filter'
|
@@ -16,6 +15,7 @@ require_relative 'policies/rule_policy'
|
|
16
15
|
require_relative 'policies/summary_policy'
|
17
16
|
require_relative 'policies_resources/rule_resources'
|
18
17
|
require_relative 'policies_resources/summary_resources'
|
18
|
+
require_relative 'api_query_builders/date_query_param_builder'
|
19
19
|
require_relative 'api_query_builders/single_query_param_builder'
|
20
20
|
require_relative 'api_query_builders/multi_query_param_builder'
|
21
21
|
require_relative 'url_builders/url_builder'
|
@@ -153,7 +153,7 @@ module Gitlab
|
|
153
153
|
end
|
154
154
|
|
155
155
|
def resources_for_rule(resource_type, rule)
|
156
|
-
puts Gitlab::Triage::UI.header("
|
156
|
+
puts Gitlab::Triage::UI.header("Gathering resources for rule: **#{rule[:name]}**", char: '-')
|
157
157
|
|
158
158
|
ExpandCondition.perform(rule_conditions(rule)) do |conditions|
|
159
159
|
# retrieving the resources for every rule is inefficient
|
@@ -193,18 +193,11 @@ module Gitlab
|
|
193
193
|
resources.select do |resource|
|
194
194
|
results = []
|
195
195
|
|
196
|
+
# rubocop:disable Style/IfUnlessModifier
|
196
197
|
if conditions[:date]
|
197
|
-
results <<
|
198
|
-
when 'issues'
|
199
|
-
Filters::IssuableDateConditionsFilter.new(resource, conditions[:date]).calculate
|
200
|
-
when 'merge_requests'
|
201
|
-
Filters::MergeRequestDateConditionsFilter.new(resource, conditions[:date]).calculate
|
202
|
-
else
|
203
|
-
raise "Unknown resource type: #{resource[:type]}"
|
204
|
-
end
|
198
|
+
results << Filters::MergeRequestDateConditionsFilter.new(resource, conditions[:date]).calculate
|
205
199
|
end
|
206
200
|
|
207
|
-
# rubocop:disable Style/IfUnlessModifier
|
208
201
|
if conditions[:upvotes]
|
209
202
|
results << Filters::VotesConditionsFilter.new(resource, conditions[:upvotes]).calculate
|
210
203
|
end
|
@@ -256,6 +249,10 @@ module Gitlab
|
|
256
249
|
condition_builders << APIQueryBuilders::SingleQueryParamBuilder.new('source_branch', conditions[:source_branch]) if conditions[:source_branch]
|
257
250
|
condition_builders << APIQueryBuilders::SingleQueryParamBuilder.new('target_branch', conditions[:target_branch]) if conditions[:target_branch]
|
258
251
|
|
252
|
+
if conditions[:date] && APIQueryBuilders::DateQueryParamBuilder.applicable?(conditions[:date])
|
253
|
+
condition_builders << APIQueryBuilders::DateQueryParamBuilder.new(conditions.delete(:date))
|
254
|
+
end
|
255
|
+
|
259
256
|
condition_builders.each do |condition_builder|
|
260
257
|
params[condition_builder.param_name] = condition_builder.param_content
|
261
258
|
end
|
@@ -1,21 +1,67 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'base_conditions_filter'
|
2
2
|
|
3
3
|
module Gitlab
|
4
4
|
module Triage
|
5
5
|
module Filters
|
6
|
-
class MergeRequestDateConditionsFilter <
|
7
|
-
ATTRIBUTES = %w[
|
6
|
+
class MergeRequestDateConditionsFilter < BaseConditionsFilter
|
7
|
+
ATTRIBUTES = %w[merged_at].freeze
|
8
|
+
CONDITIONS = %w[older_than newer_than].freeze
|
9
|
+
INTERVAL_TYPES = %w[days weeks months years].freeze
|
10
|
+
|
11
|
+
def self.allowed_attributes
|
12
|
+
self::ATTRIBUTES
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.filter_parameters
|
16
|
+
[
|
17
|
+
{
|
18
|
+
name: :attribute,
|
19
|
+
type: String,
|
20
|
+
values: allowed_attributes
|
21
|
+
},
|
22
|
+
{
|
23
|
+
name: :condition,
|
24
|
+
type: String,
|
25
|
+
values: CONDITIONS
|
26
|
+
},
|
27
|
+
{
|
28
|
+
name: :interval_type,
|
29
|
+
type: String,
|
30
|
+
values: INTERVAL_TYPES
|
31
|
+
},
|
32
|
+
{
|
33
|
+
name: :interval,
|
34
|
+
type: Numeric
|
35
|
+
}
|
36
|
+
]
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize_variables(condition)
|
40
|
+
@attribute = condition[:attribute].to_sym
|
41
|
+
@condition = condition[:condition].to_sym
|
42
|
+
@interval_type = condition[:interval_type].to_sym
|
43
|
+
@interval = condition[:interval]
|
44
|
+
end
|
8
45
|
|
9
46
|
# Guard against merge requests with no merged_at values
|
10
47
|
def resource_value
|
11
|
-
|
48
|
+
@resource[@attribute]&.to_date
|
49
|
+
end
|
50
|
+
|
51
|
+
def condition_value
|
52
|
+
@interval.public_send(@interval_type).ago.to_date # rubocop:disable GitlabSecurity/PublicSend
|
12
53
|
end
|
13
54
|
|
14
55
|
# Guard against merge requests with no merged_at values
|
15
56
|
def calculate
|
16
57
|
return false unless resource_value
|
17
58
|
|
18
|
-
|
59
|
+
case @condition
|
60
|
+
when :older_than
|
61
|
+
resource_value < condition_value
|
62
|
+
when :newer_than
|
63
|
+
resource_value > condition_value
|
64
|
+
end
|
19
65
|
end
|
20
66
|
end
|
21
67
|
end
|
@@ -10,7 +10,7 @@ module Gitlab
|
|
10
10
|
# Build an issue from several rules policies
|
11
11
|
def build_issue
|
12
12
|
action = actions[:summarize]
|
13
|
-
issues = resources.
|
13
|
+
issues = resources.map do |inner_policy_spec, inner_resources|
|
14
14
|
Policies::RulePolicy.new(
|
15
15
|
type, inner_policy_spec, inner_resources, network)
|
16
16
|
.build_issue
|
@@ -1,20 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'forwardable'
|
4
|
+
|
3
5
|
module Gitlab
|
4
6
|
module Triage
|
5
7
|
module PoliciesResources
|
6
8
|
class RuleResources
|
7
|
-
|
9
|
+
include Enumerable
|
10
|
+
extend Forwardable
|
8
11
|
|
9
12
|
def initialize(new_resources)
|
10
13
|
@resources = new_resources
|
11
14
|
end
|
12
15
|
|
13
|
-
|
14
|
-
resources.each do |resource|
|
15
|
-
yield(resource)
|
16
|
-
end
|
17
|
-
end
|
16
|
+
def_delegator :@resources, :each
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -1,20 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'forwardable'
|
4
|
+
|
3
5
|
module Gitlab
|
4
6
|
module Triage
|
5
7
|
module PoliciesResources
|
6
8
|
class SummaryResources
|
7
|
-
|
9
|
+
include Enumerable
|
10
|
+
extend Forwardable
|
8
11
|
|
9
12
|
def initialize(new_rule_to_resources)
|
10
13
|
@rule_to_resources = new_rule_to_resources
|
11
14
|
end
|
12
15
|
|
13
|
-
|
14
|
-
rule_to_resources.map do |inner_policy_spec, inner_resources|
|
15
|
-
yield(inner_policy_spec, inner_resources)
|
16
|
-
end
|
17
|
-
end
|
16
|
+
def_delegator :@rule_to_resources, :each
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Gitlab
|
2
2
|
module Triage
|
3
3
|
class ParamsValidator
|
4
|
+
InvalidParameter = Class.new(ArgumentError)
|
5
|
+
|
4
6
|
def initialize(parameter_definitions, value)
|
5
7
|
@parameter_definitions = parameter_definitions
|
6
8
|
@value = value
|
@@ -16,7 +18,7 @@ module Gitlab
|
|
16
18
|
|
17
19
|
def validate_required_parameters(value)
|
18
20
|
@parameter_definitions.each do |param|
|
19
|
-
raise
|
21
|
+
raise InvalidParameter, "#{param[:name]} is a required parameter" unless value[param[:name]]
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
@@ -24,7 +26,7 @@ module Gitlab
|
|
24
26
|
@parameter_definitions.each do |param|
|
25
27
|
if value.has_key?(param[:name])
|
26
28
|
param_types = Array(param[:type]).flatten
|
27
|
-
raise
|
29
|
+
raise InvalidParameter, "#{param[:name]} must be of type #{param[:type]}" unless param_types.any? { |type| value[param[:name]].is_a?(type) }
|
28
30
|
end
|
29
31
|
end
|
30
32
|
end
|
@@ -32,7 +34,7 @@ module Gitlab
|
|
32
34
|
def validate_parameter_content(value)
|
33
35
|
@parameter_definitions.each do |param|
|
34
36
|
if param[:values]
|
35
|
-
raise
|
37
|
+
raise InvalidParameter, "#{param[:name]} must be of one of #{param[:values].join(',')}" unless param[:values].include?(value[param[:name]])
|
36
38
|
end
|
37
39
|
end
|
38
40
|
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: 1.
|
4
|
+
version: 1.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitLab
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -136,6 +136,7 @@ files:
|
|
136
136
|
- lib/gitlab/triage/action/comment.rb
|
137
137
|
- lib/gitlab/triage/action/summarize.rb
|
138
138
|
- lib/gitlab/triage/api_query_builders/base_query_param_builder.rb
|
139
|
+
- lib/gitlab/triage/api_query_builders/date_query_param_builder.rb
|
139
140
|
- lib/gitlab/triage/api_query_builders/multi_query_param_builder.rb
|
140
141
|
- lib/gitlab/triage/api_query_builders/single_query_param_builder.rb
|
141
142
|
- lib/gitlab/triage/command_builders/base_command_builder.rb
|
@@ -158,7 +159,6 @@ files:
|
|
158
159
|
- lib/gitlab/triage/filters/author_member_conditions_filter.rb
|
159
160
|
- lib/gitlab/triage/filters/base_conditions_filter.rb
|
160
161
|
- lib/gitlab/triage/filters/forbidden_labels_conditions_filter.rb
|
161
|
-
- lib/gitlab/triage/filters/issuable_date_conditions_filter.rb
|
162
162
|
- lib/gitlab/triage/filters/member_conditions_filter.rb
|
163
163
|
- lib/gitlab/triage/filters/merge_request_date_conditions_filter.rb
|
164
164
|
- lib/gitlab/triage/filters/name_conditions_filter.rb
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require_relative 'base_conditions_filter'
|
2
|
-
|
3
|
-
module Gitlab
|
4
|
-
module Triage
|
5
|
-
module Filters
|
6
|
-
class IssuableDateConditionsFilter < BaseConditionsFilter
|
7
|
-
ATTRIBUTES = %w[updated_at created_at].freeze
|
8
|
-
CONDITIONS = %w[older_than newer_than].freeze
|
9
|
-
INTERVAL_TYPES = %w[days weeks months years].freeze
|
10
|
-
|
11
|
-
def self.allowed_attributes
|
12
|
-
self::ATTRIBUTES
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.filter_parameters
|
16
|
-
[
|
17
|
-
{
|
18
|
-
name: :attribute,
|
19
|
-
type: String,
|
20
|
-
values: allowed_attributes
|
21
|
-
},
|
22
|
-
{
|
23
|
-
name: :condition,
|
24
|
-
type: String,
|
25
|
-
values: CONDITIONS
|
26
|
-
},
|
27
|
-
{
|
28
|
-
name: :interval_type,
|
29
|
-
type: String,
|
30
|
-
values: INTERVAL_TYPES
|
31
|
-
},
|
32
|
-
{
|
33
|
-
name: :interval,
|
34
|
-
type: Numeric
|
35
|
-
}
|
36
|
-
]
|
37
|
-
end
|
38
|
-
|
39
|
-
def initialize_variables(condition)
|
40
|
-
@attribute = condition[:attribute].to_sym
|
41
|
-
@condition = condition[:condition].to_sym
|
42
|
-
@interval_type = condition[:interval_type].to_sym
|
43
|
-
@interval = condition[:interval]
|
44
|
-
end
|
45
|
-
|
46
|
-
def resource_value
|
47
|
-
@resource[@attribute].to_date
|
48
|
-
end
|
49
|
-
|
50
|
-
def condition_value
|
51
|
-
@interval.public_send(@interval_type).ago.to_date # rubocop:disable GitlabSecurity/PublicSend
|
52
|
-
end
|
53
|
-
|
54
|
-
def calculate
|
55
|
-
case @condition
|
56
|
-
when :older_than
|
57
|
-
resource_value < condition_value
|
58
|
-
when :newer_than
|
59
|
-
resource_value > condition_value
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|