gitlab_awesome_release 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: 275b6a408d136a5640c4c80d0798947403c1584c
4
- data.tar.gz: 8abbbd924954996a5f53338d69a598753569000b
3
+ metadata.gz: faf0baaeedceda64b9174c9bb51eee530f0318e8
4
+ data.tar.gz: 1fc19a40157181302624ba03bf87e52559e1a1bf
5
5
  SHA512:
6
- metadata.gz: 99f3b3db0ecc9ed025011d85ba4f3b1118a3e35f9a19b5b0c2df88a73d7ff7ef3e71d68ee0ece63029e6e6cbe8f33ca96c789c516d5f57bcd8ab717dd371167e
7
- data.tar.gz: f3adac92ac52c25f00f240e4d7836d4e9d615cd2f0c37bd2be18174a3fe582fa46f15425b4a81b80511998f72650f1097a4d2e5aff05ba7682bcc31b49e0abec
6
+ metadata.gz: 6e45e224237477007cb9cc328f7d7bf3e5ccf95b48b4c30edb49a4fdb98c0c2fe27d1475f483baf40d8c6e743365a3f96ef652c7edc89386e6ad3a8990901199
7
+ data.tar.gz: 4ecd3077daca1765e1fb710cdb65b06579cc450e14aa7dcfd488132aa30479f37eafa8c2ef4b6d15b18e47385e18ab65a4516be95aec0749e337e89b2c84e602
@@ -1,9 +1,86 @@
1
1
  stages:
2
2
  - test
3
3
 
4
- job1:
4
+ .job_template: &job_definition
5
+ variables:
6
+ CI: "true"
7
+ BUNDLE_CACHE: "vendor/bundle/"
8
+
9
+ cache:
10
+ untracked: true
11
+ key: "$CI_BUILD_NAME"
12
+ paths:
13
+ - vendor/bundle/
14
+
15
+ before_script:
16
+ - ./gitlab-ci/setup.sh
17
+
5
18
  stage: test
19
+
20
+ except:
21
+ - tags
22
+
23
+ ruby2.1:rspec:
24
+ <<: *job_definition
25
+ image: drecom/centos-ruby:2.1.10
26
+
27
+ script:
28
+ - ./gitlab-ci/rspec.sh
29
+
30
+ ruby2.1:rubocop:
31
+ <<: *job_definition
32
+ image: drecom/centos-ruby:2.1.10
33
+
34
+ script:
35
+ - ./gitlab-ci/rubocop.sh
36
+
37
+ allow_failure: true
38
+
39
+ ruby2.2:rspec:
40
+ <<: *job_definition
41
+ image: drecom/centos-ruby:2.2.6
42
+
43
+ script:
44
+ - ./gitlab-ci/rspec.sh
45
+
46
+ ruby2.2:rubocop:
47
+ <<: *job_definition
48
+
49
+ image: drecom/centos-ruby:2.2.6
50
+
51
+ script:
52
+ - ./gitlab-ci/rubocop.sh
53
+
54
+ allow_failure: true
55
+
56
+ ruby2.3:rspec:
57
+ <<: *job_definition
58
+ image: drecom/centos-ruby:2.3.3
59
+
60
+ script:
61
+ - ./gitlab-ci/rspec.sh
62
+
63
+ ruby2.3:rubocop:
64
+ <<: *job_definition
65
+ image: drecom/centos-ruby:2.3.3
66
+
6
67
  script:
7
- - ./script/build.sh
8
- tags:
9
- - ruby
68
+ - ./gitlab-ci/rubocop.sh
69
+
70
+ allow_failure: true
71
+
72
+ ruby2.4:rspec:
73
+ <<: *job_definition
74
+ image: drecom/centos-ruby:2.4.0
75
+
76
+ script:
77
+ - ./gitlab-ci/rspec.sh
78
+
79
+ ruby2.4:rubocop:
80
+ <<: *job_definition
81
+ image: drecom/centos-ruby:2.4.0
82
+
83
+ script:
84
+ - ./gitlab-ci/rubocop.sh
85
+
86
+ allow_failure: true
@@ -0,0 +1,8 @@
1
+ inherit_gem:
2
+ onkcop: "config/rubocop.yml"
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 2.4
6
+
7
+ Metrics/ClassLength:
8
+ Max: 130
@@ -1,7 +1,12 @@
1
1
  ## Unreleased
2
- [full changelog](https://gitlab.com/sue445/gitlab_awesome_release/compare/v0.1.0.beta8...HEAD)
2
+ [full changelog](https://gitlab.com/sue445/gitlab_awesome_release/compare/v0.1.0...HEAD)
3
3
 
4
4
 
5
+ ## v0.1.0
6
+ [full changelog](https://gitlab.com/sue445/gitlab_awesome_release/compare/v0.1.0.beta8...v0.1.0)
7
+
8
+ * Add create_latest_note [!18](https://gitlab.com/sue445/gitlab_awesome_release/merge_requests/18) *@sue445*
9
+
5
10
  ## v0.1.0.beta8
6
11
  [full changelog](https://gitlab.com/sue445/gitlab_awesome_release/compare/v0.1.0.beta7...v0.1.0.beta8)
7
12
 
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in gitlab_awesome_release.gemspec
4
4
  gemspec
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
  Generate changelog from tags and MergeRequests on [GitLab](https://about.gitlab.com/)
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/gitlab_awesome_release.svg)](https://badge.fury.io/rb/gitlab_awesome_release)
5
- [![build status](https://gitlab.com/ci/projects/9759/status.png?ref=master)](https://gitlab.com/ci/projects/9759?ref=master)
6
5
  [![Dependency Status](https://gemnasium.com/7f058801015a4fbcf603d936c08836a4.svg)](https://gemnasium.com/19478d2f2735ee355f4c6cd1b8d2c12e)
7
6
 
8
7
  This is inspired by [GitHub Changelog Generator](https://github.com/skywinder/github-changelog-generator)
@@ -0,0 +1,3 @@
1
+ #!/bin/bash -xe
2
+
3
+ bundle exec rspec
@@ -0,0 +1,3 @@
1
+ #!/bin/bash -xe
2
+
3
+ bundle exec rubocop
@@ -0,0 +1,3 @@
1
+ #!/bin/bash -xe
2
+
3
+ bundle check --path=${BUNDLE_CACHE} || bundle install --path=${BUNDLE_CACHE} --jobs=2 --retry=3
@@ -1,7 +1,7 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+ lib = File.expand_path("../lib", __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'gitlab_awesome_release/version'
4
+ require "gitlab_awesome_release/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "gitlab_awesome_release"
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["sue445"]
10
10
  spec.email = ["sue445@sue445.net"]
11
11
 
12
- spec.summary = %q{Generate changelog from tags and MergeRequests on GitLab}
13
- spec.description = %q{Generate changelog from tags and MergeRequests on GitLab}
12
+ spec.summary = "Generate changelog from tags and MergeRequests on GitLab"
13
+ spec.description = "Generate changelog from tags and MergeRequests on GitLab"
14
14
  spec.homepage = "https://gitlab.com/sue445/gitlab_awesome_release"
15
15
  spec.license = "MIT"
16
16
 
@@ -21,12 +21,12 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.required_ruby_version = ">= 2.1.0"
23
23
 
24
- spec.add_dependency "activesupport"
25
24
  spec.add_dependency "dotenv"
26
25
  spec.add_dependency "gitlab"
27
26
  spec.add_dependency "thor"
28
27
 
29
28
  spec.add_development_dependency "bundler", "~> 1.10"
29
+ spec.add_development_dependency "onkcop", "0.47.1.0"
30
30
  spec.add_development_dependency "pry-byebug"
31
31
  spec.add_development_dependency "rake", "~> 10.0"
32
32
  spec.add_development_dependency "rspec"
@@ -1,4 +1,3 @@
1
- require "active_support/all"
2
1
  require "gitlab_awesome_release/version"
3
2
  require "gitlab_awesome_release/project"
4
3
  require "gitlab"
@@ -3,14 +3,16 @@ require "gitlab_awesome_release"
3
3
  require "dotenv"
4
4
 
5
5
  module GitlabAwesomeRelease
6
+ require "logger"
7
+
6
8
  class CLI < Thor
7
- DEFAULT_VERSION_FORMAT = "^v?[\\d.]+"
8
- GITLAB_ENV_FILES = %w(.env.gitlab ~/.env.gitlab)
9
+ DEFAULT_VERSION_FORMAT = "^v?[\\d.]+".freeze
10
+ GITLAB_ENV_FILES = %w(.env.gitlab ~/.env.gitlab).freeze
9
11
 
10
- GITLAB_API_DESCRIPTION = "GitLab API endpoint (e.g. http://example.com/api/v3)"
11
- GITLAB_API_PRIVATE_TOKEN_DESCRIPTION = "Your private token"
12
- GITLAB_API_PROJECT_NAME = "Target project (e.g. group/repo_name)"
13
- LOG_LEVEL_DESCRIPTION = "Log level (debug|info|warn|error|fatal|unknown)"
12
+ GITLAB_API_DESCRIPTION = "GitLab API endpoint (e.g. http://example.com/api/v3)".freeze
13
+ GITLAB_API_PRIVATE_TOKEN_DESCRIPTION = "Your private token".freeze
14
+ GITLAB_API_PROJECT_NAME = "Target project (e.g. group/repo_name)".freeze
15
+ LOG_LEVEL_DESCRIPTION = "Log level (debug|info|warn|error|fatal|unknown)".freeze
14
16
 
15
17
  desc "version", "Show gitlab_awesome_release version"
16
18
  def version
@@ -92,70 +94,73 @@ module GitlabAwesomeRelease
92
94
 
93
95
  private
94
96
 
95
- def option_or_env(name, default = nil)
96
- upper_name = name.to_s.upcase
97
- options[name].presence || ENV[upper_name].presence || default
98
- end
97
+ def option_or_env(name, default = nil)
98
+ upper_name = name.to_s.upcase
99
+ return options[name] if options[name] && !options[name].to_s.empty?
100
+ return ENV[upper_name] if ENV[upper_name] && !ENV[upper_name].empty?
99
101
 
100
- def option_or_env!(name)
101
- value = option_or_env(name)
102
- return value if value
102
+ default
103
+ end
103
104
 
104
- puts "--#{name.to_s.gsub("_", "-")} or #{name.to_s.upcase} is either required!"
105
- exit!
106
- end
105
+ def option_or_env!(name)
106
+ value = option_or_env(name)
107
+ return value if value
107
108
 
108
- def create_project
109
- gitlab_api_endpoint = option_or_env!(:gitlab_api_endpoint)
110
- gitlab_api_private_token = option_or_env!(:gitlab_api_private_token)
111
- gitlab_project_name = option_or_env!(:gitlab_project_name)
112
- allow_tag_format = option_or_env(:allow_tag_format, DEFAULT_VERSION_FORMAT)
113
-
114
- @logger = Logger.new(STDOUT)
115
- @logger.level = logger_level(option_or_env(:log_level))
116
- @logger.formatter = proc{ |severity, datetime, progname, message|
117
- "[#{datetime}] #{severity} #{message}\n"
118
- }
119
-
120
- Gitlab::Request.logger = @logger
121
- GitlabAwesomeRelease::Project.new(
122
- api_endpoint: gitlab_api_endpoint,
123
- private_token: gitlab_api_private_token,
124
- project_name: gitlab_project_name,
125
- allow_tag_format: /#{allow_tag_format}/,
126
- logger: @logger,
127
- )
128
- end
109
+ puts "--#{name.to_s.tr("_", "-")} or #{name.to_s.upcase} is either required!"
110
+ exit!
111
+ end
129
112
 
130
- def write_changelog(changelog)
131
- filename = option_or_env(:filename)
132
- if filename
133
- File.open(filename, "wb") do |f|
134
- f.write(changelog)
113
+ def create_project
114
+ gitlab_api_endpoint = option_or_env!(:gitlab_api_endpoint)
115
+ gitlab_api_private_token = option_or_env!(:gitlab_api_private_token)
116
+ gitlab_project_name = option_or_env!(:gitlab_project_name)
117
+ allow_tag_format = option_or_env(:allow_tag_format, DEFAULT_VERSION_FORMAT)
118
+
119
+ @logger = Logger.new(STDOUT)
120
+ @logger.level = logger_level(option_or_env(:log_level))
121
+ @logger.formatter = proc { |severity, datetime, _progname, message|
122
+ "[#{datetime}] #{severity} #{message}\n"
123
+ }
124
+
125
+ Gitlab::Request.logger = @logger
126
+ GitlabAwesomeRelease::Project.new(
127
+ api_endpoint: gitlab_api_endpoint,
128
+ private_token: gitlab_api_private_token,
129
+ project_name: gitlab_project_name,
130
+ allow_tag_format: /#{allow_tag_format}/,
131
+ logger: @logger
132
+ )
133
+ end
134
+
135
+ def write_changelog(changelog)
136
+ filename = option_or_env(:filename)
137
+ if filename
138
+ File.open(filename, "wb") do |f|
139
+ f.write(changelog)
140
+ end
141
+ @logger.info "Write to #{filename}"
142
+ else
143
+ puts changelog
135
144
  end
136
- @logger.info "Write to #{filename}"
137
- else
138
- puts changelog
139
145
  end
140
- end
141
146
 
142
- def logger_level(log_level)
143
- case log_level.to_sym
144
- when :debug
145
- Logger::DEBUG
146
- when :error
147
- Logger::ERROR
148
- when :fatal
149
- Logger::FATAL
150
- when :info
151
- Logger::INFO
152
- when :unknown
153
- Logger::UNKNOWN
154
- when :warn
155
- Logger::WARN
156
- else
157
- raise "Unknown log_level: #{log_level}"
147
+ def logger_level(log_level)
148
+ case log_level.to_sym
149
+ when :debug
150
+ Logger::DEBUG
151
+ when :error
152
+ Logger::ERROR
153
+ when :fatal
154
+ Logger::FATAL
155
+ when :info
156
+ Logger::INFO
157
+ when :unknown
158
+ Logger::UNKNOWN
159
+ when :warn
160
+ Logger::WARN
161
+ else
162
+ raise "Unknown log_level: #{log_level}"
163
+ end
158
164
  end
159
- end
160
165
  end
161
166
  end
@@ -10,8 +10,8 @@ module GitlabAwesomeRelease
10
10
  end_time = Time.now
11
11
 
12
12
  # NOTE: options[:headers] contains PRIVATE-TOKEN
13
- _options = options.reject{ |k, _v| k == :headers }
14
- logger.debug "(#{end_time - start_time} sec) #{method.upcase} #{path} #{_options}"
13
+ _options = options.reject { |k, _v| k == :headers }
14
+ self.class.logger.debug "(#{end_time - start_time} sec) #{method.upcase} #{path} #{_options}"
15
15
  end
16
16
  end
17
17
  end
@@ -20,5 +20,12 @@ end
20
20
 
21
21
  Gitlab::Request.class_eval do
22
22
  prepend GitlabAwesomeRelease::GitlabLoggingExt
23
- cattr_accessor :logger
23
+
24
+ def self.logger
25
+ Gitlab::Request.instance_variable_get(:@logger)
26
+ end
27
+
28
+ def self.logger=(logger)
29
+ Gitlab::Request.instance_variable_set(:@logger, logger)
30
+ end
24
31
  end
@@ -35,7 +35,7 @@ module GitlabAwesomeRelease
35
35
  with_paging do |params|
36
36
  Gitlab.repo_tags(escaped_project_name, params)
37
37
  end
38
- @all_tag_names = repo_tags.sort_by{ |tag| tag.commit.authored_date }.map(&:name)
38
+ @all_tag_names = repo_tags.sort_by { |tag| tag.commit.authored_date }.map(&:name)
39
39
  end
40
40
 
41
41
  # @return [Array<String>]
@@ -60,8 +60,8 @@ module GitlabAwesomeRelease
60
60
  str << "\n"
61
61
  end
62
62
 
63
- changelog << <<-MARKDOWN.strip_heredoc
64
- *This Change Log was automatically generated by [gitlab_awesome_release](https://gitlab.com/sue445/gitlab_awesome_release)*
63
+ changelog << <<-MARKDOWN
64
+ *This Change Log was automatically generated by [gitlab_awesome_release](https://gitlab.com/sue445/gitlab_awesome_release)*
65
65
  MARKDOWN
66
66
 
67
67
  changelog
@@ -79,8 +79,8 @@ module GitlabAwesomeRelease
79
79
  summary = merge_requests_summary_between(from, to)
80
80
 
81
81
  header = generate_heading(title)
82
- header << <<-MARKDOWN.strip_heredoc
83
- [full changelog](#{web_url}/compare/#{from}...#{to})
82
+ header << <<-MARKDOWN
83
+ [full changelog](#{web_url}/compare/#{from}...#{to})
84
84
 
85
85
  MARKDOWN
86
86
 
@@ -97,10 +97,14 @@ module GitlabAwesomeRelease
97
97
  # @return [Array<Integer>] MergeRequest iids
98
98
  def merge_request_iids_between(from, to)
99
99
  commits = Gitlab.repo_compare(escaped_project_name, from, to).commits
100
- commits.map do |commit|
101
- commit["message"] =~ /^Merge branch .*See merge request \!(\d+)$/m
102
- $1
103
- end.compact.map(&:to_i)
100
+
101
+ merge_request_iids =
102
+ commits.map do |commit|
103
+ commit["message"] =~ /^Merge branch .*See merge request \!(\d+)$/m
104
+ Regexp.last_match(1)
105
+ end
106
+
107
+ merge_request_iids.compact.map(&:to_i)
104
108
  end
105
109
 
106
110
  # @param iid [Integer] MergeRequest iid
@@ -130,34 +134,34 @@ module GitlabAwesomeRelease
130
134
 
131
135
  private
132
136
 
133
- def escaped_project_name
134
- CGI.escape(@project_name)
135
- end
137
+ def escaped_project_name
138
+ CGI.escape(@project_name)
139
+ end
136
140
 
137
- # @yield [params] paging block
138
- # @yieldparam params [Hash] paging params for GitLab API (page: current page, per_page)
139
- # @yieldreturn response in all pages
140
- def with_paging
141
- all_response = []
142
- page = 1
143
- loop do
144
- response = yield(page: page, per_page: PER_PAGE)
145
- all_response += response
146
- return all_response if response.size < PER_PAGE
147
- page += 1
141
+ # @yield [params] paging block
142
+ # @yieldparam params [Hash] paging params for GitLab API (page: current page, per_page)
143
+ # @yieldreturn response in all pages
144
+ def with_paging
145
+ all_response = []
146
+ page = 1
147
+ loop do
148
+ response = yield(page: page, per_page: PER_PAGE)
149
+ all_response += response
150
+ return all_response if response.size < PER_PAGE
151
+ page += 1
152
+ end
148
153
  end
149
- end
150
154
 
151
- def merge_requests_summary_between(from, to)
152
- mr_iids = merge_request_iids_between(from, to)
153
- mr_iids.each_with_object("") do |iid, str|
154
- str << merge_request_summary(iid) + "\n"
155
+ def merge_requests_summary_between(from, to)
156
+ mr_iids = merge_request_iids_between(from, to)
157
+ mr_iids.each_with_object("") do |iid, str|
158
+ str << merge_request_summary(iid) + "\n"
159
+ end
155
160
  end
156
- end
157
161
 
158
- def assert_merge_request_iid(mr, iid)
159
- # NOTE: MR is found, but server is old GitLab?
160
- raise "MergeRequest iid does not match (expected #{iid}, but #{mr.iid})" unless iid == mr.iid
161
- end
162
+ def assert_merge_request_iid(mr, iid)
163
+ # NOTE: MR is found, but server is old GitLab?
164
+ raise "MergeRequest iid does not match (expected #{iid}, but #{mr.iid})" unless iid == mr.iid
165
+ end
162
166
  end
163
167
  end
@@ -1,3 +1,3 @@
1
1
  module GitlabAwesomeRelease
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1".freeze
3
3
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab_awesome_release
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - sue445
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-17 00:00:00.000000000 Z
11
+ date: 2017-02-06 00:00:00.000000000 Z
12
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: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: dotenv
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +66,20 @@ dependencies:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
68
  version: '1.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: onkcop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.47.1.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.47.1.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: pry-byebug
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -190,6 +190,7 @@ files:
190
190
  - ".gitignore"
191
191
  - ".gitlab-ci.yml"
192
192
  - ".rspec"
193
+ - ".rubocop.yml"
193
194
  - ".yardopts"
194
195
  - CHANGELOG.md
195
196
  - Gemfile
@@ -199,6 +200,9 @@ files:
199
200
  - bin/console
200
201
  - bin/setup
201
202
  - exe/gitlab_awesome_release
203
+ - gitlab-ci/rspec.sh
204
+ - gitlab-ci/rubocop.sh
205
+ - gitlab-ci/setup.sh
202
206
  - gitlab_awesome_release.gemspec
203
207
  - img/private_token.png
204
208
  - lib/gitlab_awesome_release.rb
@@ -207,7 +211,6 @@ files:
207
211
  - lib/gitlab_awesome_release/gitlab_logging_ext.rb
208
212
  - lib/gitlab_awesome_release/project.rb
209
213
  - lib/gitlab_awesome_release/version.rb
210
- - script/build.sh
211
214
  homepage: https://gitlab.com/sue445/gitlab_awesome_release
212
215
  licenses:
213
216
  - MIT
@@ -228,9 +231,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
228
231
  version: '0'
229
232
  requirements: []
230
233
  rubyforge_project:
231
- rubygems_version: 2.4.5.1
234
+ rubygems_version: 2.5.1
232
235
  signing_key:
233
236
  specification_version: 4
234
237
  summary: Generate changelog from tags and MergeRequests on GitLab
235
238
  test_files: []
236
- has_rdoc:
@@ -1,7 +0,0 @@
1
- #!/bin/bash -xe
2
-
3
- export CI=true
4
-
5
- bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=2 --retry=3
6
-
7
- bundle exec rspec