evilution 0.26.0 → 0.28.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 (159) hide show
  1. checksums.yaml +4 -4
  2. data/.beads/interactions.jsonl +23 -0
  3. data/.rubocop_todo.yml +6 -0
  4. data/CHANGELOG.md +54 -0
  5. data/README.md +76 -3
  6. data/lib/evilution/baseline.rb +5 -4
  7. data/lib/evilution/cache.rb +2 -0
  8. data/lib/evilution/child_output.rb +24 -0
  9. data/lib/evilution/cli/commands/run.rb +9 -0
  10. data/lib/evilution/cli/commands/version.rb +2 -0
  11. data/lib/evilution/cli/parser/options_builder.rb +23 -2
  12. data/lib/evilution/compare/diff_extractor/evilution.rb +22 -0
  13. data/lib/evilution/compare/diff_extractor/mutant.rb +30 -0
  14. data/lib/evilution/compare/diff_extractor.rb +6 -0
  15. data/lib/evilution/compare/fingerprint.rb +15 -72
  16. data/lib/evilution/compare/line_normalizer.rb +72 -0
  17. data/lib/evilution/compare/normalizer.rb +17 -4
  18. data/lib/evilution/config/builders/spec_resolver.rb +15 -0
  19. data/lib/evilution/config/builders/spec_selector.rb +16 -0
  20. data/lib/evilution/config/builders.rb +4 -0
  21. data/lib/evilution/config/env_loader.rb +12 -0
  22. data/lib/evilution/config/file_loader.rb +22 -0
  23. data/lib/evilution/config/sources.rb +14 -0
  24. data/lib/evilution/config/validators/base.rb +37 -0
  25. data/lib/evilution/config/validators/example_targeting_cache.rb +37 -0
  26. data/lib/evilution/config/validators/example_targeting_fallback.rb +22 -0
  27. data/lib/evilution/config/validators/fail_fast.rb +11 -0
  28. data/lib/evilution/config/validators/hooks.rb +12 -0
  29. data/lib/evilution/config/validators/ignore_patterns.rb +16 -0
  30. data/lib/evilution/config/validators/integration.rb +11 -0
  31. data/lib/evilution/config/validators/isolation.rb +19 -0
  32. data/lib/evilution/config/validators/jobs.rb +9 -0
  33. data/lib/evilution/config/validators/preload.rb +13 -0
  34. data/lib/evilution/config/validators/profile.rb +11 -0
  35. data/lib/evilution/config/validators/spec_mappings.rb +56 -0
  36. data/lib/evilution/config/validators/spec_pattern.rb +12 -0
  37. data/lib/evilution/config/validators.rb +4 -0
  38. data/lib/evilution/config.rb +93 -266
  39. data/lib/evilution/feedback/detector.rb +15 -0
  40. data/lib/evilution/feedback/messages.rb +42 -0
  41. data/lib/evilution/feedback.rb +5 -0
  42. data/lib/evilution/integration/crash_detector.rb +2 -2
  43. data/lib/evilution/integration/loading/source_evaluator.rb +6 -2
  44. data/lib/evilution/integration/minitest_crash_detector.rb +2 -2
  45. data/lib/evilution/integration/rspec/baseline_runner.rb +16 -0
  46. data/lib/evilution/integration/rspec/crash_detector_lifecycle.rb +17 -0
  47. data/lib/evilution/integration/rspec/example_filter_applier.rb +21 -0
  48. data/lib/evilution/integration/rspec/framework_loader.rb +28 -0
  49. data/lib/evilution/integration/rspec/result_builder.rb +40 -0
  50. data/lib/evilution/integration/rspec/state_guard/example_groups_constants.rb +28 -0
  51. data/lib/evilution/integration/rspec/state_guard/internals.rb +19 -0
  52. data/lib/evilution/integration/rspec/state_guard/object_space_example_groups.rb +43 -0
  53. data/lib/evilution/integration/rspec/state_guard/reporter_arrays.rb +32 -0
  54. data/lib/evilution/integration/rspec/state_guard/world_example_groups.rb +20 -0
  55. data/lib/evilution/integration/rspec/state_guard/world_filtered_examples.rb +20 -0
  56. data/lib/evilution/integration/rspec/state_guard/world_sources_by_path.rb +20 -0
  57. data/lib/evilution/integration/rspec/state_guard.rb +40 -0
  58. data/lib/evilution/integration/rspec/test_file_resolver.rb +30 -0
  59. data/lib/evilution/integration/rspec/unresolved_spec_warner.rb +18 -0
  60. data/lib/evilution/integration/rspec.rb +61 -232
  61. data/lib/evilution/isolation/fork.rb +23 -13
  62. data/lib/evilution/isolation/in_process.rb +10 -6
  63. data/lib/evilution/mcp/info_tool/actions/base.rb +22 -0
  64. data/lib/evilution/mcp/info_tool/actions/environment.rb +42 -0
  65. data/lib/evilution/mcp/info_tool/actions/feedback.rb +16 -0
  66. data/lib/evilution/mcp/info_tool/actions/statuses.rb +10 -0
  67. data/lib/evilution/mcp/info_tool/actions/subjects.rb +47 -0
  68. data/lib/evilution/mcp/info_tool/actions/tests.rb +60 -0
  69. data/lib/evilution/mcp/info_tool/actions.rb +16 -0
  70. data/lib/evilution/mcp/info_tool/config_factory.rb +24 -0
  71. data/lib/evilution/mcp/info_tool/error_mapper.rb +15 -0
  72. data/lib/evilution/mcp/info_tool/request_parser.rb +34 -0
  73. data/lib/evilution/mcp/info_tool/response_formatter.rb +24 -0
  74. data/lib/evilution/mcp/info_tool/status_glossary.rb +75 -0
  75. data/lib/evilution/mcp/info_tool.rb +43 -263
  76. data/lib/evilution/mcp/mutate_tool/error_payload.rb +8 -1
  77. data/lib/evilution/mcp/mutate_tool/progress_streamer.rb +5 -1
  78. data/lib/evilution/mcp/mutate_tool/report_trimmer.rb +13 -1
  79. data/lib/evilution/mcp/mutate_tool.rb +5 -2
  80. data/lib/evilution/mcp/session_tool.rb +0 -2
  81. data/lib/evilution/mutation.rb +47 -27
  82. data/lib/evilution/mutator/base.rb +8 -8
  83. data/lib/evilution/mutator/operator/block_removal.rb +1 -1
  84. data/lib/evilution/mutator/operator/method_body_replacement.rb +18 -2
  85. data/lib/evilution/mutator/operator/predicate_to_nil.rb +20 -0
  86. data/lib/evilution/mutator/registry.rb +20 -0
  87. data/lib/evilution/parallel/work_queue/channel/frame.rb +25 -0
  88. data/lib/evilution/parallel/work_queue/channel.rb +23 -0
  89. data/lib/evilution/parallel/work_queue/collection_state.rb +14 -0
  90. data/lib/evilution/parallel/work_queue/dispatcher.rb +133 -0
  91. data/lib/evilution/parallel/work_queue/validators/optional_positive_int.rb +11 -0
  92. data/lib/evilution/parallel/work_queue/validators/optional_positive_number.rb +11 -0
  93. data/lib/evilution/parallel/work_queue/validators/positive_int.rb +11 -0
  94. data/lib/evilution/parallel/work_queue/validators.rb +6 -0
  95. data/lib/evilution/parallel/work_queue/worker/loop.rb +45 -0
  96. data/lib/evilution/parallel/work_queue/worker.rb +114 -0
  97. data/lib/evilution/parallel/work_queue/worker_stat.rb +17 -0
  98. data/lib/evilution/parallel/work_queue.rb +42 -327
  99. data/lib/evilution/process_cleanup.rb +19 -0
  100. data/lib/evilution/reporter/cli/item_formatters/coverage_gap.rb +18 -0
  101. data/lib/evilution/reporter/cli/item_formatters/disabled.rb +9 -0
  102. data/lib/evilution/reporter/cli/item_formatters/error.rb +14 -0
  103. data/lib/evilution/reporter/cli/item_formatters/result_location.rb +10 -0
  104. data/lib/evilution/reporter/cli/item_formatters.rb +6 -0
  105. data/lib/evilution/reporter/cli/line_formatters/duration.rb +9 -0
  106. data/lib/evilution/reporter/cli/line_formatters/efficiency.rb +18 -0
  107. data/lib/evilution/reporter/cli/line_formatters/feedback_footer.rb +13 -0
  108. data/lib/evilution/reporter/cli/line_formatters/header.rb +10 -0
  109. data/lib/evilution/reporter/cli/line_formatters/mutations.rb +16 -0
  110. data/lib/evilution/reporter/cli/line_formatters/peak_memory.rb +12 -0
  111. data/lib/evilution/reporter/cli/line_formatters/result_line.rb +20 -0
  112. data/lib/evilution/reporter/cli/line_formatters/score.rb +14 -0
  113. data/lib/evilution/reporter/cli/line_formatters/truncation_notice.rb +11 -0
  114. data/lib/evilution/reporter/cli/line_formatters.rb +6 -0
  115. data/lib/evilution/reporter/cli/metrics_block.rb +26 -0
  116. data/lib/evilution/reporter/cli/pct.rb +9 -0
  117. data/lib/evilution/reporter/cli/section.rb +13 -0
  118. data/lib/evilution/reporter/cli/section_renderer.rb +15 -0
  119. data/lib/evilution/reporter/cli/trailer.rb +22 -0
  120. data/lib/evilution/reporter/cli.rb +79 -162
  121. data/lib/evilution/reporter/html/baseline_keys.rb +1 -1
  122. data/lib/evilution/reporter/html/diff_formatter.rb +1 -1
  123. data/lib/evilution/reporter/html/escape.rb +1 -1
  124. data/lib/evilution/reporter/html/section.rb +1 -1
  125. data/lib/evilution/reporter/html/sections.rb +4 -2
  126. data/lib/evilution/reporter/html/stylesheet.rb +1 -1
  127. data/lib/evilution/reporter/html.rb +8 -3
  128. data/lib/evilution/reporter/suggestion/registry.rb +1 -5
  129. data/lib/evilution/reporter/suggestion/templates/generic.rb +1 -1
  130. data/lib/evilution/reporter/suggestion/templates/minitest.rb +349 -643
  131. data/lib/evilution/reporter/suggestion/templates/rspec.rb +351 -598
  132. data/lib/evilution/reporter/suggestion/templates.rb +6 -0
  133. data/lib/evilution/result/error_info.rb +20 -0
  134. data/lib/evilution/result/memory_stats.rb +20 -0
  135. data/lib/evilution/result/mutation_result.rb +30 -14
  136. data/lib/evilution/runner/baseline_runner.rb +1 -2
  137. data/lib/evilution/runner/diagnostics.rb +1 -2
  138. data/lib/evilution/runner/isolation_resolver.rb +10 -4
  139. data/lib/evilution/runner/mutation_executor/mutation_runner.rb +30 -0
  140. data/lib/evilution/runner/mutation_executor/neutralization_pipeline.rb +15 -0
  141. data/lib/evilution/runner/mutation_executor/neutralizer/baseline_failed.rb +39 -0
  142. data/lib/evilution/runner/mutation_executor/neutralizer/infra_error.rb +68 -0
  143. data/lib/evilution/runner/mutation_executor/neutralizer.rb +11 -0
  144. data/lib/evilution/runner/mutation_executor/result_cache.rb +67 -0
  145. data/lib/evilution/runner/mutation_executor/result_notifier.rb +46 -0
  146. data/lib/evilution/runner/mutation_executor/result_packer.rb +41 -0
  147. data/lib/evilution/runner/mutation_executor/strategy/parallel.rb +78 -0
  148. data/lib/evilution/runner/mutation_executor/strategy/sequential.rb +32 -0
  149. data/lib/evilution/runner/mutation_executor/strategy.rb +11 -0
  150. data/lib/evilution/runner/mutation_executor.rb +53 -292
  151. data/lib/evilution/runner/mutation_planner.rb +1 -2
  152. data/lib/evilution/runner/report_publisher.rb +1 -2
  153. data/lib/evilution/runner/subject_pipeline.rb +1 -2
  154. data/lib/evilution/runner.rb +53 -30
  155. data/lib/evilution/version.rb +1 -1
  156. data/lib/evilution.rb +1 -0
  157. data/script/memory_check +3 -1
  158. metadata +125 -3
  159. data/lib/evilution/reporter/html/namespace.rb +0 -11
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../cli"
4
+
5
+ class Evilution::Reporter::CLI::Section
6
+ attr_reader :title, :fetcher, :formatter
7
+
8
+ def initialize(title:, fetcher:, formatter:)
9
+ @title = title
10
+ @fetcher = fetcher
11
+ @formatter = formatter
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../cli"
4
+
5
+ class Evilution::Reporter::CLI::SectionRenderer
6
+ def call(section, summary)
7
+ items = section.fetcher.call(summary)
8
+ return [] if items.empty?
9
+
10
+ title = section.title.respond_to?(:call) ? section.title.call(items) : section.title
11
+ lines = ["", title]
12
+ items.each { |item| lines << section.formatter.format(item) }
13
+ lines
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../cli"
4
+ require_relative "line_formatters/truncation_notice"
5
+ require_relative "line_formatters/result_line"
6
+ require_relative "line_formatters/feedback_footer"
7
+
8
+ class Evilution::Reporter::CLI::Trailer
9
+ DEFAULT_LINES = [
10
+ Evilution::Reporter::CLI::LineFormatters::TruncationNotice.new,
11
+ Evilution::Reporter::CLI::LineFormatters::ResultLine.new,
12
+ Evilution::Reporter::CLI::LineFormatters::FeedbackFooter.new
13
+ ].freeze
14
+
15
+ def initialize(lines: DEFAULT_LINES)
16
+ @lines = lines
17
+ end
18
+
19
+ def call(summary)
20
+ @lines.filter_map { |line| line.format(summary) }
21
+ end
22
+ end
@@ -5,172 +5,89 @@ require_relative "../reporter"
5
5
  class Evilution::Reporter::CLI
6
6
  SEPARATOR = "=" * 44
7
7
 
8
- def call(summary)
9
- lines = []
10
- append_metrics(lines, summary)
11
- append_sections(lines, summary)
12
- lines << ""
13
- lines << "[TRUNCATED] Stopped early due to --fail-fast" if summary.truncated?
14
- lines << result_line(summary)
15
- lines.join("\n")
8
+ def initialize(
9
+ header: LineFormatters::Header.new,
10
+ metrics_block: MetricsBlock.new,
11
+ section_renderer: SectionRenderer.new,
12
+ sections: DEFAULT_SECTIONS,
13
+ trailer: Trailer.new
14
+ )
15
+ @header = header
16
+ @metrics_block = metrics_block
17
+ @section_renderer = section_renderer
18
+ @sections = sections
19
+ @trailer = trailer
16
20
  end
17
21
 
18
- private
19
-
20
- def append_metrics(lines, summary)
21
- lines << header
22
+ def call(summary)
23
+ lines = []
24
+ lines << @header.format(summary)
22
25
  lines << SEPARATOR
23
26
  lines << ""
24
- lines << mutations_line(summary)
25
- lines << score_line(summary)
26
- lines << duration_line(summary)
27
- lines << efficiency_line(summary) if summary.duration.positive?
28
- peak = summary.peak_memory_mb
29
- lines << peak_memory_line(peak) if peak
30
- end
31
-
32
- def append_sections(lines, summary)
33
- append_survived(lines, summary)
34
- append_neutral(lines, summary)
35
- append_equivalent(lines, summary)
36
- append_unresolved(lines, summary)
37
- append_unparseable(lines, summary)
38
- append_errors(lines, summary)
39
- append_disabled(lines, summary)
40
- end
41
-
42
- def append_survived(lines, summary)
43
- gaps = summary.coverage_gaps
44
- return unless gaps.any?
45
-
46
- lines << ""
47
- lines << "Survived mutations (#{gaps.length} coverage gap#{"s" unless gaps.length == 1}):"
48
- gaps.each { |gap| lines << format_coverage_gap(gap) }
49
- end
50
-
51
- def append_neutral(lines, summary)
52
- return unless summary.neutral_results.any?
53
-
54
- lines << ""
55
- lines << "Neutral mutations (test already failing):"
56
- summary.neutral_results.each { |result| lines << format_neutral(result) }
57
- end
58
-
59
- def append_equivalent(lines, summary)
60
- return unless summary.equivalent_results.any?
61
-
62
- lines << ""
63
- lines << "Equivalent mutations (provably identical behavior):"
64
- summary.equivalent_results.each { |result| lines << format_neutral(result) }
65
- end
66
-
67
- def append_unresolved(lines, summary)
68
- return unless summary.unresolved_results.any?
69
-
70
- lines << ""
71
- lines << "Unresolved mutations (no test file resolved):"
72
- summary.unresolved_results.each { |result| lines << format_neutral(result) }
73
- end
74
-
75
- def append_unparseable(lines, summary)
76
- return unless summary.unparseable_results.any?
77
-
78
- lines << ""
79
- lines << "Unparseable mutations (mutated source did not parse):"
80
- summary.unparseable_results.each { |result| lines << format_neutral(result) }
81
- end
82
-
83
- def append_errors(lines, summary)
84
- errored = summary.results.select(&:error?)
85
- return if errored.empty?
86
-
27
+ lines.concat(@metrics_block.call(summary))
28
+ @sections.each { |section| lines.concat(@section_renderer.call(section, summary)) }
87
29
  lines << ""
88
- lines << "Errored mutations:"
89
- errored.each { |result| lines << format_error(result) }
90
- end
91
-
92
- def format_error(result)
93
- mutation = result.mutation
94
- header = " #{mutation.operator_name}: #{mutation.file_path}:#{mutation.line}"
95
- return header unless result.error_message
96
-
97
- indented = result.error_message.lines.map { |line| " #{line.chomp}" }.join("\n")
98
- "#{header}\n#{indented}"
99
- end
100
-
101
- def append_disabled(lines, summary)
102
- return unless summary.disabled_mutations.any?
103
-
104
- lines << ""
105
- lines << "Disabled mutations (skipped by # evilution:disable):"
106
- summary.disabled_mutations.each { |mutation| lines << format_disabled(mutation) }
107
- end
108
-
109
- def header
110
- "Evilution v#{Evilution::VERSION} — Mutation Testing Results"
111
- end
112
-
113
- def mutations_line(summary)
114
- parts = "Mutations: #{summary.total} total, #{summary.killed} killed, " \
115
- "#{summary.survived} survived, #{summary.timed_out} timed out"
116
- parts += ", #{summary.neutral} neutral" if summary.neutral.positive?
117
- parts += ", #{summary.equivalent} equivalent" if summary.equivalent.positive?
118
- parts += ", #{summary.unresolved} unresolved" if summary.unresolved.positive?
119
- parts += ", #{summary.unparseable} unparseable" if summary.unparseable.positive?
120
- parts += ", #{summary.skipped} skipped" if summary.skipped.positive?
121
- parts
122
- end
123
-
124
- def score_line(summary)
125
- score_pct = format_pct(summary.score)
126
- "Score: #{score_pct} (#{summary.killed}/#{summary.score_denominator})"
127
- end
128
-
129
- def duration_line(summary)
130
- "Duration: #{format("%.2f", summary.duration)}s"
131
- end
132
-
133
- def efficiency_line(summary)
134
- pct = format("%.2f%%", summary.efficiency * 100)
135
- rate = format("%.2f", summary.mutations_per_second)
136
- "Efficiency: #{pct} killtime, #{rate} mutations/s"
137
- end
138
-
139
- def format_coverage_gap(gap)
140
- location = "#{gap.file_path}:#{gap.line}"
141
- header = if gap.single?
142
- " #{gap.primary_operator}: #{location} (#{gap.subject_name})"
143
- else
144
- operators = gap.operator_names.join(", ")
145
- " #{location} (#{gap.subject_name}) [#{gap.count} mutations: #{operators}]"
146
- end
147
- body = gap.mutation_results.first.mutation.unified_diff || gap.primary_diff
148
- indented = body.split("\n").map { |l| " #{l}" }.join("\n")
149
- "#{header}\n#{indented}"
150
- end
151
-
152
- def format_neutral(result)
153
- mutation = result.mutation
154
- " #{mutation.operator_name}: #{mutation.file_path}:#{mutation.line}"
155
- end
156
-
157
- def format_disabled(mutation)
158
- " #{mutation.operator_name}: #{mutation.file_path}:#{mutation.line}"
159
- end
160
-
161
- def result_line(summary)
162
- min_score = 0.8
163
- pass_fail = summary.success?(min_score: min_score) ? "PASS" : "FAIL"
164
- score_pct = format_pct(summary.score)
165
- threshold_pct = format_pct(min_score)
166
- "Result: #{pass_fail} (score #{score_pct} #{pass_fail == "PASS" ? ">=" : "<"} #{threshold_pct})"
167
- end
168
-
169
- def peak_memory_line(peak_mb)
170
- format("Peak memory: %<mb>.1f MB", mb: peak_mb)
171
- end
172
-
173
- def format_pct(value)
174
- format("%.2f%%", value * 100)
30
+ lines.concat(@trailer.call(summary))
31
+ lines.join("\n")
175
32
  end
176
33
  end
34
+
35
+ require_relative "cli/pct"
36
+ require_relative "cli/section"
37
+ require_relative "cli/section_renderer"
38
+ require_relative "cli/line_formatters/header"
39
+ require_relative "cli/line_formatters/mutations"
40
+ require_relative "cli/line_formatters/score"
41
+ require_relative "cli/line_formatters/duration"
42
+ require_relative "cli/line_formatters/efficiency"
43
+ require_relative "cli/line_formatters/peak_memory"
44
+ require_relative "cli/line_formatters/truncation_notice"
45
+ require_relative "cli/line_formatters/result_line"
46
+ require_relative "cli/line_formatters/feedback_footer"
47
+ require_relative "cli/item_formatters/coverage_gap"
48
+ require_relative "cli/item_formatters/result_location"
49
+ require_relative "cli/item_formatters/error"
50
+ require_relative "cli/item_formatters/disabled"
51
+ require_relative "cli/metrics_block"
52
+ require_relative "cli/trailer"
53
+
54
+ Evilution::Reporter::CLI.const_set(
55
+ :DEFAULT_SECTIONS,
56
+ [
57
+ Evilution::Reporter::CLI::Section.new(
58
+ title: ->(gaps) { "Survived mutations (#{gaps.length} coverage gap#{"s" unless gaps.length == 1}):" },
59
+ fetcher: lambda(&:coverage_gaps),
60
+ formatter: Evilution::Reporter::CLI::ItemFormatters::CoverageGap.new
61
+ ),
62
+ Evilution::Reporter::CLI::Section.new(
63
+ title: "Neutral mutations (test already failing):",
64
+ fetcher: lambda(&:neutral_results),
65
+ formatter: Evilution::Reporter::CLI::ItemFormatters::ResultLocation.new
66
+ ),
67
+ Evilution::Reporter::CLI::Section.new(
68
+ title: "Equivalent mutations (provably identical behavior):",
69
+ fetcher: lambda(&:equivalent_results),
70
+ formatter: Evilution::Reporter::CLI::ItemFormatters::ResultLocation.new
71
+ ),
72
+ Evilution::Reporter::CLI::Section.new(
73
+ title: "Unresolved mutations (no test file resolved):",
74
+ fetcher: lambda(&:unresolved_results),
75
+ formatter: Evilution::Reporter::CLI::ItemFormatters::ResultLocation.new
76
+ ),
77
+ Evilution::Reporter::CLI::Section.new(
78
+ title: "Unparseable mutations (mutated source did not parse):",
79
+ fetcher: lambda(&:unparseable_results),
80
+ formatter: Evilution::Reporter::CLI::ItemFormatters::ResultLocation.new
81
+ ),
82
+ Evilution::Reporter::CLI::Section.new(
83
+ title: "Errored mutations:",
84
+ fetcher: ->(s) { s.results.select(&:error?) },
85
+ formatter: Evilution::Reporter::CLI::ItemFormatters::Error.new
86
+ ),
87
+ Evilution::Reporter::CLI::Section.new(
88
+ title: "Disabled mutations (skipped by # evilution:disable):",
89
+ fetcher: lambda(&:disabled_mutations),
90
+ formatter: Evilution::Reporter::CLI::ItemFormatters::Disabled.new
91
+ )
92
+ ].freeze
93
+ )
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "namespace"
3
+ require_relative "../html"
4
4
 
5
5
  class Evilution::Reporter::HTML::BaselineKeys
6
6
  def initialize(baseline)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "namespace"
3
+ require_relative "../html"
4
4
  require_relative "escape"
5
5
 
6
6
  module Evilution::Reporter::HTML::DiffFormatter
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "cgi"
4
- require_relative "namespace"
4
+ require_relative "../html"
5
5
 
6
6
  module Evilution::Reporter::HTML::Escape
7
7
  module_function
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "erb"
4
- require_relative "namespace"
4
+ require_relative "../html"
5
5
  require_relative "escape"
6
6
 
7
7
  class Evilution::Reporter::HTML::Section
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "namespace"
4
- require_relative "section"
3
+ require_relative "../html"
4
+
5
+ module Evilution::Reporter::HTML::Sections
6
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "namespace"
3
+ require_relative "../html"
4
4
 
5
5
  module Evilution::Reporter::HTML::Stylesheet
6
6
  PATH = File.expand_path("assets/style.css", __dir__)
@@ -2,11 +2,16 @@
2
2
 
3
3
  require_relative "../reporter"
4
4
  require_relative "suggestion"
5
- require_relative "html/escape"
6
- require_relative "html/baseline_keys"
7
- require_relative "html/report"
8
5
 
9
6
  class Evilution::Reporter::HTML
7
+ autoload :Escape, "evilution/reporter/html/escape"
8
+ autoload :BaselineKeys, "evilution/reporter/html/baseline_keys"
9
+ autoload :Section, "evilution/reporter/html/section"
10
+ autoload :Sections, "evilution/reporter/html/sections"
11
+ autoload :Stylesheet, "evilution/reporter/html/stylesheet"
12
+ autoload :DiffFormatter, "evilution/reporter/html/diff_formatter"
13
+ autoload :Report, "evilution/reporter/html/report"
14
+
10
15
  def initialize(baseline: nil, integration: :rspec)
11
16
  @suggestion = Evilution::Reporter::Suggestion.new(integration: integration)
12
17
  @baseline = baseline
@@ -1,13 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../suggestion"
4
-
5
- # rubocop:disable Style/OneClassPerFile
6
- module Evilution::Reporter::Suggestion::Templates
7
- end
4
+ require_relative "templates"
8
5
 
9
6
  class Evilution::Reporter::Suggestion::Registry
10
- # rubocop:enable Style/OneClassPerFile
11
7
  def self.default
12
8
  return @default if @default
13
9
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../registry"
3
+ require_relative "../templates"
4
4
 
5
5
  module Evilution::Reporter::Suggestion::Templates::Generic
6
6
  GENERIC_ENTRIES = {