rspec-signal 0.2.0 → 0.3.0

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +73 -0
  3. data/README.md +326 -38
  4. data/exe/rspec-signal +9 -0
  5. data/exe/rspec-signal-parallel +12 -5
  6. data/lib/rspec/signal/causal/analysis.rb +292 -0
  7. data/lib/rspec/signal/causal/census.rb +86 -0
  8. data/lib/rspec/signal/causal/entities.rb +67 -0
  9. data/lib/rspec/signal/causal/evidence.rb +144 -0
  10. data/lib/rspec/signal/causal/phase.rb +98 -0
  11. data/lib/rspec/signal/causal/scope_analysis.rb +80 -0
  12. data/lib/rspec/signal/code_paths.rb +101 -0
  13. data/lib/rspec/signal/comparison.rb +101 -0
  14. data/lib/rspec/signal/configuration.rb +18 -2
  15. data/lib/rspec/signal/failure.rb +26 -3
  16. data/lib/rspec/signal/failure_builder.rb +17 -2
  17. data/lib/rspec/signal/fingerprint.rb +18 -2
  18. data/lib/rspec/signal/formatter.rb +121 -69
  19. data/lib/rspec/signal/group.rb +20 -3
  20. data/lib/rspec/signal/history.rb +102 -0
  21. data/lib/rspec/signal/message.rb +54 -1
  22. data/lib/rspec/signal/outside_example.rb +148 -0
  23. data/lib/rspec/signal/parallel_merger.rb +67 -7
  24. data/lib/rspec/signal/parallel_run.rb +4 -3
  25. data/lib/rspec/signal/progress_bar.rb +48 -0
  26. data/lib/rspec/signal/report.rb +119 -23
  27. data/lib/rspec/signal/reporters/json_report.rb +3 -2
  28. data/lib/rspec/signal/reporters/markdown.rb +29 -21
  29. data/lib/rspec/signal/reporters/outside_examples.rb +101 -0
  30. data/lib/rspec/signal/reporters/relationships.rb +228 -0
  31. data/lib/rspec/signal/reporters/shared_code_paths.rb +86 -0
  32. data/lib/rspec/signal/rerun.rb +39 -0
  33. data/lib/rspec/signal/run_status.rb +40 -0
  34. data/lib/rspec/signal/selection.rb +130 -0
  35. data/lib/rspec/signal/terminal_summary.rb +119 -0
  36. data/lib/rspec/signal/version.rb +1 -1
  37. data/lib/rspec/signal/writer.rb +55 -18
  38. data/lib/rspec/signal.rb +18 -0
  39. metadata +20 -2
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "fileutils"
4
+ require "tempfile"
4
5
 
5
6
  module RSpec
6
7
  module Signal
@@ -26,17 +27,21 @@ module RSpec
26
27
  end
27
28
 
28
29
  def write(report)
29
- return clean if report.failures.empty? && report.errors_outside_examples.zero?
30
+ return clean unless report.reportable?
30
31
 
31
32
  FileUtils.mkdir_p(dir)
32
33
  write_gitignore
33
34
 
34
- markdown = Reporters::Markdown.new(report, @config).render
35
- written = [write_file(SIGNAL, markdown)]
36
- written.concat(optional_artifacts(report))
35
+ rendered = render_artifacts(report)
36
+ publish(rendered)
37
+ end
37
38
 
38
- stale = MANAGED - written.map { |path| File.basename(path) }
39
- Result.new(summary_path: File.join(dir, SIGNAL), written: written, cleaned: remove(stale))
39
+ # Invalidating is deliberately separate from rendering. Callers do this
40
+ # at the beginning of a run, so an abort before #write cannot make the
41
+ # preceding run look current. History uses different names and is never
42
+ # included in MANAGED.
43
+ def invalidate_current!
44
+ remove(MANAGED)
40
45
  end
41
46
 
42
47
  # Relative to the project root when possible, because that is what you
@@ -48,15 +53,53 @@ module RSpec
48
53
 
49
54
  private
50
55
 
51
- def optional_artifacts(report)
52
- written = []
53
- written << write_file(JSON, Reporters::JsonReport.new(report, @config).render) if @config.write_json
54
- written << write_file(FULL, Reporters::FullOutput.new(report, @config).render) if @config.write_full
55
- written
56
+ def render_artifacts(report)
57
+ artifacts = { SIGNAL => Reporters::Markdown.new(report, @config).render }
58
+ artifacts[JSON] = Reporters::JsonReport.new(report, @config).render if @config.write_json
59
+ artifacts[FULL] = Reporters::FullOutput.new(report, @config).render if @config.write_full
60
+ artifacts
61
+ end
62
+
63
+ # signal.md is the publication marker. Supporting artifacts are moved
64
+ # first and the marker last, so its presence always identifies a fully
65
+ # published generation. All content is staged beside its destination so
66
+ # rename remains on the same filesystem.
67
+ def publish(rendered)
68
+ staged = stage(rendered)
69
+ cleaned = invalidate_current!
70
+ published = []
71
+ publication_order(rendered.keys).each do |name|
72
+ File.rename(staged.fetch(name).path, File.join(dir, name))
73
+ published << File.join(dir, name)
74
+ end
75
+ Result.new(summary_path: File.join(dir, SIGNAL), written: published, cleaned: cleaned)
76
+ ensure
77
+ staged&.each_value(&:close!)
78
+ end
79
+
80
+ def stage(rendered)
81
+ staged = {}
82
+ rendered.each do |name, contents|
83
+ temporary = Tempfile.new([".#{name}", ".tmp"], dir)
84
+ temporary.binmode
85
+ temporary.write(contents)
86
+ temporary.flush
87
+ temporary.fsync
88
+ staged[name] = temporary
89
+ end
90
+ staged
91
+ rescue StandardError
92
+ temporary&.close!
93
+ staged&.each_value(&:close!)
94
+ raise
95
+ end
96
+
97
+ def publication_order(names)
98
+ names.reject { |name| name == SIGNAL } + [SIGNAL]
56
99
  end
57
100
 
58
101
  def clean
59
- Result.new(summary_path: nil, written: [], cleaned: remove(MANAGED))
102
+ Result.new(summary_path: nil, written: [], cleaned: invalidate_current!)
60
103
  end
61
104
 
62
105
  def remove(names)
@@ -69,12 +112,6 @@ module RSpec
69
112
  end
70
113
  end
71
114
 
72
- def write_file(name, contents)
73
- path = File.join(dir, name)
74
- File.write(path, contents)
75
- path
76
- end
77
-
78
115
  # Failure artifacts routinely contain application data. Keeping them out of
79
116
  # version control by default is cheap insurance.
80
117
  def write_gitignore
data/lib/rspec/signal.rb CHANGED
@@ -12,19 +12,37 @@ require_relative "signal/redactor"
12
12
  require_relative "signal/html_summary"
13
13
  require_relative "signal/message"
14
14
  require_relative "signal/fingerprint"
15
+ require_relative "signal/rerun"
15
16
  require_relative "signal/symptom"
16
17
  require_relative "signal/symptoms"
17
18
  require_relative "signal/failure"
19
+ require_relative "signal/outside_example"
18
20
  require_relative "signal/group"
19
21
  require_relative "signal/grouper"
20
22
  require_relative "signal/cluster"
21
23
  require_relative "signal/clusterer"
24
+ require_relative "signal/code_paths"
25
+ require_relative "signal/comparison"
26
+ require_relative "signal/selection"
27
+ require_relative "signal/causal/evidence"
28
+ require_relative "signal/causal/phase"
29
+ require_relative "signal/causal/entities"
30
+ require_relative "signal/causal/census"
31
+ require_relative "signal/causal/scope_analysis"
32
+ require_relative "signal/causal/analysis"
33
+ require_relative "signal/history"
34
+ require_relative "signal/run_status"
22
35
  require_relative "signal/report"
23
36
  require_relative "signal/configuration"
24
37
  require_relative "signal/reporters/related_failures"
38
+ require_relative "signal/reporters/outside_examples"
39
+ require_relative "signal/reporters/shared_code_paths"
40
+ require_relative "signal/reporters/relationships"
25
41
  require_relative "signal/reporters/markdown"
26
42
  require_relative "signal/reporters/json_report"
27
43
  require_relative "signal/reporters/full_output"
44
+ require_relative "signal/progress_bar"
45
+ require_relative "signal/terminal_summary"
28
46
  require_relative "signal/writer"
29
47
  require_relative "signal/parallel_run"
30
48
  require_relative "signal/parallel_merger"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-signal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chad Snow
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-08-27 00:00:00.000000000 Z
11
+ date: 2026-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-core
@@ -55,8 +55,16 @@ files:
55
55
  - lib/rspec/signal/backtrace/frame.rb
56
56
  - lib/rspec/signal/backtrace/parser.rb
57
57
  - lib/rspec/signal/backtrace/reducer.rb
58
+ - lib/rspec/signal/causal/analysis.rb
59
+ - lib/rspec/signal/causal/census.rb
60
+ - lib/rspec/signal/causal/entities.rb
61
+ - lib/rspec/signal/causal/evidence.rb
62
+ - lib/rspec/signal/causal/phase.rb
63
+ - lib/rspec/signal/causal/scope_analysis.rb
58
64
  - lib/rspec/signal/cluster.rb
59
65
  - lib/rspec/signal/clusterer.rb
66
+ - lib/rspec/signal/code_paths.rb
67
+ - lib/rspec/signal/comparison.rb
60
68
  - lib/rspec/signal/configuration.rb
61
69
  - lib/rspec/signal/failure.rb
62
70
  - lib/rspec/signal/failure_builder.rb
@@ -64,18 +72,27 @@ files:
64
72
  - lib/rspec/signal/formatter.rb
65
73
  - lib/rspec/signal/group.rb
66
74
  - lib/rspec/signal/grouper.rb
75
+ - lib/rspec/signal/history.rb
67
76
  - lib/rspec/signal/html_summary.rb
68
77
  - lib/rspec/signal/integrations/capybara.rb
69
78
  - lib/rspec/signal/message.rb
79
+ - lib/rspec/signal/outside_example.rb
70
80
  - lib/rspec/signal/parallel_merger.rb
71
81
  - lib/rspec/signal/parallel_run.rb
82
+ - lib/rspec/signal/progress_bar.rb
72
83
  - lib/rspec/signal/project.rb
73
84
  - lib/rspec/signal/redactor.rb
74
85
  - lib/rspec/signal/report.rb
75
86
  - lib/rspec/signal/reporters/full_output.rb
76
87
  - lib/rspec/signal/reporters/json_report.rb
77
88
  - lib/rspec/signal/reporters/markdown.rb
89
+ - lib/rspec/signal/reporters/outside_examples.rb
78
90
  - lib/rspec/signal/reporters/related_failures.rb
91
+ - lib/rspec/signal/reporters/relationships.rb
92
+ - lib/rspec/signal/reporters/shared_code_paths.rb
93
+ - lib/rspec/signal/rerun.rb
94
+ - lib/rspec/signal/run_status.rb
95
+ - lib/rspec/signal/selection.rb
79
96
  - lib/rspec/signal/symptom.rb
80
97
  - lib/rspec/signal/symptoms.rb
81
98
  - lib/rspec/signal/symptoms/exception_class.rb
@@ -84,6 +101,7 @@ files:
84
101
  - lib/rspec/signal/symptoms/route.rb
85
102
  - lib/rspec/signal/symptoms/ruby_error.rb
86
103
  - lib/rspec/signal/symptoms/selector.rb
104
+ - lib/rspec/signal/terminal_summary.rb
87
105
  - lib/rspec/signal/version.rb
88
106
  - lib/rspec/signal/writer.rb
89
107
  homepage: https://github.com/SilenceDogood1984/rspec-signal