evilution 0.15.0 → 0.16.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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/.beads/.migration-hint-ts +1 -1
  3. data/.beads/issues.jsonl +32 -32
  4. data/CHANGELOG.md +27 -0
  5. data/lib/evilution/ast/source_surgeon.rb +3 -3
  6. data/lib/evilution/cli.rb +1 -0
  7. data/lib/evilution/config.rb +7 -1
  8. data/lib/evilution/mutator/operator/bang_method.rb +48 -0
  9. data/lib/evilution/mutator/operator/bitwise_complement.rb +31 -0
  10. data/lib/evilution/mutator/operator/bitwise_replacement.rb +30 -0
  11. data/lib/evilution/mutator/operator/break_statement.rb +50 -0
  12. data/lib/evilution/mutator/operator/class_variable_write.rb +25 -0
  13. data/lib/evilution/mutator/operator/collection_replacement.rb +25 -1
  14. data/lib/evilution/mutator/operator/ensure_removal.rb +27 -0
  15. data/lib/evilution/mutator/operator/explicit_super_mutation.rb +47 -0
  16. data/lib/evilution/mutator/operator/global_variable_write.rb +25 -0
  17. data/lib/evilution/mutator/operator/inline_rescue.rb +39 -0
  18. data/lib/evilution/mutator/operator/instance_variable_write.rb +25 -0
  19. data/lib/evilution/mutator/operator/local_variable_assignment.rb +16 -0
  20. data/lib/evilution/mutator/operator/next_statement.rb +50 -0
  21. data/lib/evilution/mutator/operator/redo_statement.rb +18 -0
  22. data/lib/evilution/mutator/operator/rescue_body_replacement.rb +94 -0
  23. data/lib/evilution/mutator/operator/rescue_removal.rb +37 -0
  24. data/lib/evilution/mutator/operator/send_mutation.rb +11 -2
  25. data/lib/evilution/mutator/operator/zsuper_removal.rb +16 -0
  26. data/lib/evilution/mutator/registry.rb +17 -1
  27. data/lib/evilution/reporter/progress_bar.rb +84 -0
  28. data/lib/evilution/reporter/suggestion.rb +225 -1
  29. data/lib/evilution/runner.rb +23 -11
  30. data/lib/evilution/version.rb +1 -1
  31. data/lib/evilution.rb +17 -0
  32. metadata +19 -2
@@ -26,7 +26,23 @@ class Evilution::Reporter::Suggestion
26
26
  "argument_removal" => "Add a test that verifies the correct arguments are passed to this method call",
27
27
  "compound_assignment" => "Add a test that verifies the side effect of this compound assignment (the accumulated value matters)",
28
28
  "superclass_removal" => "Add a test that exercises inherited behavior from the superclass",
29
- "mixin_removal" => "Add a test that exercises behavior provided by the included/extended module"
29
+ "mixin_removal" => "Add a test that exercises behavior provided by the included/extended module",
30
+ "local_variable_assignment" => "Add a test that depends on the assigned variable being stored, not just the value expression",
31
+ "instance_variable_write" => "Add a test that verifies the instance variable is set correctly, not just the return value",
32
+ "class_variable_write" => "Add a test that verifies the class variable is set correctly and affects shared state",
33
+ "global_variable_write" => "Add a test that verifies the global variable is set correctly, not just the value expression",
34
+ "rescue_removal" => "Add a test that triggers the rescued exception and verifies the rescue handler behavior",
35
+ "rescue_body_replacement" => "Add a test that triggers the rescued exception and verifies the rescue body produces the correct result",
36
+ "inline_rescue" => "Add a test that triggers the inline rescue and verifies the fallback value is used correctly",
37
+ "ensure_removal" => "Add a test that verifies the ensure cleanup code runs and its side effects are observable",
38
+ "break_statement" => "Add a test that verifies the break condition and the value returned when the loop exits early",
39
+ "next_statement" => "Add a test that verifies the next condition and the value yielded when the iteration skips",
40
+ "redo_statement" => "Add a test that verifies the redo restarts the iteration and the retry logic is necessary",
41
+ "bang_method" => "Add a test that distinguishes in-place mutation from copy semantics (bang vs non-bang)",
42
+ "bitwise_replacement" => "Add a test that checks the exact bitwise result to distinguish &, |, and ^ operators",
43
+ "bitwise_complement" => "Add a test that verifies the bitwise complement (~) result, not just the sign or magnitude",
44
+ "zsuper_removal" => "Add a test that verifies inherited behavior from super is needed, not just the subclass logic",
45
+ "explicit_super_mutation" => "Add a test that verifies the correct arguments are passed to super and the inherited result matters"
30
46
  }.freeze
31
47
 
32
48
  CONCRETE_TEMPLATES = {
@@ -305,6 +321,58 @@ class Evilution::Reporter::Suggestion
305
321
  end
306
322
  RSPEC
307
323
  },
324
+ "local_variable_assignment" => lambda { |mutation|
325
+ method_name = parse_method_name(mutation.subject.name)
326
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
327
+ <<~RSPEC.strip
328
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
329
+ # #{mutation.file_path}:#{mutation.line}
330
+ it 'verifies the local variable assignment is used in ##{method_name}' do
331
+ # Assert that the assigned variable is read later, not just the value expression
332
+ result = subject.#{method_name}(input_value)
333
+ expect(result).to eq(expected)
334
+ end
335
+ RSPEC
336
+ },
337
+ "instance_variable_write" => lambda { |mutation|
338
+ method_name = parse_method_name(mutation.subject.name)
339
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
340
+ <<~RSPEC.strip
341
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
342
+ # #{mutation.file_path}:#{mutation.line}
343
+ it 'verifies the instance variable @state is set correctly in ##{method_name}' do
344
+ # Assert that the instance variable holds the expected value after the method runs
345
+ subject.#{method_name}(input_value)
346
+ expect(subject.instance_variable_get(:@variable)).to eq(expected)
347
+ end
348
+ RSPEC
349
+ },
350
+ "class_variable_write" => lambda { |mutation|
351
+ method_name = parse_method_name(mutation.subject.name)
352
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
353
+ <<~RSPEC.strip
354
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
355
+ # #{mutation.file_path}:#{mutation.line}
356
+ it 'verifies the class variable @@shared state is set correctly in ##{method_name}' do
357
+ # Assert that the class variable holds the expected value and affects shared state
358
+ subject.#{method_name}(input_value)
359
+ expect(described_class.class_variable_get(:@@variable)).to eq(expected)
360
+ end
361
+ RSPEC
362
+ },
363
+ "global_variable_write" => lambda { |mutation|
364
+ method_name = parse_method_name(mutation.subject.name)
365
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
366
+ <<~RSPEC.strip
367
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
368
+ # #{mutation.file_path}:#{mutation.line}
369
+ it 'verifies the global variable $state is set correctly in ##{method_name}' do
370
+ # Assert that the global variable holds the expected value after the method runs
371
+ subject.#{method_name}(input_value)
372
+ expect($variable).to eq(expected)
373
+ end
374
+ RSPEC
375
+ },
308
376
  "mixin_removal" => lambda { |mutation|
309
377
  method_name = parse_method_name(mutation.subject.name)
310
378
  original_line, _mutated_line = extract_diff_lines(mutation.diff)
@@ -317,6 +385,162 @@ class Evilution::Reporter::Suggestion
317
385
  expect(result).to eq(expected)
318
386
  end
319
387
  RSPEC
388
+ },
389
+ "rescue_removal" => lambda { |mutation|
390
+ method_name = parse_method_name(mutation.subject.name)
391
+ original_line, _mutated_line = extract_diff_lines(mutation.diff)
392
+ <<~RSPEC.strip
393
+ # Mutation: removed `#{original_line}` in #{mutation.subject.name}
394
+ # #{mutation.file_path}:#{mutation.line}
395
+ it 'verifies the rescue handler is needed in ##{method_name}' do
396
+ # Trigger the rescued exception and assert the handler's effect
397
+ result = subject.#{method_name}(input_that_raises)
398
+ expect(result).to eq(expected)
399
+ end
400
+ RSPEC
401
+ },
402
+ "rescue_body_replacement" => lambda { |mutation|
403
+ method_name = parse_method_name(mutation.subject.name)
404
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
405
+ <<~RSPEC.strip
406
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
407
+ # #{mutation.file_path}:#{mutation.line}
408
+ it 'verifies the rescue handler produces the correct result in ##{method_name}' do
409
+ # Trigger the exception and assert the rescue body's return value or side effect
410
+ result = subject.#{method_name}(input_that_raises)
411
+ expect(result).to eq(expected)
412
+ end
413
+ RSPEC
414
+ },
415
+ "inline_rescue" => lambda { |mutation|
416
+ method_name = parse_method_name(mutation.subject.name)
417
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
418
+ <<~RSPEC.strip
419
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
420
+ # #{mutation.file_path}:#{mutation.line}
421
+ it 'verifies the inline rescue fallback value in ##{method_name}' do
422
+ # Trigger the exception and assert the fallback value is correct
423
+ result = subject.#{method_name}(input_that_raises)
424
+ expect(result).to eq(expected)
425
+ end
426
+ RSPEC
427
+ },
428
+ "ensure_removal" => lambda { |mutation|
429
+ method_name = parse_method_name(mutation.subject.name)
430
+ original_line, _mutated_line = extract_diff_lines(mutation.diff)
431
+ <<~RSPEC.strip
432
+ # Mutation: removed ensure block `#{original_line}` in #{mutation.subject.name}
433
+ # #{mutation.file_path}:#{mutation.line}
434
+ it 'verifies the ensure cleanup runs in ##{method_name}' do
435
+ # Assert that the cleanup side effect is observable after the method runs
436
+ subject.#{method_name}(input_value)
437
+ expect(observable_cleanup_effect).to eq(expected)
438
+ end
439
+ RSPEC
440
+ },
441
+ "break_statement" => lambda { |mutation|
442
+ method_name = parse_method_name(mutation.subject.name)
443
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
444
+ <<~RSPEC.strip
445
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
446
+ # #{mutation.file_path}:#{mutation.line}
447
+ it 'verifies the break exits the loop correctly in ##{method_name}' do
448
+ # Assert the loop exits early and returns the expected value
449
+ result = subject.#{method_name}(input_value)
450
+ expect(result).to eq(expected)
451
+ end
452
+ RSPEC
453
+ },
454
+ "next_statement" => lambda { |mutation|
455
+ method_name = parse_method_name(mutation.subject.name)
456
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
457
+ <<~RSPEC.strip
458
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
459
+ # #{mutation.file_path}:#{mutation.line}
460
+ it 'verifies the next skips the iteration correctly in ##{method_name}' do
461
+ # Assert the iteration is skipped and the expected value is yielded
462
+ result = subject.#{method_name}(input_value)
463
+ expect(result).to eq(expected)
464
+ end
465
+ RSPEC
466
+ },
467
+ "redo_statement" => lambda { |mutation|
468
+ method_name = parse_method_name(mutation.subject.name)
469
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
470
+ <<~RSPEC.strip
471
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
472
+ # #{mutation.file_path}:#{mutation.line}
473
+ it 'verifies the redo retry logic is necessary in ##{method_name}' do
474
+ # Assert the iteration restart changes the outcome
475
+ result = subject.#{method_name}(input_value)
476
+ expect(result).to eq(expected)
477
+ end
478
+ RSPEC
479
+ },
480
+ "bitwise_replacement" => lambda { |mutation|
481
+ method_name = parse_method_name(mutation.subject.name)
482
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
483
+ <<~RSPEC.strip
484
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
485
+ # #{mutation.file_path}:#{mutation.line}
486
+ it 'verifies the exact bitwise result in ##{method_name}' do
487
+ # Assert the exact bit-level result to distinguish &, |, and ^ operators
488
+ result = subject.#{method_name}(input_value)
489
+ expect(result).to eq(expected)
490
+ end
491
+ RSPEC
492
+ },
493
+ "bitwise_complement" => lambda { |mutation|
494
+ method_name = parse_method_name(mutation.subject.name)
495
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
496
+ <<~RSPEC.strip
497
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
498
+ # #{mutation.file_path}:#{mutation.line}
499
+ it 'verifies the bitwise complement result in ##{method_name}' do
500
+ # Assert the exact complement (~) value, not just sign or magnitude
501
+ result = subject.#{method_name}(input_value)
502
+ expect(result).to eq(expected)
503
+ end
504
+ RSPEC
505
+ },
506
+ "bang_method" => lambda { |mutation|
507
+ method_name = parse_method_name(mutation.subject.name)
508
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
509
+ <<~RSPEC.strip
510
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
511
+ # #{mutation.file_path}:#{mutation.line}
512
+ it 'verifies in-place vs copy semantics matter in ##{method_name}' do
513
+ # Assert that the original object is or is not modified
514
+ result = subject.#{method_name}(input_value)
515
+ expect(result).to eq(expected)
516
+ end
517
+ RSPEC
518
+ },
519
+ "zsuper_removal" => lambda { |mutation|
520
+ method_name = parse_method_name(mutation.subject.name)
521
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
522
+ <<~RSPEC.strip
523
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
524
+ # #{mutation.file_path}:#{mutation.line}
525
+ it 'verifies inherited behavior from super is needed in ##{method_name}' do
526
+ # Assert that the result depends on the superclass implementation
527
+ result = subject.#{method_name}(input_value)
528
+ expect(result).to eq(expected)
529
+ end
530
+ RSPEC
531
+ },
532
+ "explicit_super_mutation" => lambda { |mutation|
533
+ method_name = parse_method_name(mutation.subject.name)
534
+ original_line, mutated_line = extract_diff_lines(mutation.diff)
535
+ <<~RSPEC.strip
536
+ # Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
537
+ # #{mutation.file_path}:#{mutation.line}
538
+ it 'verifies the correct arguments are passed to super in ##{method_name}' do
539
+ # Assert the inherited method receives the expected arguments
540
+ result = subject.#{method_name}(input_value)
541
+ expect(result).to eq(expected)
542
+ end
543
+ RSPEC
320
544
  }
321
545
  }.freeze
322
546
 
@@ -201,11 +201,14 @@ class Evilution::Runner
201
201
  end
202
202
 
203
203
  def run_mutations(mutations, baseline_result = nil)
204
- if config.jobs > 1
205
- run_mutations_parallel(mutations, baseline_result)
206
- else
207
- run_mutations_sequential(mutations, baseline_result)
208
- end
204
+ @progress_bar = build_progress_bar(mutations.length)
205
+ result = if config.jobs > 1
206
+ run_mutations_parallel(mutations, baseline_result)
207
+ else
208
+ run_mutations_sequential(mutations, baseline_result)
209
+ end
210
+ @progress_bar&.finish
211
+ result
209
212
  end
210
213
 
211
214
  def run_mutations_sequential(mutations, baseline_result = nil)
@@ -224,9 +227,7 @@ class Evilution::Runner
224
227
  result = neutralize_if_baseline_failed(result, baseline_result, spec_resolver)
225
228
  results << result
226
229
  survived_count += 1 if result.survived?
227
- on_result&.call(result)
228
- log_progress(index + 1, result.status)
229
- log_mutation_diagnostics(result)
230
+ notify_result(result, index + 1)
230
231
 
231
232
  if config.fail_fast? && survived_count >= config.fail_fast
232
233
  truncated = true
@@ -281,9 +282,7 @@ class Evilution::Runner
281
282
  state[:results] << result
282
283
  state[:survived_count] += 1 if result.survived?
283
284
  state[:completed] += 1
284
- on_result&.call(result)
285
- log_progress(state[:completed], result.status)
286
- log_mutation_diagnostics(result)
285
+ notify_result(result, state[:completed])
287
286
  end
288
287
 
289
288
  log_memory("after batch", "#{state[:completed]} complete")
@@ -447,6 +446,19 @@ class Evilution::Runner
447
446
  warn "[evilution] failed to save session: #{e.message}" unless config.quiet
448
447
  end
449
448
 
449
+ def notify_result(result, index)
450
+ on_result&.call(result)
451
+ @progress_bar&.tick(status: result.status)
452
+ log_progress(index, result.status)
453
+ log_mutation_diagnostics(result)
454
+ end
455
+
456
+ def build_progress_bar(total)
457
+ return nil if !config.progress? || config.quiet || config.verbose || !config.text? || !$stderr.tty?
458
+
459
+ Evilution::Reporter::ProgressBar.new(total: total, output: $stderr)
460
+ end
461
+
450
462
  def build_reporter
451
463
  case config.format
452
464
  when :json
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Evilution
4
- VERSION = "0.15.0"
4
+ VERSION = "0.16.1"
5
5
  end
data/lib/evilution.rb CHANGED
@@ -44,6 +44,22 @@ require_relative "evilution/mutator/operator/argument_nil_substitution"
44
44
  require_relative "evilution/mutator/operator/compound_assignment"
45
45
  require_relative "evilution/mutator/operator/mixin_removal"
46
46
  require_relative "evilution/mutator/operator/superclass_removal"
47
+ require_relative "evilution/mutator/operator/local_variable_assignment"
48
+ require_relative "evilution/mutator/operator/instance_variable_write"
49
+ require_relative "evilution/mutator/operator/class_variable_write"
50
+ require_relative "evilution/mutator/operator/global_variable_write"
51
+ require_relative "evilution/mutator/operator/rescue_removal"
52
+ require_relative "evilution/mutator/operator/rescue_body_replacement"
53
+ require_relative "evilution/mutator/operator/inline_rescue"
54
+ require_relative "evilution/mutator/operator/ensure_removal"
55
+ require_relative "evilution/mutator/operator/break_statement"
56
+ require_relative "evilution/mutator/operator/next_statement"
57
+ require_relative "evilution/mutator/operator/redo_statement"
58
+ require_relative "evilution/mutator/operator/bang_method"
59
+ require_relative "evilution/mutator/operator/bitwise_replacement"
60
+ require_relative "evilution/mutator/operator/bitwise_complement"
61
+ require_relative "evilution/mutator/operator/zsuper_removal"
62
+ require_relative "evilution/mutator/operator/explicit_super_mutation"
47
63
  require_relative "evilution/mutator/registry"
48
64
  require_relative "evilution/equivalent"
49
65
  require_relative "evilution/equivalent/heuristic"
@@ -66,6 +82,7 @@ require_relative "evilution/reporter/json"
66
82
  require_relative "evilution/reporter/cli"
67
83
  require_relative "evilution/reporter/html"
68
84
  require_relative "evilution/reporter/suggestion"
85
+ require_relative "evilution/reporter/progress_bar"
69
86
  require_relative "evilution/spec_resolver"
70
87
  require_relative "evilution/baseline"
71
88
  require_relative "evilution/cache"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evilution
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Kiselev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-03-28 00:00:00.000000000 Z
11
+ date: 2026-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diff-lcs
@@ -119,32 +119,48 @@ files:
119
119
  - lib/evilution/mutator/operator/argument_removal.rb
120
120
  - lib/evilution/mutator/operator/arithmetic_replacement.rb
121
121
  - lib/evilution/mutator/operator/array_literal.rb
122
+ - lib/evilution/mutator/operator/bang_method.rb
123
+ - lib/evilution/mutator/operator/bitwise_complement.rb
124
+ - lib/evilution/mutator/operator/bitwise_replacement.rb
122
125
  - lib/evilution/mutator/operator/block_removal.rb
123
126
  - lib/evilution/mutator/operator/boolean_literal_replacement.rb
124
127
  - lib/evilution/mutator/operator/boolean_operator_replacement.rb
128
+ - lib/evilution/mutator/operator/break_statement.rb
129
+ - lib/evilution/mutator/operator/class_variable_write.rb
125
130
  - lib/evilution/mutator/operator/collection_replacement.rb
126
131
  - lib/evilution/mutator/operator/comparison_replacement.rb
127
132
  - lib/evilution/mutator/operator/compound_assignment.rb
128
133
  - lib/evilution/mutator/operator/conditional_branch.rb
129
134
  - lib/evilution/mutator/operator/conditional_flip.rb
130
135
  - lib/evilution/mutator/operator/conditional_negation.rb
136
+ - lib/evilution/mutator/operator/ensure_removal.rb
137
+ - lib/evilution/mutator/operator/explicit_super_mutation.rb
131
138
  - lib/evilution/mutator/operator/float_literal.rb
139
+ - lib/evilution/mutator/operator/global_variable_write.rb
132
140
  - lib/evilution/mutator/operator/hash_literal.rb
141
+ - lib/evilution/mutator/operator/inline_rescue.rb
142
+ - lib/evilution/mutator/operator/instance_variable_write.rb
133
143
  - lib/evilution/mutator/operator/integer_literal.rb
144
+ - lib/evilution/mutator/operator/local_variable_assignment.rb
134
145
  - lib/evilution/mutator/operator/method_body_replacement.rb
135
146
  - lib/evilution/mutator/operator/method_call_removal.rb
136
147
  - lib/evilution/mutator/operator/mixin_removal.rb
137
148
  - lib/evilution/mutator/operator/negation_insertion.rb
149
+ - lib/evilution/mutator/operator/next_statement.rb
138
150
  - lib/evilution/mutator/operator/nil_replacement.rb
139
151
  - lib/evilution/mutator/operator/range_replacement.rb
140
152
  - lib/evilution/mutator/operator/receiver_replacement.rb
153
+ - lib/evilution/mutator/operator/redo_statement.rb
141
154
  - lib/evilution/mutator/operator/regexp_mutation.rb
155
+ - lib/evilution/mutator/operator/rescue_body_replacement.rb
156
+ - lib/evilution/mutator/operator/rescue_removal.rb
142
157
  - lib/evilution/mutator/operator/return_value_removal.rb
143
158
  - lib/evilution/mutator/operator/send_mutation.rb
144
159
  - lib/evilution/mutator/operator/statement_deletion.rb
145
160
  - lib/evilution/mutator/operator/string_literal.rb
146
161
  - lib/evilution/mutator/operator/superclass_removal.rb
147
162
  - lib/evilution/mutator/operator/symbol_literal.rb
163
+ - lib/evilution/mutator/operator/zsuper_removal.rb
148
164
  - lib/evilution/mutator/registry.rb
149
165
  - lib/evilution/parallel.rb
150
166
  - lib/evilution/parallel/pool.rb
@@ -152,6 +168,7 @@ files:
152
168
  - lib/evilution/reporter/cli.rb
153
169
  - lib/evilution/reporter/html.rb
154
170
  - lib/evilution/reporter/json.rb
171
+ - lib/evilution/reporter/progress_bar.rb
155
172
  - lib/evilution/reporter/suggestion.rb
156
173
  - lib/evilution/result.rb
157
174
  - lib/evilution/result/mutation_result.rb