Skip to content

Commit fc418c1

Browse files
authored
Reorganize codebase (#230)
In attempting to detail the architecture of this codebase, I realized that it would be easier if the parts of SuperDiff that implemented differs, inspection tree builders, operation tree builders, operation tree flatteners, and operation trees for Ruby objects were split off into their own directory. To that end, alongside RSpec, ActiveRecord, and ActiveSupport, there is now a "Basic" feature module. In addition, to make the file structure a little flatter, I've also renamed `InspectionTreeBuilders` in various feature modules up one level (so, `ObjectInspection::InspectionTreeBuilders` is now simply `InspectionTreeBuilders`). Following this change, SuperDiff can now be divided into 4 layers (here I'm putting CSI in brackets because it's not a public module): ``` ----------------- [SuperDiff::CSI] / / | / SuperDiff::Core ---------------------- | / | \ | \ | /^^^^^^ | SuperDiff::Basic \ | / | / | \ \ | | /^^^^^^^^^^^|^^^^ | ^^^^^^^^^^^^^\ \ SuperDiff::RSpec SuperDiff::ActiveRecord SuperDiff::ActiveSupport ``` Here is a full list of renames: - The following constants that were previously available under `SuperDiff` are now located under `SuperDiff::Core`: - `ColorizedDocumentExtensions` - `Configuration` - `GemVersion` - `Helpers` - `ImplementationChecks` - `Line` - `RecursionGuard` - `TieredLines` - `TieredLinesElider` - `TieredLinesFormatter` - Everything under `SuperDiff::Differs` is now under `SuperDiff::Basic::Differs` - All error classes under `SuperDiff::Errors` have been moved out and are now directly under `SuperDiff::Core` - `SuperDiff::ObjectInspection::InspectionTree` is now `SuperDiff::Core::InspectionTree` - Everything under `SuperDiff::ObjectInspection::InspectionTreeBuilders` is now under `SuperDiff::Core::InspectionTreeBuilders` - Everything under `SuperDiff::ObjectInspection::Nodes` is now under `SuperDiff::Core::InspectionTreeNodes` - Everything under `SuperDiff::OperationTreeBuilders` is now under `SuperDiff::Basic::OperationTreeBuilders` - Everything under `SuperDiff::OperationTreeFlatteners` is now under `SuperDiff::Basic::OperationTreeFlatteners` - Everything under `SuperDiff::OperationTrees` is now under `SuperDiff::Basic::OperationTrees` - Everything under `SuperDiff::Operations` has been moved out and is now directly under `SuperDiff::Core` - Everything under `SuperDiff::ActiveRecord::ObjectInspection::InspectionTreeBuilders` is now under `SuperDiff::ActiveRecord::InspectionTreeBuilders` - Everything under `SuperDiff::ActiveSupport::ObjectInspection::InspectionTreeBuilders` is now under `SuperDiff::ActiveSupport::InspectionTreeBuilders` - Everything under `SuperDiff::RSpec::ObjectInspection::InspectionTreeBuilders` is now under `SuperDiff::RSpec::InspectionTreeBuilders` To maintain backward compatibility, I've left all of the original constants in place, but they will now print deprecation warnings when used. I will remove them in 1.0.0.
1 parent 4625998 commit fc418c1

File tree

221 files changed

+4202
-3504
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

221 files changed

+4202
-3504
lines changed

lib/super_diff.rb

Lines changed: 69 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,93 @@
11
require "attr_extras/explicit"
2-
require "diff-lcs"
3-
require "patience_diff"
42
require "date"
53

64
module SuperDiff
7-
autoload(
8-
:ColorizedDocumentExtensions,
9-
"super_diff/colorized_document_extensions"
10-
)
11-
autoload :OperationTreeFlatteners, "super_diff/operation_tree_flatteners"
12-
autoload :Configuration, "super_diff/configuration"
5+
autoload :Core, "super_diff/core"
136
autoload :Csi, "super_diff/csi"
14-
autoload :DiffFormatters, "super_diff/diff_formatters"
157
autoload :Differs, "super_diff/differs"
168
autoload :EqualityMatchers, "super_diff/equality_matchers"
179
autoload :Errors, "super_diff/errors"
18-
autoload :GemVersion, "super_diff/gem_version"
19-
autoload :Helpers, "super_diff/helpers"
20-
autoload :ImplementationChecks, "super_diff/implementation_checks"
21-
autoload :Line, "super_diff/line"
22-
autoload :TieredLines, "super_diff/tiered_lines"
23-
autoload :TieredLinesElider, "super_diff/tiered_lines_elider"
24-
autoload :TieredLinesFormatter, "super_diff/tiered_lines_formatter"
2510
autoload :ObjectInspection, "super_diff/object_inspection"
26-
autoload :OperationTrees, "super_diff/operation_trees"
2711
autoload :OperationTreeBuilders, "super_diff/operation_tree_builders"
12+
autoload :OperationTreeFlatteners, "super_diff/operation_tree_flatteners"
13+
autoload :OperationTrees, "super_diff/operation_trees"
2814
autoload :Operations, "super_diff/operations"
29-
autoload :RecursionGuard, "super_diff/recursion_guard"
3015
autoload :VERSION, "super_diff/version"
3116

17+
def self.const_missing(missing_const_name)
18+
if Core.const_defined?(missing_const_name)
19+
warn <<~EOT
20+
WARNING: SuperDiff::#{missing_const_name} is deprecated and will be removed in the next major release.
21+
Please use SuperDiff::Core::#{missing_const_name} instead.
22+
#{caller_locations.join("\n")}
23+
EOT
24+
Core.const_get(missing_const_name)
25+
elsif Basic.const_defined?(missing_const_name)
26+
warn <<~EOT
27+
WARNING: SuperDiff::#{missing_const_name} is deprecated and will be removed in the next major release.
28+
Please use SuperDiff::Basic::#{missing_const_name} instead.
29+
#{caller_locations.join("\n")}
30+
EOT
31+
Basic.const_get(missing_const_name)
32+
else
33+
super
34+
end
35+
end
36+
3237
def self.configure
3338
yield configuration
3439
configuration.updated
3540
end
3641

3742
def self.configuration
38-
@_configuration ||= Configuration.new
43+
@_configuration ||= Core::Configuration.new
44+
end
45+
46+
def self.diff(
47+
expected,
48+
actual,
49+
indent_level: 0,
50+
raise_if_nothing_applies: true
51+
)
52+
Core::DifferDispatcher.call(
53+
expected,
54+
actual,
55+
available_classes: configuration.extra_differ_classes,
56+
indent_level: indent_level,
57+
raise_if_nothing_applies: raise_if_nothing_applies
58+
)
59+
end
60+
61+
def self.build_operation_tree_for(
62+
expected,
63+
actual,
64+
extra_operation_tree_builder_classes: [],
65+
raise_if_nothing_applies: false
66+
)
67+
Core::OperationTreeBuilderDispatcher.call(
68+
expected,
69+
actual,
70+
available_classes:
71+
configuration.extra_operation_tree_builder_classes +
72+
extra_operation_tree_builder_classes,
73+
raise_if_nothing_applies: raise_if_nothing_applies
74+
)
75+
end
76+
77+
def self.find_operation_tree_for(value)
78+
SuperDiff::Core::OperationTreeFinder.call(
79+
value,
80+
available_classes: configuration.extra_operation_tree_classes
81+
)
3982
end
4083

4184
def self.inspect_object(object, as_lines:, **rest)
42-
SuperDiff::RecursionGuard.guarding_recursion_of(object) do
85+
Core::RecursionGuard.guarding_recursion_of(object) do
4386
inspection_tree =
44-
ObjectInspection::InspectionTreeBuilders::Main.call(object)
87+
Core::InspectionTreeBuilderDispatcher.call(
88+
object,
89+
available_classes: configuration.extra_inspection_tree_builder_classes
90+
)
4591

4692
if as_lines
4793
inspection_tree.render_to_lines(object, **rest)
@@ -87,3 +133,5 @@ def self.insert_singleton_overrides(target_module, mod = nil, &block)
87133
end
88134
end
89135
end
136+
137+
require "super_diff/basic"

lib/super_diff/active_record.rb

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
11
require "super_diff/active_support"
22

3+
require "super_diff/active_record/differs"
4+
require "super_diff/active_record/inspection_tree_builders"
5+
require "super_diff/active_record/operation_trees"
6+
require "super_diff/active_record/operation_tree_builders"
7+
require "super_diff/active_record/operation_tree_flatteners"
8+
39
module SuperDiff
410
module ActiveRecord
5-
autoload :Differs, "super_diff/active_record/differs"
6-
autoload(:ObjectInspection, "super_diff/active_record/object_inspection")
7-
autoload(:OperationTrees, "super_diff/active_record/operation_trees")
8-
autoload(
9-
:OperationTreeBuilders,
10-
"super_diff/active_record/operation_tree_builders"
11-
)
12-
autoload(
13-
:OperationTreeFlatteners,
14-
"super_diff/active_record/operation_tree_flatteners"
15-
)
11+
autoload :ObjectInspection, "super_diff/active_record/object_inspection"
1612

1713
SuperDiff.configure do |config|
18-
config.add_extra_differ_classes(Differs::ActiveRecordRelation)
19-
config.add_extra_operation_tree_builder_classes(
14+
config.prepend_extra_differ_classes(Differs::ActiveRecordRelation)
15+
config.prepend_extra_operation_tree_builder_classes(
2016
OperationTreeBuilders::ActiveRecordModel,
2117
OperationTreeBuilders::ActiveRecordRelation
2218
)
23-
config.add_extra_inspection_tree_builder_classes(
24-
ObjectInspection::InspectionTreeBuilders::ActiveRecordModel,
25-
ObjectInspection::InspectionTreeBuilders::ActiveRecordRelation
19+
config.prepend_extra_inspection_tree_builder_classes(
20+
InspectionTreeBuilders::ActiveRecordModel,
21+
InspectionTreeBuilders::ActiveRecordRelation
2622
)
2723
end
2824
end

lib/super_diff/active_record/differs/active_record_relation.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module SuperDiff
22
module ActiveRecord
33
module Differs
4-
class ActiveRecordRelation < SuperDiff::Differs::Base
4+
class ActiveRecordRelation < Core::AbstractDiffer
55
def self.applies_to?(expected, actual)
66
expected.is_a?(::Array) && actual.is_a?(::ActiveRecord::Relation)
77
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module SuperDiff
2+
module ActiveRecord
3+
module InspectionTreeBuilders
4+
autoload(
5+
:ActiveRecordModel,
6+
"super_diff/active_record/inspection_tree_builders/active_record_model"
7+
)
8+
autoload(
9+
:ActiveRecordRelation,
10+
"super_diff/active_record/inspection_tree_builders/active_record_relation"
11+
)
12+
end
13+
end
14+
end
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
module SuperDiff
2+
module ActiveRecord
3+
module InspectionTreeBuilders
4+
class ActiveRecordModel < Core::AbstractInspectionTreeBuilder
5+
def self.applies_to?(value)
6+
value.is_a?(::ActiveRecord::Base)
7+
end
8+
9+
def call
10+
Core::InspectionTree.new do |t1|
11+
t1.as_lines_when_rendering_to_lines(
12+
collection_bookend: :open
13+
) do |t2|
14+
t2.add_text "#<#{object.class} "
15+
16+
# stree-ignore
17+
t2.when_rendering_to_lines do |t3|
18+
t3.add_text "{"
19+
end
20+
end
21+
22+
t1.nested do |t2|
23+
t2.insert_separated_list(
24+
["id"] + (object.attributes.keys.sort - ["id"])
25+
) do |t3, name|
26+
t3.as_prefix_when_rendering_to_lines do |t4|
27+
t4.add_text "#{name}: "
28+
end
29+
30+
t3.add_inspection_of object.read_attribute(name)
31+
end
32+
end
33+
34+
t1.as_lines_when_rendering_to_lines(
35+
collection_bookend: :close
36+
) do |t2|
37+
# stree-ignore
38+
t2.when_rendering_to_lines do |t3|
39+
t3.add_text "}"
40+
end
41+
42+
t2.add_text ">"
43+
end
44+
end
45+
end
46+
end
47+
end
48+
end
49+
end
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
module SuperDiff
2+
module ActiveRecord
3+
module InspectionTreeBuilders
4+
class ActiveRecordRelation < Core::AbstractInspectionTreeBuilder
5+
def self.applies_to?(value)
6+
value.is_a?(::ActiveRecord::Relation)
7+
end
8+
9+
def call
10+
Core::InspectionTree.new do |t1|
11+
# stree-ignore
12+
t1.as_lines_when_rendering_to_lines(
13+
collection_bookend: :open
14+
) do |t2|
15+
t2.add_text "#<ActiveRecord::Relation ["
16+
end
17+
18+
# stree-ignore
19+
t1.nested do |t2|
20+
t2.insert_array_inspection_of(object)
21+
end
22+
23+
# stree-ignore
24+
t1.as_lines_when_rendering_to_lines(
25+
collection_bookend: :close
26+
) do |t2|
27+
t2.add_text "]>"
28+
end
29+
end
30+
end
31+
end
32+
end
33+
end
34+
end

lib/super_diff/active_record/monkey_patches.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# rubocop:disable Style/BracesAroundHashParameters, Style/ClassAndModuleChildren
22
class ActiveRecord::Base
3+
# TODO: Remove this monkey patch if possible
34
def attributes_for_super_diff
45
(attributes.keys.sort - ["id"]).reduce({ id: id }) do |hash, key|
56
hash.merge(key.to_sym => attributes[key])
Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
module SuperDiff
22
module ActiveRecord
33
module ObjectInspection
4-
autoload(
5-
:InspectionTreeBuilders,
6-
"super_diff/active_record/object_inspection/inspection_tree_builders"
7-
)
4+
module InspectionTreeBuilders
5+
def self.const_missing(missing_const_name)
6+
if ActiveRecord::InspectionTreeBuilders.const_defined?(
7+
missing_const_name
8+
)
9+
warn <<~EOT
10+
WARNING: SuperDiff::ActiveRecord::ObjectInspection::InspectionTreeBuilders::#{missing_const_name} is deprecated and will be removed in the next major release.
11+
Please use SuperDiff::ActiveRecord::InspectionTreeBuilders::#{missing_const_name} instead.
12+
#{caller_locations.join("\n")}
13+
EOT
14+
ActiveRecord::InspectionTreeBuilders.const_get(missing_const_name)
15+
else
16+
super
17+
end
18+
end
19+
end
820
end
921
end
1022
end

lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb

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

lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_model.rb

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

0 commit comments

Comments
 (0)