super_diff 0.5.3 → 0.6.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 +46 -19
- data/lib/super_diff.rb +1 -7
- data/lib/super_diff/colorized_document_extensions.rb +4 -4
- data/lib/super_diff/configuration.rb +32 -22
- data/lib/super_diff/csi.rb +2 -1
- data/lib/super_diff/diff_formatters/collection.rb +1 -1
- data/lib/super_diff/diff_formatters/multiline_string.rb +4 -4
- data/lib/super_diff/equality_matchers/array.rb +2 -2
- data/lib/super_diff/equality_matchers/default.rb +2 -2
- data/lib/super_diff/equality_matchers/hash.rb +2 -2
- data/lib/super_diff/equality_matchers/multiline_string.rb +2 -2
- data/lib/super_diff/equality_matchers/primitive.rb +2 -2
- data/lib/super_diff/equality_matchers/singleline_string.rb +2 -2
- data/lib/super_diff/gem_version.rb +45 -0
- data/lib/super_diff/rspec.rb +7 -0
- data/lib/super_diff/rspec/matcher_text_builders/base.rb +7 -7
- data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +6 -6
- data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +1 -1
- data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +4 -4
- data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +1 -1
- data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +5 -5
- data/lib/super_diff/rspec/monkey_patches.rb +21 -13
- data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +12 -1
- data/lib/super_diff/version.rb +1 -1
- data/spec/examples.txt +390 -5
- data/spec/integration/rspec/be_falsey_matcher_spec.rb +10 -10
- data/spec/integration/rspec/be_matcher_spec.rb +100 -100
- data/spec/integration/rspec/be_nil_matcher_spec.rb +10 -10
- data/spec/integration/rspec/be_predicate_matcher_spec.rb +103 -103
- data/spec/integration/rspec/be_truthy_matcher_spec.rb +10 -10
- data/spec/integration/rspec/contain_exactly_matcher_spec.rb +107 -107
- data/spec/integration/rspec/eq_matcher_spec.rb +230 -230
- data/spec/integration/rspec/have_attributes_matcher_spec.rb +129 -129
- data/spec/integration/rspec/have_predicate_matcher_spec.rb +65 -65
- data/spec/integration/rspec/include_matcher_spec.rb +73 -73
- data/spec/integration/rspec/match_array_matcher_spec.rb +119 -119
- data/spec/integration/rspec/match_matcher_spec.rb +274 -274
- data/spec/integration/rspec/raise_error_matcher_spec.rb +86 -86
- data/spec/integration/rspec/respond_to_matcher_spec.rb +240 -240
- data/spec/integration/rspec/third_party_matcher_spec.rb +8 -8
- data/spec/integration/rspec/unhandled_errors_spec.rb +5 -5
- data/spec/spec_helper.rb +22 -13
- data/spec/support/integration/helpers.rb +6 -2
- data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +1 -1
- data/spec/support/integration/test_programs/base.rb +2 -0
- data/spec/support/integration/test_programs/rspec_active_record.rb +1 -1
- data/spec/support/integration/test_programs/rspec_active_support.rb +17 -0
- data/spec/support/integration/test_programs/rspec_rails.rb +1 -1
- data/spec/support/shared_examples/active_record.rb +108 -108
- data/spec/support/shared_examples/hash_with_indifferent_access.rb +196 -232
- data/spec/tmp/integration_spec.rb +15 -0
- data/spec/unit/equality_matchers/main_spec.rb +403 -403
- data/super_diff.gemspec +1 -1
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fc8e5b83b3b02559e96bbd06f8703b688d56b32588639f7d49a4774d6869433
|
4
|
+
data.tar.gz: 5f0c9d472aa1170df1a52cc41eab384c4526342cf336e380cdbd01f9e95a3b61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24306d1fba59520092a8a446e0a9219a3e9e89813fd3818f2769f737084cc8f6565b12497c86bacb4b9a8f9c5a4b13bafe0479e330cc8169a6c574e11cc74a56
|
7
|
+
data.tar.gz: 514af50e6272ae3095b752d778b7f3bc776923bccb87a2ab8a50c2f8019c9aba991e129d2dad88248c621594ab5972029a798ada0e64eb8f8a27acc0e7cde496
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
# SuperDiff [![Gem Version][version-badge]][rubygems] [![Build Status][
|
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
|
-
[
|
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
7
|
[hound]: https://houndci.com
|
8
8
|
[issuehunt-badge]: https://img.shields.io/badge/sponsored_through-IssueHunt-2EC28C
|
@@ -155,14 +155,47 @@ require "super_diff/rspec"
|
|
155
155
|
|
156
156
|
## Configuration
|
157
157
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
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:
|
163
|
+
|
164
|
+
``` ruby
|
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:
|
166
199
|
|
167
200
|
``` ruby
|
168
201
|
SuperDiff.configure do |config|
|
@@ -173,12 +206,6 @@ SuperDiff.configure do |config|
|
|
173
206
|
end
|
174
207
|
```
|
175
208
|
|
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.)*
|
181
|
-
|
182
209
|
## Support
|
183
210
|
|
184
211
|
My goal for this library is to improve your development experience.
|
@@ -204,12 +231,12 @@ I'll get notified right away!
|
|
204
231
|
|
205
232
|
## Compatibility
|
206
233
|
|
207
|
-
`super_diff` is [tested][
|
234
|
+
`super_diff` is [tested][gh-actions] to work with
|
208
235
|
Ruby >= 2.5.x,
|
209
236
|
RSpec 3.x,
|
210
237
|
and Rails >= 5.x.
|
211
238
|
|
212
|
-
[
|
239
|
+
[gh-actions]: https://github.com/mcmire/super_diff/actions?query=workflow%3ASuperDiff
|
213
240
|
|
214
241
|
## Inspiration/Thanks
|
215
242
|
|
@@ -232,5 +259,5 @@ Thank you to the authors of these libraries!
|
|
232
259
|
|
233
260
|
## Author/License
|
234
261
|
|
235
|
-
|
262
|
+
SuperDiff was created and is maintained by Elliot Winkler.
|
236
263
|
It is released under the [MIT license](LICENSE).
|
data/lib/super_diff.rb
CHANGED
@@ -13,6 +13,7 @@ module SuperDiff
|
|
13
13
|
autoload :Differs, "super_diff/differs"
|
14
14
|
autoload :EqualityMatchers, "super_diff/equality_matchers"
|
15
15
|
autoload :Errors, "super_diff/errors"
|
16
|
+
autoload :GemVersion, "super_diff/gem_version"
|
16
17
|
autoload :Helpers, "super_diff/helpers"
|
17
18
|
autoload :ImplementationChecks, "super_diff/implementation_checks"
|
18
19
|
autoload :ObjectInspection, "super_diff/object_inspection"
|
@@ -21,13 +22,6 @@ module SuperDiff
|
|
21
22
|
autoload :Operations, "super_diff/operations"
|
22
23
|
autoload :RecursionGuard, "super_diff/recursion_guard"
|
23
24
|
|
24
|
-
COLORS = {
|
25
|
-
alpha: :magenta,
|
26
|
-
beta: :yellow,
|
27
|
-
border: :blue,
|
28
|
-
header: :white,
|
29
|
-
}.freeze
|
30
|
-
|
31
25
|
def self.configure
|
32
26
|
yield configuration
|
33
27
|
end
|
@@ -6,12 +6,12 @@ module SuperDiff
|
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
colorize(*args, **opts, fg: SuperDiff
|
9
|
+
def expected(*args, **opts, &block)
|
10
|
+
colorize(*args, **opts, fg: SuperDiff.configuration.expected_color, &block)
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
colorize(*args, **opts, fg: SuperDiff
|
13
|
+
def actual(*args, **opts, &block)
|
14
|
+
colorize(*args, **opts, fg: SuperDiff.configuration.actual_color, &block)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -1,26 +1,54 @@
|
|
1
1
|
module SuperDiff
|
2
2
|
class Configuration
|
3
3
|
attr_reader(
|
4
|
+
:extra_diff_formatter_classes,
|
4
5
|
:extra_differ_classes,
|
6
|
+
:extra_inspector_classes,
|
5
7
|
:extra_operation_tree_builder_classes,
|
6
8
|
:extra_operation_tree_classes,
|
7
|
-
|
8
|
-
|
9
|
+
)
|
10
|
+
attr_accessor(
|
11
|
+
:actual_color,
|
12
|
+
:border_color,
|
13
|
+
:expected_color,
|
14
|
+
:header_color,
|
9
15
|
)
|
10
16
|
|
11
17
|
def initialize
|
18
|
+
@actual_color = :yellow
|
19
|
+
@border_color = :blue
|
20
|
+
@expected_color = :magenta
|
21
|
+
@extra_diff_formatter_classes = [].freeze
|
12
22
|
@extra_differ_classes = [].freeze
|
23
|
+
@extra_inspector_classes = [].freeze
|
13
24
|
@extra_operation_tree_builder_classes = [].freeze
|
14
25
|
@extra_operation_tree_classes = [].freeze
|
15
|
-
@
|
16
|
-
@extra_inspector_classes = [].freeze
|
26
|
+
@header_color = :white
|
17
27
|
end
|
18
28
|
|
29
|
+
def add_extra_diff_formatter_classes(*classes)
|
30
|
+
@extra_diff_formatter_classes =
|
31
|
+
(@extra_diff_formatter_classes + classes).freeze
|
32
|
+
end
|
33
|
+
alias_method(
|
34
|
+
:add_extra_diff_formatter_class,
|
35
|
+
:add_extra_diff_formatter_classes,
|
36
|
+
)
|
37
|
+
|
19
38
|
def add_extra_differ_classes(*classes)
|
20
39
|
@extra_differ_classes = (@extra_differ_classes + classes).freeze
|
21
40
|
end
|
22
41
|
alias_method :add_extra_differ_class, :add_extra_differ_classes
|
23
42
|
|
43
|
+
def add_extra_inspector_classes(*classes)
|
44
|
+
@extra_inspector_classes =
|
45
|
+
(@extra_inspector_classes + classes).freeze
|
46
|
+
end
|
47
|
+
alias_method(
|
48
|
+
:add_extra_inspector_class,
|
49
|
+
:add_extra_inspector_classes,
|
50
|
+
)
|
51
|
+
|
24
52
|
def add_extra_operation_tree_builder_classes(*classes)
|
25
53
|
@extra_operation_tree_builder_classes =
|
26
54
|
(@extra_operation_tree_builder_classes + classes).freeze
|
@@ -38,23 +66,5 @@ module SuperDiff
|
|
38
66
|
:add_extra_operation_tree_class,
|
39
67
|
:add_extra_operation_tree_classes,
|
40
68
|
)
|
41
|
-
|
42
|
-
def add_extra_diff_formatter_classes(*classes)
|
43
|
-
@extra_diff_formatter_classes =
|
44
|
-
(@extra_diff_formatter_classes + classes).freeze
|
45
|
-
end
|
46
|
-
alias_method(
|
47
|
-
:add_extra_diff_formatter_class,
|
48
|
-
:add_extra_diff_formatter_classes,
|
49
|
-
)
|
50
|
-
|
51
|
-
def add_extra_inspector_classes(*classes)
|
52
|
-
@extra_inspector_classes =
|
53
|
-
(@extra_inspector_classes + classes).freeze
|
54
|
-
end
|
55
|
-
alias_method(
|
56
|
-
:add_extra_inspector_class,
|
57
|
-
:add_extra_inspector_classes,
|
58
|
-
)
|
59
69
|
end
|
60
70
|
end
|
data/lib/super_diff/csi.rb
CHANGED
@@ -15,12 +15,12 @@ module SuperDiff
|
|
15
15
|
operation_tree.reduce([]) do |array, operation|
|
16
16
|
case operation.name
|
17
17
|
when :change
|
18
|
-
array << Helpers.style(:
|
19
|
-
array << Helpers.style(:
|
18
|
+
array << Helpers.style(:expected, "- #{operation.left_value}")
|
19
|
+
array << Helpers.style(:actual, "+ #{operation.right_value}")
|
20
20
|
when :delete
|
21
|
-
array << Helpers.style(:
|
21
|
+
array << Helpers.style(:expected, "- #{operation.value}")
|
22
22
|
when :insert
|
23
|
-
array << Helpers.style(:
|
23
|
+
array << Helpers.style(:actual, "+ #{operation.value}")
|
24
24
|
else
|
25
25
|
array << Helpers.style(:plain, " #{operation.value}")
|
26
26
|
end
|
@@ -11,14 +11,14 @@ module SuperDiff
|
|
11
11
|
|
12
12
|
#{
|
13
13
|
Helpers.style(
|
14
|
-
:
|
14
|
+
:expected,
|
15
15
|
"Expected: " +
|
16
16
|
ObjectInspection.inspect(expected, as_single_line: true),
|
17
17
|
)
|
18
18
|
}
|
19
19
|
#{
|
20
20
|
Helpers.style(
|
21
|
-
:
|
21
|
+
:actual,
|
22
22
|
" Actual: " +
|
23
23
|
ObjectInspection.inspect(actual, as_single_line: true),
|
24
24
|
)
|
@@ -19,7 +19,7 @@ module SuperDiff
|
|
19
19
|
|
20
20
|
def expected_line
|
21
21
|
Helpers.style(
|
22
|
-
:
|
22
|
+
:expected,
|
23
23
|
"Expected: " +
|
24
24
|
ObjectInspection.inspect(expected, as_single_line: true),
|
25
25
|
)
|
@@ -27,7 +27,7 @@ module SuperDiff
|
|
27
27
|
|
28
28
|
def actual_line
|
29
29
|
Helpers.style(
|
30
|
-
:
|
30
|
+
:actual,
|
31
31
|
" Actual: " +
|
32
32
|
ObjectInspection.inspect(actual, as_single_line: true),
|
33
33
|
)
|
@@ -11,14 +11,14 @@ module SuperDiff
|
|
11
11
|
|
12
12
|
#{
|
13
13
|
Helpers.style(
|
14
|
-
:
|
14
|
+
:expected,
|
15
15
|
"Expected: " +
|
16
16
|
ObjectInspection.inspect(expected, as_single_line: true),
|
17
17
|
)
|
18
18
|
}
|
19
19
|
#{
|
20
20
|
Helpers.style(
|
21
|
-
:
|
21
|
+
:actual,
|
22
22
|
" Actual: " +
|
23
23
|
ObjectInspection.inspect(actual, as_single_line: true),
|
24
24
|
)
|
@@ -12,14 +12,14 @@ module SuperDiff
|
|
12
12
|
#{
|
13
13
|
# TODO: This whole thing should not be red or green, just the values
|
14
14
|
Helpers.style(
|
15
|
-
:
|
15
|
+
:expected,
|
16
16
|
"Expected: " +
|
17
17
|
ObjectInspection.inspect(expected, as_single_line: true),
|
18
18
|
)
|
19
19
|
}
|
20
20
|
#{
|
21
21
|
Helpers.style(
|
22
|
-
:
|
22
|
+
:actual,
|
23
23
|
" Actual: " +
|
24
24
|
ObjectInspection.inspect(actual, as_single_line: true),
|
25
25
|
)
|
@@ -15,14 +15,14 @@ module SuperDiff
|
|
15
15
|
|
16
16
|
#{
|
17
17
|
Helpers.style(
|
18
|
-
:
|
18
|
+
:expected,
|
19
19
|
"Expected: " +
|
20
20
|
ObjectInspection.inspect(expected, as_single_line: true),
|
21
21
|
)
|
22
22
|
}
|
23
23
|
#{
|
24
24
|
Helpers.style(
|
25
|
-
:
|
25
|
+
:actual,
|
26
26
|
" Actual: " +
|
27
27
|
ObjectInspection.inspect(actual, as_single_line: true),
|
28
28
|
)
|
@@ -11,14 +11,14 @@ module SuperDiff
|
|
11
11
|
|
12
12
|
#{
|
13
13
|
Helpers.style(
|
14
|
-
:
|
14
|
+
:expected,
|
15
15
|
"Expected: " +
|
16
16
|
ObjectInspection.inspect(expected, as_single_line: true),
|
17
17
|
)
|
18
18
|
}
|
19
19
|
#{
|
20
20
|
Helpers.style(
|
21
|
-
:
|
21
|
+
:actual,
|
22
22
|
" Actual: " +
|
23
23
|
ObjectInspection.inspect(actual, as_single_line: true),
|
24
24
|
)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module SuperDiff
|
2
|
+
class GemVersion
|
3
|
+
def initialize(version)
|
4
|
+
@version = Gem::Version.new(version.to_s)
|
5
|
+
end
|
6
|
+
|
7
|
+
def <(other)
|
8
|
+
compare?(:<, other)
|
9
|
+
end
|
10
|
+
|
11
|
+
def <=(other)
|
12
|
+
compare?(:<=, other)
|
13
|
+
end
|
14
|
+
|
15
|
+
def ==(other)
|
16
|
+
compare?(:==, other)
|
17
|
+
end
|
18
|
+
|
19
|
+
def >=(other)
|
20
|
+
compare?(:>=, other)
|
21
|
+
end
|
22
|
+
|
23
|
+
def >(other)
|
24
|
+
compare?(:>, other)
|
25
|
+
end
|
26
|
+
|
27
|
+
def =~(other)
|
28
|
+
Gem::Requirement.new(other).satisfied_by?(version)
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s
|
32
|
+
version.to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :version
|
38
|
+
|
39
|
+
def compare?(operator, other_version)
|
40
|
+
Gem::Requirement.
|
41
|
+
new("#{operator} #{other_version}").
|
42
|
+
satisfied_by?(version)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/super_diff/rspec.rb
CHANGED
@@ -61,6 +61,13 @@ module SuperDiff
|
|
61
61
|
value.is_a?(::RSpec::Matchers::AliasedMatcher)
|
62
62
|
end
|
63
63
|
|
64
|
+
def self.rspec_version
|
65
|
+
@_rspec_version ||= begin
|
66
|
+
require "rspec/core/version"
|
67
|
+
GemVersion.new(::RSpec::Core::Version::STRING)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
64
71
|
SuperDiff.configuration.tap do |config|
|
65
72
|
config.add_extra_differ_classes(
|
66
73
|
Differs::CollectionContainingExactly,
|
@@ -45,12 +45,12 @@ module SuperDiff
|
|
45
45
|
def add_extra_after_error
|
46
46
|
end
|
47
47
|
|
48
|
-
def
|
49
|
-
SuperDiff
|
48
|
+
def actual_color
|
49
|
+
SuperDiff.configuration.actual_color
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
53
|
-
SuperDiff
|
52
|
+
def expected_color
|
53
|
+
SuperDiff.configuration.expected_color
|
54
54
|
end
|
55
55
|
|
56
56
|
private
|
@@ -91,7 +91,7 @@ module SuperDiff
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def add_actual_value
|
94
|
-
template.add_text_in_color(
|
94
|
+
template.add_text_in_color(actual_color) { actual }
|
95
95
|
end
|
96
96
|
|
97
97
|
def expected_section
|
@@ -110,7 +110,7 @@ module SuperDiff
|
|
110
110
|
else
|
111
111
|
template.add_text " "
|
112
112
|
template.add_text_in_color(
|
113
|
-
|
113
|
+
expected_color,
|
114
114
|
expected_for_failure_message,
|
115
115
|
)
|
116
116
|
end
|
@@ -121,7 +121,7 @@ module SuperDiff
|
|
121
121
|
add_expected_value_to(template, expected_for_description)
|
122
122
|
else
|
123
123
|
template.add_text " "
|
124
|
-
template.add_text_in_color(
|
124
|
+
template.add_text_in_color(expected_color, expected_for_description)
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|