Skip to content

Commit 196991a

Browse files
committed
Add integration with RSpec
Right now, RSpec doesn't support replacing its differ with a custom implementation. Therefore, we have to resort to monkey-patching some internal RSpec classes to use SuperDiff instead. While we're at it, disable some of the coloring that RSpec does, particularly its habit of styling failures in blood red. We want to be able to show off the diff and all of its glory and this just gets in the way.
1 parent 8f47e11 commit 196991a

File tree

15 files changed

+829
-69
lines changed

15 files changed

+829
-69
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
.DS_Store
22
spec/examples.txt
3+
tmp

lib/super_diff.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@
4343

4444
require_relative "super_diff/differs/base"
4545
require_relative "super_diff/differs/array"
46+
require_relative "super_diff/differs/empty"
4647
require_relative "super_diff/differs/hash"
47-
require_relative "super_diff/differs/string"
48+
require_relative "super_diff/differs/multi_line_string"
4849
require_relative "super_diff/differs/object"
4950
require_relative "super_diff/differs"
5051
require_relative "super_diff/differ"

lib/super_diff/differ.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ def self.call(*args)
77
def initialize(
88
expected,
99
actual,
10-
indent_level:,
10+
indent_level: 0,
1111
index_in_collection: nil,
1212
extra_classes: [],
1313
extra_operational_sequencer_classes: [],
@@ -35,6 +35,10 @@ def call
3535

3636
private
3737

38+
attr_reader :expected, :actual, :indent_level, :index_in_collection,
39+
:extra_classes, :extra_operational_sequencer_classes,
40+
:extra_diff_formatter_classes
41+
3842
def resolved_class
3943
(Differs::DEFAULTS + extra_classes).detect do |klass|
4044
klass.applies_to?(expected) && klass.applies_to?(actual)

lib/super_diff/differs.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module SuperDiff
22
module Differs
3-
DEFAULTS = [Array, Hash, String, Object]
3+
DEFAULTS = [Array, Hash, MultiLineString, Object, Empty]
44
end
55
end

lib/super_diff/differs/empty.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module SuperDiff
2+
module Differs
3+
class Empty < Base
4+
def self.applies_to?(value)
5+
true
6+
end
7+
8+
def call
9+
""
10+
end
11+
end
12+
end
13+
end
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module SuperDiff
2+
module Differs
3+
class MultiLineString < Base
4+
def self.applies_to?(value)
5+
value.is_a?(::String) && value.include?("\n")
6+
end
7+
8+
def call
9+
DiffFormatters::MultiLineString.call(
10+
operations,
11+
indent_level: indent_level
12+
)
13+
end
14+
15+
private
16+
17+
def operations
18+
OperationalSequencers::MultiLineString.call(
19+
expected: expected,
20+
actual: actual,
21+
extra_operational_sequencer_classes: extra_operational_sequencer_classes,
22+
extra_diff_formatter_classes: extra_diff_formatter_classes
23+
)
24+
end
25+
end
26+
end
27+
end

lib/super_diff/differs/string.rb

Lines changed: 0 additions & 53 deletions
This file was deleted.

lib/super_diff/equality_matchers/multi_line_string.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,12 @@ def fail
3131
private
3232

3333
def diff
34-
DiffFormatters::MultiLineString.call(operations, indent_level: 0)
35-
end
36-
37-
def operations
38-
OperationalSequencers::MultiLineString.call(
39-
expected: expected,
40-
actual: actual
34+
Differs::MultiLineString.call(
35+
expected,
36+
actual,
37+
indent_level: 0,
38+
extra_operational_sequencer_classes: extra_operational_sequencer_classes,
39+
extra_diff_formatter_classes: extra_diff_formatter_classes
4140
)
4241
end
4342
end

lib/super_diff/rspec.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
require_relative "../super_diff"
2+
require_relative "rspec/differ"
3+
require_relative "rspec/monkey_patches"
4+
5+
module SuperDiff
6+
module RSpec
7+
class << self
8+
attr_accessor :extra_operational_sequencer_classes
9+
attr_accessor :extra_diff_formatter_classes
10+
11+
def configure
12+
yield self
13+
end
14+
end
15+
16+
self.extra_operational_sequencer_classes = []
17+
self.extra_diff_formatter_classes = []
18+
end
19+
end

lib/super_diff/rspec/differ.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module SuperDiff
2+
module RSpec
3+
module Differ
4+
def self.diff(actual, expected)
5+
diff = SuperDiff::Differ.call(
6+
expected,
7+
actual,
8+
extra_operational_sequencer_classes: RSpec.extra_operational_sequencer_classes,
9+
extra_diff_formatter_classes: RSpec.extra_diff_formatter_classes
10+
)
11+
"\n\n" + diff
12+
end
13+
end
14+
end
15+
end

0 commit comments

Comments
 (0)