Skip to content

Commit 6f0077a

Browse files
committed
Bootstrap Rubocop configuration and fix offenses
1 parent 22e3f7c commit 6f0077a

15 files changed

+121
-53
lines changed

.rubocop.yml

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
AllCops:
2+
NewCops: enable
3+
4+
Metrics:
5+
Enabled: false
6+
7+
Style/WordArray:
8+
EnforcedStyle: brackets
9+
10+
Style/StringLiterals:
11+
EnforcedStyle: double_quotes
12+
13+
Style/GlobalVars:
14+
Exclude:
15+
- test/sample_suites/flakey_suite/**/*.rb
16+
- test/sample_suites/flaky_job_detection/**/*.rb
17+
18+
Style/SpecialGlobalVars:
19+
Enabled: false
20+
21+
Style/IfUnlessModifier:
22+
Enabled: false
23+
24+
Style/GuardClause:
25+
Enabled: false
26+
27+
Style/TrailingCommaInArrayLiteral:
28+
Enabled: false
29+
30+
Style/FrozenStringLiteralComment:
31+
Enabled: false
32+
33+
Style/NegatedIf:
34+
Enabled: false
35+
36+
Style/NumericPredicate:
37+
Enabled: false
38+
39+
Layout/FirstArrayElementIndentation:
40+
Enabled: false
41+
42+
Layout/ArgumentAlignment:
43+
Enabled: false
44+
45+
Gemspec/RequiredRubyVersion:
46+
Enabled: false
47+
48+
Naming/MethodParameterName:
49+
Enabled: false

Rakefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ require "rake/testtask"
22

33
Rake::TestTask.new do |t|
44
t.libs << "test"
5-
t.test_files = FileList['test/test_*.rb']
5+
t.test_files = FileList["test/test_*.rb"]
66
t.verbose = true
77
end
88

bin/rspecq

+7-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
require "optparse"
33
require "rspecq"
44

5-
DEFAULT_REDIS_HOST = "127.0.0.1"
5+
DEFAULT_REDIS_HOST = "127.0.0.1".freeze
66
DEFAULT_REPORT_TIMEOUT = 3600 # 1 hour
77
DEFAULT_MAX_REQUEUES = 3
88
DEFAULT_FAIL_FAST = 0
@@ -66,7 +66,7 @@ OptionParser.new do |o|
6666

6767
o.on("--report", "Enable reporter mode: do not pull tests off the queue; " \
6868
"instead print build progress and exit when it's " \
69-
"finished.\n#{o.summary_indent*9} " \
69+
"finished.\n#{o.summary_indent * 9} " \
7070
"Exits with a non-zero status code if there were any " \
7171
"failures.") do |v|
7272
opts[:report] = v
@@ -85,7 +85,7 @@ OptionParser.new do |o|
8585
end
8686

8787
o.on("--fail-fast N", Integer, "Abort build with a non-zero status code " \
88-
"after N failed examples." ) do |v|
88+
"after N failed examples.") do |v|
8989
opts[:fail_fast] = v
9090
end
9191

@@ -104,15 +104,17 @@ opts[:build] ||= ENV["RSPECQ_BUILD"]
104104
opts[:worker] ||= ENV["RSPECQ_WORKER"]
105105
opts[:redis_host] ||= ENV["RSPECQ_REDIS"] || DEFAULT_REDIS_HOST
106106
opts[:timings] ||= env_set?("RSPECQ_UPDATE_TIMINGS")
107-
opts[:file_split_threshold] ||= Integer(ENV["RSPECQ_FILE_SPLIT_THRESHOLD"] || 9999999)
107+
opts[:file_split_threshold] ||= Integer(ENV["RSPECQ_FILE_SPLIT_THRESHOLD"] || 9_999_999)
108108
opts[:report] ||= env_set?("RSPECQ_REPORT")
109109
opts[:report_timeout] ||= Integer(ENV["RSPECQ_REPORT_TIMEOUT"] || DEFAULT_REPORT_TIMEOUT)
110110
opts[:max_requeues] ||= Integer(ENV["RSPECQ_MAX_REQUEUES"] || DEFAULT_MAX_REQUEUES)
111111
opts[:redis_url] ||= ENV["RSPECQ_REDIS_URL"]
112112
opts[:fail_fast] ||= Integer(ENV["RSPECQ_FAIL_FAST"] || DEFAULT_FAIL_FAST)
113113

114+
# rubocop:disable Style/RaiseArgs, Layout/EmptyLineAfterGuardClause
114115
raise OptionParser::MissingArgument.new(:build) if opts[:build].nil?
115116
raise OptionParser::MissingArgument.new(:worker) if !opts[:report] && opts[:worker].nil?
117+
# rubocop:enable Style/RaiseArgs, Layout/EmptyLineAfterGuardClause
116118

117119
redis_opts = {}
118120

@@ -126,7 +128,7 @@ if opts[:report]
126128
reporter = RSpecQ::Reporter.new(
127129
build_id: opts[:build],
128130
timeout: opts[:report_timeout],
129-
redis_opts: redis_opts,
131+
redis_opts: redis_opts
130132
)
131133

132134
reporter.report

lib/rspecq/formatters/failure_recorder.rb

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
module RSpecQ
22
module Formatters
3+
# Persists failed examples information (i.e. message and backtrace), so
4+
# that they can be reported to the end user by the Reporter.
5+
#
6+
# Also persists non-example error information (e.g. a syntax error that
7+
# in a spec file).
38
class FailureRecorder
49
def initialize(queue, job, max_requeues)
510
@queue = queue
@@ -33,16 +38,19 @@ def example_failed(notification)
3338
end
3439

3540
presenter = RSpec::Core::Formatters::ExceptionPresenter.new(
36-
example.exception, example)
41+
example.exception, example
42+
)
3743

3844
msg = presenter.fully_formatted(nil, @colorizer)
3945
msg << "\n"
4046
msg << @colorizer.wrap(
4147
"bin/rspec #{example.location_rerun_argument}",
42-
RSpec.configuration.failure_color)
48+
RSpec.configuration.failure_color
49+
)
4350

4451
msg << @colorizer.wrap(
45-
" # #{example.full_description}", RSpec.configuration.detail_color)
52+
" # #{example.full_description}", RSpec.configuration.detail_color
53+
)
4654

4755
@queue.record_example_failure(notification.example.id, msg)
4856
end

lib/rspecq/formatters/job_timing_recorder.rb

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
module RSpecQ
22
module Formatters
3+
# Persists each job's timing (in seconds). Those timings are used when
4+
# determining the ordering in which jobs are scheduled (slower jobs will
5+
# be enqueued first).
36
class JobTimingRecorder
47
def initialize(queue, job)
58
@queue = queue

lib/rspecq/formatters/worker_heartbeat_recorder.rb

-1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,3 @@ def example_finished(*)
1414
end
1515
end
1616
end
17-

lib/rspecq/queue.rb

+5-4
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def initialize(build_id, worker_id, redis_opts)
7979
# NOTE: jobs will be processed from head to tail (lpop)
8080
def publish(jobs, fail_fast = 0)
8181
@redis.multi do
82-
@redis.hset(key_queue_config, 'fail_fast', fail_fast)
82+
@redis.hset(key_queue_config, "fail_fast", fail_fast)
8383
@redis.rpush(key_queue_unprocessed, jobs)
8484
@redis.set(key_queue_status, STATUS_READY)
8585
end.first
@@ -131,7 +131,7 @@ def requeue_job(job, max_requeues)
131131
@redis.eval(
132132
REQUEUE_JOB,
133133
keys: [key_queue_unprocessed, key_requeues],
134-
argv: [job, max_requeues],
134+
argv: [job, max_requeues]
135135
)
136136
end
137137

@@ -210,9 +210,10 @@ def published?
210210
@redis.get(key_queue_status) == STATUS_READY
211211
end
212212

213-
def wait_until_published(timeout=30)
213+
def wait_until_published(timeout = 30)
214214
(timeout * 10).times do
215215
return if published?
216+
216217
sleep 0.1
217218
end
218219

@@ -250,7 +251,7 @@ def flaky_jobs
250251
def fail_fast
251252
return nil unless published?
252253

253-
@fail_fast ||= Integer(@redis.hget(key_queue_config, 'fail_fast'))
254+
@fail_fast ||= Integer(@redis.hget(key_queue_config, "fail_fast"))
254255
end
255256

256257
# Returns true if the number of failed tests, has surpassed the threshold

lib/rspecq/reporter.rb

+5-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def initialize(build_id:, timeout:, redis_opts:)
1616

1717
# We want feedback to be immediattely printed to CI users, so
1818
# we disable buffering.
19-
STDOUT.sync = true
19+
$stdout.sync = true
2020
end
2121

2222
def report
@@ -28,7 +28,7 @@ def report
2828
failure_heading_printed = false
2929

3030
tests_duration = measure_duration do
31-
@timeout.times do |i|
31+
@timeout.times do
3232
@queue.example_failures.each do |job, rspec_output|
3333
next if reported_failures[job]
3434

@@ -124,13 +124,13 @@ def flaky_jobs_to_sentry(jobs, build_duration)
124124
return if jobs.empty?
125125

126126
jobs.each do |job|
127-
filename = job.sub(/\[.+\]/, '')
127+
filename = job.sub(/\[.+\]/, "")
128128

129129
extra = {
130130
build: @build_id,
131131
build_timeout: @timeout,
132132
queue: @queue.inspect,
133-
object: self.inspect,
133+
object: inspect,
134134
pid: Process.pid,
135135
job_path: job,
136136
build_duration: build_duration
@@ -143,7 +143,7 @@ def flaky_jobs_to_sentry(jobs, build_duration)
143143

144144
Raven.capture_message(
145145
"Flaky test in #{filename}",
146-
level: 'warning',
146+
level: "warning",
147147
extra: extra,
148148
tags: tags
149149
)

lib/rspecq/worker.rb

+13-12
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def initialize(build_id:, worker_id:, redis_opts:)
5555
@fail_fast = 0
5656
@files_or_dirs_to_run = "spec"
5757
@populate_timings = false
58-
@file_split_threshold = 999999
58+
@file_split_threshold = 999_999
5959
@heartbeat_updated_at = nil
6060
@max_requeues = 3
6161

@@ -98,7 +98,7 @@ def work
9898
# reconfigure rspec
9999
RSpec.configuration.detail_color = :magenta
100100
RSpec.configuration.seed = srand && srand % 0xFFFF
101-
RSpec.configuration.backtrace_formatter.filter_gem('rspecq')
101+
RSpec.configuration.backtrace_formatter.filter_gem("rspecq")
102102
RSpec.configuration.add_formatter(Formatters::FailureRecorder.new(queue, job, max_requeues))
103103
RSpec.configuration.add_formatter(Formatters::ExampleCountRecorder.new(queue))
104104
RSpec.configuration.add_formatter(Formatters::WorkerHeartbeatRecorder.new(self))
@@ -155,7 +155,7 @@ def try_publish_queue!(queue)
155155
jobs.concat(files_to_run)
156156
end
157157

158-
default_timing = timings.values[timings.values.size/2]
158+
default_timing = timings.values[timings.values.size / 2]
159159

160160
# assign timings (based on previous runs) to all jobs
161161
jobs = jobs.each_with_object({}) do |j, h|
@@ -180,7 +180,8 @@ def reset_rspec_state!
180180
# see https://github.com/rspec/rspec-core/pull/2723
181181
if Gem::Version.new(RSpec::Core::Version::STRING) <= Gem::Version.new("3.9.1")
182182
RSpec.world.instance_variable_set(
183-
:@example_group_counts_by_spec_file, Hash.new(0))
183+
:@example_group_counts_by_spec_file, Hash.new(0)
184+
)
184185
end
185186

186187
# RSpec.clear_examples does not reset those, which causes issues when
@@ -204,17 +205,17 @@ def files_to_example_ids(files)
204205

205206
if !cmd_result.success?
206207
rspec_output = begin
207-
JSON.parse(out)
208-
rescue JSON::ParserError
209-
out
210-
end
208+
JSON.parse(out)
209+
rescue JSON::ParserError
210+
out
211+
end
211212

212213
log_event(
213214
"Failed to split slow files, falling back to regular scheduling.\n #{err}",
214215
"error",
215216
rspec_stdout: rspec_output,
216217
rspec_stderr: err,
217-
cmd_result: cmd_result.inspect,
218+
cmd_result: cmd_result.inspect
218219
)
219220

220221
pp rspec_output
@@ -236,7 +237,7 @@ def elapsed(since)
236237

237238
# Prints msg to standard output and emits an event to Sentry, if the
238239
# SENTRY_DSN environment variable is set.
239-
def log_event(msg, level, additional={})
240+
def log_event(msg, level, additional = {})
240241
puts msg
241242

242243
Raven.capture_message(msg, level: level, extra: {
@@ -247,8 +248,8 @@ def log_event(msg, level, additional={})
247248
populate_timings: populate_timings,
248249
file_split_threshold: file_split_threshold,
249250
heartbeat_updated_at: @heartbeat_updated_at,
250-
object: self.inspect,
251-
pid: Process.pid,
251+
object: inspect,
252+
pid: Process.pid
252253
}.merge(additional))
253254
end
254255
end

rspecq.gemspec

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@ Gem::Specification.new do |s|
1313
s.license = "MIT"
1414

1515
if ENV["CI"] && ENV["RSPEC_CORE"]
16-
s.add_dependency "rspec-core", "#{ENV['RSPEC_CORE']}"
16+
s.add_dependency "rspec-core", ENV["RSPEC_CORE"]
1717
else
1818
s.add_dependency "rspec-core"
1919
end
2020

2121
s.add_dependency "redis"
2222
s.add_dependency "sentry-raven"
2323

24-
s.add_development_dependency "rake"
25-
s.add_development_dependency "pry-byebug"
2624
s.add_development_dependency "minitest"
25+
s.add_development_dependency "pry-byebug"
26+
s.add_development_dependency "rake"
2727
s.add_development_dependency "rspec"
2828
s.add_development_dependency "rubocop", "~> 0.93.0"
2929
end

test/sample_suites/deprecation_warning/spec/foo_spec.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
# rubocop:disable Style/StderrPuts
12
$stderr.puts "I'm a warning!"
3+
# rubocop:enable Style/StderrPuts
24

35
describe "A slow spec file to be splitted" do
46
it do

test/test_e2e.rb

+9-8
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ def test_suite_with_legit_failures
1717
"./spec/success_spec.rb",
1818
], queue
1919

20-
assert_equal 3 + 3 + 5, queue.example_count
20+
assert_equal 3 + 3 + 5, queue.example_count
2121

22-
assert_equal({
23-
"./spec/fail_1_spec.rb[1:2]" => "3",
24-
"./spec/fail_2_spec.rb[1:2]" => "3",
25-
}, queue.requeued_jobs)
22+
assert_equal(
23+
{ "./spec/fail_1_spec.rb[1:2]" => "3",
24+
"./spec/fail_2_spec.rb[1:2]" => "3" },
25+
queue.requeued_jobs
26+
)
2627
end
2728

2829
def test_passing_suite
@@ -87,7 +88,7 @@ def test_timings_update
8788
"./spec/medium_spec.rb",
8889
"./spec/slow_spec.rb",
8990
"./spec/very_slow_spec.rb",
90-
], queue.timings.sort_by { |k,v| v }.map(&:first)
91+
], queue.timings.sort_by { |_, v| v }.map(&:first)
9192
end
9293

9394
def test_timings_no_update
@@ -98,11 +99,11 @@ def test_timings_no_update
9899
end
99100

100101
def test_spec_file_splitting
101-
queue = exec_build( "spec_file_splitting", "--update-timings")
102+
queue = exec_build("spec_file_splitting", "--update-timings")
102103
assert queue.build_successful?
103104
refute_empty queue.timings
104105

105-
queue = exec_build( "spec_file_splitting", "--file-split-threshold 1")
106+
queue = exec_build("spec_file_splitting", "--file-split-threshold 1")
106107

107108
assert queue.build_successful?
108109
refute_empty queue.timings

0 commit comments

Comments
 (0)