super_diff 0.4.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +64 -24
  3. data/lib/super_diff.rb +20 -17
  4. data/lib/super_diff/active_record.rb +20 -24
  5. data/lib/super_diff/active_record/diff_formatters/active_record_relation.rb +3 -3
  6. data/lib/super_diff/active_record/differs/active_record_relation.rb +3 -5
  7. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_model.rb +32 -22
  8. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_relation.rb +17 -7
  9. data/lib/super_diff/active_record/operation_tree_builders.rb +14 -0
  10. data/lib/super_diff/active_record/{operational_sequencers → operation_tree_builders}/active_record_model.rb +2 -2
  11. data/lib/super_diff/active_record/{operational_sequencers → operation_tree_builders}/active_record_relation.rb +4 -4
  12. data/lib/super_diff/active_record/{operation_sequences.rb → operation_trees.rb} +2 -2
  13. data/lib/super_diff/active_record/{operation_sequences → operation_trees}/active_record_relation.rb +2 -2
  14. data/lib/super_diff/active_support.rb +16 -19
  15. data/lib/super_diff/active_support/diff_formatters/hash_with_indifferent_access.rb +3 -3
  16. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +3 -5
  17. data/lib/super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access.rb +17 -7
  18. data/lib/super_diff/active_support/operation_tree_builders.rb +10 -0
  19. data/lib/super_diff/active_support/{operational_sequencers → operation_tree_builders}/hash_with_indifferent_access.rb +2 -2
  20. data/lib/super_diff/active_support/{operation_sequences.rb → operation_trees.rb} +2 -2
  21. data/lib/super_diff/active_support/{operation_sequences → operation_trees}/hash_with_indifferent_access.rb +2 -2
  22. data/lib/super_diff/colorized_document_extensions.rb +4 -4
  23. data/lib/super_diff/configuration.rb +70 -0
  24. data/lib/super_diff/csi.rb +2 -1
  25. data/lib/super_diff/diff_formatters.rb +3 -3
  26. data/lib/super_diff/diff_formatters/array.rb +3 -3
  27. data/lib/super_diff/diff_formatters/base.rb +3 -2
  28. data/lib/super_diff/diff_formatters/collection.rb +3 -3
  29. data/lib/super_diff/diff_formatters/custom_object.rb +3 -3
  30. data/lib/super_diff/diff_formatters/default_object.rb +6 -8
  31. data/lib/super_diff/diff_formatters/defaults.rb +10 -0
  32. data/lib/super_diff/diff_formatters/hash.rb +3 -3
  33. data/lib/super_diff/diff_formatters/main.rb +41 -0
  34. data/lib/super_diff/diff_formatters/multiline_string.rb +7 -7
  35. data/lib/super_diff/differs.rb +4 -11
  36. data/lib/super_diff/differs/array.rb +2 -11
  37. data/lib/super_diff/differs/base.rb +20 -3
  38. data/lib/super_diff/differs/custom_object.rb +2 -11
  39. data/lib/super_diff/differs/default_object.rb +2 -8
  40. data/lib/super_diff/differs/defaults.rb +12 -0
  41. data/lib/super_diff/differs/hash.rb +2 -11
  42. data/lib/super_diff/differs/main.rb +48 -0
  43. data/lib/super_diff/differs/multiline_string.rb +2 -14
  44. data/lib/super_diff/differs/time_like.rb +15 -0
  45. data/lib/super_diff/equality_matchers.rb +3 -9
  46. data/lib/super_diff/equality_matchers/array.rb +3 -9
  47. data/lib/super_diff/equality_matchers/base.rb +1 -1
  48. data/lib/super_diff/equality_matchers/default.rb +3 -9
  49. data/lib/super_diff/equality_matchers/defaults.rb +12 -0
  50. data/lib/super_diff/equality_matchers/hash.rb +3 -9
  51. data/lib/super_diff/equality_matchers/main.rb +21 -0
  52. data/lib/super_diff/equality_matchers/multiline_string.rb +3 -9
  53. data/lib/super_diff/equality_matchers/primitive.rb +2 -2
  54. data/lib/super_diff/equality_matchers/singleline_string.rb +2 -2
  55. data/lib/super_diff/errors.rb +16 -0
  56. data/lib/super_diff/errors/no_diff_formatter_available_error.rb +21 -0
  57. data/lib/super_diff/errors/no_differ_available_error.rb +24 -0
  58. data/lib/super_diff/errors/no_operational_sequencer_available_error.rb +22 -0
  59. data/lib/super_diff/gem_version.rb +45 -0
  60. data/lib/super_diff/implementation_checks.rb +19 -0
  61. data/lib/super_diff/object_inspection.rb +1 -10
  62. data/lib/super_diff/object_inspection/inspection_tree.rb +6 -2
  63. data/lib/super_diff/object_inspection/inspectors.rb +5 -1
  64. data/lib/super_diff/object_inspection/inspectors/array.rb +20 -10
  65. data/lib/super_diff/object_inspection/inspectors/base.rb +36 -0
  66. data/lib/super_diff/object_inspection/inspectors/custom_object.rb +24 -14
  67. data/lib/super_diff/object_inspection/inspectors/default_object.rb +44 -30
  68. data/lib/super_diff/object_inspection/inspectors/defaults.rb +15 -0
  69. data/lib/super_diff/object_inspection/inspectors/hash.rb +20 -10
  70. data/lib/super_diff/object_inspection/inspectors/main.rb +35 -0
  71. data/lib/super_diff/object_inspection/inspectors/primitive.rb +20 -5
  72. data/lib/super_diff/object_inspection/inspectors/string.rb +15 -5
  73. data/lib/super_diff/object_inspection/inspectors/time_like.rb +23 -0
  74. data/lib/super_diff/object_inspection/nodes/inspection.rb +9 -2
  75. data/lib/super_diff/operation_tree_builders.rb +18 -0
  76. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/array.rb +38 -59
  77. data/lib/super_diff/operation_tree_builders/base.rb +98 -0
  78. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/custom_object.rb +3 -3
  79. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/default_object.rb +8 -3
  80. data/lib/super_diff/operation_tree_builders/defaults.rb +5 -0
  81. data/lib/super_diff/operation_tree_builders/hash.rb +226 -0
  82. data/lib/super_diff/operation_tree_builders/main.rb +42 -0
  83. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/multiline_string.rb +3 -3
  84. data/lib/super_diff/operation_tree_builders/time_like.rb +34 -0
  85. data/lib/super_diff/operation_trees.rb +13 -0
  86. data/lib/super_diff/{operation_sequences → operation_trees}/array.rb +5 -1
  87. data/lib/super_diff/{operation_sequences → operation_trees}/base.rb +9 -1
  88. data/lib/super_diff/{operation_sequences → operation_trees}/custom_object.rb +5 -1
  89. data/lib/super_diff/{operation_sequences → operation_trees}/default_object.rb +10 -8
  90. data/lib/super_diff/operation_trees/defaults.rb +5 -0
  91. data/lib/super_diff/{operation_sequences → operation_trees}/hash.rb +5 -1
  92. data/lib/super_diff/operation_trees/main.rb +35 -0
  93. data/lib/super_diff/operation_trees/multiline_string.rb +18 -0
  94. data/lib/super_diff/operations/unary_operation.rb +3 -0
  95. data/lib/super_diff/recursion_guard.rb +2 -0
  96. data/lib/super_diff/rspec.rb +49 -13
  97. data/lib/super_diff/rspec/augmented_matcher.rb +1 -1
  98. data/lib/super_diff/rspec/differ.rb +2 -17
  99. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +2 -7
  100. data/lib/super_diff/rspec/differs/collection_including.rb +2 -7
  101. data/lib/super_diff/rspec/differs/hash_including.rb +2 -7
  102. data/lib/super_diff/rspec/differs/object_having_attributes.rb +2 -7
  103. data/lib/super_diff/rspec/matcher_text_builders/base.rb +7 -7
  104. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +6 -6
  105. data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +1 -1
  106. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +4 -4
  107. data/lib/super_diff/rspec/matcher_text_builders/match.rb +1 -1
  108. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +1 -1
  109. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +6 -6
  110. data/lib/super_diff/rspec/matcher_text_template.rb +1 -1
  111. data/lib/super_diff/rspec/monkey_patches.rb +23 -14
  112. data/lib/super_diff/rspec/object_inspection.rb +0 -1
  113. data/lib/super_diff/rspec/object_inspection/inspectors.rb +16 -0
  114. data/lib/super_diff/rspec/object_inspection/inspectors/collection_containing_exactly.rb +17 -8
  115. data/lib/super_diff/rspec/object_inspection/inspectors/collection_including.rb +15 -9
  116. data/lib/super_diff/rspec/object_inspection/inspectors/hash_including.rb +20 -10
  117. data/lib/super_diff/rspec/object_inspection/inspectors/instance_of.rb +23 -0
  118. data/lib/super_diff/rspec/object_inspection/inspectors/kind_of.rb +23 -0
  119. data/lib/super_diff/rspec/object_inspection/inspectors/object_having_attributes.rb +20 -11
  120. data/lib/super_diff/rspec/object_inspection/inspectors/primitive.rb +13 -0
  121. data/lib/super_diff/rspec/object_inspection/inspectors/value_within.rb +29 -0
  122. data/lib/super_diff/rspec/operation_tree_builders.rb +22 -0
  123. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/collection_containing_exactly.rb +17 -6
  124. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/collection_including.rb +2 -2
  125. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/hash_including.rb +3 -11
  126. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/object_having_attributes.rb +4 -8
  127. data/lib/super_diff/version.rb +1 -1
  128. data/spec/examples.txt +393 -393
  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 +107 -107
  135. data/spec/integration/rspec/eq_matcher_spec.rb +230 -230
  136. data/spec/integration/rspec/have_attributes_matcher_spec.rb +360 -233
  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 +149 -107
  140. data/spec/integration/rspec/match_matcher_spec.rb +274 -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 +69 -13
  145. data/spec/spec_helper.rb +22 -13
  146. data/spec/support/command_runner.rb +3 -0
  147. data/spec/support/integration/helpers.rb +15 -95
  148. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +15 -30
  149. data/spec/support/integration/test_programs/base.rb +122 -0
  150. data/spec/support/integration/test_programs/plain.rb +13 -0
  151. data/spec/support/integration/test_programs/rspec_active_record.rb +17 -0
  152. data/spec/support/integration/test_programs/rspec_active_support.rb +17 -0
  153. data/spec/support/integration/test_programs/rspec_rails.rb +17 -0
  154. data/spec/support/models/active_record/person.rb +4 -11
  155. data/spec/support/models/active_record/shipping_address.rb +10 -14
  156. data/spec/support/object_id.rb +6 -5
  157. data/spec/support/shared_examples/active_record.rb +108 -108
  158. data/spec/support/shared_examples/hash_with_indifferent_access.rb +196 -232
  159. data/spec/tmp/integration_spec.rb +15 -0
  160. data/spec/unit/{equality_matcher_spec.rb → equality_matchers/main_spec.rb} +518 -362
  161. data/spec/unit/object_inspection_spec.rb +77 -1
  162. data/super_diff.gemspec +3 -2
  163. metadata +83 -54
  164. data/lib/super_diff/active_record/object_inspection/map_extension.rb +0 -18
  165. data/lib/super_diff/active_record/operational_sequencers.rb +0 -14
  166. data/lib/super_diff/active_support/object_inspection/map_extension.rb +0 -15
  167. data/lib/super_diff/active_support/operational_sequencers.rb +0 -10
  168. data/lib/super_diff/diff_formatter.rb +0 -32
  169. data/lib/super_diff/differ.rb +0 -51
  170. data/lib/super_diff/differs/time.rb +0 -24
  171. data/lib/super_diff/equality_matcher.rb +0 -32
  172. data/lib/super_diff/no_differ_available_error.rb +0 -22
  173. data/lib/super_diff/no_operational_sequencer_available_error.rb +0 -20
  174. data/lib/super_diff/object_inspection/inspector.rb +0 -27
  175. data/lib/super_diff/object_inspection/inspectors/time.rb +0 -13
  176. data/lib/super_diff/object_inspection/map.rb +0 -30
  177. data/lib/super_diff/operation_sequences.rb +0 -9
  178. data/lib/super_diff/operational_sequencer.rb +0 -48
  179. data/lib/super_diff/operational_sequencers.rb +0 -17
  180. data/lib/super_diff/operational_sequencers/base.rb +0 -89
  181. data/lib/super_diff/operational_sequencers/hash.rb +0 -85
  182. data/lib/super_diff/operational_sequencers/time_like.rb +0 -30
  183. data/lib/super_diff/rspec/configuration.rb +0 -31
  184. data/lib/super_diff/rspec/object_inspection/map_extension.rb +0 -23
  185. data/lib/super_diff/rspec/operational_sequencers.rb +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eed0200e5bbaa7abc329598fb01c4c3b7d21e3a871fccbc8c50f99a295e9cdd4
4
- data.tar.gz: 392e4d85b279fb33f8c28f47394da7509095bc50787d2784f7b6b4aed34358d8
3
+ metadata.gz: 854afb65d4337f48bd39a3e8529eb73f0ff01590a74a0a59b0df84827aff8746
4
+ data.tar.gz: '07356729294beab45bb4402398ed832819b8c9f5aba888b5004c251aaab97935'
5
5
  SHA512:
6
- metadata.gz: ea68e889de434c3340a8dc9ded4e6a1874056253d6af94bc7ea30cacda46e115100c40f27519c4770ec5f77bf4cd9d7925d63ccaff927a1cd50bb10a0c8fc64d
7
- data.tar.gz: 2e10c9d374b7f458aa2e582faa70dbecf26f22dd5445315fd72ad47529d8d193def3fa5f6e7460afd36ed26df6f3f135931533e99cf712032496b1195099b16e
6
+ metadata.gz: 240e383f75cd8fc6256c4951d288b16171e97b26267772e1af707c0fc33497547bccae2049647ed669d071fbfc8c2c6547c69488bdd3e3ce42a046d74e73dbe4
7
+ data.tar.gz: 3a3c30108caf9f15704f3c8c21c753b5e8d89ac900bdbc00cca4909a4b5a13d152cde73d0a72ea74d8a9a1b4a8775d42f87619765d22fc7b7ac00e235d70576b
data/README.md CHANGED
@@ -1,16 +1,17 @@
1
- # SuperDiff [![Gem Version][version-badge]][rubygems] [![Build Status][travis-badge]][travis] ![Downloads][downloads-badge] [![Hound][hound-badge]][hound]
1
+ # SuperDiff [![Gem Version][version-badge]][rubygems] [![Build Status][gh-actions-badge]][gh-actions] ![Downloads][downloads-badge] [![IssueHunt][issuehunt-badge]][issuehunt]
2
2
 
3
3
  [version-badge]: http://img.shields.io/gem/v/super_diff.svg
4
4
  [rubygems]: http://rubygems.org/gems/super_diff
5
- [travis-badge]: http://img.shields.io/travis/mcmire/super_diff/master.svg
5
+ [gh-actions-badge]: http://img.shields.io/github/workflow/status/mcmire/super_diff/SuperDiff/master
6
6
  [downloads-badge]: http://img.shields.io/gem/dtv/super_diff.svg
7
- [hound-badge]: https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg
8
7
  [hound]: https://houndci.com
8
+ [issuehunt-badge]: https://img.shields.io/badge/sponsored_through-IssueHunt-2EC28C
9
+ [issuehunt]: https://issuehunt.io/r/mcmire/super_diff
9
10
 
10
11
  SuperDiff is a gem that hooks into RSpec
11
12
  to intelligently display the differences between two data structures of any type.
12
13
 
13
- 📢 **[See what's changed in the latest version (0.4.2)][changelog].**
14
+ 📢 **[See what's changed in recent versions.][changelog]**
14
15
 
15
16
  [changelog]: CHANGELOG.md
16
17
 
@@ -85,7 +86,7 @@ expect(actual).to eq(expected)
85
86
 
86
87
  You would get output that looks like this:
87
88
 
88
- ![Before super_diff](doc/before.png)
89
+ ![Before super_diff](docs/before.png)
89
90
 
90
91
  What this library does
91
92
  is to provide a diff engine
@@ -94,7 +95,7 @@ and display them in a sensible way.
94
95
  So, using the example above,
95
96
  you'd get this instead:
96
97
 
97
- ![After super_diff](doc/after.png)
98
+ ![After super_diff](docs/after.png)
98
99
 
99
100
  ## Installation
100
101
 
@@ -154,26 +155,57 @@ require "super_diff/rspec"
154
155
 
155
156
  ## Configuration
156
157
 
157
- As capable as this library is,
158
- it doesn't know how to deal with every kind of object out there.
159
- If you have a custom class,
160
- and instances of your class aren't appearing in diffs like you like,
161
- you might find it necessary to instruct the gem on how to handle them.
162
- In that case
163
- you would add something like this to your test helper file
164
- (`rails_helper` or `spec_helper`):
158
+ You can customize the behavior of the gem
159
+ by adding a configuration block
160
+ to your test helper file
161
+ (`rails_helper` or `spec_helper`)
162
+ which looks something like this:
165
163
 
166
164
  ``` ruby
167
- SuperDiff::RSpec.configure do |config|
165
+ SuperDiff.configure do |config|
166
+ # ...
167
+ end
168
+ ```
169
+
170
+ ### Customizing colors
171
+
172
+ If you don't like the colors that SuperDiff uses,
173
+ you can change them like this:
174
+
175
+ ``` ruby
176
+ SuperDiff.configure do |config|
177
+ config.actual_color = :green
178
+ config.expected_color = :red
179
+ config.border_color = :yellow
180
+ config.header_color = :yellow
181
+ end
182
+ ```
183
+
184
+ See [eight_bit_color.rb](lib/super_diff/csi/eight_bit_color.rb)
185
+ for the list of available colors.
186
+
187
+ ### Diffing custom objects
188
+
189
+ If you are comparing two data structures
190
+ that involve a class that is specific to your project,
191
+ the resulting diff may not look as good as diffs involving native or primitive objects.
192
+ This happens because if SuperDiff doesn't recognize a class,
193
+ it will fall back to a generic representation when diffing instances of that class.
194
+ Fortunately, the gem has a pluggable interface
195
+ that allows you to insert your own implementations
196
+ of key pieces involved in the diffing process.
197
+ I'll have more about how that works soon,
198
+ but here is what such a configuration would look like:
199
+
200
+ ``` ruby
201
+ SuperDiff.configure do |config|
168
202
  config.add_extra_differ_class(YourDiffer)
169
- config.add_extra_operational_sequencer_class(YourOperationalSequencer)
203
+ config.add_extra_operation_tree_builder_class(YourOperationTreeBuilder)
204
+ config.add_extra_operation_tree_class(YourOperationTree)
170
205
  config.add_extra_diff_formatter_class(YourDiffFormatter)
171
206
  end
172
207
  ```
173
208
 
174
- *(More info here in the future on adding a custom differ, operational sequencer, and diff formatter.
175
- Also explanations on what these are.)*
176
-
177
209
  ## Support
178
210
 
179
211
  My goal for this library is to improve your development experience.
@@ -186,17 +218,25 @@ I'll try to respond to it as soon as I can!
186
218
 
187
219
  ## Contributing
188
220
 
189
- Any contributions to improve this library are welcome!
221
+ Any code contributions to improve this library are welcome!
190
222
  Please see the [contributing](./CONTRIBUTING.md) document for more on how to do that.
191
223
 
224
+ ## Sponsoring
225
+
226
+ If there's a change you want implemented, you can choose to sponsor that change!
227
+ `super_diff` is set up on IssueHunt,
228
+ so feel free to search for an existing issue (or make your own)
229
+ and [add a bounty](https://issuehunt.io/r/mcmire/super_diff).
230
+ I'll get notified right away!
231
+
192
232
  ## Compatibility
193
233
 
194
- `super_diff` is [tested][travis] to work with
195
- Ruby >= 2.4.x,
234
+ `super_diff` is [tested][gh-actions] to work with
235
+ Ruby >= 2.5.x,
196
236
  RSpec 3.x,
197
237
  and Rails >= 5.x.
198
238
 
199
- [travis]: http://travis-ci.org/mcmire/super_diff
239
+ [gh-actions]: https://github.com/mcmire/super_diff/actions?query=workflow%3ASuperDiff
200
240
 
201
241
  ## Inspiration/Thanks
202
242
 
@@ -219,5 +259,5 @@ Thank you to the authors of these libraries!
219
259
 
220
260
  ## Author/License
221
261
 
222
- `super_diff` was created and is maintained by Elliot Winkler.
262
+ SuperDiff was created and is maintained by Elliot Winkler.
223
263
  It is released under the [MIT license](LICENSE).
data/lib/super_diff.rb CHANGED
@@ -7,30 +7,33 @@ module SuperDiff
7
7
  :ColorizedDocumentExtensions,
8
8
  "super_diff/colorized_document_extensions",
9
9
  )
10
+ autoload :Configuration, "super_diff/configuration"
10
11
  autoload :Csi, "super_diff/csi"
11
- autoload :DiffFormatter, "super_diff/diff_formatter"
12
12
  autoload :DiffFormatters, "super_diff/diff_formatters"
13
- autoload :Differ, "super_diff/differ"
14
13
  autoload :Differs, "super_diff/differs"
15
- autoload :EqualityMatcher, "super_diff/equality_matcher"
16
14
  autoload :EqualityMatchers, "super_diff/equality_matchers"
15
+ autoload :Errors, "super_diff/errors"
16
+ autoload :GemVersion, "super_diff/gem_version"
17
17
  autoload :Helpers, "super_diff/helpers"
18
- autoload :NoDifferAvailableError, "super_diff/no_differ_available_error"
19
- autoload(
20
- :NoOperationalSequencerAvailableError,
21
- "super_diff/no_operational_sequencer_available_error",
22
- )
18
+ autoload :ImplementationChecks, "super_diff/implementation_checks"
23
19
  autoload :ObjectInspection, "super_diff/object_inspection"
24
- autoload :OperationalSequencer, "super_diff/operational_sequencer"
25
- autoload :OperationalSequencers, "super_diff/operational_sequencers"
26
- autoload :OperationSequences, "super_diff/operation_sequences"
20
+ autoload :OperationTrees, "super_diff/operation_trees"
21
+ autoload :OperationTreeBuilders, "super_diff/operation_tree_builders"
27
22
  autoload :Operations, "super_diff/operations"
28
23
  autoload :RecursionGuard, "super_diff/recursion_guard"
29
24
 
30
- COLORS = {
31
- alpha: :magenta,
32
- beta: :yellow,
33
- border: :blue,
34
- header: :white,
35
- }.freeze
25
+ def self.configure
26
+ yield configuration
27
+ end
28
+
29
+ def self.configuration
30
+ @_configuration ||= Configuration.new
31
+ end
32
+
33
+ def self.time_like?(value)
34
+ # Check for ActiveSupport's #acts_like_time? for their time-like objects
35
+ # (like ActiveSupport::TimeWithZone).
36
+ (value.respond_to?(:acts_like_time?) && value.acts_like_time?) ||
37
+ value.is_a?(Time)
38
+ end
36
39
  end
@@ -9,35 +9,31 @@ module SuperDiff
9
9
  "super_diff/active_record/object_inspection",
10
10
  )
11
11
  autoload(
12
- :OperationSequences,
13
- "super_diff/active_record/operation_sequences",
12
+ :OperationTrees,
13
+ "super_diff/active_record/operation_trees",
14
14
  )
15
15
  autoload(
16
- :OperationalSequencers,
17
- "super_diff/active_record/operational_sequencers",
16
+ :OperationTreeBuilders,
17
+ "super_diff/active_record/operation_tree_builders",
18
18
  )
19
- end
20
- end
21
19
 
22
- if defined?(SuperDiff::RSpec)
23
- SuperDiff::RSpec.configure do |config|
24
- config.add_extra_differ_class(
25
- SuperDiff::ActiveRecord::Differs::ActiveRecordRelation,
26
- )
27
- config.add_extra_operational_sequencer_class(
28
- SuperDiff::ActiveRecord::OperationalSequencers::ActiveRecordModel,
29
- )
30
- config.add_extra_operational_sequencer_class(
31
- SuperDiff::ActiveRecord::OperationalSequencers::ActiveRecordRelation,
32
- )
33
- config.add_extra_diff_formatter_class(
34
- SuperDiff::ActiveRecord::DiffFormatters::ActiveRecordRelation,
35
- )
20
+ SuperDiff.configure do |config|
21
+ config.add_extra_differ_classes(
22
+ Differs::ActiveRecordRelation,
23
+ )
24
+ config.add_extra_operation_tree_builder_classes(
25
+ OperationTreeBuilders::ActiveRecordModel,
26
+ OperationTreeBuilders::ActiveRecordRelation,
27
+ )
28
+ config.add_extra_diff_formatter_classes(
29
+ DiffFormatters::ActiveRecordRelation,
30
+ )
31
+ config.add_extra_inspector_classes(
32
+ ObjectInspection::Inspectors::ActiveRecordModel,
33
+ ObjectInspection::Inspectors::ActiveRecordRelation,
34
+ )
35
+ end
36
36
  end
37
37
  end
38
38
 
39
39
  require "super_diff/active_record/monkey_patches"
40
-
41
- SuperDiff::ObjectInspection.map.prepend(
42
- SuperDiff::ActiveRecord::ObjectInspection::MapExtension,
43
- )
@@ -2,8 +2,8 @@ module SuperDiff
2
2
  module ActiveRecord
3
3
  module DiffFormatters
4
4
  class ActiveRecordRelation < SuperDiff::DiffFormatters::Base
5
- def self.applies_to?(operations)
6
- operations.is_a?(OperationSequences::ActiveRecordRelation)
5
+ def self.applies_to?(operation_tree)
6
+ operation_tree.is_a?(OperationTrees::ActiveRecordRelation)
7
7
  end
8
8
 
9
9
  def call
@@ -12,7 +12,7 @@ module SuperDiff
12
12
  close_token: "]>",
13
13
  collection_prefix: collection_prefix,
14
14
  build_item_prefix: proc { "" },
15
- operations: operations,
15
+ operation_tree: operation_tree,
16
16
  indent_level: indent_level,
17
17
  add_comma: add_comma?,
18
18
  )
@@ -9,19 +9,17 @@ module SuperDiff
9
9
 
10
10
  def call
11
11
  DiffFormatters::ActiveRecordRelation.call(
12
- operations,
12
+ operation_tree,
13
13
  indent_level: indent_level,
14
14
  )
15
15
  end
16
16
 
17
17
  private
18
18
 
19
- def operations
20
- OperationalSequencers::ActiveRecordRelation.call(
19
+ def operation_tree
20
+ OperationTreeBuilders::ActiveRecordRelation.call(
21
21
  expected: expected,
22
22
  actual: actual,
23
- extra_operational_sequencer_classes: extra_operational_sequencer_classes,
24
- extra_diff_formatter_classes: extra_diff_formatter_classes,
25
23
  )
26
24
  end
27
25
  end
@@ -2,35 +2,45 @@ module SuperDiff
2
2
  module ActiveRecord
3
3
  module ObjectInspection
4
4
  module Inspectors
5
- ActiveRecordModel = SuperDiff::ObjectInspection::InspectionTree.new do
6
- add_text do |object|
7
- "#<#{object.class} "
5
+ class ActiveRecordModel < SuperDiff::ObjectInspection::Inspectors::Base
6
+ def self.applies_to?(value)
7
+ value.is_a?(::ActiveRecord::Base)
8
8
  end
9
9
 
10
- when_multiline do
11
- add_text "{"
12
- end
10
+ protected
13
11
 
14
- nested do |object|
15
- add_break
12
+ def inspection_tree
13
+ SuperDiff::ObjectInspection::InspectionTree.new do
14
+ add_text do |object|
15
+ "#<#{object.class} "
16
+ end
16
17
 
17
- insert_separated_list(
18
- ["id"] + (object.attributes.keys.sort - ["id"]),
19
- separator: ",",
20
- ) do |name|
21
- add_text name
22
- add_text ": "
23
- add_inspection_of object.read_attribute(name)
24
- end
25
- end
18
+ when_multiline do
19
+ add_text "{"
20
+ end
26
21
 
27
- add_break
22
+ nested do |object|
23
+ add_break
28
24
 
29
- when_multiline do
30
- add_text "}"
31
- end
25
+ insert_separated_list(
26
+ ["id"] + (object.attributes.keys.sort - ["id"]),
27
+ separator: ",",
28
+ ) do |name|
29
+ add_text name
30
+ add_text ": "
31
+ add_inspection_of object.read_attribute(name)
32
+ end
33
+ end
32
34
 
33
- add_text ">"
35
+ add_break
36
+
37
+ when_multiline do
38
+ add_text "}"
39
+ end
40
+
41
+ add_text ">"
42
+ end
43
+ end
34
44
  end
35
45
  end
36
46
  end
@@ -2,15 +2,25 @@ module SuperDiff
2
2
  module ActiveRecord
3
3
  module ObjectInspection
4
4
  module Inspectors
5
- ActiveRecordRelation = SuperDiff::ObjectInspection::InspectionTree.new do
6
- add_text "#<ActiveRecord::Relation ["
7
-
8
- nested do |array|
9
- insert_array_inspection_of(array)
5
+ class ActiveRecordRelation < SuperDiff::ObjectInspection::Inspectors::Base
6
+ def self.applies_to?(value)
7
+ value.is_a?(::ActiveRecord::Relation)
10
8
  end
11
9
 
12
- add_break
13
- add_text "]>"
10
+ protected
11
+
12
+ def inspection_tree
13
+ SuperDiff::ObjectInspection::InspectionTree.new do
14
+ add_text "#<ActiveRecord::Relation ["
15
+
16
+ nested do |array|
17
+ insert_array_inspection_of(array)
18
+ end
19
+
20
+ add_break
21
+ add_text "]>"
22
+ end
23
+ end
14
24
  end
15
25
  end
16
26
  end
@@ -0,0 +1,14 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module OperationTreeBuilders
4
+ autoload(
5
+ :ActiveRecordModel,
6
+ "super_diff/active_record/operation_tree_builders/active_record_model",
7
+ )
8
+ autoload(
9
+ :ActiveRecordRelation,
10
+ "super_diff/active_record/operation_tree_builders/active_record_relation",
11
+ )
12
+ end
13
+ end
14
+ end
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module ActiveRecord
3
- module OperationalSequencers
4
- class ActiveRecordModel < SuperDiff::OperationalSequencers::CustomObject
3
+ module OperationTreeBuilders
4
+ class ActiveRecordModel < SuperDiff::OperationTreeBuilders::CustomObject
5
5
  def self.applies_to?(expected, actual)
6
6
  expected.is_a?(::ActiveRecord::Base) &&
7
7
  actual.is_a?(::ActiveRecord::Base) &&
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module ActiveRecord
3
- module OperationalSequencers
4
- class ActiveRecordRelation < SuperDiff::OperationalSequencers::Array
3
+ module OperationTreeBuilders
4
+ class ActiveRecordRelation < SuperDiff::OperationTreeBuilders::Array
5
5
  def self.applies_to?(expected, actual)
6
6
  expected.is_a?(::Array) &&
7
7
  actual.is_a?(::ActiveRecord::Relation)
@@ -15,8 +15,8 @@ module SuperDiff
15
15
 
16
16
  private
17
17
 
18
- def operations
19
- @_operations ||= OperationSequences::ActiveRecordRelation.new([])
18
+ def operation_tree
19
+ @_operation_tree ||= OperationTrees::ActiveRecordRelation.new([])
20
20
  end
21
21
  end
22
22
  end