super_diff 0.5.3 → 0.8.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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +46 -20
  3. data/lib/super_diff.rb +46 -7
  4. data/lib/super_diff/active_record.rb +7 -7
  5. data/lib/super_diff/active_record/differs/active_record_relation.rb +3 -13
  6. data/lib/super_diff/active_record/object_inspection.rb +2 -6
  7. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb +16 -0
  8. data/lib/super_diff/active_record/object_inspection/{inspectors → inspection_tree_builders}/active_record_model.rb +19 -20
  9. data/lib/super_diff/active_record/object_inspection/{inspectors → inspection_tree_builders}/active_record_relation.rb +9 -8
  10. data/lib/super_diff/active_record/operation_tree_flatteners.rb +10 -0
  11. data/lib/super_diff/active_record/operation_tree_flatteners/active_record_relation.rb +17 -0
  12. data/lib/super_diff/active_record/operation_trees/active_record_relation.rb +8 -7
  13. data/lib/super_diff/active_support.rb +8 -8
  14. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +3 -13
  15. data/lib/super_diff/active_support/object_inspection.rb +2 -6
  16. data/lib/super_diff/active_support/object_inspection/{inspectors.rb → inspection_tree_builders.rb} +2 -2
  17. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/hash_with_indifferent_access.rb +37 -0
  18. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +17 -0
  19. data/lib/super_diff/active_support/operation_tree_flatteners.rb +10 -0
  20. data/lib/super_diff/active_support/operation_tree_flatteners/hash_with_indifferent_access.rb +17 -0
  21. data/lib/super_diff/active_support/operation_trees/hash_with_indifferent_access.rb +4 -7
  22. data/lib/super_diff/colorized_document_extensions.rb +9 -6
  23. data/lib/super_diff/configuration.rb +102 -19
  24. data/lib/super_diff/csi.rb +1 -1
  25. data/lib/super_diff/csi/four_bit_color.rb +0 -2
  26. data/lib/super_diff/diff_formatters/collection.rb +2 -2
  27. data/lib/super_diff/diff_formatters/multiline_string.rb +4 -4
  28. data/lib/super_diff/differs/array.rb +1 -1
  29. data/lib/super_diff/differs/base.rb +3 -21
  30. data/lib/super_diff/differs/custom_object.rb +1 -1
  31. data/lib/super_diff/differs/default_object.rb +1 -1
  32. data/lib/super_diff/differs/hash.rb +1 -1
  33. data/lib/super_diff/differs/main.rb +1 -7
  34. data/lib/super_diff/differs/multiline_string.rb +1 -1
  35. data/lib/super_diff/differs/time_like.rb +1 -1
  36. data/lib/super_diff/equality_matchers/array.rb +4 -4
  37. data/lib/super_diff/equality_matchers/default.rb +4 -4
  38. data/lib/super_diff/equality_matchers/hash.rb +4 -4
  39. data/lib/super_diff/equality_matchers/multiline_string.rb +4 -4
  40. data/lib/super_diff/equality_matchers/primitive.rb +6 -9
  41. data/lib/super_diff/equality_matchers/singleline_string.rb +4 -4
  42. data/lib/super_diff/gem_version.rb +45 -0
  43. data/lib/super_diff/helpers.rb +52 -2
  44. data/lib/super_diff/line.rb +83 -0
  45. data/lib/super_diff/object_inspection.rb +12 -9
  46. data/lib/super_diff/object_inspection/inspection_tree.rb +183 -81
  47. data/lib/super_diff/object_inspection/inspection_tree_builders.rb +44 -0
  48. data/lib/super_diff/object_inspection/inspection_tree_builders/array.rb +38 -0
  49. data/lib/super_diff/object_inspection/inspection_tree_builders/base.rb +27 -0
  50. data/lib/super_diff/object_inspection/inspection_tree_builders/custom_object.rb +37 -0
  51. data/lib/super_diff/object_inspection/inspection_tree_builders/default_object.rb +63 -0
  52. data/lib/super_diff/object_inspection/{inspectors → inspection_tree_builders}/defaults.rb +1 -2
  53. data/lib/super_diff/object_inspection/inspection_tree_builders/hash.rb +46 -0
  54. data/lib/super_diff/object_inspection/{inspectors → inspection_tree_builders}/main.rb +5 -10
  55. data/lib/super_diff/object_inspection/inspection_tree_builders/primitive.rb +21 -0
  56. data/lib/super_diff/object_inspection/inspection_tree_builders/time_like.rb +64 -0
  57. data/lib/super_diff/object_inspection/nodes.rb +33 -32
  58. data/lib/super_diff/object_inspection/nodes/as_lines_when_rendering_to_lines.rb +97 -0
  59. data/lib/super_diff/object_inspection/nodes/as_prefix_when_rendering_to_lines.rb +27 -0
  60. data/lib/super_diff/object_inspection/nodes/as_prelude_when_rendering_to_lines.rb +27 -0
  61. data/lib/super_diff/object_inspection/nodes/as_single_line.rb +33 -0
  62. data/lib/super_diff/object_inspection/nodes/base.rb +55 -20
  63. data/lib/super_diff/object_inspection/nodes/inspection.rb +47 -7
  64. data/lib/super_diff/object_inspection/nodes/nesting.rb +16 -5
  65. data/lib/super_diff/object_inspection/nodes/only_when.rb +54 -0
  66. data/lib/super_diff/object_inspection/nodes/text.rb +16 -2
  67. data/lib/super_diff/object_inspection/nodes/when_empty.rb +21 -6
  68. data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +20 -5
  69. data/lib/super_diff/object_inspection/nodes/when_rendering_to_lines.rb +27 -0
  70. data/lib/super_diff/object_inspection/nodes/when_rendering_to_string.rb +27 -0
  71. data/lib/super_diff/object_inspection/prefix_for_next_node.rb +6 -0
  72. data/lib/super_diff/object_inspection/prelude_for_next_node.rb +6 -0
  73. data/lib/super_diff/operation_tree_builders/array.rb +7 -10
  74. data/lib/super_diff/operation_tree_builders/base.rb +6 -6
  75. data/lib/super_diff/operation_tree_builders/custom_object.rb +5 -2
  76. data/lib/super_diff/operation_tree_builders/default_object.rb +1 -1
  77. data/lib/super_diff/operation_tree_builders/defaults.rb +1 -1
  78. data/lib/super_diff/operation_tree_builders/hash.rb +1 -8
  79. data/lib/super_diff/operation_tree_builders/multiline_string.rb +2 -6
  80. data/lib/super_diff/operation_tree_builders/time_like.rb +2 -2
  81. data/lib/super_diff/operation_tree_flatteners.rb +20 -0
  82. data/lib/super_diff/operation_tree_flatteners/array.rb +15 -0
  83. data/lib/super_diff/operation_tree_flatteners/base.rb +54 -0
  84. data/lib/super_diff/operation_tree_flatteners/collection.rb +139 -0
  85. data/lib/super_diff/operation_tree_flatteners/custom_object.rb +28 -0
  86. data/lib/super_diff/operation_tree_flatteners/default_object.rb +32 -0
  87. data/lib/super_diff/operation_tree_flatteners/hash.rb +41 -0
  88. data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +17 -0
  89. data/lib/super_diff/operation_trees/array.rb +4 -7
  90. data/lib/super_diff/operation_trees/base.rb +39 -16
  91. data/lib/super_diff/operation_trees/custom_object.rb +4 -8
  92. data/lib/super_diff/operation_trees/default_object.rb +28 -13
  93. data/lib/super_diff/operation_trees/hash.rb +4 -7
  94. data/lib/super_diff/operation_trees/main.rb +1 -1
  95. data/lib/super_diff/operation_trees/multiline_string.rb +4 -7
  96. data/lib/super_diff/operations/binary_operation.rb +1 -6
  97. data/lib/super_diff/operations/unary_operation.rb +2 -30
  98. data/lib/super_diff/recursion_guard.rb +3 -3
  99. data/lib/super_diff/rspec.rb +41 -13
  100. data/lib/super_diff/rspec/differs/collection_including.rb +4 -2
  101. data/lib/super_diff/rspec/differs/hash_including.rb +4 -2
  102. data/lib/super_diff/rspec/matcher_text_builders/base.rb +7 -7
  103. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +6 -6
  104. data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +1 -1
  105. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +4 -4
  106. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +1 -1
  107. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +5 -5
  108. data/lib/super_diff/rspec/monkey_patches.rb +353 -306
  109. data/lib/super_diff/rspec/object_inspection.rb +4 -1
  110. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +44 -0
  111. data/lib/super_diff/rspec/object_inspection/{inspectors → inspection_tree_builders}/collection_containing_exactly.rb +9 -8
  112. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +34 -0
  113. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +103 -0
  114. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +36 -0
  115. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +26 -0
  116. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +26 -0
  117. data/lib/super_diff/rspec/object_inspection/{inspectors → inspection_tree_builders}/object_having_attributes.rb +10 -12
  118. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/primitive.rb +10 -0
  119. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/value_within.rb +33 -0
  120. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +12 -4
  121. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +10 -3
  122. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +10 -3
  123. data/lib/super_diff/tiered_lines.rb +4 -0
  124. data/lib/super_diff/tiered_lines_elider.rb +490 -0
  125. data/lib/super_diff/tiered_lines_formatter.rb +79 -0
  126. data/lib/super_diff/version.rb +1 -1
  127. data/spec/examples.txt +407 -5
  128. data/spec/integration/rails/active_support_spec.rb +19 -0
  129. data/spec/integration/rspec/be_falsey_matcher_spec.rb +10 -10
  130. data/spec/integration/rspec/be_matcher_spec.rb +100 -100
  131. data/spec/integration/rspec/be_nil_matcher_spec.rb +10 -10
  132. data/spec/integration/rspec/be_predicate_matcher_spec.rb +103 -103
  133. data/spec/integration/rspec/be_truthy_matcher_spec.rb +10 -10
  134. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +113 -107
  135. data/spec/integration/rspec/eq_matcher_spec.rb +223 -277
  136. data/spec/integration/rspec/have_attributes_matcher_spec.rb +138 -129
  137. data/spec/integration/rspec/have_predicate_matcher_spec.rb +65 -65
  138. data/spec/integration/rspec/include_matcher_spec.rb +73 -73
  139. data/spec/integration/rspec/match_array_matcher_spec.rb +126 -119
  140. data/spec/integration/rspec/match_matcher_spec.rb +362 -274
  141. data/spec/integration/rspec/raise_error_matcher_spec.rb +86 -86
  142. data/spec/integration/rspec/respond_to_matcher_spec.rb +240 -240
  143. data/spec/integration/rspec/third_party_matcher_spec.rb +8 -8
  144. data/spec/integration/rspec/unhandled_errors_spec.rb +5 -5
  145. data/spec/spec_helper.rb +33 -13
  146. data/spec/support/command_runner.rb +15 -25
  147. data/spec/support/helpers.rb +21 -0
  148. data/spec/support/integration/helpers.rb +8 -2
  149. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +4 -4
  150. data/spec/support/integration/test_programs/base.rb +38 -10
  151. data/spec/support/integration/test_programs/rspec_active_record.rb +1 -1
  152. data/spec/support/integration/test_programs/rspec_active_support.rb +17 -0
  153. data/spec/support/integration/test_programs/rspec_rails.rb +1 -1
  154. data/spec/support/shared_examples/active_record.rb +109 -108
  155. data/spec/support/shared_examples/active_support.rb +65 -0
  156. data/spec/support/shared_examples/elided_diffs.rb +914 -0
  157. data/spec/support/shared_examples/hash_with_indifferent_access.rb +196 -232
  158. data/spec/support/unit/helpers.rb +15 -0
  159. data/spec/support/unit/matchers/match_output.rb +41 -0
  160. data/spec/unit/active_record/object_inspection_spec.rb +273 -0
  161. data/spec/unit/equality_matchers/main_spec.rb +445 -465
  162. data/spec/unit/helpers_spec.rb +61 -0
  163. data/spec/unit/operation_tree_flatteners/array_spec.rb +604 -0
  164. data/spec/unit/operation_tree_flatteners/custom_object_spec.rb +667 -0
  165. data/spec/unit/operation_tree_flatteners/default_object_spec.rb +687 -0
  166. data/spec/unit/operation_tree_flatteners/hash_spec.rb +632 -0
  167. data/spec/unit/operation_tree_flatteners/multiline_string_spec.rb +121 -0
  168. data/spec/unit/rspec/object_inspection_spec.rb +446 -0
  169. data/spec/unit/super_diff_spec.rb +1958 -0
  170. data/spec/unit/tiered_lines_elider_spec.rb +6356 -0
  171. data/spec/unit/tiered_lines_formatter_spec.rb +193 -0
  172. data/super_diff.gemspec +1 -1
  173. metadata +95 -50
  174. data/lib/super_diff/active_record/diff_formatters.rb +0 -10
  175. data/lib/super_diff/active_record/diff_formatters/active_record_relation.rb +0 -23
  176. data/lib/super_diff/active_record/object_inspection/inspectors.rb +0 -16
  177. data/lib/super_diff/active_support/diff_formatters.rb +0 -10
  178. data/lib/super_diff/active_support/diff_formatters/hash_with_indifferent_access.rb +0 -36
  179. data/lib/super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access.rb +0 -28
  180. data/lib/super_diff/diff_formatters.rb +0 -14
  181. data/lib/super_diff/diff_formatters/array.rb +0 -21
  182. data/lib/super_diff/diff_formatters/base.rb +0 -33
  183. data/lib/super_diff/diff_formatters/custom_object.rb +0 -30
  184. data/lib/super_diff/diff_formatters/default_object.rb +0 -46
  185. data/lib/super_diff/diff_formatters/defaults.rb +0 -10
  186. data/lib/super_diff/diff_formatters/hash.rb +0 -34
  187. data/lib/super_diff/diff_formatters/main.rb +0 -41
  188. data/lib/super_diff/object_inspection/inspectors.rb +0 -23
  189. data/lib/super_diff/object_inspection/inspectors/array.rb +0 -32
  190. data/lib/super_diff/object_inspection/inspectors/base.rb +0 -36
  191. data/lib/super_diff/object_inspection/inspectors/custom_object.rb +0 -37
  192. data/lib/super_diff/object_inspection/inspectors/default_object.rb +0 -61
  193. data/lib/super_diff/object_inspection/inspectors/hash.rb +0 -32
  194. data/lib/super_diff/object_inspection/inspectors/primitive.rb +0 -28
  195. data/lib/super_diff/object_inspection/inspectors/string.rb +0 -23
  196. data/lib/super_diff/object_inspection/inspectors/time_like.rb +0 -23
  197. data/lib/super_diff/object_inspection/nodes/break.rb +0 -15
  198. data/lib/super_diff/object_inspection/nodes/when_multiline.rb +0 -22
  199. data/lib/super_diff/object_inspection/nodes/when_singleline.rb +0 -24
  200. data/lib/super_diff/rspec/object_inspection/inspectors.rb +0 -40
  201. data/lib/super_diff/rspec/object_inspection/inspectors/collection_including.rb +0 -28
  202. data/lib/super_diff/rspec/object_inspection/inspectors/hash_including.rb +0 -31
  203. data/lib/super_diff/rspec/object_inspection/inspectors/instance_of.rb +0 -23
  204. data/lib/super_diff/rspec/object_inspection/inspectors/kind_of.rb +0 -23
  205. data/lib/super_diff/rspec/object_inspection/inspectors/primitive.rb +0 -13
  206. data/lib/super_diff/rspec/object_inspection/inspectors/value_within.rb +0 -29
  207. data/spec/support/object_id.rb +0 -27
  208. data/spec/support/ruby_versions.rb +0 -11
  209. data/spec/unit/object_inspection_spec.rb +0 -1168
@@ -23,7 +23,7 @@ RSpec.describe "Integration with a third-party matcher", type: :integration do
23
23
  red_line "Here is the next line."
24
24
  plain_line " This part is indented, for whatever reason. It just kinda keeps"
25
25
  plain_line " going until we finish saying whatever it is we want to say."
26
- }
26
+ },
27
27
  )
28
28
 
29
29
  expect(program).
@@ -50,10 +50,10 @@ RSpec.describe "Integration with a third-party matcher", type: :integration do
50
50
  snippet: %|expect(:anything).to fail_with_paragraphed_failure_message|,
51
51
  newline_before_expectation: true,
52
52
  expectation: proc {
53
- red_line "This is a message that spans multiple paragraphs."
53
+ red_line "This is a message that spans multiple paragraphs."
54
54
  newline
55
55
  plain_line "Here is the next paragraph."
56
- }
56
+ },
57
57
  )
58
58
 
59
59
  expect(program).
@@ -81,7 +81,7 @@ RSpec.describe "Integration with a third-party matcher", type: :integration do
81
81
  expectation: proc {
82
82
  red_line "This is a message that spans multiple lines."
83
83
  red_line "Here is the next line."
84
- }
84
+ },
85
85
  )
86
86
 
87
87
  expect(program).
@@ -142,7 +142,7 @@ RSpec.describe "Integration with a third-party matcher", type: :integration do
142
142
  red_line "Here is the next line."
143
143
  plain_line " This part is indented, for whatever reason. It just kinda keeps"
144
144
  plain_line " going until we finish saying whatever it is we want to say."
145
- }
145
+ },
146
146
  )
147
147
 
148
148
  expect(program).
@@ -171,8 +171,8 @@ RSpec.describe "Integration with a third-party matcher", type: :integration do
171
171
  expectation: proc {
172
172
  red_line "This is a message that spans multiple paragraphs."
173
173
  newline
174
- plain_line "Here is the next paragraph."
175
- }
174
+ plain_line "Here is the next paragraph."
175
+ },
176
176
  )
177
177
 
178
178
  expect(program).
@@ -228,7 +228,7 @@ RSpec.describe "Integration with a third-party matcher", type: :integration do
228
228
  snippet: %|expect(:anything).not_to pass_with_singleline_failure_message|,
229
229
  expectation: proc {
230
230
  red_line "This is a message that spans only one line."
231
- }
231
+ },
232
232
  )
233
233
 
234
234
  expect(program).
@@ -21,7 +21,7 @@ RSpec.describe "Integration with RSpec and unhandled errors", type: :integration
21
21
  expectation: proc {
22
22
  red_line "RuntimeError:"
23
23
  indent by: 2 do
24
- red_line "Some kind of error or whatever"
24
+ red_line "Some kind of error or whatever"
25
25
  newline
26
26
  plain_line "This is another line"
27
27
  end
@@ -95,7 +95,7 @@ RSpec.describe "Integration with RSpec and unhandled errors", type: :integration
95
95
  indent by: 5 do
96
96
  line do
97
97
  plain "1.1) "
98
- bold "Failure/Error: "
98
+ bold "Failure/Error: "
99
99
  plain snippet
100
100
  end
101
101
 
@@ -106,7 +106,7 @@ RSpec.describe "Integration with RSpec and unhandled errors", type: :integration
106
106
  indent by: 2 do
107
107
  red_line "Some kind of error or whatever"
108
108
  newline
109
- line "This is another line"
109
+ line "This is another line"
110
110
  end
111
111
  end
112
112
  end
@@ -116,7 +116,7 @@ RSpec.describe "Integration with RSpec and unhandled errors", type: :integration
116
116
  indent by: 5 do
117
117
  line do
118
118
  plain "1.2) "
119
- bold "Failure/Error: "
119
+ bold "Failure/Error: "
120
120
  plain snippet
121
121
  end
122
122
 
@@ -127,7 +127,7 @@ RSpec.describe "Integration with RSpec and unhandled errors", type: :integration
127
127
  indent by: 2 do
128
128
  red_line "Some kind of error or whatever"
129
129
  newline
130
- line "This is another line"
130
+ line "This is another line"
131
131
  end
132
132
  end
133
133
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require "pp"
2
+
1
3
  begin
2
4
  require "pry-byebug"
3
5
  rescue LoadError
@@ -8,6 +10,8 @@ begin
8
10
  rescue LoadError
9
11
  end
10
12
 
13
+ require "climate_control"
14
+
11
15
  #---
12
16
 
13
17
  require_relative "../support/current_bundle"
@@ -18,28 +22,28 @@ SuperDiff::CurrentBundle.instance.assert_appraisal!
18
22
 
19
23
  begin
20
24
  require "active_record"
25
+
21
26
  active_record_available = true
22
- rescue LoadError
23
- active_record_available = false
24
- end
25
27
 
26
- if active_record_available
27
28
  ActiveRecord::Base.establish_connection(
28
29
  adapter: "sqlite3",
29
30
  database: ":memory:",
30
31
  )
31
-
32
- require "super_diff/rspec-rails"
33
- else
34
- require "super_diff/rspec"
32
+ rescue LoadError
33
+ active_record_available = false
35
34
  end
36
35
 
37
- Dir.glob(File.expand_path("support/**/*.rb", __dir__)).each do |file|
38
- next if !active_record_available && file.include?('models/active_record')
39
- require file
40
- end
36
+ Dir.glob(File.expand_path("support/**/*.rb", __dir__)).
37
+ sort.
38
+ reject do |file|
39
+ file.include?("/models/active_record/") && !active_record_available
40
+ end.
41
+ each do |file|
42
+ require file
43
+ end
41
44
 
42
45
  RSpec.configure do |config|
46
+ config.include(SuperDiff::UnitTests, type: :unit)
43
47
  config.include(SuperDiff::IntegrationTests, type: :integration)
44
48
 
45
49
  config.expect_with :rspec do |expectations|
@@ -65,6 +69,22 @@ RSpec.configure do |config|
65
69
 
66
70
  config.order = :random
67
71
  Kernel.srand config.seed
72
+
73
+ if ENV["CI"] == "true"
74
+ config.color_mode = :on
75
+ end
68
76
  end
69
77
 
70
- require "pp"
78
+ require "warnings_logger"
79
+ $VERBOSE = true
80
+ WarningsLogger.configure do |config|
81
+ config.project_name = "super_diff"
82
+ config.project_directory = Pathname.new("..").expand_path(__dir__)
83
+ end
84
+ WarningsLogger.enable
85
+
86
+ if active_record_available
87
+ require "super_diff/rspec-rails"
88
+ else
89
+ require "super_diff/rspec"
90
+ end
@@ -5,24 +5,6 @@ require "shellwords"
5
5
  require "timeout"
6
6
 
7
7
  class CommandRunner
8
- module OutputHelpers
9
- def self.bookended(text)
10
- divider("START") + text + "\n" + divider("END")
11
- end
12
-
13
- def self.divider(title = "")
14
- total_length = 72
15
- start_length = 3
16
-
17
- string = ""
18
- string << ("-" * start_length)
19
- string << title
20
- string << "-" * (total_length - start_length - title.length)
21
- string << "\n"
22
- string
23
- end
24
- end
25
-
26
8
  class CommandFailedError < StandardError
27
9
  def self.create(command:, exit_status:, output:, message: nil)
28
10
  allocate.tap do |error|
@@ -49,7 +31,11 @@ Command #{command.inspect} failed, exiting with status #{exit_status}.
49
31
  if output
50
32
  message << <<-MESSAGE
51
33
  Output:
52
- #{OutputHelpers.divider("START") + output + OutputHelpers.divider("END")}
34
+ #{
35
+ SuperDiff::Test::OutputHelpers.divider("START") +
36
+ output +
37
+ SuperDiff::Test::OutputHelpers.divider("END")
38
+ }
53
39
  MESSAGE
54
40
  end
55
41
 
@@ -83,7 +69,11 @@ Command #{formatted_command.inspect} timed out after #{timeout} seconds.
83
69
  if output
84
70
  message << <<-MESSAGE
85
71
  Output:
86
- #{OutputHelpers.divider("START") + output + OutputHelpers.divider("END")}
72
+ #{
73
+ SuperDiff::Test::OutputHelpers.divider("START") +
74
+ output +
75
+ SuperDiff::Test::OutputHelpers.divider("END")
76
+ }
87
77
  MESSAGE
88
78
  end
89
79
 
@@ -120,9 +110,9 @@ Output:
120
110
  @env = extract_env_from(@options)
121
111
 
122
112
  @process = ChildProcess.build(*command)
123
- # @env.each do |key, value|
124
- # @process.environment[key] = value
125
- # end
113
+ @env.each do |key, value|
114
+ @process.environment[key] = value
115
+ end
126
116
  @process.io.stdout = @process.io.stderr = @writer
127
117
 
128
118
  @wrapper = -> (block) { block.call }
@@ -250,9 +240,9 @@ Output:
250
240
 
251
241
  debug do
252
242
  "\n" +
253
- OutputHelpers.divider("START") +
243
+ SuperDiff::Test::OutputHelpers.divider("START") +
254
244
  output +
255
- OutputHelpers.divider("END")
245
+ SuperDiff::Test::OutputHelpers.divider("END")
256
246
  end
257
247
  end
258
248
 
@@ -0,0 +1,21 @@
1
+ module SuperDiff
2
+ module Test
3
+ module OutputHelpers
4
+ def self.bookended(text)
5
+ divider("START") + text + "\n" + divider("END")
6
+ end
7
+
8
+ def self.divider(title = "")
9
+ total_length = 72
10
+ start_length = 3
11
+
12
+ string = ""
13
+ string << ("-" * start_length)
14
+ string << title
15
+ string << "-" * (total_length - start_length - title.length)
16
+ string << "\n"
17
+ string
18
+ end
19
+ end
20
+ end
21
+ end
@@ -11,21 +11,27 @@ module SuperDiff
11
11
  def make_plain_test_program(
12
12
  test,
13
13
  color_enabled:,
14
+ configuration: {},
14
15
  preserve_as_whole_file: false
15
16
  )
16
17
  TestPrograms::Plain.new(
17
18
  test,
18
19
  color_enabled: color_enabled,
20
+ configuration: configuration,
19
21
  preserve_as_whole_file: preserve_as_whole_file,
20
22
  )
21
23
  end
22
24
 
23
25
  def make_rspec_active_record_program(test, color_enabled:)
24
- TestPrograms::RspecActiveRecord.new(test, color_enabled: color_enabled)
26
+ TestPrograms::RSpecActiveRecord.new(test, color_enabled: color_enabled)
27
+ end
28
+
29
+ def make_rspec_active_support_program(test, color_enabled:)
30
+ TestPrograms::RSpecActiveSupport.new(test, color_enabled: color_enabled)
25
31
  end
26
32
 
27
33
  def make_rspec_rails_test_program(test, color_enabled:)
28
- TestPrograms::RspecRails.new(test, color_enabled: color_enabled)
34
+ TestPrograms::RSpecRails.new(test, color_enabled: color_enabled)
29
35
  end
30
36
 
31
37
  def build_expected_output(
@@ -12,7 +12,7 @@ module SuperDiff
12
12
  end
13
13
 
14
14
  def removing_object_ids
15
- first_replacing(/#<([\w:]+):0x[a-z0-9]+(.*?)>/, '#<\1\2>')
15
+ first_replacing(/#<([\w:]+):0x[a-f0-9]+/, '#<\1')
16
16
  self
17
17
  end
18
18
 
@@ -36,12 +36,12 @@ module SuperDiff
36
36
  "."
37
37
  else
38
38
  message =
39
- "Expected test to produce output, but it did not.\n\n" +
39
+ "Expected test to produce #{expect_output_to_contain_color? ? "colored" : "uncolored"} output, but it did not.\n\n" +
40
40
  "Expected output to contain:\n\n" +
41
- CommandRunner::OutputHelpers.bookended(expected_output) +
41
+ SuperDiff::Test::OutputHelpers.bookended(expected_output) +
42
42
  "\n" +
43
43
  "Actual output:\n\n" +
44
- CommandRunner::OutputHelpers.bookended(actual_output)
44
+ SuperDiff::Test::OutputHelpers.bookended(actual_output)
45
45
 
46
46
  if ["1", "true"].include?(ENV["SHOW_DIFF"])
47
47
  ::RSpec::Matchers::ExpectedsForMultipleDiffs.
@@ -1,3 +1,6 @@
1
+ require "attr_extras/explicit"
2
+ require "json"
3
+
1
4
  module SuperDiff
2
5
  module IntegrationTests
3
6
  module TestPrograms
@@ -7,11 +10,15 @@ module SuperDiff
7
10
  PROJECT_DIRECTORY = Pathname.new("../../../..").expand_path(__dir__)
8
11
  TEMP_DIRECTORY = PROJECT_DIRECTORY.join("tmp")
9
12
 
10
- attr_private :code, :color_enabled, :preserve_as_whole_file
11
-
12
- def initialize(code, color_enabled:, preserve_as_whole_file: false)
13
+ def initialize(
14
+ code,
15
+ color_enabled:,
16
+ configuration: {},
17
+ preserve_as_whole_file: false
18
+ )
13
19
  @code = code.strip
14
20
  @color_enabled = color_enabled
21
+ @configuration = configuration
15
22
  @preserve_as_whole_file = preserve_as_whole_file
16
23
  end
17
24
 
@@ -31,15 +38,27 @@ module SuperDiff
31
38
 
32
39
  private
33
40
 
34
- attr_query :color_enabled?
35
- attr_query :preserve_as_whole_file?
41
+ attr_reader :code, :configuration
42
+
43
+ def color_enabled?
44
+ @color_enabled
45
+ end
46
+
47
+ def preserve_as_whole_file?
48
+ @preserve_as_whole_file
49
+ end
36
50
 
37
51
  def result_of_command
38
52
  @_result_of_command ||=
39
53
  if zeus_running?
40
- Bundler.with_unbundled_env { CommandRunner.run(*command) }
54
+ Bundler.with_unbundled_env do
55
+ CommandRunner.run(Shellwords.join(command))
56
+ end
41
57
  else
42
- CommandRunner.run(*command)
58
+ CommandRunner.run(
59
+ Shellwords.join(command),
60
+ env: { 'DISABLE_PRY' => 'true' },
61
+ )
43
62
  end
44
63
  end
45
64
 
@@ -49,7 +68,15 @@ module SuperDiff
49
68
  end
50
69
 
51
70
  if zeus_running?
52
- ["zeus", test_plan_command, color_option, tempfile.to_s]
71
+ [
72
+ "zeus",
73
+ test_plan_command,
74
+ color_option,
75
+ "--no-pry",
76
+ tempfile.to_s,
77
+ "--configuration",
78
+ JSON.generate(configuration),
79
+ ]
53
80
  else
54
81
  [
55
82
  "rspec",
@@ -65,7 +92,7 @@ module SuperDiff
65
92
  end
66
93
 
67
94
  def color_option
68
- color_enabled ? "--color" : "--no-color"
95
+ color_enabled? ? "--color" : "--no-color"
69
96
  end
70
97
 
71
98
  def tempfile
@@ -86,7 +113,8 @@ module SuperDiff
86
113
 
87
114
  test_plan = TestPlan.new(
88
115
  using_outside_of_zeus: true,
89
- color_enabled: #{color_enabled?}
116
+ color_enabled: #{color_enabled?.inspect},
117
+ configuration: #{configuration.inspect}
90
118
  )
91
119
  test_plan.boot
92
120
  #{test_plan_prelude}
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module IntegrationTests
3
3
  module TestPrograms
4
- class RspecActiveRecord < Base
4
+ class RSpecActiveRecord < Base
5
5
  protected
6
6
 
7
7
  def test_plan_prelude
@@ -0,0 +1,17 @@
1
+ module SuperDiff
2
+ module IntegrationTests
3
+ module TestPrograms
4
+ class RSpecActiveSupport < Base
5
+ protected
6
+
7
+ def test_plan_prelude
8
+ "test_plan.boot_active_support"
9
+ end
10
+
11
+ def test_plan_command
12
+ "run_rspec_active_support_test"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end