super_diff 0.3.0 → 0.5.1
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.
- checksums.yaml +4 -4
- data/README.md +104 -73
- data/lib/super_diff.rb +20 -11
- data/lib/super_diff/active_record.rb +21 -23
- data/lib/super_diff/active_record/diff_formatters/active_record_relation.rb +3 -3
- data/lib/super_diff/active_record/differs/active_record_relation.rb +3 -5
- data/lib/super_diff/active_record/monkey_patches.rb +9 -0
- data/lib/super_diff/active_record/object_inspection/inspectors/active_record_model.rb +32 -22
- data/lib/super_diff/active_record/object_inspection/inspectors/active_record_relation.rb +17 -7
- data/lib/super_diff/active_record/operation_tree_builders.rb +14 -0
- data/lib/super_diff/active_record/{operational_sequencers → operation_tree_builders}/active_record_model.rb +2 -2
- data/lib/super_diff/active_record/{operational_sequencers → operation_tree_builders}/active_record_relation.rb +4 -4
- data/lib/super_diff/active_record/{operation_sequences.rb → operation_trees.rb} +2 -2
- data/lib/super_diff/active_record/{operation_sequences → operation_trees}/active_record_relation.rb +2 -2
- data/lib/super_diff/active_support.rb +16 -19
- data/lib/super_diff/active_support/diff_formatters/hash_with_indifferent_access.rb +3 -3
- data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +3 -5
- data/lib/super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access.rb +17 -7
- data/lib/super_diff/active_support/operation_tree_builders.rb +10 -0
- data/lib/super_diff/active_support/{operational_sequencers → operation_tree_builders}/hash_with_indifferent_access.rb +2 -2
- data/lib/super_diff/active_support/{operation_sequences.rb → operation_trees.rb} +2 -2
- data/lib/super_diff/active_support/{operation_sequences → operation_trees}/hash_with_indifferent_access.rb +2 -2
- data/lib/super_diff/configuration.rb +60 -0
- data/lib/super_diff/csi.rb +4 -0
- data/lib/super_diff/diff_formatters.rb +3 -3
- data/lib/super_diff/diff_formatters/array.rb +3 -3
- data/lib/super_diff/diff_formatters/base.rb +3 -2
- data/lib/super_diff/diff_formatters/collection.rb +2 -2
- data/lib/super_diff/diff_formatters/custom_object.rb +3 -3
- data/lib/super_diff/diff_formatters/default_object.rb +6 -8
- data/lib/super_diff/diff_formatters/defaults.rb +10 -0
- data/lib/super_diff/diff_formatters/hash.rb +3 -3
- data/lib/super_diff/diff_formatters/main.rb +41 -0
- data/lib/super_diff/diff_formatters/multiline_string.rb +3 -3
- data/lib/super_diff/differs.rb +4 -11
- data/lib/super_diff/differs/array.rb +2 -11
- data/lib/super_diff/differs/base.rb +20 -3
- data/lib/super_diff/differs/custom_object.rb +2 -11
- data/lib/super_diff/differs/default_object.rb +2 -8
- data/lib/super_diff/differs/defaults.rb +12 -0
- data/lib/super_diff/differs/hash.rb +2 -11
- data/lib/super_diff/differs/main.rb +48 -0
- data/lib/super_diff/differs/multiline_string.rb +2 -14
- data/lib/super_diff/differs/time_like.rb +15 -0
- data/lib/super_diff/equality_matchers.rb +3 -9
- data/lib/super_diff/equality_matchers/array.rb +1 -7
- data/lib/super_diff/equality_matchers/base.rb +1 -1
- data/lib/super_diff/equality_matchers/default.rb +2 -8
- data/lib/super_diff/equality_matchers/defaults.rb +12 -0
- data/lib/super_diff/equality_matchers/hash.rb +1 -7
- data/lib/super_diff/equality_matchers/main.rb +21 -0
- data/lib/super_diff/equality_matchers/multiline_string.rb +1 -7
- data/lib/super_diff/errors.rb +16 -0
- data/lib/super_diff/errors/no_diff_formatter_available_error.rb +21 -0
- data/lib/super_diff/errors/no_differ_available_error.rb +24 -0
- data/lib/super_diff/errors/no_operational_sequencer_available_error.rb +22 -0
- data/lib/super_diff/implementation_checks.rb +19 -0
- data/lib/super_diff/object_inspection.rb +1 -10
- data/lib/super_diff/object_inspection/inspection_tree.rb +6 -2
- data/lib/super_diff/object_inspection/inspectors.rb +5 -1
- data/lib/super_diff/object_inspection/inspectors/array.rb +20 -10
- data/lib/super_diff/object_inspection/inspectors/base.rb +36 -0
- data/lib/super_diff/object_inspection/inspectors/custom_object.rb +24 -14
- data/lib/super_diff/object_inspection/inspectors/default_object.rb +44 -30
- data/lib/super_diff/object_inspection/inspectors/defaults.rb +15 -0
- data/lib/super_diff/object_inspection/inspectors/hash.rb +20 -10
- data/lib/super_diff/object_inspection/inspectors/main.rb +35 -0
- data/lib/super_diff/object_inspection/inspectors/primitive.rb +20 -5
- data/lib/super_diff/object_inspection/inspectors/string.rb +15 -5
- data/lib/super_diff/object_inspection/inspectors/time_like.rb +23 -0
- data/lib/super_diff/object_inspection/nodes/inspection.rb +9 -2
- data/lib/super_diff/operation_tree_builders.rb +18 -0
- data/lib/super_diff/{operational_sequencers → operation_tree_builders}/array.rb +38 -59
- data/lib/super_diff/operation_tree_builders/base.rb +98 -0
- data/lib/super_diff/{operational_sequencers → operation_tree_builders}/custom_object.rb +3 -3
- data/lib/super_diff/{operational_sequencers → operation_tree_builders}/default_object.rb +8 -3
- data/lib/super_diff/operation_tree_builders/defaults.rb +5 -0
- data/lib/super_diff/operation_tree_builders/hash.rb +226 -0
- data/lib/super_diff/operation_tree_builders/main.rb +42 -0
- data/lib/super_diff/{operational_sequencers → operation_tree_builders}/multiline_string.rb +3 -3
- data/lib/super_diff/operation_tree_builders/time_like.rb +34 -0
- data/lib/super_diff/operation_trees.rb +13 -0
- data/lib/super_diff/{operation_sequences → operation_trees}/array.rb +5 -1
- data/lib/super_diff/operation_trees/base.rb +31 -0
- data/lib/super_diff/{operation_sequences → operation_trees}/custom_object.rb +5 -1
- data/lib/super_diff/{operation_sequences → operation_trees}/default_object.rb +10 -8
- data/lib/super_diff/operation_trees/defaults.rb +5 -0
- data/lib/super_diff/{operation_sequences → operation_trees}/hash.rb +5 -1
- data/lib/super_diff/operation_trees/main.rb +35 -0
- data/lib/super_diff/operation_trees/multiline_string.rb +18 -0
- data/lib/super_diff/operations/unary_operation.rb +3 -0
- data/lib/super_diff/rspec.rb +54 -22
- data/lib/super_diff/rspec/augmented_matcher.rb +1 -1
- data/lib/super_diff/rspec/differ.rb +2 -17
- data/lib/super_diff/rspec/differs.rb +9 -3
- data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +3 -8
- data/lib/super_diff/rspec/differs/collection_including.rb +18 -0
- data/lib/super_diff/rspec/differs/hash_including.rb +18 -0
- data/lib/super_diff/rspec/differs/object_having_attributes.rb +17 -0
- data/lib/super_diff/rspec/matcher_text_builders.rb +4 -0
- data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +26 -7
- data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +61 -0
- data/lib/super_diff/rspec/matcher_text_builders/match.rb +1 -1
- data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +13 -1
- data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +1 -1
- data/lib/super_diff/rspec/matcher_text_template.rb +1 -1
- data/lib/super_diff/rspec/monkey_patches.rb +226 -115
- data/lib/super_diff/rspec/object_inspection.rb +0 -1
- data/lib/super_diff/rspec/object_inspection/inspectors.rb +22 -6
- data/lib/super_diff/rspec/object_inspection/inspectors/collection_containing_exactly.rb +17 -8
- data/lib/super_diff/rspec/object_inspection/inspectors/collection_including.rb +28 -0
- data/lib/super_diff/rspec/object_inspection/inspectors/hash_including.rb +31 -0
- data/lib/super_diff/rspec/object_inspection/inspectors/instance_of.rb +23 -0
- data/lib/super_diff/rspec/object_inspection/inspectors/kind_of.rb +23 -0
- data/lib/super_diff/rspec/object_inspection/inspectors/object_having_attributes.rb +31 -0
- data/lib/super_diff/rspec/object_inspection/inspectors/primitive.rb +13 -0
- data/lib/super_diff/rspec/object_inspection/inspectors/value_within.rb +29 -0
- data/lib/super_diff/rspec/operation_tree_builders.rb +22 -0
- data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/collection_containing_exactly.rb +6 -6
- data/lib/super_diff/rspec/{operational_sequencers/partial_array.rb → operation_tree_builders/collection_including.rb} +4 -3
- data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +25 -0
- data/lib/super_diff/rspec/{operational_sequencers/partial_object.rb → operation_tree_builders/object_having_attributes.rb} +5 -11
- data/lib/super_diff/version.rb +1 -1
- data/spec/examples.txt +5 -350
- data/spec/integration/rails/active_record_spec.rb +1 -1
- data/spec/integration/rails/hash_with_indifferent_access_spec.rb +1 -1
- data/spec/integration/rspec/be_predicate_matcher_spec.rb +111 -59
- data/spec/integration/rspec/eq_matcher_spec.rb +1 -1
- data/spec/integration/rspec/have_attributes_matcher_spec.rb +354 -227
- data/spec/integration/rspec/have_predicate_matcher_spec.rb +484 -0
- data/spec/integration/rspec/include_matcher_spec.rb +2 -2
- data/spec/integration/rspec/match_array_matcher_spec.rb +372 -0
- data/spec/integration/rspec/match_matcher_spec.rb +8 -8
- data/spec/integration/rspec/raise_error_matcher_spec.rb +605 -226
- data/spec/integration/rspec/third_party_matcher_spec.rb +241 -0
- data/spec/integration/rspec/unhandled_errors_spec.rb +110 -58
- data/spec/spec_helper.rb +18 -7
- data/spec/support/command_runner.rb +3 -0
- data/spec/support/integration/helpers.rb +14 -90
- data/spec/support/integration/matchers.rb +143 -0
- data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +14 -29
- data/spec/support/integration/test_programs/base.rb +120 -0
- data/spec/support/integration/test_programs/plain.rb +13 -0
- data/spec/support/integration/test_programs/rspec_active_record.rb +17 -0
- data/spec/support/integration/test_programs/rspec_rails.rb +17 -0
- data/spec/support/models/active_record/person.rb +4 -11
- data/spec/support/models/active_record/query.rb +15 -0
- data/spec/support/models/active_record/shipping_address.rb +10 -14
- data/spec/support/object_id.rb +27 -0
- data/spec/support/ruby_versions.rb +4 -0
- data/spec/support/shared_examples/active_record.rb +71 -0
- data/spec/support/shared_examples/hash_with_indifferent_access.rb +724 -208
- data/spec/unit/{equality_matcher_spec.rb → equality_matchers/main_spec.rb} +165 -9
- data/spec/unit/object_inspection_spec.rb +94 -18
- data/spec/unit/rspec/matchers/have_predicate_spec.rb +21 -0
- data/spec/unit/rspec/matchers/match_array_spec.rb +11 -0
- data/spec/unit/rspec/matchers/raise_error_spec.rb +16 -0
- data/super_diff.gemspec +4 -6
- metadata +99 -82
- data/lib/super_diff/active_record/object_inspection/map_extension.rb +0 -18
- data/lib/super_diff/active_record/operational_sequencers.rb +0 -14
- data/lib/super_diff/active_support/object_inspection/map_extension.rb +0 -15
- data/lib/super_diff/active_support/operational_sequencers.rb +0 -10
- data/lib/super_diff/diff_formatter.rb +0 -32
- data/lib/super_diff/differ.rb +0 -51
- data/lib/super_diff/differs/time.rb +0 -24
- data/lib/super_diff/equality_matcher.rb +0 -32
- data/lib/super_diff/no_differ_available_error.rb +0 -22
- data/lib/super_diff/no_operational_sequencer_available_error.rb +0 -20
- data/lib/super_diff/object_inspection/inspector.rb +0 -27
- data/lib/super_diff/object_inspection/inspectors/time.rb +0 -13
- data/lib/super_diff/object_inspection/map.rb +0 -30
- data/lib/super_diff/operation_sequences.rb +0 -9
- data/lib/super_diff/operation_sequences/base.rb +0 -11
- data/lib/super_diff/operational_sequencer.rb +0 -48
- data/lib/super_diff/operational_sequencers.rb +0 -17
- data/lib/super_diff/operational_sequencers/base.rb +0 -89
- data/lib/super_diff/operational_sequencers/hash.rb +0 -85
- data/lib/super_diff/operational_sequencers/time_like.rb +0 -30
- data/lib/super_diff/rspec/configuration.rb +0 -31
- data/lib/super_diff/rspec/differs/partial_array.rb +0 -22
- data/lib/super_diff/rspec/differs/partial_hash.rb +0 -22
- data/lib/super_diff/rspec/differs/partial_object.rb +0 -22
- data/lib/super_diff/rspec/object_inspection/inspectors/partial_array.rb +0 -22
- data/lib/super_diff/rspec/object_inspection/inspectors/partial_hash.rb +0 -21
- data/lib/super_diff/rspec/object_inspection/inspectors/partial_object.rb +0 -21
- data/lib/super_diff/rspec/object_inspection/map_extension.rb +0 -23
- data/lib/super_diff/rspec/operational_sequencers.rb +0 -22
- data/lib/super_diff/rspec/operational_sequencers/partial_hash.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bdda657427ecef6cf2c8d65b9485b73da6c1ab64dbc0f608ce185028ca8bd6a
|
4
|
+
data.tar.gz: 7476633c6bf06aee6087fc9156743ac56d83507380f44b2236e6c32710088d9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45059e4f3d8932f71d6a7f76afe1694e20687a453a9bacb82b1bc0e7c4ed4ec3fc5db20639a9d799b718761a1f053787ed83a867e9adba1d661cc0c03e26b06d
|
7
|
+
data.tar.gz: 7efd5ddfd5e753e569ba126eb214657250234c4e3968a92cd6e87ca01907dcb6feb71aaa5491b7938f38e8a7a634355ece2533fb7a30252e4ad93613f5e0eb2e
|
data/README.md
CHANGED
@@ -1,38 +1,40 @@
|
|
1
|
-
# SuperDiff [![Gem Version][version-badge]][rubygems] [![Build Status][travis-badge]][travis] ![Downloads][downloads-badge] [![
|
1
|
+
# SuperDiff [![Gem Version][version-badge]][rubygems] [![Build Status][travis-badge]][travis] ![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
5
|
[travis-badge]: http://img.shields.io/travis/mcmire/super_diff/master.svg
|
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
|
-
SuperDiff is a gem that hooks into RSpec
|
11
|
-
differences between two data structures of any type.
|
11
|
+
SuperDiff is a gem that hooks into RSpec
|
12
|
+
to intelligently display the differences between two data structures of any type.
|
12
13
|
|
13
|
-
📢 **[See what's changed in
|
14
|
+
📢 **[See what's changed in recent versions.][changelog].**
|
14
15
|
|
15
16
|
[changelog]: CHANGELOG.md
|
16
17
|
|
17
18
|
## Introduction
|
18
19
|
|
19
|
-
The primary motivation behind this gem
|
20
|
-
built-in diffing capabilities.
|
20
|
+
The primary motivation behind this gem
|
21
|
+
is to vastly improve upon RSpec's built-in diffing capabilities.
|
21
22
|
|
22
|
-
Sometimes, whenever you use a matcher such as `eq`, `match`, `include`, or
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
Since [RSpec merely runs your `expected` and `actual` values through Ruby's
|
30
|
-
|
31
|
-
|
23
|
+
Sometimes, whenever you use a matcher such as `eq`, `match`, `include`, or `have_attributes`,
|
24
|
+
you will get a diff of the two data structures you are trying to match against.
|
25
|
+
This is great if all you want to do is compare multi-line strings.
|
26
|
+
But if you want to compare other, more "real world" kinds of values,
|
27
|
+
such as what you might work with when developing API endpoints
|
28
|
+
or testing methods that make database calls and return a set of model objects,
|
29
|
+
then you are out of luck.
|
30
|
+
Since [RSpec merely runs your `expected` and `actual` values through Ruby's PrettyPrinter library][rspec-differ-fail]
|
31
|
+
and then performs a diff of these strings,
|
32
|
+
the output it produces leaves much to be desired.
|
32
33
|
|
33
34
|
[rspec-differ-fail]: https://github.com/rspec/rspec-support/blob/c69a231d7369dd165ad7ce4742e1a2e21e3462b5/lib/rspec/support/differ.rb#L178
|
34
35
|
|
35
|
-
For instance,
|
36
|
+
For instance,
|
37
|
+
let's say you wanted to compare these two hashes:
|
36
38
|
|
37
39
|
``` ruby
|
38
40
|
actual = {
|
@@ -84,38 +86,62 @@ expect(actual).to eq(expected)
|
|
84
86
|
|
85
87
|
You would get output that looks like this:
|
86
88
|
|
87
|
-

|
88
90
|
|
89
|
-
What this library does
|
90
|
-
|
91
|
-
|
91
|
+
What this library does
|
92
|
+
is to provide a diff engine
|
93
|
+
that knows how to figure out the differences between any two data structures
|
94
|
+
and display them in a sensible way.
|
95
|
+
So, using the example above,
|
96
|
+
you'd get this instead:
|
92
97
|
|
93
|
-

|
94
99
|
|
95
100
|
## Installation
|
96
101
|
|
97
|
-
|
98
|
-
|
102
|
+
There are a few different ways to install `super_diff`
|
103
|
+
depending on your type of project.
|
99
104
|
|
100
105
|
### Rails apps
|
101
106
|
|
102
|
-
If you're developing a Rails app,
|
107
|
+
If you're developing a Rails app,
|
108
|
+
add the following to your Gemfile:
|
103
109
|
|
104
110
|
``` ruby
|
105
|
-
|
111
|
+
group :test do
|
112
|
+
gem "super_diff"
|
113
|
+
end
|
106
114
|
```
|
107
115
|
|
108
|
-
After running `bundle install`,
|
116
|
+
After running `bundle install`,
|
117
|
+
add the following to your `rails_helper`:
|
109
118
|
|
110
119
|
``` ruby
|
111
120
|
require "super_diff/rspec-rails"
|
112
121
|
```
|
113
122
|
|
114
|
-
|
123
|
+
### Projects using some part of Rails (e.g. ActiveModel)
|
124
|
+
|
125
|
+
If you're developing an app using Hanami or Sinatra,
|
126
|
+
or merely using a part of Rails such as ActiveModel,
|
127
|
+
add the following to your Gemfile where appropriate:
|
128
|
+
|
129
|
+
``` ruby
|
130
|
+
gem "super_diff"
|
131
|
+
```
|
132
|
+
|
133
|
+
After running `bundle install`,
|
134
|
+
add the following to your `spec_helper`:
|
135
|
+
|
136
|
+
``` ruby
|
137
|
+
require "super_diff/rspec"
|
138
|
+
require "super_diff/active_support"
|
139
|
+
```
|
115
140
|
|
116
|
-
###
|
141
|
+
### Gems
|
117
142
|
|
118
|
-
If you're developing a
|
143
|
+
If you're developing a gem,
|
144
|
+
add the following to your gemspec:
|
119
145
|
|
120
146
|
``` ruby
|
121
147
|
spec.add_development_dependency "super_diff"
|
@@ -127,72 +153,76 @@ Now add the following to your `spec_helper`:
|
|
127
153
|
require "super_diff/rspec"
|
128
154
|
```
|
129
155
|
|
130
|
-
You're done!
|
131
|
-
|
132
156
|
## Configuration
|
133
157
|
|
134
|
-
As capable as this library is,
|
135
|
-
|
136
|
-
|
137
|
-
your
|
158
|
+
As capable as this library is,
|
159
|
+
it doesn't know how to deal with every kind of object out there.
|
160
|
+
If you have a custom class,
|
161
|
+
and instances of your class aren't appearing in diffs like you like,
|
162
|
+
you might find it necessary to instruct the gem on how to handle them.
|
163
|
+
In that case
|
164
|
+
you would add something like this to your test helper file
|
165
|
+
(`rails_helper` or `spec_helper`):
|
138
166
|
|
139
167
|
``` ruby
|
140
|
-
SuperDiff
|
168
|
+
SuperDiff.configure do |config|
|
141
169
|
config.add_extra_differ_class(YourDiffer)
|
142
|
-
config.
|
170
|
+
config.add_extra_operation_tree_builder_class(YourOperationTreeBuilder)
|
171
|
+
config.add_extra_operation_tree_class(YourOperationTree)
|
143
172
|
config.add_extra_diff_formatter_class(YourDiffFormatter)
|
144
173
|
end
|
145
174
|
```
|
146
175
|
|
147
|
-
*(More info here in the future on adding a custom differ,
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
If you encounter a bug or have an idea for how this could be better, feel free
|
153
|
-
to [create an issue](https://github.com/mcmire/super_diff/issues).
|
176
|
+
*(More info here in the future on adding a custom differ,
|
177
|
+
operation tree builder,
|
178
|
+
operation tree,
|
179
|
+
and diff formatter.
|
180
|
+
Also explanations on what these are.)*
|
154
181
|
|
155
|
-
|
156
|
-
this repo. Then, when you've cloned your fork, run:
|
182
|
+
## Support
|
157
183
|
|
158
|
-
|
159
|
-
|
160
|
-
|
184
|
+
My goal for this library is to improve your development experience.
|
185
|
+
If this is not the case,
|
186
|
+
and you encounter a bug or have a suggestion,
|
187
|
+
feel free to [create an issue][issues-list].
|
188
|
+
I'll try to respond to it as soon as I can!
|
161
189
|
|
162
|
-
|
163
|
-
tests:
|
190
|
+
[issues-list]: https://github.com/mcmire/super_diff/issues
|
164
191
|
|
165
|
-
|
166
|
-
bundle exec rake
|
167
|
-
```
|
192
|
+
## Contributing
|
168
193
|
|
169
|
-
|
194
|
+
Any code contributions to improve this library are welcome!
|
195
|
+
Please see the [contributing](./CONTRIBUTING.md) document for more on how to do that.
|
170
196
|
|
171
|
-
|
172
|
-
bin/rspec spec/integration/...
|
173
|
-
bin/rspec spec/unit/...
|
174
|
-
```
|
197
|
+
## Sponsoring
|
175
198
|
|
176
|
-
|
199
|
+
If there's a change you want implemented, you can choose to sponsor that change!
|
200
|
+
`super_diff` is set up on IssueHunt,
|
201
|
+
so feel free to search for an existing issue (or make your own)
|
202
|
+
and [add a bounty](https://issuehunt.io/r/mcmire/super_diff/issues).
|
203
|
+
I'll get notified right away!
|
177
204
|
|
178
205
|
## Compatibility
|
179
206
|
|
180
|
-
`super_diff` is [tested][travis] to work with
|
181
|
-
|
207
|
+
`super_diff` is [tested][travis] to work with
|
208
|
+
Ruby >= 2.4.x,
|
209
|
+
RSpec 3.x,
|
210
|
+
and Rails >= 5.x.
|
182
211
|
|
183
212
|
[travis]: http://travis-ci.org/mcmire/super_diff
|
184
213
|
|
185
214
|
## Inspiration/Thanks
|
186
215
|
|
187
|
-
In developing this gem
|
216
|
+
In developing this gem
|
217
|
+
I made use of or was heavily inspired by these libraries:
|
188
218
|
|
189
|
-
* [Diff::LCS][diff-lcs],
|
190
|
-
this gem][original-version]
|
191
|
-
|
192
|
-
|
193
|
-
the [inspectors][inspection-tree].
|
219
|
+
* [Diff::LCS][diff-lcs],
|
220
|
+
the library I started with in the [original version of this gem][original-version]
|
221
|
+
(made in 2011!)
|
222
|
+
* The pretty-printing algorithms and API within [PrettyPrinter][pretty-printer] and [AwesomePrint][awesome-print],
|
223
|
+
from which I borrowed ideas to develop the [inspectors][inspection-tree].
|
194
224
|
|
195
|
-
Thank you
|
225
|
+
Thank you to the authors of these libraries!
|
196
226
|
|
197
227
|
[original-version]: https://github.com/mcmire/super_diff/tree/old-master
|
198
228
|
[diff-lcs]: https://github.com/halostatue/diff-lcs
|
@@ -200,6 +230,7 @@ Thank you so much!
|
|
200
230
|
[awesome-print]: https://github.com/awesome-print/awesome_print
|
201
231
|
[inspection-tree]: https://github.com/mcmire/super_diff/blob/master/lib/super_diff/object_inspection/inspection_tree.rb
|
202
232
|
|
203
|
-
##
|
233
|
+
## Author/License
|
204
234
|
|
205
|
-
|
235
|
+
`super_diff` was created and is maintained by Elliot Winkler.
|
236
|
+
It is released under the [MIT license](LICENSE).
|
data/lib/super_diff.rb
CHANGED
@@ -7,23 +7,17 @@ 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"
|
17
16
|
autoload :Helpers, "super_diff/helpers"
|
18
|
-
autoload :
|
19
|
-
autoload(
|
20
|
-
:NoOperationalSequencerAvailableError,
|
21
|
-
"super_diff/no_operational_sequencer_available_error",
|
22
|
-
)
|
17
|
+
autoload :ImplementationChecks, "super_diff/implementation_checks"
|
23
18
|
autoload :ObjectInspection, "super_diff/object_inspection"
|
24
|
-
autoload :
|
25
|
-
autoload :
|
26
|
-
autoload :OperationSequences, "super_diff/operation_sequences"
|
19
|
+
autoload :OperationTrees, "super_diff/operation_trees"
|
20
|
+
autoload :OperationTreeBuilders, "super_diff/operation_tree_builders"
|
27
21
|
autoload :Operations, "super_diff/operations"
|
28
22
|
autoload :RecursionGuard, "super_diff/recursion_guard"
|
29
23
|
|
@@ -33,4 +27,19 @@ module SuperDiff
|
|
33
27
|
border: :blue,
|
34
28
|
header: :white,
|
35
29
|
}.freeze
|
30
|
+
|
31
|
+
def self.configure
|
32
|
+
yield configuration
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.configuration
|
36
|
+
@_configuration ||= Configuration.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.time_like?(value)
|
40
|
+
# Check for ActiveSupport's #acts_like_time? for their time-like objects
|
41
|
+
# (like ActiveSupport::TimeWithZone).
|
42
|
+
(value.respond_to?(:acts_like_time?) && value.acts_like_time?) ||
|
43
|
+
value.is_a?(Time)
|
44
|
+
end
|
36
45
|
end
|
@@ -9,33 +9,31 @@ module SuperDiff
|
|
9
9
|
"super_diff/active_record/object_inspection",
|
10
10
|
)
|
11
11
|
autoload(
|
12
|
-
:
|
13
|
-
"super_diff/active_record/
|
12
|
+
:OperationTrees,
|
13
|
+
"super_diff/active_record/operation_trees",
|
14
14
|
)
|
15
15
|
autoload(
|
16
|
-
:
|
17
|
-
"super_diff/active_record/
|
16
|
+
:OperationTreeBuilders,
|
17
|
+
"super_diff/active_record/operation_tree_builders",
|
18
18
|
)
|
19
|
-
end
|
20
|
-
end
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
40
|
-
SuperDiff::ActiveRecord::ObjectInspection::MapExtension,
|
41
|
-
)
|
39
|
+
require "super_diff/active_record/monkey_patches"
|
@@ -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?(
|
6
|
-
|
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
|
-
|
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
|
-
|
12
|
+
operation_tree,
|
13
13
|
indent_level: indent_level,
|
14
14
|
)
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
-
def
|
20
|
-
|
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
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# rubocop:disable Style/BracesAroundHashParameters, Style/ClassAndModuleChildren
|
2
|
+
class ActiveRecord::Base
|
3
|
+
def attributes_for_super_diff
|
4
|
+
(attributes.keys.sort - ["id"]).reduce({ id: id }) do |hash, key|
|
5
|
+
hash.merge(key.to_sym => attributes[key])
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
# rubocop:enable Style/BracesAroundHashParameters, Style/ClassAndModuleChildren
|
@@ -2,35 +2,45 @@ module SuperDiff
|
|
2
2
|
module ActiveRecord
|
3
3
|
module ObjectInspection
|
4
4
|
module Inspectors
|
5
|
-
ActiveRecordModel
|
6
|
-
|
7
|
-
|
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
|
-
|
11
|
-
add_text "{"
|
12
|
-
end
|
10
|
+
protected
|
13
11
|
|
14
|
-
|
15
|
-
|
12
|
+
def inspection_tree
|
13
|
+
SuperDiff::ObjectInspection::InspectionTree.new do
|
14
|
+
add_text do |object|
|
15
|
+
"#<#{object.class} "
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
22
|
+
nested do |object|
|
23
|
+
add_break
|
28
24
|
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
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
|