flakey_spec_catcher 0.9.7 → 0.11.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +1 -0
- data/flakey_spec_catcher.gemspec +6 -4
- data/lib/flakey_spec_catcher/change_capsule.rb +31 -7
- data/lib/flakey_spec_catcher/cli_override.rb +15 -1
- data/lib/flakey_spec_catcher/git_controller.rb +7 -40
- data/lib/flakey_spec_catcher/rerun_manager.rb +19 -0
- data/lib/flakey_spec_catcher/runner.rb +3 -1
- data/lib/flakey_spec_catcher/user_config.rb +11 -4
- data/lib/flakey_spec_catcher/version.rb +1 -1
- metadata +43 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a88793e18d2fc8a483639620b2876b4955f3fc8a5425f41a25cc2e3509cd6e0
|
4
|
+
data.tar.gz: f4c0a38a03eb0fabcde7111f3bf8bfc3698a7c5c576a106fb7c7b4337ed782b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c033294dc195ab6784dc22919ff986f7e646657b85a7efe6a5780333b666b4a7c7bba5f10ab41839ee9574cd9f4307a6f9b6c276f5da4f9144b5828dd1f2e06
|
7
|
+
data.tar.gz: 00a950c3296e05a81c8294c2005d6c84b454296de2f697b7ef2152ec6f29ef02c6305b3749d3a2d1449436fa1b6fb6ac0ccc2d9e3f5ae9db7ebef04043db2b96
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -163,6 +163,7 @@ FSC_USAGE_PATTERNS = '{ spec/ui => bundle exec rspec }, { spec/api => parallel_r
|
|
163
163
|
--verbose Send all output from running tests to stdout
|
164
164
|
-v, --version Prints current flakey_spec_catcher_version
|
165
165
|
-h, --help Displays available flakey_spec_catcher cli overrides
|
166
|
+
--rspec-options '[OPTIONS]' Execute default usage with rspec options
|
166
167
|
```
|
167
168
|
|
168
169
|
Examples:
|
data/flakey_spec_catcher.gemspec
CHANGED
@@ -28,11 +28,13 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.require_paths = ['lib']
|
29
29
|
|
30
30
|
gem.metadata['allowed_push_host'] = 'https://rubygems.org'
|
31
|
-
gem.required_ruby_version = '>= 2.
|
31
|
+
gem.required_ruby_version = '>= 2.6'
|
32
32
|
|
33
|
-
gem.add_dependency 'rspec', '~> 3.
|
33
|
+
gem.add_dependency 'rspec', '~> 3.10'
|
34
|
+
gem.add_development_dependency 'byebug', '~> 11.1'
|
34
35
|
gem.add_development_dependency 'climate_control', '~> 0.2'
|
35
|
-
gem.add_development_dependency 'rake', '~>
|
36
|
-
gem.add_development_dependency '
|
36
|
+
gem.add_development_dependency 'rake', '~> 13.0'
|
37
|
+
gem.add_development_dependency 'rubocop', '~> 0.93.1'
|
38
|
+
gem.add_development_dependency 'simplecov', '~> 0.19'
|
37
39
|
end
|
38
40
|
# rubocop:enable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
@@ -8,7 +8,7 @@ module FlakeySpecCatcher
|
|
8
8
|
# A ChangeCapsule object will represent the changes made to a block of code. It
|
9
9
|
# accomplishes this using ChangeContext and ChangeSummary objects.
|
10
10
|
class ChangeCapsule
|
11
|
-
attr_reader :file_name, :change_summary, :change_contexts
|
11
|
+
attr_reader :file_name, :change_summary, :change_contexts, :spec_tree
|
12
12
|
SCOPE_SPECIFIERS = %w[it context describe scenario].freeze
|
13
13
|
SHARED_EXAMPLES = %w[include_examples it_behaves_like it_should_behave_like matching].freeze
|
14
14
|
|
@@ -16,6 +16,7 @@ module FlakeySpecCatcher
|
|
16
16
|
@file_name = file_name
|
17
17
|
@change_summary = change_summary
|
18
18
|
@change_contexts = []
|
19
|
+
@spec_tree = {}
|
19
20
|
handle_initial_change_contexts(change_contexts)
|
20
21
|
end
|
21
22
|
|
@@ -23,23 +24,30 @@ module FlakeySpecCatcher
|
|
23
24
|
@change_contexts.map(&:rerun_info)
|
24
25
|
end
|
25
26
|
|
27
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
26
28
|
def fill_contexts
|
27
29
|
change_context_stack = []
|
28
30
|
ignore_scope_closure = 0
|
29
31
|
lines_in_file = File.read(@file_name).split("\n")
|
30
32
|
lines_in_file.each_with_index do |line, index|
|
33
|
+
shared_example_identified = false
|
34
|
+
|
31
35
|
# Check if line matches an rspec example or examplegroup format
|
32
36
|
if line =~ spec_scope
|
33
37
|
handle_change_context(line, index, change_context_stack)
|
34
38
|
# Else, ignore other blocks that might pollute context stack
|
39
|
+
elsif line =~ shared_example_scope
|
40
|
+
handle_change_context(line, index, change_context_stack)
|
41
|
+
shared_example_identified = true
|
35
42
|
elsif line_matches_method_or_block(line)
|
36
43
|
ignore_scope_closure += 1
|
37
44
|
end
|
38
45
|
|
39
46
|
fill_context(line, index, change_context_stack)
|
40
47
|
|
41
|
-
|
42
|
-
|
48
|
+
if shared_example_identified
|
49
|
+
change_context_stack.pop
|
50
|
+
elsif line =~ pop_scope
|
43
51
|
if ignore_scope_closure.positive?
|
44
52
|
ignore_scope_closure -= 1
|
45
53
|
else
|
@@ -48,6 +56,7 @@ module FlakeySpecCatcher
|
|
48
56
|
end
|
49
57
|
end
|
50
58
|
end
|
59
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
51
60
|
|
52
61
|
private
|
53
62
|
|
@@ -69,14 +78,15 @@ module FlakeySpecCatcher
|
|
69
78
|
end
|
70
79
|
|
71
80
|
def spec_scope
|
72
|
-
# Not sure if we need to check for description in quotes
|
73
|
-
# spec_scope = /^\s*(#{SCOPE_SPECIFIERS.join("|")})\s*('.*'|".*").*do\s*$/
|
74
|
-
|
75
81
|
/\s*(#{SCOPE_SPECIFIERS.join("|")}).*\s+do.*$/
|
76
82
|
end
|
77
83
|
|
84
|
+
def shared_example_scope
|
85
|
+
/\s*(#{SHARED_EXAMPLES.join("|")}).*\s+.*$/
|
86
|
+
end
|
87
|
+
|
78
88
|
def line_matches_method_or_block(line)
|
79
|
-
return true if line =~ /\s*do(\s+|$)/ || line =~ /^\s*def\s+/ || line =~ /^\s*if\s+/
|
89
|
+
return true if line =~ /\s*do(\s+|$)/ || line =~ /^\s*def\s+/ || line =~ /^\s*if\s+/ || line =~ /^\s*class\s+/
|
80
90
|
|
81
91
|
false
|
82
92
|
end
|
@@ -112,6 +122,20 @@ module FlakeySpecCatcher
|
|
112
122
|
|
113
123
|
change_context_stack.push(change_context) unless
|
114
124
|
change_context_stack.any? { |c| c == change_context }
|
125
|
+
|
126
|
+
build_spec_tree(change_context_stack)
|
127
|
+
end
|
128
|
+
|
129
|
+
def build_spec_tree(change_contexts)
|
130
|
+
return unless change_contexts.count > 1
|
131
|
+
|
132
|
+
current_scope = change_contexts[-1].rerun_info
|
133
|
+
parent_scope = change_contexts[-2].rerun_info
|
134
|
+
@spec_tree[parent_scope] = if @spec_tree[parent_scope]
|
135
|
+
@spec_tree[parent_scope] << current_scope
|
136
|
+
else
|
137
|
+
[current_scope]
|
138
|
+
end
|
115
139
|
end
|
116
140
|
end
|
117
141
|
end
|
@@ -8,7 +8,8 @@ module FlakeySpecCatcher
|
|
8
8
|
# Captures command line arguments for manual re-runs
|
9
9
|
class CliOverride
|
10
10
|
attr_reader :rerun_patterns, :rerun_usage, :repeat_factor, :enable_runs, :excluded_tags, :use_parent, :dry_run
|
11
|
-
attr_reader :output_file, :split_nodes, :split_index, :verbose
|
11
|
+
attr_reader :output_file, :split_nodes, :split_index, :verbose, :test_options, :break_on_first_failure
|
12
|
+
attr_reader :list_child_specs
|
12
13
|
|
13
14
|
def initialize
|
14
15
|
@dry_run = false
|
@@ -16,6 +17,7 @@ module FlakeySpecCatcher
|
|
16
17
|
@excluded_tags = []
|
17
18
|
@use_parent = false
|
18
19
|
@verbose = false
|
20
|
+
@test_options = []
|
19
21
|
parse_command_line_args
|
20
22
|
validate_arguments
|
21
23
|
end
|
@@ -55,6 +57,14 @@ module FlakeySpecCatcher
|
|
55
57
|
@repeat_factor = remove_formatter_quotes(repeat).to_i
|
56
58
|
end
|
57
59
|
|
60
|
+
opts.on('--break-on-first-failure', 'Break on first failure') do |break_on_first_failure|
|
61
|
+
@break_on_first_failure = break_on_first_failure
|
62
|
+
end
|
63
|
+
|
64
|
+
opts.on('--list-child-specs', 'List Child Specs (Verbose Spec Listing') do |list_child_specs|
|
65
|
+
@list_child_specs = list_child_specs
|
66
|
+
end
|
67
|
+
|
58
68
|
opts.on('-e', '--excluded-tags=EXCLUDED_TAGS',
|
59
69
|
'Specify tags to exclude in a comma separated list') do |tags|
|
60
70
|
@excluded_tags = parse_tags(tags)
|
@@ -87,6 +97,10 @@ module FlakeySpecCatcher
|
|
87
97
|
puts opts
|
88
98
|
@enable_runs = false
|
89
99
|
end
|
100
|
+
|
101
|
+
opts.on("--rspec-options '[OPTIONS]'", 'execute default usage with rspec options') do |arg|
|
102
|
+
@test_options = arg.split(/[ ](?=(?:[^"]*"[^"]*")*[^"]*$)(?=(?:[^']*'[^']*')*[^']*$)/)
|
103
|
+
end
|
90
104
|
end.parse!
|
91
105
|
end
|
92
106
|
|
@@ -56,45 +56,12 @@ module FlakeySpecCatcher
|
|
56
56
|
return nil if @remote.nil?
|
57
57
|
|
58
58
|
working_branch = `git branch | grep '*'`.delete('*').gsub(/\s+/, '')
|
59
|
-
|
60
|
-
|
61
|
-
# Assume master if no matches
|
62
|
-
|
63
|
-
# Example output
|
64
|
-
# * remote origin
|
65
|
-
# Fetch URL: gerrit:repo
|
66
|
-
# Push URL: gerrit:repo
|
67
|
-
# HEAD branch: master
|
68
|
-
# Remote branches:
|
69
|
-
# dev/reports tracked
|
70
|
-
# edge tracked
|
71
|
-
# master tracked
|
72
|
-
# Local branch configured for 'git pull':
|
73
|
-
# master merges with remote master
|
74
|
-
# Local refs configured for 'git push':
|
75
|
-
# dev/reports pushes to dev/reports (up to date)
|
76
|
-
# master pushes to master (up to date)
|
77
|
-
|
78
|
-
remote_branches = `git remote show #{@remote}`.split("\n")
|
79
|
-
|
80
|
-
# Separate 'dev/reports pushes to dev/reports (up to date)' into
|
81
|
-
# ['dev/reports', 'dev/reports'] or [<LOCAL BRANCH>, <REMOTE BRANCH>]
|
82
|
-
remote_pairs = remote_branches.map { |r| r.scan(/(\S*)\s+pushes to\s+(\S*)\s+/).flatten }
|
83
|
-
|
84
|
-
# check if the working branch (currently checked out branch) corresponds to a remote_pair
|
85
|
-
# if so, use that remote pair for comparison, else use master
|
86
|
-
match = remote_pairs.find do |pair|
|
87
|
-
# working branch (pair[0]) pushes to remote (pair[1])
|
88
|
-
pair[0] == working_branch
|
89
|
-
end
|
59
|
+
branch_remote = `git config branch.#{working_branch}.remote`.strip
|
60
|
+
return 'master' unless @remote == branch_remote
|
90
61
|
|
91
|
-
remote_branch =
|
92
|
-
|
93
|
-
|
94
|
-
# match is formatted as [working_branch, remote]
|
95
|
-
match[1]
|
96
|
-
end
|
97
|
-
remote_branch
|
62
|
+
remote_branch = `git config branch.#{branch}.merge`.strip.sub(%r{^refs/heads/}, '')
|
63
|
+
remote_branch = nil if remote_branch.empty?
|
64
|
+
remote_branch || 'master'
|
98
65
|
end
|
99
66
|
|
100
67
|
def initialize_git_comparison(test_mode)
|
@@ -108,7 +75,7 @@ module FlakeySpecCatcher
|
|
108
75
|
@git_comparison = "#{@base_commit_sha}..#{@working_commit_sha}"
|
109
76
|
end
|
110
77
|
|
111
|
-
# rubocop:disable Metrics/
|
78
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
112
79
|
def parse_changes
|
113
80
|
# For each file, get the change block
|
114
81
|
diff_files.each do |filename|
|
@@ -128,7 +95,7 @@ module FlakeySpecCatcher
|
|
128
95
|
end
|
129
96
|
end
|
130
97
|
end
|
131
|
-
# rubocop:enable Metrics/
|
98
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
132
99
|
|
133
100
|
def identify_change_contexts
|
134
101
|
@capsule_manager.change_capsules.each(&:fill_contexts)
|
@@ -39,6 +39,7 @@ module FlakeySpecCatcher
|
|
39
39
|
else
|
40
40
|
all_non_example_groups - identify_tag_excluded_reruns
|
41
41
|
end
|
42
|
+
tests = transform_parent_specs(tests).flatten if @user_config.list_child_specs
|
42
43
|
filter_reruns_by_ignore_files(tests)
|
43
44
|
end
|
44
45
|
|
@@ -171,5 +172,23 @@ module FlakeySpecCatcher
|
|
171
172
|
@rerun_capsules.push(FlakeySpecCatcher::RerunCapsule.new(testcase: testcase, usage: usage))
|
172
173
|
end
|
173
174
|
end
|
175
|
+
|
176
|
+
def transform_parent_specs(tests)
|
177
|
+
transformed_tests = []
|
178
|
+
tests.each do |test|
|
179
|
+
capsule = @git_controller.capsule_manager.change_capsules.find { |c| c.file_name == test.split(':')[0] }
|
180
|
+
spec_tree = capsule.spec_tree
|
181
|
+
# If test is a key in the spec_tree, it's an example group, so we queue up its descendant examples
|
182
|
+
if spec_tree[test]
|
183
|
+
spec_tree[test].each do |child|
|
184
|
+
transformed_tests << transform_parent_specs([child]).flatten
|
185
|
+
end
|
186
|
+
# Else test is just an example
|
187
|
+
else
|
188
|
+
transformed_tests << test
|
189
|
+
end
|
190
|
+
end
|
191
|
+
transformed_tests
|
192
|
+
end
|
174
193
|
end
|
175
194
|
end
|
@@ -36,6 +36,7 @@ module FlakeySpecCatcher
|
|
36
36
|
puts " Current Sha: #{@git_controller.working_commit_sha}"
|
37
37
|
puts " Base Sha: #{@git_controller.base_commit_sha}"
|
38
38
|
puts " Repeat factor: #{@user_config.repeat_factor}"
|
39
|
+
puts " Break on first failure: #{@user_config.break_on_first_failure}" if @user_config.break_on_first_failure
|
39
40
|
puts " Node Total: #{@user_config.split_nodes}" if @user_config.split_nodes
|
40
41
|
puts " Node Index: #{@user_config.split_index}" if @user_config.split_index
|
41
42
|
puts " Changed Specs Detected: #{@git_controller.changed_examples}"
|
@@ -75,6 +76,7 @@ module FlakeySpecCatcher
|
|
75
76
|
@user_config.repeat_factor.times do
|
76
77
|
iteration_status = handle_capsule_rerun(capsule)
|
77
78
|
status = [status, iteration_status].max
|
79
|
+
break if @user_config.break_on_first_failure && !status.zero?
|
78
80
|
end
|
79
81
|
end
|
80
82
|
|
@@ -98,7 +100,7 @@ module FlakeySpecCatcher
|
|
98
100
|
rspec_args = ['--format', 'documentation', '--out', @user_config.output_file, test]
|
99
101
|
# Rspec output sent to stdout if verbose option is true
|
100
102
|
rspec_args << '-fd' if @user_config.verbose
|
101
|
-
return_status = RSpec::Core::Runner.run(rspec_args)
|
103
|
+
return_status = RSpec::Core::Runner.run(@user_config.test_options.concat(rspec_args))
|
102
104
|
RSpec.clear_examples
|
103
105
|
copy_output_to_temp_file unless @user_config.output_file == File::NULL
|
104
106
|
return_status
|
@@ -11,11 +11,12 @@ module FlakeySpecCatcher
|
|
11
11
|
attr_reader :rerun_file_only, :rspec_usage_patterns, :excluded_tags
|
12
12
|
attr_reader :manual_rerun_patterns, :manual_rerun_usage
|
13
13
|
attr_reader :enable_runs, :output_file, :use_parent, :dry_run
|
14
|
-
attr_reader :split_nodes, :split_index, :verbose
|
14
|
+
attr_reader :split_nodes, :split_index, :verbose, :test_options
|
15
|
+
attr_reader :break_on_first_failure, :list_child_specs
|
15
16
|
|
16
17
|
USER_CONFIG_ENV_VARS = %w[FSC_REPEAT_FACTOR FSC_IGNORE_FILES FSC_IGNORE_BRANCHES
|
17
18
|
FSC_SILENT_MODE FSC_RERUN_FILE_ONLY FSC_USAGE_PATTERNS
|
18
|
-
FSC_EXCLUDED_TAGS FSC_OUTPUT_FILE].freeze
|
19
|
+
FSC_EXCLUDED_TAGS FSC_OUTPUT_FILE FSC_LIST_CHILD_SPECS].freeze
|
19
20
|
|
20
21
|
def initialize(cli_override: CliOverride.new)
|
21
22
|
apply_env_var_settings
|
@@ -32,6 +33,7 @@ module FlakeySpecCatcher
|
|
32
33
|
@ignore_branches = env_var_string_to_array(ENV['FSC_IGNORE_BRANCHES'])
|
33
34
|
@silent_mode = env_var_string_to_bool(ENV['FSC_SILENT_MODE'])
|
34
35
|
@rerun_file_only = env_var_string_to_bool(ENV['FSC_RERUN_FILE_ONLY'])
|
36
|
+
@list_child_specs = env_var_string_to_bool(ENV['FSC_LIST_CHILD_SPECS'])
|
35
37
|
@rspec_usage_patterns = env_var_string_to_pairs(ENV['FSC_USAGE_PATTERNS'])
|
36
38
|
@excluded_tags = env_var_string_to_tags(ENV['FSC_EXCLUDED_TAGS'])
|
37
39
|
@output_file = ENV['FSC_OUTPUT_FILE']
|
@@ -44,6 +46,8 @@ module FlakeySpecCatcher
|
|
44
46
|
@manual_rerun_usage = @cli_override.rerun_usage
|
45
47
|
@use_parent = @cli_override.use_parent
|
46
48
|
@repeat_factor = @cli_override.repeat_factor if @cli_override.repeat_factor.to_i.positive?
|
49
|
+
@break_on_first_failure = @cli_override.break_on_first_failure
|
50
|
+
@list_child_specs = @cli_override.list_child_specs unless @cli_override.list_child_specs.nil?
|
47
51
|
@enable_runs = @cli_override.enable_runs
|
48
52
|
@dry_run = @cli_override.dry_run
|
49
53
|
@split_nodes = @cli_override.split_nodes unless @cli_override.split_nodes.nil?
|
@@ -55,6 +59,7 @@ module FlakeySpecCatcher
|
|
55
59
|
end
|
56
60
|
@output_file = set_output_file
|
57
61
|
@verbose = @cli_override.verbose
|
62
|
+
@test_options = @cli_override.test_options
|
58
63
|
end
|
59
64
|
# rubocop:enable Metrics/AbcSize
|
60
65
|
|
@@ -167,7 +172,7 @@ module FlakeySpecCatcher
|
|
167
172
|
end
|
168
173
|
end
|
169
174
|
|
170
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
175
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
171
176
|
def override_user_config(env_var, env_value)
|
172
177
|
case env_var
|
173
178
|
when 'FSC_REPEAT_FACTOR'
|
@@ -180,6 +185,8 @@ module FlakeySpecCatcher
|
|
180
185
|
@silent_mode = env_var_string_to_bool(env_value)
|
181
186
|
when 'FSC_RERUN_FILE_ONLY'
|
182
187
|
@rerun_file_only = env_var_string_to_bool(env_value)
|
188
|
+
when 'FSC_LIST_CHILD_SPECS'
|
189
|
+
@list_child_specs = env_var_string_to_bool(env_value)
|
183
190
|
when 'FSC_USAGE_PATTERNS'
|
184
191
|
@rspec_usage_patterns = env_var_string_to_pairs(env_value)
|
185
192
|
when 'FSC_EXCLUDED_TAGS'
|
@@ -188,6 +195,6 @@ module FlakeySpecCatcher
|
|
188
195
|
@output_file = env_value
|
189
196
|
end
|
190
197
|
end
|
191
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
198
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
192
199
|
end
|
193
200
|
end
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flakey_spec_catcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Watson
|
8
8
|
- Mikey Hargiss
|
9
9
|
- Ben Nelson
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2021-10-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -18,14 +18,28 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '3.
|
21
|
+
version: '3.10'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '3.
|
28
|
+
version: '3.10'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: byebug
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '11.1'
|
36
|
+
type: :development
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '11.1'
|
29
43
|
- !ruby/object:Gem::Dependency
|
30
44
|
name: climate_control
|
31
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -46,29 +60,43 @@ dependencies:
|
|
46
60
|
requirements:
|
47
61
|
- - "~>"
|
48
62
|
- !ruby/object:Gem::Version
|
49
|
-
version: '
|
63
|
+
version: '13.0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '13.0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rubocop
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.93.1
|
50
78
|
type: :development
|
51
79
|
prerelease: false
|
52
80
|
version_requirements: !ruby/object:Gem::Requirement
|
53
81
|
requirements:
|
54
82
|
- - "~>"
|
55
83
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
84
|
+
version: 0.93.1
|
57
85
|
- !ruby/object:Gem::Dependency
|
58
86
|
name: simplecov
|
59
87
|
requirement: !ruby/object:Gem::Requirement
|
60
88
|
requirements:
|
61
89
|
- - "~>"
|
62
90
|
- !ruby/object:Gem::Version
|
63
|
-
version: '0.
|
91
|
+
version: '0.19'
|
64
92
|
type: :development
|
65
93
|
prerelease: false
|
66
94
|
version_requirements: !ruby/object:Gem::Requirement
|
67
95
|
requirements:
|
68
96
|
- - "~>"
|
69
97
|
- !ruby/object:Gem::Version
|
70
|
-
version: '0.
|
71
|
-
description:
|
98
|
+
version: '0.19'
|
99
|
+
description:
|
72
100
|
email:
|
73
101
|
- bwatson@instructure.com
|
74
102
|
- mhargiss@instructure.com
|
@@ -102,12 +130,12 @@ files:
|
|
102
130
|
- lib/flakey_spec_catcher/version.rb
|
103
131
|
- lib/helpers/colorize.rb
|
104
132
|
- lib/helpers/indent_string.rb
|
105
|
-
homepage:
|
133
|
+
homepage:
|
106
134
|
licenses:
|
107
135
|
- MIT
|
108
136
|
metadata:
|
109
137
|
allowed_push_host: https://rubygems.org
|
110
|
-
post_install_message:
|
138
|
+
post_install_message:
|
111
139
|
rdoc_options: []
|
112
140
|
require_paths:
|
113
141
|
- lib
|
@@ -115,15 +143,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
143
|
requirements:
|
116
144
|
- - ">="
|
117
145
|
- !ruby/object:Gem::Version
|
118
|
-
version: '2.
|
146
|
+
version: '2.6'
|
119
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
148
|
requirements:
|
121
149
|
- - ">="
|
122
150
|
- !ruby/object:Gem::Version
|
123
151
|
version: '0'
|
124
152
|
requirements: []
|
125
|
-
rubygems_version: 3.1
|
126
|
-
signing_key:
|
153
|
+
rubygems_version: 3.0.1
|
154
|
+
signing_key:
|
127
155
|
specification_version: 4
|
128
156
|
summary: Run new or changed specs many times to prevent unreliable specs
|
129
157
|
test_files: []
|