super_diff 0.12.1 → 0.15.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 (272) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -19
  3. data/lib/super_diff/active_record/differs/active_record_relation.rb +2 -0
  4. data/lib/super_diff/active_record/differs.rb +3 -1
  5. data/lib/super_diff/active_record/inspection_tree_builders/active_record_model.rb +7 -5
  6. data/lib/super_diff/active_record/inspection_tree_builders/active_record_relation.rb +12 -10
  7. data/lib/super_diff/active_record/inspection_tree_builders.rb +4 -2
  8. data/lib/super_diff/active_record/monkey_patches.rb +4 -2
  9. data/lib/super_diff/active_record/object_inspection.rb +6 -4
  10. data/lib/super_diff/active_record/operation_tree_builders/active_record_model.rb +3 -1
  11. data/lib/super_diff/active_record/operation_tree_builders/active_record_relation.rb +3 -1
  12. data/lib/super_diff/active_record/operation_tree_builders.rb +4 -2
  13. data/lib/super_diff/active_record/operation_tree_flatteners/active_record_relation.rb +4 -2
  14. data/lib/super_diff/active_record/operation_tree_flatteners.rb +3 -1
  15. data/lib/super_diff/active_record/operation_trees/active_record_relation.rb +2 -0
  16. data/lib/super_diff/active_record/operation_trees.rb +3 -1
  17. data/lib/super_diff/active_record.rb +10 -8
  18. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +2 -0
  19. data/lib/super_diff/active_support/differs.rb +3 -1
  20. data/lib/super_diff/active_support/inspection_tree_builders/hash_with_indifferent_access.rb +16 -14
  21. data/lib/super_diff/active_support/inspection_tree_builders/ordered_options.rb +16 -14
  22. data/lib/super_diff/active_support/inspection_tree_builders.rb +4 -2
  23. data/lib/super_diff/active_support/object_inspection.rb +6 -4
  24. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +6 -4
  25. data/lib/super_diff/active_support/operation_tree_builders.rb +3 -1
  26. data/lib/super_diff/active_support/operation_tree_flatteners/hash_with_indifferent_access.rb +4 -2
  27. data/lib/super_diff/active_support/operation_tree_flatteners.rb +3 -1
  28. data/lib/super_diff/active_support/operation_trees/hash_with_indifferent_access.rb +2 -0
  29. data/lib/super_diff/active_support/operation_trees.rb +3 -1
  30. data/lib/super_diff/active_support.rb +8 -6
  31. data/lib/super_diff/basic/diff_formatters/collection.rb +18 -18
  32. data/lib/super_diff/basic/diff_formatters/multiline_string.rb +2 -0
  33. data/lib/super_diff/basic/diff_formatters.rb +4 -2
  34. data/lib/super_diff/basic/differs/array.rb +2 -0
  35. data/lib/super_diff/basic/differs/custom_object.rb +3 -1
  36. data/lib/super_diff/basic/differs/date_like.rb +2 -0
  37. data/lib/super_diff/basic/differs/default_object.rb +3 -1
  38. data/lib/super_diff/basic/differs/hash.rb +2 -0
  39. data/lib/super_diff/basic/differs/multiline_string.rb +2 -0
  40. data/lib/super_diff/basic/differs/time_like.rb +2 -0
  41. data/lib/super_diff/basic/differs.rb +11 -9
  42. data/lib/super_diff/basic/inspection_tree_builders/array.rb +5 -3
  43. data/lib/super_diff/basic/inspection_tree_builders/custom_object.rb +5 -3
  44. data/lib/super_diff/basic/inspection_tree_builders/data_object.rb +42 -0
  45. data/lib/super_diff/basic/inspection_tree_builders/date_like.rb +7 -5
  46. data/lib/super_diff/basic/inspection_tree_builders/default_object.rb +7 -5
  47. data/lib/super_diff/basic/inspection_tree_builders/hash.rb +7 -5
  48. data/lib/super_diff/basic/inspection_tree_builders/primitive.rb +3 -1
  49. data/lib/super_diff/basic/inspection_tree_builders/range_object.rb +19 -0
  50. data/lib/super_diff/basic/inspection_tree_builders/time_like.rb +8 -8
  51. data/lib/super_diff/basic/inspection_tree_builders.rb +18 -8
  52. data/lib/super_diff/basic/operation_tree_builders/array.rb +6 -4
  53. data/lib/super_diff/basic/operation_tree_builders/custom_object.rb +3 -1
  54. data/lib/super_diff/basic/operation_tree_builders/data_object.rb +20 -0
  55. data/lib/super_diff/basic/operation_tree_builders/date_like.rb +2 -0
  56. data/lib/super_diff/basic/operation_tree_builders/default_object.rb +32 -31
  57. data/lib/super_diff/basic/operation_tree_builders/hash.rb +49 -46
  58. data/lib/super_diff/basic/operation_tree_builders/multiline_string.rb +5 -3
  59. data/lib/super_diff/basic/operation_tree_builders/time_like.rb +5 -3
  60. data/lib/super_diff/basic/operation_tree_builders.rb +15 -9
  61. data/lib/super_diff/basic/operation_tree_flatteners/array.rb +4 -2
  62. data/lib/super_diff/basic/operation_tree_flatteners/collection.rb +11 -11
  63. data/lib/super_diff/basic/operation_tree_flatteners/custom_object.rb +5 -3
  64. data/lib/super_diff/basic/operation_tree_flatteners/default_object.rb +6 -5
  65. data/lib/super_diff/basic/operation_tree_flatteners/hash.rb +5 -3
  66. data/lib/super_diff/basic/operation_tree_flatteners/multiline_string.rb +3 -1
  67. data/lib/super_diff/basic/operation_tree_flatteners.rb +8 -6
  68. data/lib/super_diff/basic/operation_trees/array.rb +2 -0
  69. data/lib/super_diff/basic/operation_trees/custom_object.rb +2 -0
  70. data/lib/super_diff/basic/operation_trees/default_object.rb +6 -4
  71. data/lib/super_diff/basic/operation_trees/hash.rb +2 -0
  72. data/lib/super_diff/basic/operation_trees/multiline_string.rb +3 -1
  73. data/lib/super_diff/basic/operation_trees.rb +9 -7
  74. data/lib/super_diff/basic.rb +12 -7
  75. data/lib/super_diff/core/abstract_differ.rb +2 -0
  76. data/lib/super_diff/core/abstract_inspection_tree_builder.rb +2 -0
  77. data/lib/super_diff/core/abstract_operation_tree.rb +4 -2
  78. data/lib/super_diff/core/abstract_operation_tree_builder.rb +15 -18
  79. data/lib/super_diff/core/abstract_operation_tree_flattener.rb +5 -3
  80. data/lib/super_diff/core/binary_operation.rb +3 -1
  81. data/lib/super_diff/core/colorized_document_extensions.rb +2 -0
  82. data/lib/super_diff/core/configuration.rb +23 -43
  83. data/lib/super_diff/core/differ_dispatcher.rb +4 -2
  84. data/lib/super_diff/core/gem_version.rb +2 -0
  85. data/lib/super_diff/core/helpers.rb +14 -12
  86. data/lib/super_diff/core/implementation_checks.rb +6 -2
  87. data/lib/super_diff/core/inspection_tree.rb +38 -38
  88. data/lib/super_diff/core/inspection_tree_builder_dispatcher.rb +5 -5
  89. data/lib/super_diff/core/inspection_tree_nodes/as_lines_when_rendering_to_lines.rb +3 -1
  90. data/lib/super_diff/core/inspection_tree_nodes/as_prefix_when_rendering_to_lines.rb +2 -0
  91. data/lib/super_diff/core/inspection_tree_nodes/as_prelude_when_rendering_to_lines.rb +2 -0
  92. data/lib/super_diff/core/inspection_tree_nodes/as_single_line.rb +2 -0
  93. data/lib/super_diff/core/inspection_tree_nodes/base.rb +9 -9
  94. data/lib/super_diff/core/inspection_tree_nodes/inspection.rb +2 -0
  95. data/lib/super_diff/core/inspection_tree_nodes/nesting.rb +2 -0
  96. data/lib/super_diff/core/inspection_tree_nodes/only_when.rb +5 -1
  97. data/lib/super_diff/core/inspection_tree_nodes/text.rb +2 -0
  98. data/lib/super_diff/core/inspection_tree_nodes/when_empty.rb +3 -1
  99. data/lib/super_diff/core/inspection_tree_nodes/when_non_empty.rb +3 -1
  100. data/lib/super_diff/core/inspection_tree_nodes/when_rendering_to_lines.rb +3 -1
  101. data/lib/super_diff/core/inspection_tree_nodes/when_rendering_to_string.rb +2 -0
  102. data/lib/super_diff/core/inspection_tree_nodes.rb +16 -14
  103. data/lib/super_diff/core/line.rb +9 -7
  104. data/lib/super_diff/core/no_differ_available_error.rb +7 -5
  105. data/lib/super_diff/core/no_inspection_tree_builder_available_error.rb +5 -3
  106. data/lib/super_diff/core/no_operation_tree_available_error.rb +4 -2
  107. data/lib/super_diff/core/no_operation_tree_builder_available_error.rb +7 -5
  108. data/lib/super_diff/core/operation_tree_builder_dispatcher.rb +3 -3
  109. data/lib/super_diff/core/operation_tree_finder.rb +8 -8
  110. data/lib/super_diff/core/prefix_for_next_inspection_tree_node.rb +2 -0
  111. data/lib/super_diff/core/prelude_for_next_inspection_tree_node.rb +2 -0
  112. data/lib/super_diff/core/recursion_guard.rb +6 -4
  113. data/lib/super_diff/core/tiered_lines.rb +2 -0
  114. data/lib/super_diff/core/tiered_lines_elider.rb +53 -54
  115. data/lib/super_diff/core/tiered_lines_formatter.rb +6 -4
  116. data/lib/super_diff/core/unary_operation.rb +2 -0
  117. data/lib/super_diff/core.rb +31 -29
  118. data/lib/super_diff/csi/bold_sequence.rb +2 -0
  119. data/lib/super_diff/csi/color.rb +4 -4
  120. data/lib/super_diff/csi/color_sequence_block.rb +3 -1
  121. data/lib/super_diff/csi/colorized_document.rb +7 -9
  122. data/lib/super_diff/csi/document.rb +15 -18
  123. data/lib/super_diff/csi/eight_bit_color.rb +32 -37
  124. data/lib/super_diff/csi/four_bit_color.rb +12 -9
  125. data/lib/super_diff/csi/reset_sequence.rb +2 -0
  126. data/lib/super_diff/csi/twenty_four_bit_color.rb +22 -21
  127. data/lib/super_diff/csi/uncolorized_document.rb +2 -0
  128. data/lib/super_diff/csi.rb +12 -42
  129. data/lib/super_diff/differs.rb +6 -4
  130. data/lib/super_diff/equality_matchers/array.rb +18 -16
  131. data/lib/super_diff/equality_matchers/base.rb +6 -4
  132. data/lib/super_diff/equality_matchers/default.rb +5 -3
  133. data/lib/super_diff/equality_matchers/defaults.rb +3 -1
  134. data/lib/super_diff/equality_matchers/hash.rb +18 -16
  135. data/lib/super_diff/equality_matchers/main.rb +3 -1
  136. data/lib/super_diff/equality_matchers/multiline_string.rb +18 -16
  137. data/lib/super_diff/equality_matchers/primitive.rb +15 -13
  138. data/lib/super_diff/equality_matchers/singleline_string.rb +16 -14
  139. data/lib/super_diff/equality_matchers.rb +11 -9
  140. data/lib/super_diff/errors.rb +4 -2
  141. data/lib/super_diff/object_inspection.rb +17 -15
  142. data/lib/super_diff/operation_tree_builders.rb +6 -4
  143. data/lib/super_diff/operation_tree_flatteners.rb +6 -4
  144. data/lib/super_diff/operation_trees.rb +6 -4
  145. data/lib/super_diff/operations.rb +4 -2
  146. data/lib/super_diff/rails.rb +4 -2
  147. data/lib/super_diff/rspec/augmented_matcher.rb +3 -1
  148. data/lib/super_diff/rspec/differ.rb +16 -7
  149. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +2 -0
  150. data/lib/super_diff/rspec/differs/collection_including.rb +2 -0
  151. data/lib/super_diff/rspec/differs/hash_including.rb +2 -0
  152. data/lib/super_diff/rspec/differs/object_having_attributes.rb +2 -0
  153. data/lib/super_diff/rspec/differs.rb +6 -4
  154. data/lib/super_diff/rspec/inspection_tree_builders/collection_containing_exactly.rb +12 -10
  155. data/lib/super_diff/rspec/inspection_tree_builders/collection_including.rb +10 -8
  156. data/lib/super_diff/rspec/inspection_tree_builders/double.rb +20 -18
  157. data/lib/super_diff/rspec/inspection_tree_builders/generic_describable_matcher.rb +2 -0
  158. data/lib/super_diff/rspec/inspection_tree_builders/hash_including.rb +10 -8
  159. data/lib/super_diff/rspec/inspection_tree_builders/instance_of.rb +2 -0
  160. data/lib/super_diff/rspec/inspection_tree_builders/kind_of.rb +2 -0
  161. data/lib/super_diff/rspec/inspection_tree_builders/object_having_attributes.rb +12 -10
  162. data/lib/super_diff/rspec/inspection_tree_builders/primitive.rb +2 -0
  163. data/lib/super_diff/rspec/inspection_tree_builders/value_within.rb +6 -4
  164. data/lib/super_diff/rspec/inspection_tree_builders.rb +12 -10
  165. data/lib/super_diff/rspec/matcher_text_builders/base.rb +12 -12
  166. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +19 -17
  167. data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +3 -1
  168. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +7 -5
  169. data/lib/super_diff/rspec/matcher_text_builders/match.rb +6 -4
  170. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +5 -3
  171. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +20 -18
  172. data/lib/super_diff/rspec/matcher_text_builders.rb +9 -7
  173. data/lib/super_diff/rspec/matcher_text_template.rb +34 -39
  174. data/lib/super_diff/rspec/monkey_patches.rb +129 -56
  175. data/lib/super_diff/rspec/object_inspection.rb +7 -5
  176. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +4 -4
  177. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +2 -0
  178. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +2 -0
  179. data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +2 -0
  180. data/lib/super_diff/rspec/operation_tree_builders.rb +6 -4
  181. data/lib/super_diff/rspec-rails.rb +4 -2
  182. data/lib/super_diff/rspec.rb +27 -14
  183. data/lib/super_diff/version.rb +3 -1
  184. data/lib/super_diff.rb +24 -27
  185. data/super_diff.gemspec +20 -18
  186. metadata +15 -182
  187. data/spec/examples.txt +0 -704
  188. data/spec/integration/rails/active_record_spec.rb +0 -21
  189. data/spec/integration/rails/active_support_spec.rb +0 -19
  190. data/spec/integration/rails/engines_spec.rb +0 -25
  191. data/spec/integration/rails/hash_with_indifferent_access_spec.rb +0 -21
  192. data/spec/integration/rspec/be_falsey_matcher_spec.rb +0 -58
  193. data/spec/integration/rspec/be_matcher_spec.rb +0 -605
  194. data/spec/integration/rspec/be_nil_matcher_spec.rb +0 -57
  195. data/spec/integration/rspec/be_predicate_matcher_spec.rb +0 -615
  196. data/spec/integration/rspec/be_truthy_matcher_spec.rb +0 -62
  197. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +0 -377
  198. data/spec/integration/rspec/eq_matcher_spec.rb +0 -1066
  199. data/spec/integration/rspec/generic_describable_matchers_spec.rb +0 -177
  200. data/spec/integration/rspec/have_attributes_matcher_spec.rb +0 -443
  201. data/spec/integration/rspec/have_predicate_matcher_spec.rb +0 -478
  202. data/spec/integration/rspec/include_matcher_spec.rb +0 -452
  203. data/spec/integration/rspec/magic_metadata_spec.rb +0 -51
  204. data/spec/integration/rspec/match_array_matcher_spec.rb +0 -424
  205. data/spec/integration/rspec/match_matcher_spec.rb +0 -1359
  206. data/spec/integration/rspec/raise_error_matcher_spec.rb +0 -1488
  207. data/spec/integration/rspec/respond_to_matcher_spec.rb +0 -999
  208. data/spec/integration/rspec/third_party_matcher_spec.rb +0 -245
  209. data/spec/integration/rspec/unhandled_errors_spec.rb +0 -150
  210. data/spec/internal/log/test.log +0 -0
  211. data/spec/spec_helper.rb +0 -90
  212. data/spec/support/colorizer.rb +0 -9
  213. data/spec/support/command_runner.rb +0 -253
  214. data/spec/support/helpers.rb +0 -21
  215. data/spec/support/integration/helpers.rb +0 -124
  216. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +0 -104
  217. data/spec/support/integration/matchers.rb +0 -177
  218. data/spec/support/integration/test_programs/base.rb +0 -143
  219. data/spec/support/integration/test_programs/plain.rb +0 -19
  220. data/spec/support/integration/test_programs/rspec_active_record.rb +0 -20
  221. data/spec/support/integration/test_programs/rspec_active_support.rb +0 -20
  222. data/spec/support/integration/test_programs/rspec_rails.rb +0 -20
  223. data/spec/support/integration/test_programs/rspec_rails_engine.rb +0 -20
  224. data/spec/support/models/a.rb +0 -11
  225. data/spec/support/models/active_record/person.rb +0 -28
  226. data/spec/support/models/active_record/query.rb +0 -15
  227. data/spec/support/models/active_record/shipping_address.rb +0 -24
  228. data/spec/support/models/customer.rb +0 -22
  229. data/spec/support/models/empty_class.rb +0 -6
  230. data/spec/support/models/item.rb +0 -10
  231. data/spec/support/models/order.rb +0 -9
  232. data/spec/support/models/person.rb +0 -20
  233. data/spec/support/models/player.rb +0 -30
  234. data/spec/support/models/shipping_address.rb +0 -25
  235. data/spec/support/shared_examples/active_record.rb +0 -428
  236. data/spec/support/shared_examples/active_support.rb +0 -188
  237. data/spec/support/shared_examples/elided_diffs.rb +0 -938
  238. data/spec/support/shared_examples/hash_with_indifferent_access.rb +0 -749
  239. data/spec/support/shared_examples/key.rb +0 -123
  240. data/spec/support/unit/helpers.rb +0 -24
  241. data/spec/support/unit/matchers/be_deprecated_in_favor_of.rb +0 -39
  242. data/spec/support/unit/matchers/match_output.rb +0 -40
  243. data/spec/unit/active_record/object_inspection_spec.rb +0 -289
  244. data/spec/unit/active_support/object_inspection_spec.rb +0 -170
  245. data/spec/unit/basic/operation_tree_flatteners/array_spec.rb +0 -637
  246. data/spec/unit/basic/operation_tree_flatteners/custom_object_spec.rb +0 -685
  247. data/spec/unit/basic/operation_tree_flatteners/default_object_spec.rb +0 -685
  248. data/spec/unit/basic/operation_tree_flatteners/hash_spec.rb +0 -671
  249. data/spec/unit/basic/operation_tree_flatteners/multiline_string_spec.rb +0 -131
  250. data/spec/unit/core/helpers_spec.rb +0 -68
  251. data/spec/unit/core/tiered_lines_elider_spec.rb +0 -6328
  252. data/spec/unit/core/tiered_lines_formatter_spec.rb +0 -131
  253. data/spec/unit/deprecations_spec.rb +0 -176
  254. data/spec/unit/equality_matchers/main_spec.rb +0 -1842
  255. data/spec/unit/rspec/matchers/be_compared_to_spec.rb +0 -23
  256. data/spec/unit/rspec/matchers/be_falsey_spec.rb +0 -9
  257. data/spec/unit/rspec/matchers/be_nil_spec.rb +0 -9
  258. data/spec/unit/rspec/matchers/be_predicate_spec.rb +0 -31
  259. data/spec/unit/rspec/matchers/be_spec.rb +0 -17
  260. data/spec/unit/rspec/matchers/be_truthy_spec.rb +0 -9
  261. data/spec/unit/rspec/matchers/contain_exactly_spec.rb +0 -11
  262. data/spec/unit/rspec/matchers/eq_spec.rb +0 -9
  263. data/spec/unit/rspec/matchers/have_attributes_spec.rb +0 -11
  264. data/spec/unit/rspec/matchers/have_predicate_spec.rb +0 -21
  265. data/spec/unit/rspec/matchers/include_spec.rb +0 -21
  266. data/spec/unit/rspec/matchers/match_array_spec.rb +0 -11
  267. data/spec/unit/rspec/matchers/match_spec.rb +0 -9
  268. data/spec/unit/rspec/matchers/raise_error_spec.rb +0 -77
  269. data/spec/unit/rspec/matchers/respond_to_spec.rb +0 -85
  270. data/spec/unit/rspec/object_inspection/rspec_matcher_spec.rb +0 -91
  271. data/spec/unit/rspec/object_inspection_spec.rb +0 -471
  272. data/spec/unit/super_diff_spec.rb +0 -2115
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeBuilders
@@ -7,7 +9,7 @@ module SuperDiff
7
9
  end
8
10
 
9
11
  def initialize(*args)
10
- super(*args)
12
+ super
11
13
 
12
14
  establish_expected_and_actual_attributes
13
15
  end
@@ -15,11 +17,10 @@ module SuperDiff
15
17
  protected
16
18
 
17
19
  def unary_operations
18
- attribute_names.reduce([]) do |operations, name|
20
+ attribute_names.each_with_object([]) do |name, operations|
19
21
  possibly_add_noop_operation_to(operations, name)
20
22
  possibly_add_delete_operation_to(operations, name)
21
23
  possibly_add_insert_operation_to(operations, name)
22
- operations
23
24
  end
24
25
  end
25
26
 
@@ -32,7 +33,7 @@ module SuperDiff
32
33
  def attribute_names
33
34
  (
34
35
  expected.instance_variables.sort & actual.instance_variables.sort
35
- ).map { |variable_name| variable_name[1..-1] }
36
+ ).map { |variable_name| variable_name[1..] }
36
37
  end
37
38
 
38
39
  private
@@ -52,15 +53,15 @@ module SuperDiff
52
53
  end
53
54
 
54
55
  def possibly_add_noop_operation_to(operations, attribute_name)
55
- if should_add_noop_operation?(attribute_name)
56
- operations << Core::UnaryOperation.new(
57
- name: :noop,
58
- collection: actual_attributes,
59
- key: attribute_name,
60
- index: attribute_names.index(attribute_name),
61
- value: actual_attributes[attribute_name]
62
- )
63
- end
56
+ return unless should_add_noop_operation?(attribute_name)
57
+
58
+ operations << Core::UnaryOperation.new(
59
+ name: :noop,
60
+ collection: actual_attributes,
61
+ key: attribute_name,
62
+ index: attribute_names.index(attribute_name),
63
+ value: actual_attributes[attribute_name]
64
+ )
64
65
  end
65
66
 
66
67
  def should_add_noop_operation?(attribute_name)
@@ -71,15 +72,15 @@ module SuperDiff
71
72
  end
72
73
 
73
74
  def possibly_add_delete_operation_to(operations, attribute_name)
74
- if should_add_delete_operation?(attribute_name)
75
- operations << Core::UnaryOperation.new(
76
- name: :delete,
77
- collection: expected_attributes,
78
- key: attribute_name,
79
- index: attribute_names.index(attribute_name),
80
- value: expected_attributes[attribute_name]
81
- )
82
- end
75
+ return unless should_add_delete_operation?(attribute_name)
76
+
77
+ operations << Core::UnaryOperation.new(
78
+ name: :delete,
79
+ collection: expected_attributes,
80
+ key: attribute_name,
81
+ index: attribute_names.index(attribute_name),
82
+ value: expected_attributes[attribute_name]
83
+ )
83
84
  end
84
85
 
85
86
  def should_add_delete_operation?(attribute_name)
@@ -92,15 +93,15 @@ module SuperDiff
92
93
  end
93
94
 
94
95
  def possibly_add_insert_operation_to(operations, attribute_name)
95
- if should_add_insert_operation?(attribute_name)
96
- operations << Core::UnaryOperation.new(
97
- name: :insert,
98
- collection: actual_attributes,
99
- key: attribute_name,
100
- index: attribute_names.index(attribute_name),
101
- value: actual_attributes[attribute_name]
102
- )
103
- end
96
+ return unless should_add_insert_operation?(attribute_name)
97
+
98
+ operations << Core::UnaryOperation.new(
99
+ name: :insert,
100
+ collection: actual_attributes,
101
+ key: attribute_name,
102
+ index: attribute_names.index(attribute_name),
103
+ value: actual_attributes[attribute_name]
104
+ )
104
105
  end
105
106
 
106
107
  def should_add_insert_operation?(attribute_name)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeBuilders
@@ -20,8 +22,10 @@ module SuperDiff
20
22
 
21
23
  def unary_operations_using_variant_of_patience_algorithm
22
24
  operations = []
23
- aks, eks = actual.keys, expected.keys
24
- previous_ei, ei = nil, 0
25
+ aks = actual.keys
26
+ eks = expected.keys
27
+ previous_ei = nil
28
+ ei = 0
25
29
  ai = 0
26
30
 
27
31
  # When diffing a hash, we're more interested in the 'actual' version
@@ -30,7 +34,8 @@ module SuperDiff
30
34
  # hash, and we start off by looping over it.
31
35
  while ai < aks.size
32
36
  ak = aks[ai]
33
- av, ev = actual[ak], expected[ak]
37
+ av = actual[ak]
38
+ ev = expected[ak]
34
39
  # While we iterate over 'actual' in order, we jump all over
35
40
  # 'expected', trying to match up its keys with the keys in 'actual' as
36
41
  # much as possible.
@@ -51,23 +56,23 @@ module SuperDiff
51
56
  # the keys in 'expected'.)
52
57
  (previous_ei + 1).upto(ei - 1) do |ei2|
53
58
  ek = eks[ei2]
54
- ev2, av2 = expected[ek], actual[ek]
59
+ ev2 = expected[ek]
60
+ av2 = actual[ek]
55
61
 
56
- if (
62
+ next unless
57
63
  (!actual.include?(ek) || ev2 != av2) &&
58
- operations.none? do |operation|
59
- %i[delete noop].include?(operation.name) &&
60
- operation.key == ek
61
- end
62
- )
63
- operations << Core::UnaryOperation.new(
64
- name: :delete,
65
- collection: expected,
66
- key: ek,
67
- value: ev2,
68
- index: ei2
69
- )
70
- end
64
+ operations.none? do |operation|
65
+ %i[delete noop].include?(operation.name) &&
66
+ operation.key == ek
67
+ end
68
+
69
+ operations << Core::UnaryOperation.new(
70
+ name: :delete,
71
+ collection: expected,
72
+ key: ek,
73
+ value: ev2,
74
+ index: ei2
75
+ )
71
76
  end
72
77
  end
73
78
 
@@ -82,10 +87,9 @@ module SuperDiff
82
87
  # (If we're here, it probably means that the key in 'actual' isn't
83
88
  # present in 'expected' or the values don't match.)
84
89
 
85
- if (
86
- (operations.empty? || operations.last.name == :noop) &&
87
- (ai == 0 || eks.include?(aks[ai - 1]))
88
- )
90
+ if (operations.empty? || operations.last.name == :noop) &&
91
+ (ai.zero? || eks.include?(aks[ai - 1]))
92
+
89
93
  # If we go from a match in the last iteration to a missing or
90
94
  # extra key in this one, or we're at the first key in 'actual' and
91
95
  # it's missing or extra, look for deletes in the 'expected' hash
@@ -98,7 +102,7 @@ module SuperDiff
98
102
  # or we hit some other condition (see below).
99
103
 
100
104
  start_index =
101
- if ai > 0
105
+ if ai.positive?
102
106
  eks.index(aks[ai - 1]) + 1
103
107
  else
104
108
  0
@@ -106,18 +110,18 @@ module SuperDiff
106
110
 
107
111
  start_index.upto(eks.size - 1) do |ei2|
108
112
  ek = eks[ei2]
109
- ev, av2 = expected[ek], actual[ek]
113
+ ev = expected[ek]
114
+ av2 = actual[ek]
110
115
 
111
116
  if actual.include?(ek) && ev == av2
112
117
  # If the key in 'expected' we've landed on happens to be a
113
118
  # match in 'actual', then stop, because it's going to be
114
119
  # handled in some future iteration of the 'actual' loop.
115
120
  break
116
- elsif (
117
- aks[ai + 1..-1].any? do |k|
121
+ elsif aks[ai + 1..].any? do |k| # rubocop:disable Lint/DuplicateBranch for clarity
118
122
  expected.include?(k) && expected[k] != actual[k]
119
123
  end
120
- )
124
+
121
125
  # While we backtracked a bit to iterate over 'expected', we
122
126
  # now have to look ahead. If we will end up encountering a
123
127
  # insert that matches this delete later, stop and go back to
@@ -135,28 +139,27 @@ module SuperDiff
135
139
  )
136
140
  end
137
141
 
138
- if ek == ak && ev != av
139
- # If we're pointing to the same key in 'expected' as in
140
- # 'actual', but with different values, go ahead and add an
141
- # insert now to accompany the delete added above. That way
142
- # they appear together, which will be easier to read.
143
- operations << Core::UnaryOperation.new(
144
- name: :insert,
145
- collection: actual,
146
- key: ak,
147
- value: av,
148
- index: ai
149
- )
150
- end
142
+ next unless ek == ak && ev != av
143
+
144
+ # If we're pointing to the same key in 'expected' as in
145
+ # 'actual', but with different values, go ahead and add an
146
+ # insert now to accompany the delete added above. That way
147
+ # they appear together, which will be easier to read.
148
+ operations << Core::UnaryOperation.new(
149
+ name: :insert,
150
+ collection: actual,
151
+ key: ak,
152
+ value: av,
153
+ index: ai
154
+ )
151
155
  end
152
156
  end
153
157
 
154
- if (
155
- expected.include?(ak) && ev != av &&
156
- operations.none? do |op|
157
- op.name == :delete && op.key == ak
158
- end
159
- )
158
+ if expected.include?(ak) && ev != av &&
159
+ operations.none? do |op|
160
+ op.name == :delete && op.key == ak
161
+ end
162
+
160
163
  # If we're here, it means that we didn't encounter any delete
161
164
  # operations above for whatever reason and so we need to add a
162
165
  # delete to represent the fact that the value for this key has
@@ -1,4 +1,6 @@
1
- require "patience_diff"
1
+ # frozen_string_literal: true
2
+
3
+ require 'patience_diff'
2
4
 
3
5
  module SuperDiff
4
6
  module Basic
@@ -10,7 +12,7 @@ module SuperDiff
10
12
  end
11
13
 
12
14
  def initialize(*args)
13
- super(*args)
15
+ super
14
16
 
15
17
  @original_expected = @expected
16
18
  @original_actual = @actual
@@ -42,7 +44,7 @@ module SuperDiff
42
44
  attr_reader :sequence_matcher, :original_expected, :original_actual
43
45
 
44
46
  def split_into_lines(string)
45
- string.scan(/.+(?:\r|\n|\r\n|\Z)/)
47
+ string.scan(/.*(?:\r|\n|\r\n|\Z)/)
46
48
  end
47
49
 
48
50
  def opcodes
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeBuilders
@@ -14,10 +16,10 @@ module SuperDiff
14
16
  # If timezones are different, also show a normalized timestamp at the
15
17
  # end of the diff to help visualize why they are different moments in
16
18
  # time.
17
- if actual.zone != expected.zone
18
- base + ["utc"]
19
- else
19
+ if actual.zone == expected.zone
20
20
  base
21
+ else
22
+ base + ['utc']
21
23
  end
22
24
  end
23
25
  end
@@ -1,31 +1,37 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeBuilders
4
- autoload :Array, "super_diff/basic/operation_tree_builders/array"
6
+ autoload :Array, 'super_diff/basic/operation_tree_builders/array'
5
7
  autoload(
6
8
  :CustomObject,
7
- "super_diff/basic/operation_tree_builders/custom_object"
9
+ 'super_diff/basic/operation_tree_builders/custom_object'
10
+ )
11
+ autoload(
12
+ :DataObject,
13
+ 'super_diff/basic/operation_tree_builders/data_object'
8
14
  )
9
15
  autoload(
10
16
  :DefaultObject,
11
- "super_diff/basic/operation_tree_builders/default_object"
17
+ 'super_diff/basic/operation_tree_builders/default_object'
12
18
  )
13
- autoload :Hash, "super_diff/basic/operation_tree_builders/hash"
19
+ autoload :Hash, 'super_diff/basic/operation_tree_builders/hash'
14
20
  # TODO: Where is this used?
15
21
  autoload(
16
22
  :MultilineString,
17
- "super_diff/basic/operation_tree_builders/multiline_string"
23
+ 'super_diff/basic/operation_tree_builders/multiline_string'
18
24
  )
19
- autoload :TimeLike, "super_diff/basic/operation_tree_builders/time_like"
20
- autoload :DateLike, "super_diff/basic/operation_tree_builders/date_like"
25
+ autoload :TimeLike, 'super_diff/basic/operation_tree_builders/time_like'
26
+ autoload :DateLike, 'super_diff/basic/operation_tree_builders/date_like'
21
27
 
22
28
  class Main
23
29
  def self.call(*args)
24
- warn <<~EOT
30
+ warn <<~WARNING
25
31
  WARNING: SuperDiff::OperationTreeBuilders::Main.call(...) is deprecated and will be removed in the next major release.
26
32
  Please use SuperDiff.build_operation_tree_for(...) instead.
27
33
  #{caller_locations.join("\n")}
28
- EOT
34
+ WARNING
29
35
  SuperDiff.build_operation_tree_for(*args)
30
36
  end
31
37
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeFlatteners
@@ -5,11 +7,11 @@ module SuperDiff
5
7
  protected
6
8
 
7
9
  def open_token
8
- "["
10
+ '['
9
11
  end
10
12
 
11
13
  def close_token
12
- "]"
14
+ ']'
13
15
  end
14
16
  end
15
17
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeFlatteners
@@ -23,7 +25,7 @@ module SuperDiff
23
25
  end
24
26
 
25
27
  def inner_lines
26
- @_inner_lines ||=
28
+ @inner_lines ||=
27
29
  operation_tree.flat_map do |operation|
28
30
  lines =
29
31
  if operation.name == :change
@@ -52,7 +54,7 @@ module SuperDiff
52
54
  end
53
55
 
54
56
  def add_prefix_at_beginning_of_lines(lines, operation)
55
- [lines[0].prefixed_with(item_prefix_for(operation))] + lines[1..-1]
57
+ [lines[0].prefixed_with(item_prefix_for(operation))] + lines[1..]
56
58
  end
57
59
 
58
60
  def maybe_add_comma_at_end_of_lines(lines, operation)
@@ -81,13 +83,11 @@ module SuperDiff
81
83
  operation.left_collection,
82
84
  operation.right_collection
83
85
  ) do |already_seen|
84
- if already_seen
85
- raise InfiniteRecursionError
86
- else
87
- operation.children.flatten(
88
- indentation_level: indentation_level + 1
89
- )
90
- end
86
+ raise InfiniteRecursionError if already_seen
87
+
88
+ operation.children.flatten(
89
+ indentation_level: indentation_level + 1
90
+ )
91
91
  end
92
92
  end
93
93
 
@@ -117,7 +117,7 @@ module SuperDiff
117
117
  end
118
118
 
119
119
  def item_prefix_for(_operation)
120
- ""
120
+ ''
121
121
  end
122
122
 
123
123
  def build_lines_from_inspection_of(value, type:, indentation_level:)
@@ -131,7 +131,7 @@ module SuperDiff
131
131
 
132
132
  class InfiniteRecursionError < StandardError
133
133
  def initialize(_message = nil)
134
- super("Unhandled recursive data structure encountered!")
134
+ super('Unhandled recursive data structure encountered!')
135
135
  end
136
136
  end
137
137
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeFlatteners
@@ -5,16 +7,16 @@ module SuperDiff
5
7
  protected
6
8
 
7
9
  def open_token
8
- "#<%<class>s {" % { class: operation_tree.underlying_object.class }
10
+ format('#<%<class>s {', class: operation_tree.underlying_object.class)
9
11
  end
10
12
 
11
13
  def close_token
12
- "}>"
14
+ '}>'
13
15
  end
14
16
 
15
17
  def item_prefix_for(operation)
16
18
  key =
17
- # Note: We could have used the right_key here too, they're both the
19
+ # NOTE: We could have used the right_key here too, they're both the
18
20
  # same keys
19
21
  if operation.respond_to?(:left_key)
20
22
  operation.left_key
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeFlatteners
@@ -5,18 +7,17 @@ module SuperDiff
5
7
  protected
6
8
 
7
9
  def open_token
8
- "#<#{operation_tree.underlying_object.class.name}:" +
9
- Core::Helpers.object_address_for(operation_tree.underlying_object) +
10
- " {"
10
+ "#<#{operation_tree.underlying_object.class.name}:" \
11
+ "#{Core::Helpers.object_address_for(operation_tree.underlying_object)} {"
11
12
  end
12
13
 
13
14
  def close_token
14
- "}>"
15
+ '}>'
15
16
  end
16
17
 
17
18
  def item_prefix_for(operation)
18
19
  key =
19
- # Note: We could have used the right_key here too, they're both the
20
+ # NOTE: We could have used the right_key here too, they're both the
20
21
  # same keys
21
22
  if operation.respond_to?(:left_key)
22
23
  operation.left_key
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeFlatteners
@@ -5,11 +7,11 @@ module SuperDiff
5
7
  protected
6
8
 
7
9
  def open_token
8
- "{"
10
+ '{'
9
11
  end
10
12
 
11
13
  def close_token
12
- "}"
14
+ '}'
13
15
  end
14
16
 
15
17
  def item_prefix_for(operation)
@@ -25,7 +27,7 @@ module SuperDiff
25
27
  end
26
28
 
27
29
  def key_for(operation)
28
- # Note: We could have used the right_key here too, they're both the
30
+ # NOTE: We could have used the right_key here too, they're both the
29
31
  # same keys
30
32
  operation.respond_to?(:left_key) ? operation.left_key : operation.key
31
33
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeFlatteners
@@ -10,7 +12,7 @@ module SuperDiff
10
12
  # TODO: Test that quotes and things don't get escaped but escape
11
13
  # characters do
12
14
  value:
13
- operation.value.inspect[1..-2].gsub(/\\"/, '"').gsub(/\\'/, "'")
15
+ operation.value.inspect[1..-2].gsub('\\"', '"').gsub("\\'", "'")
14
16
  )
15
17
  end
16
18
  end
@@ -1,23 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTreeFlatteners
4
- autoload :Array, "super_diff/basic/operation_tree_flatteners/array"
6
+ autoload :Array, 'super_diff/basic/operation_tree_flatteners/array'
5
7
  autoload(
6
8
  :Collection,
7
- "super_diff/basic/operation_tree_flatteners/collection"
9
+ 'super_diff/basic/operation_tree_flatteners/collection'
8
10
  )
9
11
  autoload(
10
12
  :CustomObject,
11
- "super_diff/basic/operation_tree_flatteners/custom_object"
13
+ 'super_diff/basic/operation_tree_flatteners/custom_object'
12
14
  )
13
15
  autoload(
14
16
  :DefaultObject,
15
- "super_diff/basic/operation_tree_flatteners/default_object"
17
+ 'super_diff/basic/operation_tree_flatteners/default_object'
16
18
  )
17
- autoload :Hash, "super_diff/basic/operation_tree_flatteners/hash"
19
+ autoload :Hash, 'super_diff/basic/operation_tree_flatteners/hash'
18
20
  autoload(
19
21
  :MultilineString,
20
- "super_diff/basic/operation_tree_flatteners/multiline_string"
22
+ 'super_diff/basic/operation_tree_flatteners/multiline_string'
21
23
  )
22
24
  end
23
25
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTrees
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTrees
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTrees
@@ -17,18 +19,18 @@ module SuperDiff
17
19
  pp.text "#<#{self.class.name} "
18
20
  pp.nest(1) do
19
21
  pp.breakable
20
- pp.text ":operations=>"
21
- pp.group(1, "[", "]") do
22
+ pp.text ':operations=>'
23
+ pp.group(1, '[', ']') do
22
24
  pp.breakable
23
25
  pp.seplist(self) { |value| pp.pp value }
24
26
  end
25
27
  pp.comma_breakable
26
- pp.text ":underlying_object=>"
28
+ pp.text ':underlying_object=>'
27
29
  pp.object_address_group underlying_object do
28
30
  # do nothing
29
31
  end
30
32
  end
31
- pp.text ">"
33
+ pp.text '>'
32
34
  end
33
35
 
34
36
  protected
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTrees
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SuperDiff
2
4
  module Basic
3
5
  module OperationTrees
4
6
  class MultilineString < Core::AbstractOperationTree
5
7
  def self.applies_to?(value)
6
- value.is_a?(::String) && value.is_a?(::String)
8
+ value.is_a?(::String)
7
9
  end
8
10
 
9
11
  protected