payping-gitlab-triage 0.1.1

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.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +19 -0
  3. data/.gitignore +15 -0
  4. data/.gitlab/CODEOWNERS +2 -0
  5. data/.gitlab/changelog_config.yml +13 -0
  6. data/.gitlab/issue_templates/Default.md +13 -0
  7. data/.gitlab/merge_request_templates/Default.md +11 -0
  8. data/.gitlab/merge_request_templates/Release.md +13 -0
  9. data/.gitlab-ci.yml +146 -0
  10. data/.rubocop.yml +21 -0
  11. data/.rubocop_todo.yml +145 -0
  12. data/.ruby-version +1 -0
  13. data/.tool-versions +1 -0
  14. data/.yardopts +4 -0
  15. data/CONTRIBUTING.md +31 -0
  16. data/Dangerfile +5 -0
  17. data/Gemfile +15 -0
  18. data/Guardfile +70 -0
  19. data/LICENSE.md +25 -0
  20. data/README.md +1480 -0
  21. data/Rakefile +6 -0
  22. data/bin/gitlab-triage +19 -0
  23. data/gitlab-triage.gemspec +41 -0
  24. data/lib/gitlab/triage/action/base.rb +14 -0
  25. data/lib/gitlab/triage/action/comment.rb +104 -0
  26. data/lib/gitlab/triage/action/comment_on_summary.rb +83 -0
  27. data/lib/gitlab/triage/action/delete.rb +56 -0
  28. data/lib/gitlab/triage/action/issue.rb +64 -0
  29. data/lib/gitlab/triage/action/summarize.rb +82 -0
  30. data/lib/gitlab/triage/action.rb +36 -0
  31. data/lib/gitlab/triage/api_query_builders/base_query_param_builder.rb +27 -0
  32. data/lib/gitlab/triage/api_query_builders/date_query_param_builder.rb +42 -0
  33. data/lib/gitlab/triage/api_query_builders/multi_query_param_builder.rb +28 -0
  34. data/lib/gitlab/triage/api_query_builders/single_query_param_builder.rb +13 -0
  35. data/lib/gitlab/triage/command_builders/base_command_builder.rb +40 -0
  36. data/lib/gitlab/triage/command_builders/cc_command_builder.rb +19 -0
  37. data/lib/gitlab/triage/command_builders/comment_command_builder.rb +19 -0
  38. data/lib/gitlab/triage/command_builders/label_command_builder.rb +40 -0
  39. data/lib/gitlab/triage/command_builders/move_command_builder.rb +19 -0
  40. data/lib/gitlab/triage/command_builders/remove_label_command_builder.rb +15 -0
  41. data/lib/gitlab/triage/command_builders/status_command_builder.rb +23 -0
  42. data/lib/gitlab/triage/command_builders/text_content_builder.rb +138 -0
  43. data/lib/gitlab/triage/engine.rb +635 -0
  44. data/lib/gitlab/triage/entity_builders/issue_builder.rb +54 -0
  45. data/lib/gitlab/triage/entity_builders/summary_builder.rb +82 -0
  46. data/lib/gitlab/triage/errors/network.rb +11 -0
  47. data/lib/gitlab/triage/errors.rb +1 -0
  48. data/lib/gitlab/triage/expand_condition/expansion.rb +203 -0
  49. data/lib/gitlab/triage/expand_condition/list.rb +25 -0
  50. data/lib/gitlab/triage/expand_condition/sequence.rb +25 -0
  51. data/lib/gitlab/triage/expand_condition.rb +23 -0
  52. data/lib/gitlab/triage/filters/assignee_member_conditions_filter.rb +13 -0
  53. data/lib/gitlab/triage/filters/author_member_conditions_filter.rb +13 -0
  54. data/lib/gitlab/triage/filters/base_conditions_filter.rb +58 -0
  55. data/lib/gitlab/triage/filters/branch_date_filter.rb +73 -0
  56. data/lib/gitlab/triage/filters/branch_protected_filter.rb +26 -0
  57. data/lib/gitlab/triage/filters/discussions_conditions_filter.rb +58 -0
  58. data/lib/gitlab/triage/filters/issue_date_conditions_filter.rb +78 -0
  59. data/lib/gitlab/triage/filters/member_conditions_filter.rb +84 -0
  60. data/lib/gitlab/triage/filters/merge_request_date_conditions_filter.rb +13 -0
  61. data/lib/gitlab/triage/filters/name_conditions_filter.rb +26 -0
  62. data/lib/gitlab/triage/filters/no_additional_labels_conditions_filter.rb +30 -0
  63. data/lib/gitlab/triage/filters/ruby_conditions_filter.rb +33 -0
  64. data/lib/gitlab/triage/filters/votes_conditions_filter.rb +54 -0
  65. data/lib/gitlab/triage/graphql_network.rb +81 -0
  66. data/lib/gitlab/triage/graphql_queries/query_builder.rb +158 -0
  67. data/lib/gitlab/triage/graphql_queries/query_param_builders/base_param_builder.rb +30 -0
  68. data/lib/gitlab/triage/graphql_queries/query_param_builders/date_param_builder.rb +35 -0
  69. data/lib/gitlab/triage/graphql_queries/query_param_builders/labels_param_builder.rb +18 -0
  70. data/lib/gitlab/triage/limiters/base_limiter.rb +35 -0
  71. data/lib/gitlab/triage/limiters/date_field_limiter.rb +45 -0
  72. data/lib/gitlab/triage/network.rb +39 -0
  73. data/lib/gitlab/triage/network_adapters/base_adapter.rb +17 -0
  74. data/lib/gitlab/triage/network_adapters/graphql_adapter.rb +92 -0
  75. data/lib/gitlab/triage/network_adapters/httparty_adapter.rb +116 -0
  76. data/lib/gitlab/triage/network_adapters/test_adapter.rb +39 -0
  77. data/lib/gitlab/triage/option_parser.rb +105 -0
  78. data/lib/gitlab/triage/options.rb +30 -0
  79. data/lib/gitlab/triage/param_builders/date_param_builder.rb +64 -0
  80. data/lib/gitlab/triage/policies/base_policy.rb +80 -0
  81. data/lib/gitlab/triage/policies/rule_policy.rb +36 -0
  82. data/lib/gitlab/triage/policies/summary_policy.rb +29 -0
  83. data/lib/gitlab/triage/policies_resources/rule_resources.rb +11 -0
  84. data/lib/gitlab/triage/policies_resources/summary_resources.rb +11 -0
  85. data/lib/gitlab/triage/resource/base.rb +102 -0
  86. data/lib/gitlab/triage/resource/branch.rb +13 -0
  87. data/lib/gitlab/triage/resource/context.rb +47 -0
  88. data/lib/gitlab/triage/resource/epic.rb +20 -0
  89. data/lib/gitlab/triage/resource/instance_version.rb +35 -0
  90. data/lib/gitlab/triage/resource/issue.rb +52 -0
  91. data/lib/gitlab/triage/resource/label.rb +56 -0
  92. data/lib/gitlab/triage/resource/label_event.rb +48 -0
  93. data/lib/gitlab/triage/resource/linked_issue.rb +15 -0
  94. data/lib/gitlab/triage/resource/merge_request.rb +23 -0
  95. data/lib/gitlab/triage/resource/milestone.rb +98 -0
  96. data/lib/gitlab/triage/resource/shared/issuable.rb +119 -0
  97. data/lib/gitlab/triage/rest_api_network.rb +125 -0
  98. data/lib/gitlab/triage/retryable.rb +33 -0
  99. data/lib/gitlab/triage/ui.rb +23 -0
  100. data/lib/gitlab/triage/url_builders/url_builder.rb +54 -0
  101. data/lib/gitlab/triage/utils.rb +13 -0
  102. data/lib/gitlab/triage/validators/limiter_validator.rb +21 -0
  103. data/lib/gitlab/triage/validators/params_validator.rb +43 -0
  104. data/lib/gitlab/triage/version.rb +7 -0
  105. data/lib/gitlab/triage.rb +6 -0
  106. data/support/.gitlab-ci.example.yml +22 -0
  107. data/support/.triage-policies.example.yml +51 -0
  108. metadata +280 -0
@@ -0,0 +1,125 @@
1
+ require 'active_support/all'
2
+ require 'net/protocol'
3
+
4
+ require_relative 'retryable'
5
+ require_relative 'ui'
6
+ require_relative 'errors'
7
+
8
+ module Gitlab
9
+ module Triage
10
+ class RestAPINetwork
11
+ include Retryable
12
+
13
+ MINIMUM_RATE_LIMIT = 25
14
+
15
+ attr_reader :options, :adapter
16
+
17
+ def initialize(adapter)
18
+ @adapter = adapter
19
+ @options = adapter.options
20
+ @cache = {}
21
+ end
22
+
23
+ def query_api_cached(url)
24
+ @cache[url] || @cache[url] = query_api(url)
25
+ end
26
+
27
+ def query_api(url)
28
+ response = {}
29
+ resources = []
30
+
31
+ begin
32
+ print '.'
33
+ url = response.fetch(:next_page_url) { url }
34
+
35
+ response = execute_with_retry(
36
+ exception_types: [Net::ReadTimeout, Errors::Network::InternalServerError],
37
+ backoff_exceptions: Errors::Network::TooManyRequests) do
38
+ puts Gitlab::Triage::UI.debug "query_api: #{url}" if options.debug
39
+
40
+ @adapter.get(token, url)
41
+ end
42
+
43
+ results = response.delete(:results)
44
+
45
+ case results
46
+ when Array
47
+ resources.concat(results)
48
+ when Hash
49
+ resources << results
50
+ else
51
+ raise_unexpected_response(results)
52
+ end
53
+
54
+ rate_limit_debug(response) if options.debug
55
+ rate_limit_wait(response)
56
+ end while response.delete(:more_pages)
57
+
58
+ resources.map!(&:with_indifferent_access)
59
+ rescue Net::ReadTimeout
60
+ []
61
+ end
62
+
63
+ def post_api(url, body)
64
+ response = execute_with_retry(
65
+ exception_types: Net::ReadTimeout,
66
+ backoff_exceptions: Errors::Network::TooManyRequests) do
67
+ puts Gitlab::Triage::UI.debug "post_api: #{url}" if options.debug
68
+
69
+ @adapter.post(token, url, body)
70
+ end
71
+
72
+ rate_limit_debug(response) if options.debug
73
+ rate_limit_wait(response)
74
+
75
+ results = response.delete(:results)
76
+
77
+ case results
78
+ when Hash
79
+ results.with_indifferent_access
80
+ else
81
+ raise_unexpected_response(results)
82
+ end
83
+ rescue Net::ReadTimeout
84
+ {}
85
+ end
86
+
87
+ def delete_api(url)
88
+ response = execute_with_retry(
89
+ exception_types: Net::ReadTimeout,
90
+ backoff_exceptions: Errors::Network::TooManyRequests) do
91
+ puts Gitlab::Triage::UI.debug "delete_api: #{url}" if options.debug
92
+
93
+ @adapter.delete(token, url)
94
+ end
95
+
96
+ rate_limit_debug(response) if options.debug
97
+ rate_limit_wait(response)
98
+ rescue Net::ReadTimeout
99
+ {}
100
+ end
101
+
102
+ private
103
+
104
+ def token
105
+ options.token
106
+ end
107
+
108
+ def rate_limit_debug(response)
109
+ rate_limit_infos = "Rate limit remaining: #{response[:ratelimit_remaining]} (reset at #{response[:ratelimit_reset_at]})"
110
+ puts Gitlab::Triage::UI.debug "rate_limit_infos: #{rate_limit_infos}"
111
+ end
112
+
113
+ def rate_limit_wait(response)
114
+ return unless response.delete(:ratelimit_remaining) < MINIMUM_RATE_LIMIT
115
+
116
+ puts Gitlab::Triage::UI.debug "Rate limit almost exceeded, sleeping for #{response[:ratelimit_reset_at] - Time.now} seconds" if options.debug
117
+ sleep(1) until Time.now >= response[:ratelimit_reset_at]
118
+ end
119
+
120
+ def raise_unexpected_response(results)
121
+ raise Errors::Network::UnexpectedResponse, "Unexpected response: #{results.inspect}"
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,33 @@
1
+ module Gitlab
2
+ module Triage
3
+ module Retryable
4
+ MAX_RETRIES = 3
5
+ BACK_OFF_SECONDS = 10
6
+
7
+ attr_accessor :tries
8
+
9
+ def execute_with_retry(exception_types: [StandardError], backoff_exceptions: [])
10
+ @tries = 0
11
+
12
+ until maximum_retries_reached?
13
+ begin
14
+ @tries += 1
15
+ return yield
16
+ rescue *exception_types
17
+ raise if maximum_retries_reached?
18
+ rescue *backoff_exceptions
19
+ raise if maximum_retries_reached?
20
+
21
+ sleep(BACK_OFF_SECONDS)
22
+ end
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def maximum_retries_reached?
29
+ tries == MAX_RETRIES
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ module Gitlab
2
+ module Triage
3
+ class UI
4
+ def self.header(text, char: '=')
5
+ header = char * text.size
6
+
7
+ [header, text, header, nil].join("\n")
8
+ end
9
+
10
+ def self.debug(text)
11
+ "[DEBUG] #{text}"
12
+ end
13
+
14
+ def self.warn(text)
15
+ "[WARNING] #{text}"
16
+ end
17
+
18
+ def self.error(text)
19
+ "[ERROR] #{text}"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,54 @@
1
+ module Gitlab
2
+ module Triage
3
+ module UrlBuilders
4
+ class UrlBuilder
5
+ def initialize(options)
6
+ @network_options = options.fetch(:network_options)
7
+ @host_url = @network_options.host_url
8
+ @api_version = @network_options.api_version
9
+ @all = options.fetch(:all, false)
10
+ @source = options.fetch(:source, 'projects')
11
+ @source_id = options.fetch(:source_id)
12
+ @resource_type = options.fetch(:resource_type, nil)
13
+ @sub_resource_type = options.fetch(:sub_resource_type, nil)
14
+ @resource_id = options.fetch(:resource_id, nil)
15
+ @params = options.fetch(:params, [])
16
+
17
+ @params = @params.merge(scope: :all) if @all
18
+ end
19
+
20
+ def build
21
+ url = base_url
22
+ url << "/#{percent_encode(@resource_id.to_s)}" if @resource_id
23
+ url << "/#{@sub_resource_type}" if @sub_resource_type
24
+ url << params_string if @params
25
+ url
26
+ end
27
+
28
+ private
29
+
30
+ def host_with_api_url
31
+ "#{@host_url}/api/#{@api_version}"
32
+ end
33
+
34
+ def base_url
35
+ url = host_with_api_url
36
+ url << "/#{@source}/#{percent_encode(@source_id.to_s)}" unless @all
37
+ url << "/repository" if @resource_type == 'branches'
38
+ url << "/#{@resource_type}" if @resource_type
39
+ url
40
+ end
41
+
42
+ def params_string
43
+ "?" << @params.map do |k, v|
44
+ "#{percent_encode(k.to_s)}=#{percent_encode(v.to_s)}"
45
+ end.join("&")
46
+ end
47
+
48
+ def percent_encode(str)
49
+ CGI.escape(str).gsub('+', '%20')
50
+ end
51
+ end
52
+ end
53
+ end
54
+ 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
@@ -0,0 +1,21 @@
1
+ require_relative 'params_validator'
2
+
3
+ module Gitlab
4
+ module Triage
5
+ class LimiterValidator < ParamsValidator
6
+ private
7
+
8
+ def params_limiter_names
9
+ @parameter_definitions.map do |param|
10
+ param[:name]
11
+ end
12
+ end
13
+
14
+ def validate_required_parameters(value)
15
+ return if value.keys.one? { |key| params_limiter_names.include?(key.to_sym) }
16
+
17
+ raise ArgumentError, "For the limits field, please specify one of: `#{params_limiter_names.join('`, `')}`"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,43 @@
1
+ module Gitlab
2
+ module Triage
3
+ class ParamsValidator
4
+ InvalidParameter = Class.new(ArgumentError)
5
+
6
+ def initialize(parameter_definitions, value)
7
+ @parameter_definitions = parameter_definitions
8
+ @value = value
9
+ end
10
+
11
+ def validate!
12
+ validate_required_parameters(@value)
13
+ validate_parameter_types(@value)
14
+ validate_parameter_content(@value)
15
+ end
16
+
17
+ private
18
+
19
+ def validate_required_parameters(value)
20
+ @parameter_definitions.each do |param|
21
+ raise InvalidParameter, "#{param[:name]} is a required parameter" unless value[param[:name]]
22
+ end
23
+ end
24
+
25
+ def validate_parameter_types(value)
26
+ @parameter_definitions.each do |param|
27
+ if value.has_key?(param[:name])
28
+ param_types = Array(param[:type]).flatten
29
+ raise InvalidParameter, "#{param[:name]} must be of type #{param[:type]}" unless param_types.any? { |type| value[param[:name]].is_a?(type) }
30
+ end
31
+ end
32
+ end
33
+
34
+ def validate_parameter_content(value)
35
+ @parameter_definitions.each do |param|
36
+ if param[:values]
37
+ raise InvalidParameter, "#{param[:name]} must be one of #{param[:values].join(',')}" unless param[:values].include?(value[param[:name]])
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gitlab
4
+ module Triage
5
+ VERSION = '0.1.1'
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ require 'gitlab/triage/version'
2
+
3
+ module Gitlab
4
+ module Triage
5
+ end
6
+ end
@@ -0,0 +1,22 @@
1
+ image: ruby:2.7
2
+
3
+ stages:
4
+ - triage
5
+
6
+ dry-run:triage:
7
+ stage: triage
8
+ script:
9
+ - gem install gitlab-triage
10
+ - gitlab-triage --help
11
+ - gitlab-triage --dry-run --token $GITLAB_API_TOKEN --host-url $CI_SERVER_URL --source projects --source-id $CI_PROJECT_PATH
12
+ when: manual
13
+ except:
14
+ - schedules
15
+
16
+ run:triage:
17
+ stage: triage
18
+ script:
19
+ - gem install gitlab-triage
20
+ - gitlab-triage --token $GITLAB_API_TOKEN --host-url $CI_SERVER_URL --source projects --source-id $CI_PROJECT_PATH
21
+ only:
22
+ - schedules
@@ -0,0 +1,51 @@
1
+ resource_rules:
2
+ issues:
3
+ rules:
4
+ - name: Comment 1 week old, unlabelled issues
5
+ conditions:
6
+ date:
7
+ attribute: created_at
8
+ condition: older_than
9
+ interval_type: weeks
10
+ interval: 1
11
+ labels:
12
+ - None
13
+ state: opened
14
+ actions:
15
+ comment: |
16
+ This issue has been open for one week and is unlabelled
17
+ summaries:
18
+ - name: Newest and oldest issues summary
19
+ actions:
20
+ summarize:
21
+ title: "Newest and oldest {{type}} summary"
22
+ summary: |
23
+ Please triage the following {{type}}:
24
+
25
+ {{items}}
26
+
27
+ Please take care of them before the end of #{7.days.from_now.strftime('%Y-%m-%d')}
28
+
29
+ /label ~"needs attention"
30
+ rules:
31
+ - name: New issues
32
+ conditions:
33
+ state: opened
34
+ limits:
35
+ most_recent: 2
36
+ actions:
37
+ summarize:
38
+ item: "- [ ] [{{title}}]({{web_url}}) {{labels}}"
39
+ summary: "Please triage the following new {{type}}:\n\n{{items}}"
40
+ - name: Old issues
41
+ conditions:
42
+ state: opened
43
+ limits:
44
+ oldest: 2
45
+ actions:
46
+ summarize:
47
+ item: "- [ ] [{{title}}]({{web_url}}) {{labels}}"
48
+ summary: "Please triage the following old {{type}}:\n\n{{items}}"
49
+ merge_requests:
50
+ rules:
51
+ []
metadata ADDED
@@ -0,0 +1,280 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: payping-gitlab-triage
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - GitLab
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-01-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '5.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: globalid
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: graphql-client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.16'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.16'
55
+ - !ruby/object:Gem::Dependency
56
+ name: httparty
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.17'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.17'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: gitlab-styles
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '10.2'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '10.2'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.8'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.8'
125
+ - !ruby/object:Gem::Dependency
126
+ name: webmock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.4'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.4'
139
+ description:
140
+ email:
141
+ - gitlab_rubygems@gitlab.com
142
+ executables:
143
+ - gitlab-triage
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".codeclimate.yml"
148
+ - ".gitignore"
149
+ - ".gitlab-ci.yml"
150
+ - ".gitlab/CODEOWNERS"
151
+ - ".gitlab/changelog_config.yml"
152
+ - ".gitlab/issue_templates/Default.md"
153
+ - ".gitlab/merge_request_templates/Default.md"
154
+ - ".gitlab/merge_request_templates/Release.md"
155
+ - ".rubocop.yml"
156
+ - ".rubocop_todo.yml"
157
+ - ".ruby-version"
158
+ - ".tool-versions"
159
+ - ".yardopts"
160
+ - CONTRIBUTING.md
161
+ - Dangerfile
162
+ - Gemfile
163
+ - Guardfile
164
+ - LICENSE.md
165
+ - README.md
166
+ - Rakefile
167
+ - bin/gitlab-triage
168
+ - gitlab-triage.gemspec
169
+ - lib/gitlab/triage.rb
170
+ - lib/gitlab/triage/action.rb
171
+ - lib/gitlab/triage/action/base.rb
172
+ - lib/gitlab/triage/action/comment.rb
173
+ - lib/gitlab/triage/action/comment_on_summary.rb
174
+ - lib/gitlab/triage/action/delete.rb
175
+ - lib/gitlab/triage/action/issue.rb
176
+ - lib/gitlab/triage/action/summarize.rb
177
+ - lib/gitlab/triage/api_query_builders/base_query_param_builder.rb
178
+ - lib/gitlab/triage/api_query_builders/date_query_param_builder.rb
179
+ - lib/gitlab/triage/api_query_builders/multi_query_param_builder.rb
180
+ - lib/gitlab/triage/api_query_builders/single_query_param_builder.rb
181
+ - lib/gitlab/triage/command_builders/base_command_builder.rb
182
+ - lib/gitlab/triage/command_builders/cc_command_builder.rb
183
+ - lib/gitlab/triage/command_builders/comment_command_builder.rb
184
+ - lib/gitlab/triage/command_builders/label_command_builder.rb
185
+ - lib/gitlab/triage/command_builders/move_command_builder.rb
186
+ - lib/gitlab/triage/command_builders/remove_label_command_builder.rb
187
+ - lib/gitlab/triage/command_builders/status_command_builder.rb
188
+ - lib/gitlab/triage/command_builders/text_content_builder.rb
189
+ - lib/gitlab/triage/engine.rb
190
+ - lib/gitlab/triage/entity_builders/issue_builder.rb
191
+ - lib/gitlab/triage/entity_builders/summary_builder.rb
192
+ - lib/gitlab/triage/errors.rb
193
+ - lib/gitlab/triage/errors/network.rb
194
+ - lib/gitlab/triage/expand_condition.rb
195
+ - lib/gitlab/triage/expand_condition/expansion.rb
196
+ - lib/gitlab/triage/expand_condition/list.rb
197
+ - lib/gitlab/triage/expand_condition/sequence.rb
198
+ - lib/gitlab/triage/filters/assignee_member_conditions_filter.rb
199
+ - lib/gitlab/triage/filters/author_member_conditions_filter.rb
200
+ - lib/gitlab/triage/filters/base_conditions_filter.rb
201
+ - lib/gitlab/triage/filters/branch_date_filter.rb
202
+ - lib/gitlab/triage/filters/branch_protected_filter.rb
203
+ - lib/gitlab/triage/filters/discussions_conditions_filter.rb
204
+ - lib/gitlab/triage/filters/issue_date_conditions_filter.rb
205
+ - lib/gitlab/triage/filters/member_conditions_filter.rb
206
+ - lib/gitlab/triage/filters/merge_request_date_conditions_filter.rb
207
+ - lib/gitlab/triage/filters/name_conditions_filter.rb
208
+ - lib/gitlab/triage/filters/no_additional_labels_conditions_filter.rb
209
+ - lib/gitlab/triage/filters/ruby_conditions_filter.rb
210
+ - lib/gitlab/triage/filters/votes_conditions_filter.rb
211
+ - lib/gitlab/triage/graphql_network.rb
212
+ - lib/gitlab/triage/graphql_queries/query_builder.rb
213
+ - lib/gitlab/triage/graphql_queries/query_param_builders/base_param_builder.rb
214
+ - lib/gitlab/triage/graphql_queries/query_param_builders/date_param_builder.rb
215
+ - lib/gitlab/triage/graphql_queries/query_param_builders/labels_param_builder.rb
216
+ - lib/gitlab/triage/limiters/base_limiter.rb
217
+ - lib/gitlab/triage/limiters/date_field_limiter.rb
218
+ - lib/gitlab/triage/network.rb
219
+ - lib/gitlab/triage/network_adapters/base_adapter.rb
220
+ - lib/gitlab/triage/network_adapters/graphql_adapter.rb
221
+ - lib/gitlab/triage/network_adapters/httparty_adapter.rb
222
+ - lib/gitlab/triage/network_adapters/test_adapter.rb
223
+ - lib/gitlab/triage/option_parser.rb
224
+ - lib/gitlab/triage/options.rb
225
+ - lib/gitlab/triage/param_builders/date_param_builder.rb
226
+ - lib/gitlab/triage/policies/base_policy.rb
227
+ - lib/gitlab/triage/policies/rule_policy.rb
228
+ - lib/gitlab/triage/policies/summary_policy.rb
229
+ - lib/gitlab/triage/policies_resources/rule_resources.rb
230
+ - lib/gitlab/triage/policies_resources/summary_resources.rb
231
+ - lib/gitlab/triage/resource/base.rb
232
+ - lib/gitlab/triage/resource/branch.rb
233
+ - lib/gitlab/triage/resource/context.rb
234
+ - lib/gitlab/triage/resource/epic.rb
235
+ - lib/gitlab/triage/resource/instance_version.rb
236
+ - lib/gitlab/triage/resource/issue.rb
237
+ - lib/gitlab/triage/resource/label.rb
238
+ - lib/gitlab/triage/resource/label_event.rb
239
+ - lib/gitlab/triage/resource/linked_issue.rb
240
+ - lib/gitlab/triage/resource/merge_request.rb
241
+ - lib/gitlab/triage/resource/milestone.rb
242
+ - lib/gitlab/triage/resource/shared/issuable.rb
243
+ - lib/gitlab/triage/rest_api_network.rb
244
+ - lib/gitlab/triage/retryable.rb
245
+ - lib/gitlab/triage/ui.rb
246
+ - lib/gitlab/triage/url_builders/url_builder.rb
247
+ - lib/gitlab/triage/utils.rb
248
+ - lib/gitlab/triage/validators/limiter_validator.rb
249
+ - lib/gitlab/triage/validators/params_validator.rb
250
+ - lib/gitlab/triage/version.rb
251
+ - support/.gitlab-ci.example.yml
252
+ - support/.triage-policies.example.yml
253
+ homepage: https://gitlab.com/gitlab-org/ruby/gems/gitlab-triage
254
+ licenses:
255
+ - MIT
256
+ metadata:
257
+ allowed_push_host: https://rubygems.org
258
+ homepage_uri: https://gitlab.com/gitlab-org/ruby/gems/gitlab-triage
259
+ source_code_uri: https://gitlab.com/gitlab-org/ruby/gems/gitlab-triage
260
+ changelog_uri: https://gitlab.com/gitlab-org/ruby/gems/gitlab-triage/-/releases
261
+ post_install_message:
262
+ rdoc_options: []
263
+ require_paths:
264
+ - lib
265
+ required_ruby_version: !ruby/object:Gem::Requirement
266
+ requirements:
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ version: 2.5.0
270
+ required_rubygems_version: !ruby/object:Gem::Requirement
271
+ requirements:
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: '0'
275
+ requirements: []
276
+ rubygems_version: 3.3.5
277
+ signing_key:
278
+ specification_version: 4
279
+ summary: GitLab triage automation project.
280
+ test_files: []