super_diff 0.9.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +65 -26
  3. data/lib/super_diff/active_record/differs/active_record_relation.rb +1 -2
  4. data/lib/super_diff/active_record/differs.rb +1 -1
  5. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_model.rb +22 -18
  6. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_relation.rb +14 -7
  7. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb +2 -2
  8. data/lib/super_diff/active_record/object_inspection.rb +1 -1
  9. data/lib/super_diff/active_record/operation_tree_builders/active_record_model.rb +1 -2
  10. data/lib/super_diff/active_record/operation_tree_builders/active_record_relation.rb +1 -2
  11. data/lib/super_diff/active_record/operation_tree_builders.rb +2 -2
  12. data/lib/super_diff/active_record/operation_tree_flatteners.rb +1 -1
  13. data/lib/super_diff/active_record/operation_trees.rb +1 -1
  14. data/lib/super_diff/active_record.rb +7 -15
  15. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +5 -6
  16. data/lib/super_diff/active_support/differs.rb +1 -1
  17. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/hash_with_indifferent_access.rb +20 -11
  18. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/ordered_options.rb +46 -0
  19. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders.rb +5 -1
  20. data/lib/super_diff/active_support/object_inspection.rb +1 -1
  21. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +5 -6
  22. data/lib/super_diff/active_support/operation_tree_builders.rb +1 -1
  23. data/lib/super_diff/active_support/operation_tree_flatteners.rb +1 -1
  24. data/lib/super_diff/active_support/operation_trees.rb +1 -1
  25. data/lib/super_diff/active_support.rb +6 -10
  26. data/lib/super_diff/colorized_document_extensions.rb +2 -4
  27. data/lib/super_diff/configuration.rb +14 -8
  28. data/lib/super_diff/csi/color.rb +4 -4
  29. data/lib/super_diff/csi/colorized_document.rb +12 -16
  30. data/lib/super_diff/csi/document.rb +8 -19
  31. data/lib/super_diff/csi/eight_bit_color.rb +19 -19
  32. data/lib/super_diff/csi/four_bit_color.rb +82 -31
  33. data/lib/super_diff/csi/twenty_four_bit_color.rb +12 -11
  34. data/lib/super_diff/csi/uncolorized_document.rb +2 -6
  35. data/lib/super_diff/csi.rb +10 -14
  36. data/lib/super_diff/diff_formatters/collection.rb +35 -41
  37. data/lib/super_diff/differs/date_like.rb +15 -0
  38. data/lib/super_diff/differs/default_object.rb +1 -1
  39. data/lib/super_diff/differs/defaults.rb +2 -1
  40. data/lib/super_diff/differs/main.rb +2 -13
  41. data/lib/super_diff/differs.rb +1 -0
  42. data/lib/super_diff/equality_matchers/array.rb +10 -12
  43. data/lib/super_diff/equality_matchers/base.rb +1 -1
  44. data/lib/super_diff/equality_matchers/default.rb +2 -4
  45. data/lib/super_diff/equality_matchers/defaults.rb +1 -1
  46. data/lib/super_diff/equality_matchers/hash.rb +10 -12
  47. data/lib/super_diff/equality_matchers/multiline_string.rb +11 -13
  48. data/lib/super_diff/equality_matchers/primitive.rb +10 -12
  49. data/lib/super_diff/equality_matchers/singleline_string.rb +10 -12
  50. data/lib/super_diff/equality_matchers.rb +1 -1
  51. data/lib/super_diff/errors.rb +2 -6
  52. data/lib/super_diff/gem_version.rb +3 -3
  53. data/lib/super_diff/helpers.rb +10 -10
  54. data/lib/super_diff/implementation_checks.rb +2 -2
  55. data/lib/super_diff/line.rb +3 -3
  56. data/lib/super_diff/object_inspection/inspection_tree.rb +64 -73
  57. data/lib/super_diff/object_inspection/inspection_tree_builders/array.rb +29 -14
  58. data/lib/super_diff/object_inspection/inspection_tree_builders/custom_object.rb +17 -13
  59. data/lib/super_diff/object_inspection/inspection_tree_builders/date_like.rb +51 -0
  60. data/lib/super_diff/object_inspection/inspection_tree_builders/default_object.rb +43 -27
  61. data/lib/super_diff/object_inspection/inspection_tree_builders/defaults.rb +2 -1
  62. data/lib/super_diff/object_inspection/inspection_tree_builders/hash.rb +35 -18
  63. data/lib/super_diff/object_inspection/inspection_tree_builders/primitive.rb +3 -5
  64. data/lib/super_diff/object_inspection/inspection_tree_builders/time_like.rb +30 -36
  65. data/lib/super_diff/object_inspection/inspection_tree_builders.rb +13 -9
  66. data/lib/super_diff/object_inspection/nodes/as_lines_when_rendering_to_lines.rb +11 -22
  67. data/lib/super_diff/object_inspection/nodes/as_prefix_when_rendering_to_lines.rb +1 -5
  68. data/lib/super_diff/object_inspection/nodes/as_prelude_when_rendering_to_lines.rb +1 -5
  69. data/lib/super_diff/object_inspection/nodes/as_single_line.rb +3 -7
  70. data/lib/super_diff/object_inspection/nodes/base.rb +9 -14
  71. data/lib/super_diff/object_inspection/nodes/inspection.rb +26 -34
  72. data/lib/super_diff/object_inspection/nodes/nesting.rb +1 -1
  73. data/lib/super_diff/object_inspection/nodes/only_when.rb +2 -6
  74. data/lib/super_diff/object_inspection/nodes/text.rb +1 -5
  75. data/lib/super_diff/object_inspection/nodes/when_empty.rb +2 -6
  76. data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +2 -6
  77. data/lib/super_diff/object_inspection/nodes/when_rendering_to_lines.rb +1 -1
  78. data/lib/super_diff/object_inspection/nodes/when_rendering_to_string.rb +1 -5
  79. data/lib/super_diff/object_inspection/nodes.rb +7 -7
  80. data/lib/super_diff/object_inspection.rb +3 -3
  81. data/lib/super_diff/operation_tree_builders/array.rb +12 -11
  82. data/lib/super_diff/operation_tree_builders/base.rb +17 -15
  83. data/lib/super_diff/operation_tree_builders/custom_object.rb +8 -6
  84. data/lib/super_diff/operation_tree_builders/date_like.rb +15 -0
  85. data/lib/super_diff/operation_tree_builders/default_object.rb +29 -21
  86. data/lib/super_diff/operation_tree_builders/defaults.rb +1 -1
  87. data/lib/super_diff/operation_tree_builders/hash.rb +23 -24
  88. data/lib/super_diff/operation_tree_builders/main.rb +4 -11
  89. data/lib/super_diff/operation_tree_builders/multiline_string.rb +3 -3
  90. data/lib/super_diff/operation_tree_builders/time_like.rb +1 -11
  91. data/lib/super_diff/operation_tree_builders.rb +2 -1
  92. data/lib/super_diff/operation_tree_flatteners/base.rb +1 -5
  93. data/lib/super_diff/operation_tree_flatteners/collection.rb +13 -16
  94. data/lib/super_diff/operation_tree_flatteners/default_object.rb +1 -2
  95. data/lib/super_diff/operation_tree_flatteners/hash.rb +2 -10
  96. data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +2 -1
  97. data/lib/super_diff/operation_tree_flatteners.rb +3 -3
  98. data/lib/super_diff/operation_trees/base.rb +3 -5
  99. data/lib/super_diff/operation_trees/default_object.rb +1 -3
  100. data/lib/super_diff/operations/binary_operation.rb +2 -2
  101. data/lib/super_diff/operations/unary_operation.rb +1 -1
  102. data/lib/super_diff/rails.rb +2 -1
  103. data/lib/super_diff/recursion_guard.rb +5 -4
  104. data/lib/super_diff/rspec/augmented_matcher.rb +4 -5
  105. data/lib/super_diff/rspec/differ.rb +6 -13
  106. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +3 -2
  107. data/lib/super_diff/rspec/differs/collection_including.rb +1 -1
  108. data/lib/super_diff/rspec/differs/hash_including.rb +1 -1
  109. data/lib/super_diff/rspec/differs.rb +3 -3
  110. data/lib/super_diff/rspec/matcher_text_builders/base.rb +13 -15
  111. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +5 -7
  112. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +3 -5
  113. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +2 -10
  114. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +2 -6
  115. data/lib/super_diff/rspec/matcher_text_builders.rb +5 -8
  116. data/lib/super_diff/rspec/matcher_text_template.rb +13 -16
  117. data/lib/super_diff/rspec/monkey_patches.rb +180 -123
  118. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_containing_exactly.rb +14 -7
  119. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +21 -13
  120. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +35 -36
  121. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/generic_describable_matcher.rb +19 -0
  122. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +21 -15
  123. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +11 -10
  124. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +11 -10
  125. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/object_having_attributes.rb +14 -7
  126. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/value_within.rb +10 -11
  127. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +13 -9
  128. data/lib/super_diff/rspec/object_inspection.rb +1 -1
  129. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +11 -10
  130. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +7 -6
  131. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +11 -10
  132. data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +22 -17
  133. data/lib/super_diff/rspec/operation_tree_builders.rb +4 -4
  134. data/lib/super_diff/rspec.rb +17 -18
  135. data/lib/super_diff/tiered_lines_elider.rb +87 -115
  136. data/lib/super_diff/tiered_lines_formatter.rb +5 -9
  137. data/lib/super_diff/version.rb +1 -1
  138. data/lib/super_diff.rb +13 -9
  139. data/spec/examples.txt +541 -483
  140. data/spec/integration/rails/active_record_spec.rb +3 -1
  141. data/spec/integration/rails/engines_spec.rb +25 -0
  142. data/spec/integration/rails/hash_with_indifferent_access_spec.rb +3 -1
  143. data/spec/integration/rspec/be_falsey_matcher_spec.rb +40 -35
  144. data/spec/integration/rspec/be_matcher_spec.rb +360 -320
  145. data/spec/integration/rspec/be_nil_matcher_spec.rb +38 -34
  146. data/spec/integration/rspec/be_predicate_matcher_spec.rb +376 -359
  147. data/spec/integration/rspec/be_truthy_matcher_spec.rb +38 -33
  148. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +257 -254
  149. data/spec/integration/rspec/eq_matcher_spec.rb +695 -585
  150. data/spec/integration/rspec/generic_describable_matchers_spec.rb +177 -0
  151. data/spec/integration/rspec/have_attributes_matcher_spec.rb +312 -304
  152. data/spec/integration/rspec/have_predicate_matcher_spec.rb +291 -297
  153. data/spec/integration/rspec/include_matcher_spec.rb +327 -225
  154. data/spec/integration/rspec/magic_metadata_spec.rb +51 -0
  155. data/spec/integration/rspec/match_array_matcher_spec.rb +294 -291
  156. data/spec/integration/rspec/match_matcher_spec.rb +916 -903
  157. data/spec/integration/rspec/raise_error_matcher_spec.rb +1208 -449
  158. data/spec/integration/rspec/respond_to_matcher_spec.rb +702 -697
  159. data/spec/integration/rspec/third_party_matcher_spec.rb +142 -138
  160. data/spec/integration/rspec/unhandled_errors_spec.rb +88 -84
  161. data/spec/internal/log/test.log +0 -0
  162. data/spec/spec_helper.rb +20 -20
  163. data/spec/support/command_runner.rb +34 -57
  164. data/spec/support/integration/helpers.rb +44 -32
  165. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +28 -23
  166. data/spec/support/integration/matchers.rb +34 -0
  167. data/spec/support/integration/test_programs/base.rb +17 -22
  168. data/spec/support/integration/test_programs/plain.rb +6 -0
  169. data/spec/support/integration/test_programs/rspec_active_record.rb +4 -1
  170. data/spec/support/integration/test_programs/rspec_active_support.rb +4 -1
  171. data/spec/support/integration/test_programs/rspec_rails.rb +4 -1
  172. data/spec/support/integration/test_programs/rspec_rails_engine.rb +20 -0
  173. data/spec/support/models/active_record/person.rb +6 -4
  174. data/spec/support/models/active_record/shipping_address.rb +9 -10
  175. data/spec/support/models/customer.rb +2 -4
  176. data/spec/support/models/player.rb +3 -6
  177. data/spec/support/models/shipping_address.rb +4 -13
  178. data/spec/support/shared_examples/active_record.rb +258 -240
  179. data/spec/support/shared_examples/active_support.rb +174 -51
  180. data/spec/support/shared_examples/elided_diffs.rb +447 -423
  181. data/spec/support/shared_examples/hash_with_indifferent_access.rb +500 -464
  182. data/spec/support/shared_examples/key.rb +123 -0
  183. data/spec/support/unit/helpers.rb +1 -3
  184. data/spec/support/unit/matchers/match_output.rb +12 -13
  185. data/spec/unit/active_record/object_inspection_spec.rb +222 -206
  186. data/spec/unit/active_support/object_inspection_spec.rb +170 -0
  187. data/spec/unit/equality_matchers/main_spec.rb +1049 -984
  188. data/spec/unit/helpers_spec.rb +14 -21
  189. data/spec/unit/operation_tree_flatteners/array_spec.rb +557 -524
  190. data/spec/unit/operation_tree_flatteners/custom_object_spec.rb +619 -601
  191. data/spec/unit/operation_tree_flatteners/default_object_spec.rb +619 -621
  192. data/spec/unit/operation_tree_flatteners/hash_spec.rb +595 -556
  193. data/spec/unit/operation_tree_flatteners/multiline_string_spec.rb +102 -92
  194. data/spec/unit/rspec/matchers/be_compared_to_spec.rb +3 -3
  195. data/spec/unit/rspec/matchers/be_predicate_spec.rb +3 -3
  196. data/spec/unit/rspec/matchers/contain_exactly_spec.rb +1 -1
  197. data/spec/unit/rspec/matchers/have_attributes_spec.rb +1 -1
  198. data/spec/unit/rspec/matchers/have_predicate_spec.rb +2 -2
  199. data/spec/unit/rspec/matchers/include_spec.rb +2 -2
  200. data/spec/unit/rspec/matchers/match_array_spec.rb +2 -2
  201. data/spec/unit/rspec/matchers/raise_error_spec.rb +43 -11
  202. data/spec/unit/rspec/matchers/respond_to_spec.rb +23 -16
  203. data/spec/unit/rspec/object_inspection/rspec_matcher_spec.rb +91 -0
  204. data/spec/unit/rspec/object_inspection_spec.rb +351 -326
  205. data/spec/unit/super_diff_spec.rb +1594 -1437
  206. data/spec/unit/tiered_lines_elider_spec.rb +3508 -3536
  207. data/spec/unit/tiered_lines_formatter_spec.rb +54 -116
  208. data/super_diff.gemspec +13 -12
  209. metadata +88 -75
  210. data/lib/super_diff/errors/no_diff_formatter_available_error.rb +0 -21
  211. data/lib/super_diff/errors/no_operational_sequencer_available_error.rb +0 -22
  212. data/spec/tmp/warnings_logger/all_warnings.txt +0 -2
@@ -8,11 +8,7 @@ module SuperDiff
8
8
  method_object :lines
9
9
 
10
10
  def call
11
- if all_lines_are_changed_or_unchanged?
12
- lines
13
- else
14
- elided_lines
15
- end
11
+ all_lines_are_changed_or_unchanged? ? lines : elided_lines
16
12
  end
17
13
 
18
14
  private
@@ -22,9 +18,11 @@ module SuperDiff
22
18
  end
23
19
 
24
20
  def elided_lines
25
- boxes_to_elide.reverse.reduce(lines) do |lines_with_elisions, box|
26
- with_box_elided(box, lines_with_elisions)
27
- end
21
+ boxes_to_elide
22
+ .reverse
23
+ .reduce(lines) do |lines_with_elisions, box|
24
+ with_box_elided(box, lines_with_elisions)
25
+ end
28
26
  end
29
27
 
30
28
  def boxes_to_elide
@@ -35,9 +33,7 @@ module SuperDiff
35
33
  end
36
34
 
37
35
  def panes_to_consider_for_eliding
38
- panes.select do |pane|
39
- pane.type == :clean && pane.range.size > maximum
40
- end
36
+ panes.select { |pane| pane.type == :clean && pane.range.size > maximum }
41
37
  end
42
38
 
43
39
  def panes
@@ -45,24 +41,26 @@ module SuperDiff
45
41
  end
46
42
 
47
43
  def padded_dirty_panes
48
- @_padded_dirty_panes ||= combine_congruent_panes(
49
- dirty_panes.
50
- map(&:padded).
51
- map { |pane| pane.capped_to(0, lines.size - 1) }
52
- )
44
+ @_padded_dirty_panes ||=
45
+ combine_congruent_panes(
46
+ dirty_panes
47
+ .map(&:padded)
48
+ .map { |pane| pane.capped_to(0, lines.size - 1) }
49
+ )
53
50
  end
54
51
 
55
52
  def dirty_panes
56
- @_dirty_panes ||= lines.
57
- each_with_index.
58
- select { |line, index| line.type != :noop }.
59
- reduce([]) do |panes, (_, index)|
60
- if !panes.empty? && panes.last.range.end == index - 1
61
- panes[0..-2] + [panes[-1].extended_to(index)]
62
- else
63
- panes + [Pane.new(type: :dirty, range: index..index)]
53
+ @_dirty_panes ||=
54
+ lines
55
+ .each_with_index
56
+ .select { |line, index| line.type != :noop }
57
+ .reduce([]) do |panes, (_, index)|
58
+ if !panes.empty? && panes.last.range.end == index - 1
59
+ panes[0..-2] + [panes[-1].extended_to(index)]
60
+ else
61
+ panes + [Pane.new(type: :dirty, range: index..index)]
62
+ end
64
63
  end
65
- end
66
64
  end
67
65
 
68
66
  def with_box_elided(box, lines)
@@ -92,7 +90,7 @@ module SuperDiff
92
90
  with_subset_of_lines_elided(
93
91
  lines,
94
92
  range: box.range,
95
- indentation_level: box.indentation_level,
93
+ indentation_level: box.indentation_level
96
94
  )
97
95
  end
98
96
  end
@@ -106,26 +104,25 @@ module SuperDiff
106
104
  end
107
105
 
108
106
  def all_indentation_levels
109
- lines.
110
- map(&:indentation_level).
111
- select { |indentation_level| indentation_level > 0 }.
112
- uniq
107
+ lines
108
+ .map(&:indentation_level)
109
+ .select { |indentation_level| indentation_level > 0 }
110
+ .uniq
113
111
  end
114
112
 
115
113
  def find_boxes_to_elide_within(pane)
116
114
  set_of_boxes =
117
115
  normalized_box_groups_at_decreasing_indentation_levels_within(pane)
118
116
 
119
- total_size_before_eliding = lines[pane.range].
120
- reject(&:complete_bookend?).
121
- size
117
+ total_size_before_eliding =
118
+ lines[pane.range].reject(&:complete_bookend?).size
122
119
 
123
120
  if total_size_before_eliding > maximum
124
121
  if maximum > 0
125
122
  set_of_boxes.find do |boxes|
126
123
  total_size_after_eliding =
127
124
  total_size_before_eliding -
128
- boxes.sum { |box| box.range.size - SIZE_OF_ELISION }
125
+ boxes.sum { |box| box.range.size - SIZE_OF_ELISION }
129
126
  total_size_after_eliding <= maximum
130
127
  end
131
128
  else
@@ -137,22 +134,21 @@ module SuperDiff
137
134
  end
138
135
 
139
136
  def normalized_box_groups_at_decreasing_indentation_levels_within(pane)
140
- box_groups_at_decreasing_indentation_levels_within(pane).
141
- map(&method(:filter_out_boxes_fully_contained_in_others)).
142
- map(&method(:combine_congruent_boxes))
137
+ box_groups_at_decreasing_indentation_levels_within(pane).map(
138
+ &method(:filter_out_boxes_fully_contained_in_others)
139
+ ).map(&method(:combine_congruent_boxes))
143
140
  end
144
141
 
145
142
  def box_groups_at_decreasing_indentation_levels_within(pane)
146
- boxes_within_pane = boxes.select do |box|
147
- box.fits_fully_within?(pane)
148
- end
143
+ boxes_within_pane = boxes.select { |box| box.fits_fully_within?(pane) }
149
144
 
150
- possible_indentation_levels = boxes_within_pane.
151
- map(&:indentation_level).
152
- select { |indentation_level| indentation_level > 0 }.
153
- uniq.
154
- sort.
155
- reverse
145
+ possible_indentation_levels =
146
+ boxes_within_pane
147
+ .map(&:indentation_level)
148
+ .select { |indentation_level| indentation_level > 0 }
149
+ .uniq
150
+ .sort
151
+ .reverse
156
152
 
157
153
  possible_indentation_levels.map do |indentation_level|
158
154
  boxes_within_pane.select do |box|
@@ -162,9 +158,10 @@ module SuperDiff
162
158
  end
163
159
 
164
160
  def filter_out_boxes_fully_contained_in_others(boxes)
165
- sorted_boxes = boxes.sort_by do |box|
166
- [box.indentation_level, box.range.begin, box.range.end]
167
- end
161
+ sorted_boxes =
162
+ boxes.sort_by do |box|
163
+ [box.indentation_level, box.range.begin, box.range.end]
164
+ end
168
165
 
169
166
  boxes.reject do |box2|
170
167
  sorted_boxes.any? do |box1|
@@ -185,14 +182,14 @@ module SuperDiff
185
182
  criterion = on
186
183
  spannables.reduce([]) do |combined_spannables, spannable|
187
184
  if (
188
- !combined_spannables.empty? &&
189
- spannable.range.begin <= combined_spannables.last.range.end + 1 &&
190
- spannable.public_send(criterion) ==
191
- combined_spannables.last.public_send(criterion)
192
- )
193
- combined_spannables[0..-2] + [
194
- combined_spannables[-1].extended_to(spannable.range.end),
195
- ]
185
+ !combined_spannables.empty? &&
186
+ spannable.range.begin <=
187
+ combined_spannables.last.range.end + 1 &&
188
+ spannable.public_send(criterion) ==
189
+ combined_spannables.last.public_send(criterion)
190
+ )
191
+ combined_spannables[0..-2] +
192
+ [combined_spannables[-1].extended_to(spannable.range.end)]
196
193
  else
197
194
  combined_spannables + [spannable]
198
195
  end
@@ -213,10 +210,8 @@ module SuperDiff
213
210
 
214
211
  with_subset_of_lines_elided(
215
212
  lines,
216
- range: Range.new(
217
- box.range.begin,
218
- box.range.begin + amount_to_elide - 1,
219
- ),
213
+ range:
214
+ Range.new(box.range.begin, box.range.begin + amount_to_elide - 1),
220
215
  indentation_level: box.indentation_level
221
216
  )
222
217
  end
@@ -252,14 +247,16 @@ module SuperDiff
252
247
  end
253
248
 
254
249
  opening_length, closing_length =
255
- half_of_maximum, half_of_maximum + remainder
250
+ half_of_maximum,
251
+ half_of_maximum + remainder
256
252
 
257
253
  with_subset_of_lines_elided(
258
254
  lines,
259
- range: Range.new(
260
- box.range.begin + opening_length,
261
- box.range.end - closing_length,
262
- ),
255
+ range:
256
+ Range.new(
257
+ box.range.begin + opening_length,
258
+ box.range.end - closing_length
259
+ ),
263
260
  indentation_level: box.indentation_level
264
261
  )
265
262
  end
@@ -270,8 +267,8 @@ module SuperDiff
270
267
  range,
271
268
  Elision.new(
272
269
  indentation_level: indentation_level,
273
- children: lines[range].map(&:as_elided),
274
- ),
270
+ children: lines[range].map(&:as_elided)
271
+ )
275
272
  )
276
273
  end
277
274
 
@@ -282,7 +279,7 @@ module SuperDiff
282
279
  class BuildPanes
283
280
  extend AttrExtras.mixin
284
281
 
285
- method_object [:dirty_panes!, :lines!]
282
+ method_object %i[dirty_panes! lines!]
286
283
 
287
284
  def call
288
285
  beginning + middle + ending
@@ -291,19 +288,13 @@ module SuperDiff
291
288
  private
292
289
 
293
290
  def beginning
294
- if (
295
- dirty_panes.empty? ||
296
- dirty_panes.first.range.begin == 0
297
- )
291
+ if (dirty_panes.empty? || dirty_panes.first.range.begin == 0)
298
292
  []
299
293
  else
300
294
  [
301
295
  Pane.new(
302
296
  type: :clean,
303
- range: Range.new(
304
- 0,
305
- dirty_panes.first.range.begin - 1
306
- )
297
+ range: Range.new(0, dirty_panes.first.range.begin - 1)
307
298
  )
308
299
  ]
309
300
  end
@@ -313,43 +304,30 @@ module SuperDiff
313
304
  if dirty_panes.size == 1
314
305
  dirty_panes
315
306
  else
316
- dirty_panes.
317
- each_with_index.
318
- each_cons(2).
319
- reduce([]) do |panes, ((pane1, _), (pane2, index2))|
307
+ dirty_panes
308
+ .each_with_index
309
+ .each_cons(2)
310
+ .reduce([]) do |panes, ((pane1, _), (pane2, index2))|
320
311
  panes +
321
- [
322
- pane1,
323
- Pane.new(
324
- type: :clean,
325
- range: Range.new(
326
- pane1.range.end + 1,
327
- pane2.range.begin - 1,
312
+ [
313
+ pane1,
314
+ Pane.new(
315
+ type: :clean,
316
+ range: Range.new(pane1.range.end + 1, pane2.range.begin - 1)
328
317
  )
329
- )
330
- ] + (
331
- index2 == dirty_panes.size - 1 ?
332
- [pane2] :
333
- []
334
- )
318
+ ] + (index2 == dirty_panes.size - 1 ? [pane2] : [])
335
319
  end
336
320
  end
337
321
  end
338
322
 
339
323
  def ending
340
- if (
341
- dirty_panes.empty? ||
342
- dirty_panes.last.range.end >= lines.size - 1
343
- )
324
+ if (dirty_panes.empty? || dirty_panes.last.range.end >= lines.size - 1)
344
325
  []
345
326
  else
346
327
  [
347
328
  Pane.new(
348
329
  type: :clean,
349
- range: Range.new(
350
- dirty_panes.last.range.end + 1,
351
- lines.size - 1
352
- )
330
+ range: Range.new(dirty_panes.last.range.end + 1, lines.size - 1)
353
331
  )
354
332
  ]
355
333
  end
@@ -359,26 +337,20 @@ module SuperDiff
359
337
  class Pane
360
338
  extend AttrExtras.mixin
361
339
 
362
- rattr_initialize [:type!, :range!]
340
+ rattr_initialize %i[type! range!]
363
341
 
364
342
  def extended_to(new_end)
365
343
  self.class.new(type: type, range: range.begin..new_end)
366
344
  end
367
345
 
368
346
  def padded
369
- self.class.new(
370
- type: type,
371
- range: Range.new(range.begin, range.end)
372
- )
347
+ self.class.new(type: type, range: Range.new(range.begin, range.end))
373
348
  end
374
349
 
375
350
  def capped_to(beginning, ending)
376
351
  new_beginning = range.begin < beginning ? beginning : range.begin
377
352
  new_ending = range.end > ending ? ending : range.end
378
- self.class.new(
379
- type: type,
380
- range: Range.new(new_beginning, new_ending),
381
- )
353
+ self.class.new(type: type, range: Range.new(new_beginning, new_ending))
382
354
  end
383
355
  end
384
356
 
@@ -427,14 +399,14 @@ module SuperDiff
427
399
  def open_new_collection_box(line, index)
428
400
  open_collection_boxes << Box.new(
429
401
  indentation_level: line.indentation_level,
430
- range: index..index,
402
+ range: index..index
431
403
  )
432
404
  end
433
405
 
434
406
  def record_item_box(line, index)
435
407
  final_boxes << Box.new(
436
408
  indentation_level: line.indentation_level,
437
- range: index..index,
409
+ range: index..index
438
410
  )
439
411
  end
440
412
  end
@@ -442,7 +414,7 @@ module SuperDiff
442
414
  class Box
443
415
  extend AttrExtras.mixin
444
416
 
445
- rattr_initialize [:indentation_level!, :range!]
417
+ rattr_initialize %i[indentation_level! range!]
446
418
 
447
419
  def fully_contains?(other)
448
420
  range.begin <= other.range.begin && range.end >= other.range.end
@@ -464,7 +436,7 @@ module SuperDiff
464
436
  class Elision
465
437
  extend AttrExtras.mixin
466
438
 
467
- rattr_initialize [:indentation_level!, :children!]
439
+ rattr_initialize %i[indentation_level! children!]
468
440
 
469
441
  def type
470
442
  :elision
@@ -15,7 +15,7 @@ module SuperDiff
15
15
  formattable_lines.each do |formattable_line|
16
16
  doc.public_send(
17
17
  "#{formattable_line.color}_line",
18
- formattable_line.content,
18
+ formattable_line.content
19
19
  )
20
20
  end
21
21
  end
@@ -34,7 +34,7 @@ module SuperDiff
34
34
  delete: :expected,
35
35
  insert: :actual,
36
36
  elision: :elision_marker,
37
- noop: :plain,
37
+ noop: :plain
38
38
  }.freeze
39
39
 
40
40
  pattr_initialize :line
@@ -47,7 +47,7 @@ module SuperDiff
47
47
  COLORS.fetch(line.type) do
48
48
  raise(
49
49
  KeyError,
50
- "Couldn't find color for line type #{line.type.inspect}!",
50
+ "Couldn't find color for line type #{line.type.inspect}!"
51
51
  )
52
52
  end
53
53
  end
@@ -58,7 +58,7 @@ module SuperDiff
58
58
  ICONS.fetch(line.type) do
59
59
  raise(
60
60
  KeyError,
61
- "Couldn't find icon for line type #{line.type.inspect}!",
61
+ "Couldn't find icon for line type #{line.type.inspect}!"
62
62
  )
63
63
  end
64
64
  end
@@ -68,11 +68,7 @@ module SuperDiff
68
68
  end
69
69
 
70
70
  def possible_comma
71
- if line.add_comma?
72
- ","
73
- else
74
- ""
75
- end
71
+ line.add_comma? ? "," : ""
76
72
  end
77
73
  end
78
74
  end
@@ -1,3 +1,3 @@
1
1
  module SuperDiff
2
- VERSION = "0.9.0".freeze
2
+ VERSION = "0.11.0".freeze
3
3
  end
data/lib/super_diff.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  require "attr_extras/explicit"
2
2
  require "diff-lcs"
3
3
  require "patience_diff"
4
+ require "date"
4
5
 
5
6
  module SuperDiff
6
7
  autoload(
7
8
  :ColorizedDocumentExtensions,
8
- "super_diff/colorized_document_extensions",
9
+ "super_diff/colorized_document_extensions"
9
10
  )
10
11
  autoload :OperationTreeFlatteners, "super_diff/operation_tree_flatteners"
11
12
  autoload :Configuration, "super_diff/configuration"
@@ -39,9 +40,8 @@ module SuperDiff
39
40
 
40
41
  def self.inspect_object(object, as_lines:, **rest)
41
42
  SuperDiff::RecursionGuard.guarding_recursion_of(object) do
42
- inspection_tree = ObjectInspection::InspectionTreeBuilders::Main.call(
43
- object
44
- )
43
+ inspection_tree =
44
+ ObjectInspection::InspectionTreeBuilders::Main.call(object)
45
45
 
46
46
  if as_lines
47
47
  inspection_tree.render_to_lines(object, **rest)
@@ -58,6 +58,14 @@ module SuperDiff
58
58
  value.is_a?(Time)
59
59
  end
60
60
 
61
+ def self.date_like?(value)
62
+ # Check for ActiveSupport's #acts_like_date? for their date-like objects
63
+ # In case class is both time-like and date-like, we should treat it as
64
+ # time-like. This is governed by the order of `Differs::DEFAULTS` entries
65
+ (value.respond_to?(:acts_like_date?) && value.acts_like_date?) ||
66
+ value.is_a?(Date)
67
+ end
68
+
61
69
  def self.primitive?(value)
62
70
  case value
63
71
  when true, false, nil, Symbol, Numeric, Regexp, Class
@@ -68,11 +76,7 @@ module SuperDiff
68
76
  end
69
77
 
70
78
  def self.insert_overrides(target_module, mod = nil, &block)
71
- if mod
72
- target_module.prepend(mod)
73
- else
74
- target_module.prepend(Module.new(&block))
75
- end
79
+ mod ? target_module.prepend(mod) : target_module.prepend(Module.new(&block))
76
80
  end
77
81
 
78
82
  def self.insert_singleton_overrides(target_module, mod = nil, &block)