Skip to content

Commit c67b963

Browse files
committed
Add support for diffing ActiveRecord::Relation objects
1 parent 4718aa4 commit c67b963

29 files changed

+563
-192
lines changed

lib/super_diff.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ module SuperDiff
99
autoload :DiffFormatters, "super_diff/diff_formatters"
1010
autoload :Differ, "super_diff/differ"
1111
autoload :Differs, "super_diff/differs"
12+
autoload :EqualityMatcher, "super_diff/equality_matcher"
13+
autoload :EqualityMatchers, "super_diff/equality_matchers"
14+
autoload :Helpers, "super_diff/helpers"
15+
autoload :NoDifferAvailableError, "super_diff/no_differ_available_error"
1216
autoload(
1317
:NoOperationalSequencerAvailableError,
1418
"super_diff/no_operational_sequencer_available_error",
1519
)
16-
autoload :EqualityMatcher, "super_diff/equality_matcher"
17-
autoload :EqualityMatchers, "super_diff/equality_matchers"
18-
autoload :Helpers, "super_diff/helpers"
1920
autoload :ObjectInspection, "super_diff/object_inspection"
2021
autoload :OperationalSequencer, "super_diff/operational_sequencer"
2122
autoload :OperationalSequencers, "super_diff/operational_sequencers"

lib/super_diff/active_record.rb

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,37 @@
11
module SuperDiff
22
module ActiveRecord
3+
autoload :DiffFormatters, "super_diff/active_record/diff_formatters"
4+
autoload :Differs, "super_diff/active_record/differs"
35
autoload(
46
:ObjectInspection,
57
"super_diff/active_record/object_inspection",
68
)
79
autoload(
8-
:OperationalSequencer,
9-
"super_diff/active_record/operational_sequencer",
10+
:OperationSequences,
11+
"super_diff/active_record/operation_sequences",
12+
)
13+
autoload(
14+
:OperationalSequencers,
15+
"super_diff/active_record/operational_sequencers",
1016
)
1117
end
1218
end
1319

1420
if defined?(SuperDiff::RSpec)
15-
SuperDiff::RSpec.configuration.add_extra_operational_sequencer_class(
16-
SuperDiff::ActiveRecord::OperationalSequencer,
17-
)
21+
SuperDiff::RSpec.configure do |config|
22+
config.add_extra_differ_class(
23+
SuperDiff::ActiveRecord::Differs::ActiveRecordRelation,
24+
)
25+
config.add_extra_operational_sequencer_class(
26+
SuperDiff::ActiveRecord::OperationalSequencers::ActiveRecordModel,
27+
)
28+
config.add_extra_operational_sequencer_class(
29+
SuperDiff::ActiveRecord::OperationalSequencers::ActiveRecordRelation,
30+
)
31+
config.add_extra_diff_formatter_class(
32+
SuperDiff::ActiveRecord::DiffFormatters::ActiveRecordRelation,
33+
)
34+
end
1835
end
1936

2037
SuperDiff::ObjectInspection.map.prepend(
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module SuperDiff
2+
module ActiveRecord
3+
module DiffFormatters
4+
autoload(
5+
:ActiveRecordRelation,
6+
"super_diff/active_record/diff_formatters/active_record_relation",
7+
)
8+
end
9+
end
10+
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module SuperDiff
2+
module ActiveRecord
3+
module DiffFormatters
4+
class ActiveRecordRelation < SuperDiff::DiffFormatters::Base
5+
def self.applies_to?(operations)
6+
operations.is_a?(OperationSequences::ActiveRecordRelation)
7+
end
8+
9+
def call
10+
SuperDiff::DiffFormatters::Collection.call(
11+
open_token: "#<ActiveRecord::Relation [",
12+
close_token: "]>",
13+
collection_prefix: collection_prefix,
14+
build_item_prefix: proc { "" },
15+
operations: operations,
16+
indent_level: indent_level,
17+
add_comma: add_comma?,
18+
)
19+
end
20+
end
21+
end
22+
end
23+
end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module SuperDiff
2+
module ActiveRecord
3+
module Differs
4+
autoload(
5+
:ActiveRecordRelation,
6+
"super_diff/active_record/differs/active_record_relation",
7+
)
8+
end
9+
end
10+
end
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module SuperDiff
2+
module ActiveRecord
3+
module Differs
4+
class ActiveRecordRelation < SuperDiff::Differs::Base
5+
def self.applies_to?(expected, actual)
6+
expected.is_a?(::Array) &&
7+
actual.is_a?(::ActiveRecord::Relation)
8+
end
9+
10+
def call
11+
DiffFormatters::ActiveRecordRelation.call(
12+
operations,
13+
indent_level: indent_level,
14+
)
15+
end
16+
17+
private
18+
19+
def operations
20+
OperationalSequencers::ActiveRecordRelation.call(
21+
expected: expected,
22+
actual: actual,
23+
extra_operational_sequencer_classes: extra_operational_sequencer_classes,
24+
extra_diff_formatter_classes: extra_diff_formatter_classes,
25+
)
26+
end
27+
end
28+
end
29+
end
30+
end

lib/super_diff/active_record/object_inspection.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ module SuperDiff
22
module ActiveRecord
33
module ObjectInspection
44
autoload(
5-
:Inspector,
6-
"super_diff/active_record/object_inspection/inspector",
5+
:Inspectors,
6+
"super_diff/active_record/object_inspection/inspectors",
77
)
88
autoload(
99
:MapExtension,

lib/super_diff/active_record/object_inspection/inspector.rb

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module SuperDiff
2+
module ActiveRecord
3+
module ObjectInspection
4+
module Inspectors
5+
autoload(
6+
:ActiveRecordModel,
7+
"super_diff/active_record/object_inspection/inspectors/active_record_model",
8+
)
9+
autoload(
10+
:ActiveRecordRelation,
11+
"super_diff/active_record/object_inspection/inspectors/active_record_relation",
12+
)
13+
end
14+
end
15+
end
16+
end
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
module SuperDiff
2+
module ActiveRecord
3+
module ObjectInspection
4+
module Inspectors
5+
ActiveRecordModel = SuperDiff::ObjectInspection::InspectionTree.new do
6+
add_text do |object|
7+
"#<#{object.class} "
8+
end
9+
10+
when_multiline do
11+
add_text "{"
12+
end
13+
14+
nested do |object|
15+
add_break
16+
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
26+
27+
add_break
28+
29+
when_multiline do
30+
add_text "}"
31+
end
32+
33+
add_text ">"
34+
end
35+
end
36+
end
37+
end
38+
end

0 commit comments

Comments
 (0)