dri 0.1.1 → 0.2.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: e352230c90233014a517cb67addf17a051a2b2eb05c93f0e88bcaab45c40e723
4
- data.tar.gz: 51bbd9e7f07e20668fa8b6161e41b3995ae47b8d1866be6ad81fd07fc0c37bf1
3
+ metadata.gz: 3ae68ce5f20bab397121604708b813e8f488316559f82392a389f1750e57c89c
4
+ data.tar.gz: 30b16b0291beb7e18cc74acb9c54100c869544bba883c79729f577c8bda5dd7f
5
5
  SHA512:
6
- metadata.gz: 00b8bcfe9d1d884523f2f5d3963cfa8ab3b7f33f04f819fd17b253838bf899d67394de91524d3dfa40ff692b48c5768f039dc8b6ed44abbcd5faa14b1606eb60
7
- data.tar.gz: 58a9c606cd89a5282f25b9fe89fcf16bcf9c70d53df868876884d10149e34786de5c3341d216dd227bbb3d44e16649e26032117c1f12e33e61de52168fd54ebe
6
+ metadata.gz: ad35cf45172de050ecd86c376527abc98ba535f9ad97f54f84f7be3875882c46ae897039d26a4c9f4db3c7df598608c81e8613518b7c7eeb44b7903610899406
7
+ data.tar.gz: a790667c5528fc3ad94f610b2add55b36a4fb5efd9bad3e8e10a78d44e58a8140721d4717a75def60ca829715389bebf001704a38a1a8127e1e6872228dd0fe6
data/.gitignore CHANGED
@@ -6,9 +6,11 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /vendor/bundle
9
10
 
10
11
  # rspec failure tracking
11
12
  .rspec_status
12
13
 
13
14
  .dri_profile.yml
14
- handover_reports/*
15
+ handover_reports/*
16
+ .idea/
data/.gitlab-ci.yml CHANGED
@@ -1,28 +1,47 @@
1
- image: ruby:3.0.2
1
+ .job_base:
2
+ image: ruby:2.7
3
+ variables:
4
+ BUNDLE_PATH: vendor/bundle
5
+ BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES: "true"
6
+ before_script:
7
+ - gem install bundler -v 2.3.9 --no-document
8
+ - bundle install
9
+ cache:
10
+ key:
11
+ files:
12
+ - dri.gemspec
13
+ - Gemfile.lock
14
+ paths:
15
+ - vendor/bundle
16
+ rules:
17
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
18
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
19
+
20
+ include:
21
+ - project: gitlab-org/quality/pipeline-common
22
+ ref: 0.3.4
23
+ file:
24
+ - /ci/gem-release.yml
2
25
 
3
26
  stages:
4
27
  - build
5
28
  - test
6
29
  - deploy
7
30
 
8
- before_script:
9
- - gem install bundler:2.2.22
10
- - bundle install
11
-
12
31
  build_gem:
13
32
  stage: build
33
+ extends: .job_base
14
34
  script:
15
35
  - gem build
16
36
 
17
- rspec:
37
+ rubocop:
18
38
  stage: test
39
+ extends: .job_base
19
40
  script:
20
- - bundle exec rspec
41
+ - bundle exec rubocop --color
21
42
 
22
- deploy:
23
- stage: deploy
43
+ rspec:
44
+ stage: test
45
+ extends: .job_base
24
46
  script:
25
- - gem push dri*.gem
26
- rules:
27
- - if: '$CI_COMMIT_TAG'
28
- when: always
47
+ - bundle exec rspec --color
data/.rubocop.yml ADDED
@@ -0,0 +1,53 @@
1
+ inherit_gem:
2
+ gitlab-styles:
3
+ - rubocop-all.yml
4
+ - rubocop-gemspec.yml
5
+ - rubocop-lint.yml
6
+ - rubocop-naming.yml
7
+ - rubocop-performance.yml
8
+ - rubocop-rspec.yml
9
+ - rubocop-security.yml
10
+ - rubocop-style.yml
11
+
12
+ AllCops:
13
+ TargetRubyVersion: 2.7
14
+
15
+ RSpec/MultipleMemoizedHelpers:
16
+ Max: 25
17
+ AllowSubject: true
18
+
19
+ CodeReuse/ActiveRecord:
20
+ Exclude:
21
+ - spec/**/*.rb
22
+
23
+ Metrics/AbcSize:
24
+ Enabled: true
25
+ Max: 30
26
+
27
+ Metrics/BlockLength:
28
+ Enabled: true
29
+ Exclude:
30
+ - spec/**/*.rb
31
+ - dri.gemspec
32
+
33
+ Metrics/MethodLength:
34
+ Enabled: true
35
+ Max: 30
36
+
37
+ Layout/BeginEndAlignment:
38
+ Enabled: true
39
+
40
+ Layout/EmptyLinesAroundAttributeAccessor:
41
+ Enabled: true
42
+
43
+ Layout/SpaceAroundMethodCallOperator:
44
+ Enabled: true
45
+
46
+ Lint/HashCompareByIdentity:
47
+ Enabled: true
48
+
49
+ Lint/RedundantSafeNavigation:
50
+ Enabled: true
51
+
52
+ Style/ClassEqualityComparison:
53
+ Enabled: true
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.7.5
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.0.2
data/Gemfile CHANGED
@@ -1,7 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in dri.gemspec
4
6
  gemspec
5
-
6
- gem "rake", "~> 12.0"
7
- gem "rspec", "~> 3.0"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dri (0.1.0)
4
+ dri (0.1.3)
5
5
  httparty (~> 0.20.0)
6
6
  json (~> 2.6.1)
7
7
  markdown-tables (~> 1.1.1)
@@ -19,39 +19,88 @@ PATH
19
19
  GEM
20
20
  remote: https://rubygems.org/
21
21
  specs:
22
+ activesupport (7.0.2.3)
23
+ concurrent-ruby (~> 1.0, >= 1.0.2)
24
+ i18n (>= 1.6, < 2)
25
+ minitest (>= 5.1)
26
+ tzinfo (~> 2.0)
22
27
  addressable (2.8.0)
23
28
  public_suffix (>= 2.0.2, < 5.0)
29
+ ast (2.4.2)
30
+ concurrent-ruby (1.1.10)
24
31
  crack (0.4.5)
25
32
  rexml
26
33
  diff-lcs (1.5.0)
34
+ gitlab-styles (7.0.0)
35
+ rubocop (~> 0.91, >= 0.91.1)
36
+ rubocop-gitlab-security (~> 0.1.1)
37
+ rubocop-graphql (~> 0.10)
38
+ rubocop-performance (~> 1.9.2)
39
+ rubocop-rails (~> 2.9)
40
+ rubocop-rspec (~> 1.44)
27
41
  hashdiff (1.0.1)
28
42
  httparty (0.20.0)
29
43
  mime-types (~> 3.0)
30
44
  multi_xml (>= 0.5.2)
45
+ i18n (1.10.0)
46
+ concurrent-ruby (~> 1.0)
31
47
  json (2.6.1)
32
48
  markdown-tables (1.1.1)
33
49
  mime-types (3.4.1)
34
50
  mime-types-data (~> 3.2015)
35
51
  mime-types-data (3.2022.0105)
52
+ minitest (5.15.0)
36
53
  multi_xml (0.6.0)
54
+ parallel (1.22.1)
55
+ parser (3.1.1.0)
56
+ ast (~> 2.4.1)
37
57
  pastel (0.8.0)
38
58
  tty-color (~> 0.5)
39
59
  public_suffix (4.0.6)
40
- rake (12.3.3)
60
+ rack (2.2.3)
61
+ rainbow (3.1.1)
62
+ rake (13.0.6)
63
+ regexp_parser (2.2.1)
41
64
  rexml (3.2.5)
42
- rspec (3.11.0)
43
- rspec-core (~> 3.11.0)
44
- rspec-expectations (~> 3.11.0)
45
- rspec-mocks (~> 3.11.0)
46
- rspec-core (3.11.0)
47
- rspec-support (~> 3.11.0)
48
- rspec-expectations (3.11.0)
65
+ rspec (3.10.0)
66
+ rspec-core (~> 3.10.0)
67
+ rspec-expectations (~> 3.10.0)
68
+ rspec-mocks (~> 3.10.0)
69
+ rspec-core (3.10.2)
70
+ rspec-support (~> 3.10.0)
71
+ rspec-expectations (3.10.2)
49
72
  diff-lcs (>= 1.2.0, < 2.0)
50
- rspec-support (~> 3.11.0)
51
- rspec-mocks (3.11.0)
73
+ rspec-support (~> 3.10.0)
74
+ rspec-mocks (3.10.3)
52
75
  diff-lcs (>= 1.2.0, < 2.0)
53
- rspec-support (~> 3.11.0)
54
- rspec-support (3.11.0)
76
+ rspec-support (~> 3.10.0)
77
+ rspec-support (3.10.3)
78
+ rubocop (0.93.1)
79
+ parallel (~> 1.10)
80
+ parser (>= 2.7.1.5)
81
+ rainbow (>= 2.2.2, < 4.0)
82
+ regexp_parser (>= 1.8)
83
+ rexml
84
+ rubocop-ast (>= 0.6.0)
85
+ ruby-progressbar (~> 1.7)
86
+ unicode-display_width (>= 1.4.0, < 2.0)
87
+ rubocop-ast (1.16.0)
88
+ parser (>= 3.1.1.0)
89
+ rubocop-gitlab-security (0.1.1)
90
+ rubocop (>= 0.51)
91
+ rubocop-graphql (0.14.2)
92
+ rubocop (>= 0.87, < 2)
93
+ rubocop-performance (1.9.2)
94
+ rubocop (>= 0.90.0, < 2.0)
95
+ rubocop-ast (>= 0.4.0)
96
+ rubocop-rails (2.9.1)
97
+ activesupport (>= 4.2.0)
98
+ rack (>= 1.1)
99
+ rubocop (>= 0.90.0, < 2.0)
100
+ rubocop-rspec (1.44.1)
101
+ rubocop (~> 0.87)
102
+ rubocop-ast (>= 0.7.1)
103
+ ruby-progressbar (1.11.0)
55
104
  strings (0.2.1)
56
105
  strings-ansi (~> 0.2)
57
106
  unicode-display_width (>= 1.5, < 3.0)
@@ -85,7 +134,9 @@ GEM
85
134
  pastel (~> 0.8)
86
135
  strings (~> 0.2.0)
87
136
  tty-screen (~> 0.8)
88
- unicode-display_width (2.1.0)
137
+ tzinfo (2.0.4)
138
+ concurrent-ruby (~> 1.0)
139
+ unicode-display_width (1.8.0)
89
140
  unicode_utils (1.4.0)
90
141
  webmock (3.14.0)
91
142
  addressable (>= 2.8.0)
@@ -98,10 +149,11 @@ PLATFORMS
98
149
 
99
150
  DEPENDENCIES
100
151
  dri!
101
- rake (~> 12.0)
102
- rspec (~> 3.0)
152
+ gitlab-styles (~> 7.0.0)
153
+ rake
154
+ rspec (~> 3.10.0)
103
155
  timecop (~> 0.9.1)
104
156
  webmock (~> 3.5)
105
157
 
106
158
  BUNDLED WITH
107
- 2.1.4
159
+ 2.3.9
data/README.md CHANGED
@@ -56,6 +56,9 @@ $ dri profile
56
56
  - failures
57
57
  - testcases
58
58
  - triaged
59
+ - quarantines
60
+ - dequarantines
61
+ - featureflags
59
62
  - [4. publish](#4-publish)
60
63
  - report
61
64
  - [5. rm](#5-rm)
@@ -107,6 +110,25 @@ $ dri fetch triaged
107
110
 
108
111
  Fetches triaged failures which use the triage emoji specified in `dri profile`.
109
112
 
113
+ ```shell
114
+ $ dri fetch quarantines
115
+ ```
116
+
117
+ Fetches open quarantine Merge Requests to be reviewed
118
+
119
+ ```shell
120
+ $ dri fetch dequarantines
121
+ ```
122
+
123
+ Fetches open dequarantine Merge Requests to be reviewed
124
+
125
+ ```shell
126
+ $ dri fetch featureflags
127
+ ```
128
+
129
+ Fetches a list of today's feature flag changes, including the date and time in UTC of when the change occurred as well as a link to the corresponding issue from the feature-flag-log project.
130
+ Results are organized by environment (production, staging, staging ref and preprod).
131
+
110
132
  #### 4. publish
111
133
 
112
134
  ```shell
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "bundler/setup"
4
5
  require "dri"
data/dri.gemspec CHANGED
@@ -1,41 +1,44 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'lib/dri/version'
2
4
 
3
5
  Gem::Specification.new do |spec|
4
- spec.name = "dri"
5
- spec.license = "MIT"
6
+ spec.name = 'dri'
7
+ spec.license = 'MIT'
6
8
  spec.version = Dri::VERSION
7
- spec.authors = ["GitLab Quality"]
8
- spec.email = ["quality+dri@gitlab.com"]
9
+ spec.authors = ['GitLab Quality']
10
+ spec.email = ['quality+dri@gitlab.com']
9
11
 
10
- spec.summary = %q{CLI app to help triage GitLab QA pipelines}
12
+ spec.summary = 'CLI app to help triage GitLab QA pipelines'
11
13
  spec.homepage = 'https://gitlab.com/gitlab-org/quality/dri'
12
- spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
14
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
13
15
 
14
16
  # Specify which files should be added to the gem when it is released.
15
17
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
16
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
18
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
17
19
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
20
  end
19
- spec.bindir = "exe"
21
+ spec.bindir = 'exe'
20
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
- spec.require_paths = ["lib"]
23
+ spec.require_paths = ['lib']
22
24
 
23
- spec.add_dependency "tty-config", "~> 0.4.0"
24
- spec.add_dependency "tty-font", "~> 0.5"
25
- spec.add_dependency "tty-prompt", "~> 0.23.1"
26
- spec.add_dependency "tty-spinner", "~> 0.9"
27
- spec.add_dependency "tty-table", "~> 0.12.0"
25
+ spec.add_dependency 'httparty', '~> 0.20.0'
26
+ spec.add_dependency 'json', '~> 2.6.1'
27
+ spec.add_dependency 'markdown-tables', '~> 1.1.1'
28
+ spec.add_dependency 'pastel', '~> 0.8.0'
29
+ spec.add_dependency 'thor', '~> 1.0.1'
28
30
  spec.add_dependency 'tty-box', '~> 0.7.0'
31
+ spec.add_dependency 'tty-config', '~> 0.4.0'
32
+ spec.add_dependency 'tty-editor', '~> 0.6'
33
+ spec.add_dependency 'tty-font', '~> 0.5'
29
34
  spec.add_dependency 'tty-logger', '~> 0.6.0'
30
- spec.add_dependency "tty-editor", "~> 0.6"
31
- spec.add_dependency "pastel", "~> 0.8.0"
32
- spec.add_dependency "thor", "~> 1.0.1"
33
- spec.add_dependency "markdown-tables", "~> 1.1.1"
34
- spec.add_dependency 'json', '~> 2.6.1'
35
- spec.add_dependency 'httparty', '~> 0.20.0'
35
+ spec.add_dependency 'tty-prompt', '~> 0.23.1'
36
+ spec.add_dependency 'tty-spinner', '~> 0.9'
37
+ spec.add_dependency 'tty-table', '~> 0.12.0'
36
38
 
37
- spec.add_development_dependency "rake"
39
+ spec.add_development_dependency 'gitlab-styles', '~> 7.0.0'
40
+ spec.add_development_dependency 'rake'
38
41
  spec.add_development_dependency 'rspec', '~> 3.10.0'
39
- spec.add_development_dependency 'webmock', '~> 3.5'
40
42
  spec.add_development_dependency "timecop", "~> 0.9.1"
43
+ spec.add_development_dependency 'webmock', '~> 3.5'
41
44
  end
data/exe/dri CHANGED
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  lib_path = File.expand_path('../lib', __dir__)
5
- $:.unshift(lib_path) if !$:.include?(lib_path)
5
+ $LOAD_PATH.unshift(lib_path) unless $LOAD_PATH.include?(lib_path)
6
6
  require 'dri/cli'
7
7
 
8
8
  Signal.trap('INT') do
@@ -12,7 +12,7 @@ end
12
12
 
13
13
  begin
14
14
  Dri::CLI.start
15
- rescue Dri::CLI::Error => err
16
- puts "ERROR: #{err.message}"
15
+ rescue Dri::CLI::Error => e
16
+ puts "ERROR: #{e.message}"
17
17
  exit 1
18
18
  end
@@ -3,14 +3,15 @@
3
3
  require "httparty"
4
4
  require "json"
5
5
  require "tty-config"
6
+ require 'cgi'
6
7
 
7
8
  module Dri
8
- class ApiClient
9
-
10
- API_URL = 'https://gitlab.com/api/v4'
11
- TESTCASES_PROJECT_ID = '11229385'
12
- TRIAGE_PROJECT_ID = '15291320'
13
- GITLAB_PROJECT_ID = '278964'
9
+ class ApiClient # rubocop:disable Metrics/ClassLength
10
+ API_URL = 'https://gitlab.com/api/v4'
11
+ TESTCASES_PROJECT_ID = '11229385'
12
+ TRIAGE_PROJECT_ID = '15291320'
13
+ GITLAB_PROJECT_ID = '278964'
14
+ FEATURE_FLAG_LOG_PROJECT_ID = '15208716'
14
15
 
15
16
  def initialize(config)
16
17
  profile = config.read
@@ -50,6 +51,26 @@ module Dri
50
51
  fetch_json(url.join)
51
52
  end
52
53
 
54
+ # Fetch MRs
55
+ #
56
+ # @see https://docs.gitlab.com/ee/api/merge_requests.html for all passable options
57
+ #
58
+ # @param [Hash<String>] options
59
+ # @option options [String] state
60
+ # @option options [String] order_by
61
+ # @option options [String] sort
62
+ # @option options [String] milestone
63
+ # @option options [String] labels
64
+ def fetch_mrs(project_id:, **options)
65
+ uri = URI(API_URL)
66
+ uri.query = HTTParty::HashConversions.to_params(options)
67
+
68
+ # CGI.escape('gitlab-org/gitlab') => 'gitlab-org%2Fgitlab'
69
+ uri.path = File.join(uri.path, 'projects', CGI.escape(project_id), 'merge_requests')
70
+
71
+ fetch_json(uri.to_s)
72
+ end
73
+
53
74
  def fetch_current_triage_issue
54
75
  url = ["#{API_URL}/projects/"]
55
76
  url << "#{TRIAGE_PROJECT_ID}/issues?state=opened"
@@ -87,6 +108,16 @@ module Dri
87
108
  delete_json(url)
88
109
  end
89
110
 
111
+ def fetch_feature_flag_logs(date:, page:)
112
+ url = ["#{API_URL}/projects/"]
113
+ url << "#{FEATURE_FLAG_LOG_PROJECT_ID}/issues"
114
+ url << "?created_after=#{date}"
115
+ url << "&per_page=100"
116
+ url << "&page=#{page}"
117
+
118
+ fetch_json(url.join)
119
+ end
120
+
90
121
  private
91
122
 
92
123
  def post_json(url, body)
@@ -97,7 +128,7 @@ module Dri
97
128
  }
98
129
  }
99
130
 
100
- response = HTTParty.post(url, options)
131
+ response = HTTParty.post(url, options)
101
132
  handle_response(response)
102
133
  end
103
134
 
@@ -107,12 +138,12 @@ module Dri
107
138
  end
108
139
 
109
140
  def handle_response(response)
110
- #puts response.to_json
141
+ # puts response.to_json
111
142
  response
112
143
  end
113
144
 
114
145
  def fetch_json(url)
115
- response = HTTParty.get(url, headers: header)
146
+ response = HTTParty.get(url, headers: header)
116
147
 
117
148
  if response.code != 200
118
149
  puts "Response error code \"#{response.code}\" - Unable to sync with GitLab"
@@ -122,4 +153,4 @@ module Dri
122
153
  handle_response(JSON.parse(response.body))
123
154
  end
124
155
  end
125
- end
156
+ end
data/lib/dri/cli.rb CHANGED
@@ -25,14 +25,14 @@ module Dri
25
25
  end
26
26
 
27
27
  class_option :no_color, type: :boolean, default: false,
28
- desc: "Disable colorization in output"
28
+ desc: "Disable colorization in output"
29
29
 
30
30
  desc 'version', 'dri version'
31
31
  def version
32
32
  require_relative 'version'
33
33
  puts "v#{Dri::VERSION}"
34
34
  end
35
- map %w(--version -v) => :version
35
+ map %w[--version -v] => :version
36
36
 
37
37
  require_relative 'commands/rm'
38
38
  register Dri::Commands::Rm, 'rm', 'rm [SUBCOMMAND]', 'Remove triage-related items'
data/lib/dri/command.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'command'
3
4
  require_relative 'api_client'
4
5
 
6
+ require 'dri/refinements/truncate'
7
+
5
8
  require "tty-config"
6
9
  require "pastel"
7
10
  require 'forwardable'
@@ -11,7 +14,6 @@ module Dri
11
14
  extend Forwardable
12
15
 
13
16
  def_delegators :command, :run
14
- attr_reader :config, :emoji, :token, :username, :timezone, :profile
15
17
 
16
18
  def pastel(**options)
17
19
  Pastel.new(**options)
@@ -54,10 +56,10 @@ module Dri
54
56
  end
55
57
 
56
58
  def verify_config_exists
57
- if !config.exist?
58
- logger.error "Oops, could not find a configuration. Try using #{add_color('dri init', :yellow)} first."
59
- exit 1
60
- end
59
+ return if config.exist?
60
+
61
+ logger.error "Oops, could not find a configuration. Try using #{add_color('dri init', :yellow)} first."
62
+ exit 1
61
63
  end
62
64
 
63
65
  def add_color(str, *color)