saboteur 0.12.1 → 0.12.2

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +69 -0
  3. data/README.md +16 -3
  4. data/lib/saboteur/baseline/command.rb +6 -1
  5. data/lib/saboteur/baseline/comparison.rb +8 -0
  6. data/lib/saboteur/baseline/completeness.rb +14 -4
  7. data/lib/saboteur/baseline/evidence.rb +8 -1
  8. data/lib/saboteur/baseline/run_evidence.rb +10 -1
  9. data/lib/saboteur/baseline/workflow.rb +17 -5
  10. data/lib/saboteur/cli/color_option.rb +26 -0
  11. data/lib/saboteur/cli/doctor_command.rb +1 -0
  12. data/lib/saboteur/cli/exit_status.rb +4 -3
  13. data/lib/saboteur/cli/explain_command.rb +2 -1
  14. data/lib/saboteur/cli/failure_output.rb +13 -2
  15. data/lib/saboteur/cli/help_command.rb +5 -0
  16. data/lib/saboteur/cli/history_command.rb +2 -0
  17. data/lib/saboteur/cli/output_options.rb +1 -5
  18. data/lib/saboteur/cli/run_command.rb +1 -1
  19. data/lib/saboteur/cli/run_reporting.rb +1 -9
  20. data/lib/saboteur/cli/run_validation.rb +0 -1
  21. data/lib/saboteur/cli/survivors_command.rb +5 -2
  22. data/lib/saboteur/cli/whole_suite_map_lookup.rb +33 -0
  23. data/lib/saboteur/cli.rb +6 -2
  24. data/lib/saboteur/engine/coverage_store.rb +7 -4
  25. data/lib/saboteur/engine/diagnostics.rb +7 -0
  26. data/lib/saboteur/engine/pipelines.rb +9 -2
  27. data/lib/saboteur/engine/survivor_confirmation.rb +75 -11
  28. data/lib/saboteur/engine/test_guess.rb +2 -1
  29. data/lib/saboteur/engine.rb +34 -16
  30. data/lib/saboteur/execution/runner.rb +3 -0
  31. data/lib/saboteur/gates.rb +1 -1
  32. data/lib/saboteur/integration/rspec.rb +30 -0
  33. data/lib/saboteur/reporter/default_findings.rb +1 -1
  34. data/lib/saboteur/reporter/gap_kinds.rb +6 -0
  35. data/lib/saboteur/reporter/next_steps.rb +3 -1
  36. data/lib/saboteur/reporter/score_table.rb +6 -11
  37. data/lib/saboteur/reporter/stryker.rb +7 -2
  38. data/lib/saboteur/reporter/survivor_classification.rb +15 -0
  39. data/lib/saboteur/reporter/survivor_list.rb +6 -6
  40. data/lib/saboteur/reporter/terminal.rb +4 -2
  41. data/lib/saboteur/reporter/unconfirmed_section.rb +44 -0
  42. data/lib/saboteur/result.rb +39 -2
  43. data/lib/saboteur/selection/coverage_map.rb +11 -1
  44. data/lib/saboteur/version.rb +1 -1
  45. data/lib/saboteur.rb +4 -0
  46. metadata +4 -1
@@ -443,9 +443,19 @@ module Saboteur
443
443
  [prefix.count("\n") + 1, offset - ((prefix.rindex("\n") || -1) + 1)]
444
444
  end
445
445
 
446
+ # Durations are compared to the millisecond. Two tests within a
447
+ # millisecond of each other swap places from one map build to the next,
448
+ # and with fail-fast the first failing test names a mutant's killer and
449
+ # kill cause, so sub-millisecond noise must not decide the order (#1274).
450
+ # Suite order breaks the tie instead.
446
451
  def sort_test_ids(ids)
447
452
  order = test_order
448
- ids.sort_by { |id| [durations.fetch(id, Float::INFINITY), order.fetch(id, Float::INFINITY)] }
453
+ ids.sort_by { |id| [duration_bucket(id), order.fetch(id, Float::INFINITY)] }
454
+ end
455
+
456
+ def duration_bucket(id)
457
+ seconds = durations[id]
458
+ seconds ? (seconds * 1000).ceil : Float::INFINITY
449
459
  end
450
460
 
451
461
  def test_order
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Saboteur
5
- VERSION = "0.12.1"
5
+ VERSION = "0.12.2"
6
6
  end
data/lib/saboteur.rb CHANGED
@@ -6,6 +6,10 @@ require_relative "saboteur/version"
6
6
  module Saboteur
7
7
  class Error < StandardError; end
8
8
 
9
+ # A spec path from the cached coverage map that is not a spec file inside
10
+ # the project: the map is untrusted input (#427, #1286).
11
+ class RefusedSpecPath < Error; end
12
+
9
13
  # A phase timeout that --max-duration shortened: budget exhaustion, not a
10
14
  # broken suite. The engine turns it into the budget partial-report path
11
15
  # instead of a phase error (#296).
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saboteur
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.12.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vamsi Pavan Mahesh Gunturu
@@ -63,6 +63,7 @@ files:
63
63
  - lib/saboteur/cli.rb
64
64
  - lib/saboteur/cli/agent_provenance.rb
65
65
  - lib/saboteur/cli/baseline_gate.rb
66
+ - lib/saboteur/cli/color_option.rb
66
67
  - lib/saboteur/cli/dirty_tree_notice.rb
67
68
  - lib/saboteur/cli/doctor_command.rb
68
69
  - lib/saboteur/cli/error_cause.rb
@@ -89,6 +90,7 @@ files:
89
90
  - lib/saboteur/cli/shard_options.rb
90
91
  - lib/saboteur/cli/source_set.rb
91
92
  - lib/saboteur/cli/survivors_command.rb
93
+ - lib/saboteur/cli/whole_suite_map_lookup.rb
92
94
  - lib/saboteur/config.rb
93
95
  - lib/saboteur/config_file.rb
94
96
  - lib/saboteur/constant_reads.rb
@@ -253,6 +255,7 @@ files:
253
255
  - lib/saboteur/reporter/survivor_ranking.rb
254
256
  - lib/saboteur/reporter/terminal.rb
255
257
  - lib/saboteur/reporter/test_matrix.rb
258
+ - lib/saboteur/reporter/unconfirmed_section.rb
256
259
  - lib/saboteur/reporter/wording.rb
257
260
  - lib/saboteur/result.rb
258
261
  - lib/saboteur/score.rb