gitlab-triage 1.16.0 → 1.17.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 843acca8deb39647c9cea0af3b5fbeb5bfd620c7cc00f007c1ad3c891db198f4
4
- data.tar.gz: b0445de658103d20efa09b883f98360f1569ce7c0a9e03a8928431bb05b4e61f
3
+ metadata.gz: 68a42526c02ea2ea87e7f0ca3d24ac0fb5acbdd145fb30fc2bbd79e533ce9b65
4
+ data.tar.gz: 274ba6fb0d4040abc095207eb3349c3719e57e6e37d6087af1bedaed78e8b6b5
5
5
  SHA512:
6
- metadata.gz: fa98bec626946cfb312e48b6b0a5d7a06b5b47eda6d8caca6a2775a4d55c5cb1d1ffe97334fbae673da58a1ad324c3440a68be7d8665590e2bb536f11afb05df
7
- data.tar.gz: '098cd6f58e0f2799911fed6650e0d729e9efd85721722340a5bd6215400dca2a3bef92f3d34c1e70ec306d49c1d1be15a27cb6d5d3d4ae055f406c3afb71cd35'
6
+ metadata.gz: be15fd2ef8f9e4d12116f83906905bd43a45f0ba81978f03504aa751e97ae367f92110072abb2b2c4ae2419fd01c9599d89db3469f96c871341291dfdcddc43a
7
+ data.tar.gz: e2a9669fd8373304b66d8470fe24fae0c55349c229accf9a523462ead4e63ea4f8ef3f3bc3c1d9a6765073a5d7226f8787f2feeb8a1c6c4491d6dcedbaa3af1f
data/README.md CHANGED
@@ -38,6 +38,7 @@ The format of the file is [YAML](https://en.wikipedia.org/wiki/YAML).
38
38
  project.
39
39
 
40
40
  Select which resource to add the policy to:
41
+ - `epics`
41
42
  - `issues`
42
43
  - `merge_requests`
43
44
 
@@ -47,9 +48,28 @@ For example:
47
48
 
48
49
  ```yml
49
50
  resource_rules:
51
+ epics:
52
+ rules:
53
+ - name: My epic policy
54
+ conditions:
55
+ date:
56
+ attribute: updated_at
57
+ condition: older_than
58
+ interval_type: days
59
+ interval: 5
60
+ state: opened
61
+ labels:
62
+ - None
63
+ actions:
64
+ labels:
65
+ - needs attention
66
+ mention:
67
+ - markglenfletcher
68
+ comment: |
69
+ {{author}} This epic is unlabelled after 5 days. It needs attention. Please take care of this before the end of #{2.days.from_now.strftime('%Y-%m-%d')}
50
70
  issues:
51
71
  rules:
52
- - name: My policy
72
+ - name: My issue policy
53
73
  conditions:
54
74
  date:
55
75
  attribute: updated_at
@@ -86,7 +106,7 @@ resource_rules:
86
106
  /label ~"needs attention"
87
107
  merge_requests:
88
108
  rules:
89
- - name: My policy
109
+ - name: My merge request policy
90
110
  conditions:
91
111
  state: opened
92
112
  labels:
@@ -797,8 +817,8 @@ Accepts a hash of fields.
797
817
 
798
818
  | Field | Type | Description | Required | Placeholders | Ruby expression | Default |
799
819
  | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
800
- | `title` | string | The title of the generated issue | yes | yes | no | |
801
- | `destination` | integer or string | The project ID or path to create the generated issue in | no | no | no | source project |
820
+ | `title` | string | The title of the generated issue | yes | yes | yes | |
821
+ | `destination` | integer or string | The project ID or path to create the generated issue in | no | no | no | source project |
802
822
  | `item` | string | Template representing each triaged resource | no | yes | yes | |
803
823
  | `summary` | string | The description of the generated issue | no | Only `{{title}}`, `{{items}}`, `{{type}}` | yes | |
804
824
  | `redact_confidential_resources` | boolean | Whether redact fields for confidential resources | no | no | no | true |
@@ -901,7 +921,7 @@ resource_rules:
901
921
  comment_type: thread
902
922
  comment_on_summary: |
903
923
  # {{title}}
904
-
924
+
905
925
  author: {{author}}
906
926
  summarize:
907
927
  title: |
data/bin/gitlab-triage CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'yaml'
4
4
  require_relative '../lib/gitlab/triage/option_parser'
5
5
  require_relative '../lib/gitlab/triage/engine'
6
+ require_relative '../lib/gitlab/triage/ui'
6
7
 
7
8
  options = Gitlab::Triage::OptionParser.parse(ARGV)
8
9
  options.policies_files << '.triage-policies.yml' if options.policies_files.empty?
@@ -10,7 +11,9 @@ options.policies_files << '.triage-policies.yml' if options.policies_files.empty
10
11
  options.policies_files.each do |policies_file|
11
12
  policies = HashWithIndifferentAccess.new(YAML.load_file(policies_file))
12
13
 
13
- Gitlab::Triage::Engine
14
+ policy_engine = Gitlab::Triage::Engine
14
15
  .new(policies: policies, options: options)
15
- .perform
16
+
17
+ puts Gitlab::Triage::UI.header("Executing policies from #{policies_file}.", char: '*')
18
+ policy_engine.perform
16
19
  end
@@ -57,14 +57,17 @@ module Gitlab
57
57
  end
58
58
 
59
59
  def build_post_url(resource)
60
- # POST /projects/:id/issues/:issue_iid/notes
61
- post_url = UrlBuilders::UrlBuilder.new(
60
+ url_builder_opts = {
62
61
  network_options: network.options,
63
- source_id: resource[:project_id],
62
+ source: policy.source,
63
+ source_id: resource[policy.source_id_sym],
64
64
  resource_type: policy.type,
65
65
  resource_id: resource['iid'],
66
66
  sub_resource_type: sub_resource_type
67
- ).build
67
+ }
68
+
69
+ # POST /(groups|projects)/:id/(epics|issues|merge_requests)/:iid/notes
70
+ post_url = UrlBuilders::UrlBuilder.new(url_builder_opts).build
68
71
 
69
72
  puts Gitlab::Triage::UI.debug "post_url: #{post_url}" if network.options.debug
70
73
 
@@ -1,57 +1,32 @@
1
- require_relative '../validators/params_validator'
1
+ require_relative '../param_builders/date_param_builder'
2
+ require_relative 'base_query_param_builder'
2
3
 
3
4
  module Gitlab
4
5
  module Triage
5
6
  module APIQueryBuilders
6
- class DateQueryParamBuilder
7
+ class DateQueryParamBuilder < BaseQueryParamBuilder
7
8
  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
9
 
35
10
  def self.applicable?(condition)
36
11
  ATTRIBUTES.include?(condition[:attribute].to_s)
37
12
  end
38
13
 
39
14
  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)
15
+ date_param_builder = ParamBuilders::DateParamBuilder.new(ATTRIBUTES, condition_hash)
16
+
17
+ super(build_param_name(condition_hash), date_param_builder.param_content)
45
18
  end
46
19
 
47
- def validate_condition(condition)
48
- ParamsValidator.new(self.class.filter_parameters, condition).validate!
20
+ def param_content
21
+ param_contents
49
22
  end
50
23
 
51
- def param_name
52
- prefix = attribute.sub(/_at\z/, '')
24
+ private
25
+
26
+ def build_param_name(condition_hash)
27
+ prefix = condition_hash[:attribute].to_s.sub(/_at\z/, '')
53
28
  suffix =
54
- case interval_condition
29
+ case condition_hash[:condition].to_sym
55
30
  when :older_than
56
31
  'before'
57
32
  when :newer_than
@@ -60,18 +35,6 @@ module Gitlab
60
35
 
61
36
  "#{prefix}_#{suffix}"
62
37
  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
38
  end
76
39
  end
77
40
  end
@@ -177,14 +177,23 @@ module Gitlab
177
177
  ExpandCondition.perform(rule_conditions(rule)) do |conditions|
178
178
  # retrieving the resources for every rule is inefficient
179
179
  # however, previous rules may affect those upcoming
180
- resources = network.query_api(build_get_url(resource_type, conditions))
181
- iids = resources.pluck('iid').map(&:to_s)
180
+ resources = []
181
+
182
+ if rule[:api] == 'graphql'
183
+ graphql_query = build_graphql_query(resource_type, conditions, true)
184
+ resources = graphql_network.query(graphql_query, source: source_full_path)
185
+ else
186
+ resources = network.query_api(build_get_url(resource_type, conditions))
187
+ iids = resources.pluck('iid').map(&:to_s)
188
+
189
+ graphql_query = build_graphql_query(resource_type, conditions)
190
+ graphql_resources = graphql_network.query(graphql_query, source: source_full_path, iids: iids) if graphql_query.any?
191
+
192
+ decorate_resources_with_graphql_data(resources, graphql_resources)
193
+ end
182
194
 
183
- graphql_query = build_graphql_query(resource_type, conditions)
184
- graphql_resources = graphql_network.query(graphql_query, source: source_full_path, iids: iids) if graphql_query.present?
185
195
  # In some filters/actions we want to know which resource type it is
186
196
  attach_resource_type(resources, resource_type)
187
- decorate_resources_with_graphql_data(resources, graphql_resources)
188
197
 
189
198
  puts "\n\n* Found #{resources.count} resources..."
190
199
  print "* Filtering resources..."
@@ -199,10 +208,17 @@ module Gitlab
199
208
  end
200
209
  end
201
210
 
202
- # We don't have to do this once the response will contain the type
203
- # of the resource. For now let's just attach it.
204
211
  def attach_resource_type(resources, resource_type)
205
- resources.each { |resource| resource[:type] ||= resource_type }
212
+ resources.each { |resource| resource[:type] = resource_type }
213
+ # TODO: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
214
+ # We should not overwrite the attribute here, but we need to
215
+ # fix it first. We should instead use something like
216
+ # gitlab_triage_resource_type so it won't conflict with the
217
+ # existing fields.
218
+ # And we need to retain the backward compatibility that using
219
+ # {{type}} will give us this value, rather than from the REST API,
220
+ # which will give us ISSUE from:
221
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59648
206
222
  end
207
223
 
208
224
  def decorate_resources_with_graphql_data(resources, graphql_resources)
@@ -313,9 +329,9 @@ module Gitlab
313
329
  ).build
314
330
  end
315
331
 
316
- def build_graphql_query(resource_type, conditions)
332
+ def build_graphql_query(resource_type, conditions, graphql_only = false)
317
333
  Gitlab::Triage::GraphqlQueries::QueryBuilder
318
- .new(options.source, resource_type, conditions)
334
+ .new(options.source, resource_type, conditions, graphql_only: graphql_only)
319
335
  end
320
336
 
321
337
  def source_full_path
@@ -44,11 +44,21 @@ module Gitlab
44
44
  resources
45
45
  .map { |resource| resource.deep_transform_keys(&:underscore) }
46
46
  .map(&:with_indifferent_access)
47
- .map { |resource| resource.merge(id: extract_id_from_global_id(resource[:id])) }
47
+ .map { |resource| normalize(resource) }
48
48
  end
49
49
 
50
50
  private
51
51
 
52
+ def normalize(resource)
53
+ resource
54
+ .slice(:iid, :state, :author, :merged_at, :user_notes_count, :user_discussions_count, :upvotes, :downvotes, :project_id, :web_url)
55
+ .merge(
56
+ id: extract_id_from_global_id(resource[:id]),
57
+ labels: [*resource.dig(:labels, :nodes)].pluck(:title),
58
+ assignees: [*resource.dig(:assignees, :nodes)]
59
+ )
60
+ end
61
+
52
62
  def extract_id_from_global_id(global_id)
53
63
  return if global_id.blank?
54
64
 
@@ -1,14 +1,16 @@
1
- require_relative 'user_notes_query'
2
- require_relative 'threads_query'
1
+ require_relative 'query_param_builders/base_param_builder'
2
+ require_relative 'query_param_builders/date_param_builder'
3
+ require_relative 'query_param_builders/labels_param_builder'
3
4
 
4
5
  module Gitlab
5
6
  module Triage
6
7
  module GraphqlQueries
7
8
  class QueryBuilder
8
- def initialize(source_type, resource_type, conditions)
9
+ def initialize(source_type, resource_type, conditions, graphql_only: false)
9
10
  @source_type = source_type.to_s.singularize
10
11
  @resource_type = resource_type
11
12
  @conditions = conditions
13
+ @graphql_only = graphql_only
12
14
  end
13
15
 
14
16
  def resource_path
@@ -16,30 +18,84 @@ module Gitlab
16
18
  end
17
19
 
18
20
  def query
19
- return if query_template.nil?
21
+ return if resource_fields.empty?
20
22
 
21
- format(query_template, source_type: source_type, resource_type: resource_type.to_s.camelize(:lower), group_query: group_query)
23
+ format(
24
+ BASE_QUERY,
25
+ source_type: source_type,
26
+ resource_type: resource_type.to_s.camelize(:lower),
27
+ resource_fields: resource_fields.join(' '),
28
+ resource_query: resource_query,
29
+ iids_declaration: graphql_only ? nil : ', $iids: [String!]',
30
+ iids_query: graphql_only ? nil : ', iids: $iids'
31
+ )
22
32
  end
23
33
 
24
- delegate :present?, to: :query_template
34
+ delegate :any?, to: :resource_fields
25
35
 
26
36
  private
27
37
 
28
- attr_reader :source_type, :resource_type, :conditions
38
+ attr_reader :source_type, :resource_type, :conditions, :graphql_only
29
39
 
30
- def query_template
31
- case conditions.dig(:discussions, :attribute).to_s
32
- when 'notes'
33
- UserNotesQuery
34
- when 'threads'
35
- ThreadsQuery
40
+ BASE_QUERY = <<~GRAPHQL.freeze
41
+ query($source: ID!, $after: String%{iids_declaration}) {
42
+ %{source_type}(fullPath: $source) {
43
+ id
44
+ %{resource_type}(after: $after%{iids_query}%{resource_query}) {
45
+ pageInfo {
46
+ hasNextPage
47
+ endCursor
48
+ }
49
+ nodes {
50
+ id iid title updatedAt createdAt webUrl projectId %{resource_fields}
51
+ }
52
+ }
53
+ }
54
+ }
55
+ GRAPHQL
56
+
57
+ def resource_fields
58
+ fields = []
59
+
60
+ fields << 'userNotesCount' if conditions.dig(:discussions, :attribute).to_s == 'notes'
61
+ fields << 'userDiscussionsCount' if conditions.dig(:discussions, :attribute).to_s == 'threads'
62
+
63
+ if graphql_only
64
+ fields << 'labels { nodes { title } }'
65
+ fields << 'author { id name username }'
66
+ fields << 'assignees { nodes { id name username } }' if conditions.key?(:assignee_member)
67
+ fields << 'upvotes' if conditions.dig(:upvotes, :attribute).to_s == 'upvotes'
68
+ fields << 'downvotes' if conditions.dig(:upvotes, :attribute).to_s == 'downvotes'
69
+ fields << 'mergedAt' if resource_type == 'merge_requests'
36
70
  end
71
+
72
+ fields
37
73
  end
38
74
 
39
- def group_query
40
- return if source_type != 'group'
75
+ def resource_query
76
+ condition_queries = []
77
+
78
+ condition_queries << QueryParamBuilders::BaseParamBuilder.new('includeSubgroups', true, with_quotes: false) if source_type == 'group'
79
+
80
+ conditions.each do |condition, condition_params|
81
+ condition_queries << QueryParamBuilders::DateParamBuilder.new(condition_params) if condition.to_s == 'date'
82
+ condition_queries << QueryParamBuilders::BaseParamBuilder.new('milestoneTitle', condition_params) if condition.to_s == 'milestone'
83
+ condition_queries << QueryParamBuilders::BaseParamBuilder.new('state', condition_params, with_quotes: false) if condition.to_s == 'state'
84
+
85
+ if resource_type == 'merge_requests'
86
+ condition_queries << QueryParamBuilders::LabelsParamBuilder.new('labels', condition_params) if condition.to_s == 'labels'
87
+ condition_queries << QueryParamBuilders::BaseParamBuilder.new('sourceBranch', condition_params) if condition.to_s == 'source_branch'
88
+ condition_queries << QueryParamBuilders::BaseParamBuilder.new('targetBranch', condition_params) if condition.to_s == 'target_branch'
89
+ end
90
+
91
+ if resource_type == 'issues'
92
+ condition_queries << QueryParamBuilders::LabelsParamBuilder.new('labelName', condition_params) if condition.to_s == 'labels'
93
+ end
94
+ end
41
95
 
42
- ', includeSubgroups: true'
96
+ condition_queries
97
+ .map(&:build_param)
98
+ .join
43
99
  end
44
100
  end
45
101
  end
@@ -0,0 +1,25 @@
1
+ require_relative '../../utils'
2
+
3
+ module Gitlab
4
+ module Triage
5
+ module GraphqlQueries
6
+ module QueryParamBuilders
7
+ class BaseParamBuilder
8
+ attr_reader :param_name, :param_contents, :with_quotes
9
+
10
+ def initialize(param_name, param_contents, with_quotes: true)
11
+ @param_name = param_name
12
+ @param_contents = param_contents.to_s.strip
13
+ @with_quotes = with_quotes
14
+ end
15
+
16
+ def build_param
17
+ contents = with_quotes ? Utils.graphql_quote(param_contents) : param_contents
18
+
19
+ ", #{param_name}: #{contents}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../../param_builders/date_param_builder'
2
+ require_relative 'base_param_builder'
3
+
4
+ module Gitlab
5
+ module Triage
6
+ module GraphqlQueries
7
+ module QueryParamBuilders
8
+ class DateParamBuilder < BaseParamBuilder
9
+ ATTRIBUTES = %w[updated_at created_at merged_at].freeze
10
+
11
+ def initialize(condition_hash)
12
+ date_param_builder = ParamBuilders::DateParamBuilder.new(ATTRIBUTES, condition_hash)
13
+
14
+ super(build_param_name(condition_hash), date_param_builder.param_content)
15
+ end
16
+
17
+ private
18
+
19
+ def build_param_name(condition_hash)
20
+ prefix = condition_hash[:attribute].to_s.sub(/_at\z/, '')
21
+ suffix =
22
+ case condition_hash[:condition].to_sym
23
+ when :older_than
24
+ 'Before'
25
+ when :newer_than
26
+ 'After'
27
+ end
28
+
29
+ "#{prefix}#{suffix}"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../../utils'
2
+ require_relative 'base_param_builder'
3
+
4
+ module Gitlab
5
+ module Triage
6
+ module GraphqlQueries
7
+ module QueryParamBuilders
8
+ class LabelsParamBuilder < BaseParamBuilder
9
+ def initialize(param_name, labels)
10
+ label_param_content = labels.map { |label| Utils.graphql_quote(label) }.join(', ').then { |content| "[#{content}]" }
11
+
12
+ super(param_name, label_param_content, with_quotes: false)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,58 @@
1
+ require_relative '../validators/params_validator'
2
+
3
+ module Gitlab
4
+ module Triage
5
+ module ParamBuilders
6
+ class DateParamBuilder
7
+ CONDITIONS = %w[older_than newer_than].freeze
8
+ INTERVAL_TYPES = %w[days weeks months years].freeze
9
+
10
+ def initialize(allowed_attributes, condition_hash)
11
+ @allowed_attributes = allowed_attributes
12
+ @attribute = condition_hash[:attribute].to_s
13
+ @interval_condition = condition_hash[:condition].to_sym
14
+ @interval_type = condition_hash[:interval_type]
15
+ @interval = condition_hash[:interval]
16
+
17
+ validate_condition(condition_hash)
18
+ end
19
+
20
+ def param_content
21
+ interval.public_send(interval_type).ago.to_date # rubocop:disable GitlabSecurity/PublicSend
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :allowed_attributes, :attribute, :interval_condition, :interval_type, :interval
27
+
28
+ def validate_condition(condition)
29
+ ParamsValidator.new(filter_parameters, condition).validate!
30
+ end
31
+
32
+ def filter_parameters
33
+ [
34
+ {
35
+ name: :attribute,
36
+ type: String,
37
+ values: allowed_attributes
38
+ },
39
+ {
40
+ name: :condition,
41
+ type: String,
42
+ values: CONDITIONS
43
+ },
44
+ {
45
+ name: :interval_type,
46
+ type: String,
47
+ values: INTERVAL_TYPES
48
+ },
49
+ {
50
+ name: :interval,
51
+ type: Numeric
52
+ }
53
+ ]
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -24,6 +24,24 @@ module Gitlab
24
24
  @name ||= (policy_spec[:name] || "#{type}-#{object_id}")
25
25
  end
26
26
 
27
+ def source
28
+ case type
29
+ when 'epics'
30
+ 'groups'
31
+ else
32
+ 'projects'
33
+ end
34
+ end
35
+
36
+ def source_id_sym
37
+ case type
38
+ when 'epics'
39
+ :group_id
40
+ else
41
+ :project_id
42
+ end
43
+ end
44
+
27
45
  def actions
28
46
  @actions ||= policy_spec.fetch(:actions) { {} }
29
47
  end
@@ -0,0 +1,13 @@
1
+ module Gitlab
2
+ module Triage
3
+ module Utils
4
+ module_function
5
+
6
+ def graphql_quote(string)
7
+ contents = string.to_s.gsub('"', '\\"')
8
+
9
+ %("#{contents}")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Gitlab
4
4
  module Triage
5
- VERSION = '1.16.0'
5
+ VERSION = '1.17.0'
6
6
  end
7
7
  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.16.0
4
+ version: 1.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-10 00:00:00.000000000 Z
11
+ date: 2021-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -196,8 +196,9 @@ files:
196
196
  - lib/gitlab/triage/filters/votes_conditions_filter.rb
197
197
  - lib/gitlab/triage/graphql_network.rb
198
198
  - lib/gitlab/triage/graphql_queries/query_builder.rb
199
- - lib/gitlab/triage/graphql_queries/threads_query.rb
200
- - lib/gitlab/triage/graphql_queries/user_notes_query.rb
199
+ - lib/gitlab/triage/graphql_queries/query_param_builders/base_param_builder.rb
200
+ - lib/gitlab/triage/graphql_queries/query_param_builders/date_param_builder.rb
201
+ - lib/gitlab/triage/graphql_queries/query_param_builders/labels_param_builder.rb
201
202
  - lib/gitlab/triage/limiters/base_limiter.rb
202
203
  - lib/gitlab/triage/limiters/date_field_limiter.rb
203
204
  - lib/gitlab/triage/network.rb
@@ -207,6 +208,7 @@ files:
207
208
  - lib/gitlab/triage/network_adapters/test_adapter.rb
208
209
  - lib/gitlab/triage/option_parser.rb
209
210
  - lib/gitlab/triage/options.rb
211
+ - lib/gitlab/triage/param_builders/date_param_builder.rb
210
212
  - lib/gitlab/triage/policies/base_policy.rb
211
213
  - lib/gitlab/triage/policies/rule_policy.rb
212
214
  - lib/gitlab/triage/policies/summary_policy.rb
@@ -225,6 +227,7 @@ files:
225
227
  - lib/gitlab/triage/retryable.rb
226
228
  - lib/gitlab/triage/ui.rb
227
229
  - lib/gitlab/triage/url_builders/url_builder.rb
230
+ - lib/gitlab/triage/utils.rb
228
231
  - lib/gitlab/triage/validators/limiter_validator.rb
229
232
  - lib/gitlab/triage/validators/params_validator.rb
230
233
  - lib/gitlab/triage/version.rb
@@ -249,7 +252,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
249
252
  - !ruby/object:Gem::Version
250
253
  version: '0'
251
254
  requirements: []
252
- rubygems_version: 3.1.4
255
+ rubygems_version: 3.1.6
253
256
  signing_key:
254
257
  specification_version: 4
255
258
  summary: GitLab triage automation project.
@@ -1,23 +0,0 @@
1
- module Gitlab
2
- module Triage
3
- module GraphqlQueries
4
- ThreadsQuery = <<-GRAPHQL.freeze # rubocop:disable Naming/ConstantName
5
- query($source: ID!, $after: String, $iids: [String!]) {
6
- %{source_type}(fullPath: $source) {
7
- id
8
- %{resource_type}(after: $after, iids: $iids%{group_query}) {
9
- pageInfo {
10
- hasNextPage
11
- endCursor
12
- }
13
- nodes {
14
- id
15
- userDiscussionsCount
16
- }
17
- }
18
- }
19
- }
20
- GRAPHQL
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- module Gitlab
2
- module Triage
3
- module GraphqlQueries
4
- UserNotesQuery = <<-GRAPHQL.freeze # rubocop:disable Naming/ConstantName
5
- query($source: ID!, $after: String, $iids: [String!]) {
6
- %{source_type}(fullPath: $source) {
7
- id
8
- %{resource_type}(after: $after, iids: $iids%{group_query}) {
9
- pageInfo {
10
- hasNextPage
11
- endCursor
12
- }
13
- nodes {
14
- id
15
- userNotesCount
16
- }
17
- }
18
- }
19
- }
20
- GRAPHQL
21
- end
22
- end
23
- end