super_diff 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +65 -26
- data/lib/super_diff/active_record/differs/active_record_relation.rb +1 -2
- data/lib/super_diff/active_record/differs.rb +1 -1
- data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_model.rb +5 -13
- data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_relation.rb +1 -3
- data/lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb +2 -2
- data/lib/super_diff/active_record/object_inspection.rb +1 -1
- data/lib/super_diff/active_record/operation_tree_builders/active_record_model.rb +1 -2
- data/lib/super_diff/active_record/operation_tree_builders/active_record_relation.rb +1 -2
- data/lib/super_diff/active_record/operation_tree_builders.rb +2 -2
- data/lib/super_diff/active_record/operation_tree_flatteners.rb +1 -1
- data/lib/super_diff/active_record/operation_trees.rb +1 -1
- data/lib/super_diff/active_record.rb +7 -15
- data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +5 -6
- data/lib/super_diff/active_support/differs.rb +1 -1
- data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/hash_with_indifferent_access.rb +3 -9
- data/lib/super_diff/active_support/object_inspection/inspection_tree_builders.rb +1 -1
- data/lib/super_diff/active_support/object_inspection.rb +1 -1
- data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +5 -6
- data/lib/super_diff/active_support/operation_tree_builders.rb +1 -1
- data/lib/super_diff/active_support/operation_tree_flatteners.rb +1 -1
- data/lib/super_diff/active_support/operation_trees.rb +1 -1
- data/lib/super_diff/active_support.rb +6 -11
- data/lib/super_diff/colorized_document_extensions.rb +2 -4
- data/lib/super_diff/configuration.rb +14 -8
- data/lib/super_diff/csi/color.rb +4 -4
- data/lib/super_diff/csi/colorized_document.rb +12 -16
- data/lib/super_diff/csi/document.rb +8 -19
- data/lib/super_diff/csi/eight_bit_color.rb +19 -19
- data/lib/super_diff/csi/four_bit_color.rb +82 -31
- data/lib/super_diff/csi/twenty_four_bit_color.rb +12 -11
- data/lib/super_diff/csi/uncolorized_document.rb +2 -6
- data/lib/super_diff/csi.rb +10 -14
- data/lib/super_diff/diff_formatters/collection.rb +35 -41
- data/lib/super_diff/differs/default_object.rb +1 -1
- data/lib/super_diff/differs/defaults.rb +1 -1
- data/lib/super_diff/differs/main.rb +2 -13
- data/lib/super_diff/equality_matchers/array.rb +10 -12
- data/lib/super_diff/equality_matchers/base.rb +1 -1
- data/lib/super_diff/equality_matchers/default.rb +2 -4
- data/lib/super_diff/equality_matchers/defaults.rb +1 -1
- data/lib/super_diff/equality_matchers/hash.rb +10 -12
- data/lib/super_diff/equality_matchers/multiline_string.rb +11 -13
- data/lib/super_diff/equality_matchers/primitive.rb +10 -12
- data/lib/super_diff/equality_matchers/singleline_string.rb +10 -12
- data/lib/super_diff/equality_matchers.rb +1 -1
- data/lib/super_diff/errors.rb +3 -3
- data/lib/super_diff/gem_version.rb +3 -3
- data/lib/super_diff/helpers.rb +10 -10
- data/lib/super_diff/implementation_checks.rb +2 -2
- data/lib/super_diff/line.rb +3 -3
- data/lib/super_diff/object_inspection/inspection_tree.rb +46 -60
- data/lib/super_diff/object_inspection/inspection_tree_builders/array.rb +2 -6
- data/lib/super_diff/object_inspection/inspection_tree_builders/custom_object.rb +3 -9
- data/lib/super_diff/object_inspection/inspection_tree_builders/default_object.rb +5 -14
- data/lib/super_diff/object_inspection/inspection_tree_builders/defaults.rb +1 -1
- data/lib/super_diff/object_inspection/inspection_tree_builders/hash.rb +4 -12
- data/lib/super_diff/object_inspection/inspection_tree_builders/time_like.rb +6 -23
- data/lib/super_diff/object_inspection/inspection_tree_builders.rb +9 -9
- data/lib/super_diff/object_inspection/nodes/as_lines_when_rendering_to_lines.rb +8 -20
- data/lib/super_diff/object_inspection/nodes/as_prefix_when_rendering_to_lines.rb +1 -5
- data/lib/super_diff/object_inspection/nodes/as_prelude_when_rendering_to_lines.rb +1 -5
- data/lib/super_diff/object_inspection/nodes/as_single_line.rb +3 -7
- data/lib/super_diff/object_inspection/nodes/base.rb +9 -14
- data/lib/super_diff/object_inspection/nodes/inspection.rb +26 -34
- data/lib/super_diff/object_inspection/nodes/nesting.rb +1 -1
- data/lib/super_diff/object_inspection/nodes/only_when.rb +2 -6
- data/lib/super_diff/object_inspection/nodes/text.rb +1 -5
- data/lib/super_diff/object_inspection/nodes/when_empty.rb +2 -6
- data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +2 -6
- data/lib/super_diff/object_inspection/nodes/when_rendering_to_lines.rb +1 -1
- data/lib/super_diff/object_inspection/nodes/when_rendering_to_string.rb +1 -5
- data/lib/super_diff/object_inspection/nodes.rb +7 -7
- data/lib/super_diff/object_inspection.rb +3 -3
- data/lib/super_diff/operation_tree_builders/array.rb +12 -11
- data/lib/super_diff/operation_tree_builders/base.rb +17 -15
- data/lib/super_diff/operation_tree_builders/custom_object.rb +8 -6
- data/lib/super_diff/operation_tree_builders/default_object.rb +29 -21
- data/lib/super_diff/operation_tree_builders/hash.rb +23 -24
- data/lib/super_diff/operation_tree_builders/main.rb +4 -11
- data/lib/super_diff/operation_tree_builders/multiline_string.rb +3 -3
- data/lib/super_diff/operation_tree_builders/time_like.rb +1 -11
- data/lib/super_diff/operation_tree_builders.rb +1 -1
- data/lib/super_diff/operation_tree_flatteners/base.rb +1 -5
- data/lib/super_diff/operation_tree_flatteners/collection.rb +13 -16
- data/lib/super_diff/operation_tree_flatteners/default_object.rb +1 -2
- data/lib/super_diff/operation_tree_flatteners/hash.rb +2 -10
- data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +2 -1
- data/lib/super_diff/operation_tree_flatteners.rb +3 -3
- data/lib/super_diff/operation_trees/base.rb +3 -5
- data/lib/super_diff/operation_trees/default_object.rb +1 -3
- data/lib/super_diff/operations/binary_operation.rb +2 -2
- data/lib/super_diff/operations/unary_operation.rb +1 -1
- data/lib/super_diff/rails.rb +2 -1
- data/lib/super_diff/recursion_guard.rb +5 -4
- data/lib/super_diff/rspec/augmented_matcher.rb +4 -5
- data/lib/super_diff/rspec/differ.rb +6 -13
- data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +3 -2
- data/lib/super_diff/rspec/differs/collection_including.rb +1 -1
- data/lib/super_diff/rspec/differs/hash_including.rb +1 -1
- data/lib/super_diff/rspec/differs.rb +3 -3
- data/lib/super_diff/rspec/matcher_text_builders/base.rb +13 -15
- data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +5 -7
- data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +3 -5
- data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +1 -5
- data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +2 -6
- data/lib/super_diff/rspec/matcher_text_builders.rb +5 -8
- data/lib/super_diff/rspec/matcher_text_template.rb +13 -16
- data/lib/super_diff/rspec/monkey_patches.rb +122 -116
- data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +8 -6
- data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +11 -16
- data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +2 -1
- data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +8 -6
- data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +8 -6
- data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +9 -9
- data/lib/super_diff/rspec/object_inspection.rb +1 -1
- data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +11 -10
- data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +7 -6
- data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +11 -10
- data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +22 -17
- data/lib/super_diff/rspec/operation_tree_builders.rb +4 -4
- data/lib/super_diff/rspec.rb +11 -13
- data/lib/super_diff/tiered_lines_elider.rb +87 -115
- data/lib/super_diff/tiered_lines_formatter.rb +5 -9
- data/lib/super_diff/version.rb +1 -1
- data/lib/super_diff.rb +4 -9
- data/spec/examples.txt +493 -485
- data/spec/integration/rails/active_record_spec.rb +3 -1
- data/spec/integration/rails/engines_spec.rb +20 -0
- data/spec/integration/rails/hash_with_indifferent_access_spec.rb +3 -1
- data/spec/integration/rspec/be_falsey_matcher_spec.rb +40 -35
- data/spec/integration/rspec/be_matcher_spec.rb +360 -320
- data/spec/integration/rspec/be_nil_matcher_spec.rb +38 -34
- data/spec/integration/rspec/be_predicate_matcher_spec.rb +376 -359
- data/spec/integration/rspec/be_truthy_matcher_spec.rb +38 -33
- data/spec/integration/rspec/contain_exactly_matcher_spec.rb +242 -239
- data/spec/integration/rspec/eq_matcher_spec.rb +595 -557
- data/spec/integration/rspec/have_attributes_matcher_spec.rb +294 -286
- data/spec/integration/rspec/have_predicate_matcher_spec.rb +291 -297
- data/spec/integration/rspec/include_matcher_spec.rb +317 -215
- data/spec/integration/rspec/match_array_matcher_spec.rb +276 -273
- data/spec/integration/rspec/match_matcher_spec.rb +847 -834
- data/spec/integration/rspec/raise_error_matcher_spec.rb +468 -453
- data/spec/integration/rspec/respond_to_matcher_spec.rb +702 -697
- data/spec/integration/rspec/third_party_matcher_spec.rb +142 -138
- data/spec/integration/rspec/unhandled_errors_spec.rb +88 -84
- data/spec/spec_helper.rb +17 -20
- data/spec/support/command_runner.rb +34 -57
- data/spec/support/integration/helpers.rb +35 -28
- data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +28 -23
- data/spec/support/integration/test_programs/base.rb +12 -17
- data/spec/support/integration/test_programs/plain.rb +6 -0
- data/spec/support/integration/test_programs/rspec_active_record.rb +4 -1
- data/spec/support/integration/test_programs/rspec_active_support.rb +4 -1
- data/spec/support/integration/test_programs/rspec_rails.rb +4 -1
- data/spec/support/integration/test_programs/rspec_rails_engine.rb +30 -0
- data/spec/support/models/active_record/person.rb +6 -4
- data/spec/support/models/active_record/shipping_address.rb +9 -10
- data/spec/support/models/customer.rb +2 -4
- data/spec/support/models/player.rb +3 -6
- data/spec/support/models/shipping_address.rb +4 -13
- data/spec/support/shared_examples/active_record.rb +232 -214
- data/spec/support/shared_examples/active_support.rb +53 -51
- data/spec/support/shared_examples/elided_diffs.rb +405 -381
- data/spec/support/shared_examples/hash_with_indifferent_access.rb +424 -388
- data/spec/support/shared_examples/key.rb +123 -0
- data/spec/support/unit/helpers.rb +1 -3
- data/spec/support/unit/matchers/match_output.rb +12 -13
- data/spec/unit/active_record/object_inspection_spec.rb +222 -206
- data/spec/unit/equality_matchers/main_spec.rb +1049 -984
- data/spec/unit/helpers_spec.rb +14 -21
- data/spec/unit/operation_tree_flatteners/array_spec.rb +557 -524
- data/spec/unit/operation_tree_flatteners/custom_object_spec.rb +619 -601
- data/spec/unit/operation_tree_flatteners/default_object_spec.rb +619 -621
- data/spec/unit/operation_tree_flatteners/hash_spec.rb +595 -556
- data/spec/unit/operation_tree_flatteners/multiline_string_spec.rb +102 -92
- data/spec/unit/rspec/matchers/be_compared_to_spec.rb +3 -3
- data/spec/unit/rspec/matchers/be_predicate_spec.rb +3 -3
- data/spec/unit/rspec/matchers/contain_exactly_spec.rb +1 -1
- data/spec/unit/rspec/matchers/have_attributes_spec.rb +1 -1
- data/spec/unit/rspec/matchers/have_predicate_spec.rb +2 -2
- data/spec/unit/rspec/matchers/include_spec.rb +2 -2
- data/spec/unit/rspec/matchers/match_array_spec.rb +2 -2
- data/spec/unit/rspec/matchers/raise_error_spec.rb +5 -5
- data/spec/unit/rspec/matchers/respond_to_spec.rb +23 -16
- data/spec/unit/rspec/object_inspection_spec.rb +349 -324
- data/spec/unit/super_diff_spec.rb +1542 -1449
- data/spec/unit/tiered_lines_elider_spec.rb +3508 -3536
- data/spec/unit/tiered_lines_formatter_spec.rb +54 -116
- data/super_diff.gemspec +13 -12
- metadata +73 -73
- data/spec/tmp/warnings_logger/all_warnings.txt +0 -2
@@ -5,16 +5,18 @@ module SuperDiff
|
|
5
5
|
:extra_differ_classes,
|
6
6
|
:extra_inspection_tree_builder_classes,
|
7
7
|
:extra_operation_tree_builder_classes,
|
8
|
-
:extra_operation_tree_classes
|
8
|
+
:extra_operation_tree_classes
|
9
9
|
)
|
10
10
|
attr_accessor(
|
11
11
|
:actual_color,
|
12
12
|
:border_color,
|
13
|
+
:color_enabled,
|
13
14
|
:diff_elision_enabled,
|
14
15
|
:diff_elision_maximum,
|
15
16
|
:elision_marker_color,
|
16
17
|
:expected_color,
|
17
18
|
:header_color,
|
19
|
+
:key_enabled
|
18
20
|
)
|
19
21
|
|
20
22
|
def initialize(options = {})
|
@@ -31,6 +33,7 @@ module SuperDiff
|
|
31
33
|
@extra_operation_tree_builder_classes = [].freeze
|
32
34
|
@extra_operation_tree_classes = [].freeze
|
33
35
|
@header_color = :white
|
36
|
+
@key_enabled = true
|
34
37
|
|
35
38
|
merge!(options)
|
36
39
|
end
|
@@ -54,6 +57,10 @@ module SuperDiff
|
|
54
57
|
@diff_elision_enabled
|
55
58
|
end
|
56
59
|
|
60
|
+
def key_enabled?
|
61
|
+
@key_enabled
|
62
|
+
end
|
63
|
+
|
57
64
|
def merge!(configuration_or_options)
|
58
65
|
options =
|
59
66
|
if configuration_or_options.is_a?(self.class)
|
@@ -62,9 +69,7 @@ module SuperDiff
|
|
62
69
|
configuration_or_options
|
63
70
|
end
|
64
71
|
|
65
|
-
options.each
|
66
|
-
instance_variable_set("@#{key}", value)
|
67
|
-
end
|
72
|
+
options.each { |key, value| instance_variable_set("@#{key}", value) }
|
68
73
|
|
69
74
|
updated
|
70
75
|
end
|
@@ -79,7 +84,7 @@ module SuperDiff
|
|
79
84
|
end
|
80
85
|
alias_method(
|
81
86
|
:add_extra_diff_formatter_class,
|
82
|
-
:add_extra_diff_formatter_classes
|
87
|
+
:add_extra_diff_formatter_classes
|
83
88
|
)
|
84
89
|
|
85
90
|
def add_extra_differ_classes(*classes)
|
@@ -93,7 +98,7 @@ module SuperDiff
|
|
93
98
|
end
|
94
99
|
alias_method(
|
95
100
|
:add_extra_inspection_tree_builder_class,
|
96
|
-
:add_extra_inspection_tree_builder_classes
|
101
|
+
:add_extra_inspection_tree_builder_classes
|
97
102
|
)
|
98
103
|
|
99
104
|
def add_extra_operation_tree_builder_classes(*classes)
|
@@ -102,7 +107,7 @@ module SuperDiff
|
|
102
107
|
end
|
103
108
|
alias_method(
|
104
109
|
:add_extra_operation_tree_builder_class,
|
105
|
-
:add_extra_operation_tree_builder_classes
|
110
|
+
:add_extra_operation_tree_builder_classes
|
106
111
|
)
|
107
112
|
|
108
113
|
def add_extra_operation_tree_classes(*classes)
|
@@ -111,7 +116,7 @@ module SuperDiff
|
|
111
116
|
end
|
112
117
|
alias_method(
|
113
118
|
:add_extra_operation_tree_class,
|
114
|
-
:add_extra_operation_tree_classes
|
119
|
+
:add_extra_operation_tree_classes
|
115
120
|
)
|
116
121
|
|
117
122
|
def to_h
|
@@ -131,6 +136,7 @@ module SuperDiff
|
|
131
136
|
extra_operation_tree_builder_classes.dup,
|
132
137
|
extra_operation_tree_classes: extra_operation_tree_classes.dup,
|
133
138
|
header_color: header_color,
|
139
|
+
key_enabled: key_enabled?
|
134
140
|
}
|
135
141
|
end
|
136
142
|
|
data/lib/super_diff/csi/color.rb
CHANGED
@@ -48,13 +48,13 @@ module SuperDiff
|
|
48
48
|
attr_reader :layer
|
49
49
|
|
50
50
|
def interpret_layer!(layer)
|
51
|
-
if [
|
51
|
+
if %i[foreground background].include?(layer)
|
52
52
|
layer
|
53
53
|
else
|
54
54
|
raise ArgumentError.new(
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
"Invalid layer #{layer.inspect}. " +
|
56
|
+
"Layer must be :foreground or :background."
|
57
|
+
)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
@@ -11,9 +11,7 @@ module SuperDiff
|
|
11
11
|
def colorize_block(colors, opts, &block)
|
12
12
|
color_sequence = build_initial_color_sequence_from(colors, opts)
|
13
13
|
|
14
|
-
if color_sequences_open_in_parent.any?
|
15
|
-
add_part(Csi.reset_sequence)
|
16
|
-
end
|
14
|
+
add_part(Csi.reset_sequence) if color_sequences_open_in_parent.any?
|
17
15
|
|
18
16
|
add_part(color_sequence)
|
19
17
|
color_sequences_open_in_parent << color_sequence
|
@@ -34,15 +32,11 @@ module SuperDiff
|
|
34
32
|
contents.each do |content|
|
35
33
|
if content.is_a?(self.class)
|
36
34
|
content.each do |part|
|
37
|
-
if part.is_a?(ColorSequenceBlock)
|
38
|
-
add_part(Csi.reset_sequence)
|
39
|
-
end
|
35
|
+
add_part(Csi.reset_sequence) if part.is_a?(ColorSequenceBlock)
|
40
36
|
|
41
37
|
add_part(part)
|
42
38
|
|
43
|
-
if part.is_a?(ResetSequence)
|
44
|
-
add_part(color_sequence)
|
45
|
-
end
|
39
|
+
add_part(color_sequence) if part.is_a?(ResetSequence)
|
46
40
|
end
|
47
41
|
else
|
48
42
|
add_part(content)
|
@@ -57,15 +51,17 @@ module SuperDiff
|
|
57
51
|
attr_reader :color_sequences_open_in_parent
|
58
52
|
|
59
53
|
def build_initial_color_sequence_from(colors, opts)
|
60
|
-
ColorSequenceBlock
|
61
|
-
|
62
|
-
|
63
|
-
|
54
|
+
ColorSequenceBlock
|
55
|
+
.new(colors)
|
56
|
+
.tap do |sequence|
|
57
|
+
if opts[:fg]
|
58
|
+
sequence << Color.resolve(opts[:fg], layer: :foreground)
|
59
|
+
end
|
64
60
|
|
65
|
-
|
66
|
-
|
61
|
+
if opts[:bg]
|
62
|
+
sequence << Color.resolve(opts[:bg], layer: :background)
|
63
|
+
end
|
67
64
|
end
|
68
|
-
end
|
69
65
|
end
|
70
66
|
end
|
71
67
|
end
|
@@ -7,9 +7,7 @@ module SuperDiff
|
|
7
7
|
@parts = []
|
8
8
|
@indentation_stack = []
|
9
9
|
|
10
|
-
if block
|
11
|
-
evaluate_block(&block)
|
12
|
-
end
|
10
|
+
evaluate_block(&block) if block
|
13
11
|
end
|
14
12
|
|
15
13
|
def each(&block)
|
@@ -21,9 +19,8 @@ module SuperDiff
|
|
21
19
|
end
|
22
20
|
|
23
21
|
def colorize(*args, **opts, &block)
|
24
|
-
contents, colors =
|
25
|
-
arg.is_a?(String) || arg.is_a?(self.class)
|
26
|
-
end
|
22
|
+
contents, colors =
|
23
|
+
args.partition { |arg| arg.is_a?(String) || arg.is_a?(self.class) }
|
27
24
|
|
28
25
|
if colors[0].is_a?(Symbol)
|
29
26
|
if colors[0] == :colorize
|
@@ -47,13 +44,9 @@ module SuperDiff
|
|
47
44
|
if block
|
48
45
|
evaluate_block(&block)
|
49
46
|
elsif contents.any?
|
50
|
-
contents.each
|
51
|
-
add_part(part)
|
52
|
-
end
|
47
|
+
contents.each { |part| add_part(part) }
|
53
48
|
else
|
54
|
-
raise ArgumentError.new(
|
55
|
-
"Must have something to add to the document!",
|
56
|
-
)
|
49
|
+
raise ArgumentError.new("Must have something to add to the document!")
|
57
50
|
end
|
58
51
|
end
|
59
52
|
alias_method :plain, :text
|
@@ -68,8 +61,8 @@ module SuperDiff
|
|
68
61
|
text(*contents)
|
69
62
|
else
|
70
63
|
raise ArgumentError.new(
|
71
|
-
|
72
|
-
|
64
|
+
"Must have something to add to the document!"
|
65
|
+
)
|
73
66
|
end
|
74
67
|
end
|
75
68
|
|
@@ -155,11 +148,7 @@ module SuperDiff
|
|
155
148
|
end
|
156
149
|
|
157
150
|
def wrapper
|
158
|
-
|
159
|
-
:line
|
160
|
-
else
|
161
|
-
:text
|
162
|
-
end
|
151
|
+
for_line? ? :line : :text
|
163
152
|
end
|
164
153
|
end
|
165
154
|
|
@@ -19,18 +19,18 @@ module SuperDiff
|
|
19
19
|
bright_blue: 12,
|
20
20
|
bright_magenta: 13,
|
21
21
|
bright_cyan: 14,
|
22
|
-
bright_white: 15
|
22
|
+
bright_white: 15
|
23
23
|
}.freeze
|
24
24
|
STARTING_INDICES = {
|
25
25
|
standard: 0,
|
26
26
|
high_intensity: 8,
|
27
|
-
grayscale: 232
|
27
|
+
grayscale: 232
|
28
28
|
}.freeze
|
29
29
|
VALID_PAIR_TYPES = STARTING_INDICES.keys
|
30
30
|
VALID_PAIR_INDEX_RANGES = {
|
31
31
|
standard: 0..7,
|
32
32
|
high_intensity: 0..7,
|
33
|
-
grayscale: 0..23
|
33
|
+
grayscale: 0..23
|
34
34
|
}.freeze
|
35
35
|
LEADING_CODES_BY_LAYER = { foreground: 38, background: 48 }.freeze
|
36
36
|
LAYERS_BY_LEADING_CODE = LEADING_CODES_BY_LAYER.invert.freeze
|
@@ -93,10 +93,10 @@ module SuperDiff
|
|
93
93
|
def interpret_triplet!(red:, green:, blue:)
|
94
94
|
if invalid_triplet?(red, green, blue)
|
95
95
|
raise ArgumentError.new(
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
96
|
+
"(#{red},#{green},#{blue}) is not a valid color " +
|
97
|
+
"specification. All components must be between " +
|
98
|
+
"#{VALID_COMPONENT_RANGE.begin} and #{VALID_COMPONENT_RANGE.end}."
|
99
|
+
)
|
100
100
|
end
|
101
101
|
|
102
102
|
16 + 36 * red + 6 * green + blue
|
@@ -110,7 +110,7 @@ module SuperDiff
|
|
110
110
|
if !VALID_CODES_BY_NAME.include?(name)
|
111
111
|
message =
|
112
112
|
"#{name.inspect} is not a valid color name.\n" +
|
113
|
-
|
113
|
+
"Valid names are:\n"
|
114
114
|
|
115
115
|
VALID_CODES_BY_NAME.keys.each do |valid_name|
|
116
116
|
message << "- #{valid_name}\n"
|
@@ -125,19 +125,19 @@ module SuperDiff
|
|
125
125
|
def interpret_pair!(type:, index:)
|
126
126
|
if !VALID_PAIR_TYPES.include?(type)
|
127
127
|
raise ArgumentError.new(
|
128
|
-
|
129
|
-
|
130
|
-
|
128
|
+
"Given pair did not have a valid type. " +
|
129
|
+
"Type must be one of: #{VALID_PAIR_TYPES}"
|
130
|
+
)
|
131
131
|
end
|
132
132
|
|
133
133
|
valid_range = VALID_PAIR_INDEX_RANGES[type]
|
134
134
|
|
135
135
|
if !valid_range.cover?(index)
|
136
136
|
raise ArgumentError.new(
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
137
|
+
"Given pair did not have a valid index. " +
|
138
|
+
"For #{type}, index must be between #{valid_range.begin} and " +
|
139
|
+
"#{valid_range.end}."
|
140
|
+
)
|
141
141
|
end
|
142
142
|
|
143
143
|
STARTING_INDICES[type] + index
|
@@ -149,7 +149,7 @@ module SuperDiff
|
|
149
149
|
if match
|
150
150
|
{
|
151
151
|
layer: interpret_layer!(match[1]),
|
152
|
-
code: interpret_code!(match[2].to_i)
|
152
|
+
code: interpret_code!(match[2].to_i)
|
153
153
|
}
|
154
154
|
end
|
155
155
|
end
|
@@ -165,9 +165,9 @@ module SuperDiff
|
|
165
165
|
def interpret_code!(code)
|
166
166
|
if !VALID_CODE_RANGE.cover?(code)
|
167
167
|
raise ArgumentError.new(
|
168
|
-
|
169
|
-
|
170
|
-
|
168
|
+
"#{code.inspect} is not a valid color code " +
|
169
|
+
"(must be between 0 and 255)."
|
170
|
+
)
|
171
171
|
end
|
172
172
|
|
173
173
|
code
|
@@ -1,31 +1,86 @@
|
|
1
1
|
module SuperDiff
|
2
2
|
module Csi
|
3
3
|
class FourBitColor < Color
|
4
|
-
VALID_TYPES = [
|
4
|
+
VALID_TYPES = %i[foreground background].freeze
|
5
5
|
VALID_CODES_BY_NAME = {
|
6
|
-
black: {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
6
|
+
black: {
|
7
|
+
foreground: 30,
|
8
|
+
background: 40
|
9
|
+
},
|
10
|
+
red: {
|
11
|
+
foreground: 31,
|
12
|
+
background: 41
|
13
|
+
},
|
14
|
+
green: {
|
15
|
+
foreground: 32,
|
16
|
+
background: 42
|
17
|
+
},
|
18
|
+
yellow: {
|
19
|
+
foreground: 33,
|
20
|
+
background: 43
|
21
|
+
},
|
22
|
+
blue: {
|
23
|
+
foreground: 34,
|
24
|
+
background: 44
|
25
|
+
},
|
26
|
+
magenta: {
|
27
|
+
foreground: 35,
|
28
|
+
background: 45
|
29
|
+
},
|
30
|
+
cyan: {
|
31
|
+
foreground: 36,
|
32
|
+
background: 46
|
33
|
+
},
|
34
|
+
white: {
|
35
|
+
foreground: 37,
|
36
|
+
background: 47
|
37
|
+
},
|
38
|
+
bright_black: {
|
39
|
+
foreground: 90,
|
40
|
+
background: 100
|
41
|
+
},
|
42
|
+
bright_red: {
|
43
|
+
foreground: 91,
|
44
|
+
background: 101
|
45
|
+
},
|
46
|
+
bright_green: {
|
47
|
+
foreground: 92,
|
48
|
+
background: 102
|
49
|
+
},
|
50
|
+
bright_yellow: {
|
51
|
+
foreground: 93,
|
52
|
+
background: 103
|
53
|
+
},
|
54
|
+
bright_blue: {
|
55
|
+
foreground: 94,
|
56
|
+
background: 104
|
57
|
+
},
|
58
|
+
bright_magenta: {
|
59
|
+
foreground: 95,
|
60
|
+
background: 105
|
61
|
+
},
|
62
|
+
bright_cyan: {
|
63
|
+
foreground: 96,
|
64
|
+
background: 106
|
65
|
+
},
|
66
|
+
bright_white: {
|
67
|
+
foreground: 97,
|
68
|
+
background: 107
|
69
|
+
}
|
22
70
|
}.freeze
|
23
|
-
COLORS_BY_CODE =
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
71
|
+
COLORS_BY_CODE =
|
72
|
+
VALID_CODES_BY_NAME.reduce({}) do |hash, (name, value)|
|
73
|
+
hash.merge(
|
74
|
+
value[:foreground] => {
|
75
|
+
name: name,
|
76
|
+
layer: :foreground
|
77
|
+
},
|
78
|
+
value[:background] => {
|
79
|
+
name: name,
|
80
|
+
layer: :background
|
81
|
+
}
|
82
|
+
)
|
83
|
+
end
|
29
84
|
VALID_NAMES = VALID_CODES_BY_NAME.keys
|
30
85
|
VALID_CODE_RANGES = [30..37, 40..47, 90..97, 100..107].freeze
|
31
86
|
OPENING_REGEX = /\e\[(\d+)m/.freeze
|
@@ -72,11 +127,9 @@ module SuperDiff
|
|
72
127
|
if !VALID_NAMES.include?(name)
|
73
128
|
message =
|
74
129
|
"#{name.inspect} is not a valid color name.\n" +
|
75
|
-
|
130
|
+
"Valid names are:\n"
|
76
131
|
|
77
|
-
VALID_NAMES.each
|
78
|
-
message << "- #{valid_name}"
|
79
|
-
end
|
132
|
+
VALID_NAMES.each { |valid_name| message << "- #{valid_name}" }
|
80
133
|
|
81
134
|
raise ArgumentError.new(message)
|
82
135
|
end
|
@@ -87,16 +140,14 @@ module SuperDiff
|
|
87
140
|
def interpret_sequence!(sequence)
|
88
141
|
match = sequence.match(OPENING_REGEX)
|
89
142
|
|
90
|
-
if match
|
91
|
-
interpret_code!(match[1].to_i)
|
92
|
-
end
|
143
|
+
interpret_code!(match[1].to_i) if match
|
93
144
|
end
|
94
145
|
|
95
146
|
def interpret_code!(code)
|
96
147
|
if VALID_CODE_RANGES.none? { |range| range.cover?(code) }
|
97
148
|
message =
|
98
149
|
"#{code.inspect} is not a valid color code.\n" +
|
99
|
-
|
150
|
+
"Valid codes are:\n"
|
100
151
|
|
101
152
|
VALID_CODE_RANGES.each do |range|
|
102
153
|
message << "- #{range.begin} through #{range.end}\n"
|
@@ -28,7 +28,7 @@ module SuperDiff
|
|
28
28
|
SERIAL_CODE,
|
29
29
|
triplet.red,
|
30
30
|
triplet.blue,
|
31
|
-
triplet.green
|
31
|
+
triplet.green
|
32
32
|
].join(";") + "m"
|
33
33
|
end
|
34
34
|
|
@@ -37,7 +37,7 @@ module SuperDiff
|
|
37
37
|
red: triplet.red,
|
38
38
|
green: triplet.green,
|
39
39
|
blue: triplet.blue,
|
40
|
-
layer: :foreground
|
40
|
+
layer: :foreground
|
41
41
|
)
|
42
42
|
end
|
43
43
|
|
@@ -55,11 +55,12 @@ module SuperDiff
|
|
55
55
|
if match
|
56
56
|
{
|
57
57
|
layer: interpret_layer!(match[1]),
|
58
|
-
triplet:
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
58
|
+
triplet:
|
59
|
+
interpret_triplet!(
|
60
|
+
red: match[2].to_i,
|
61
|
+
green: match[3].to_i,
|
62
|
+
blue: match[4].to_i
|
63
|
+
)
|
63
64
|
}
|
64
65
|
end
|
65
66
|
end
|
@@ -67,10 +68,10 @@ module SuperDiff
|
|
67
68
|
def interpret_triplet!(red:, green:, blue:)
|
68
69
|
if invalid_triplet?(red, green, blue)
|
69
70
|
raise ArgumentError.new(
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
71
|
+
"(#{red},#{green},#{blue}) is not a valid color " +
|
72
|
+
"specification. All components must be between " +
|
73
|
+
"#{VALID_COMPONENT_RANGE.begin} and #{VALID_COMPONENT_RANGE.end}."
|
74
|
+
)
|
74
75
|
end
|
75
76
|
|
76
77
|
Triplet.new(red: red, green: green, blue: blue)
|
@@ -10,9 +10,7 @@ module SuperDiff
|
|
10
10
|
def colorize_inline(contents, *)
|
11
11
|
contents.each do |content|
|
12
12
|
if content.is_a?(self.class)
|
13
|
-
content.each
|
14
|
-
add_part(part)
|
15
|
-
end
|
13
|
+
content.each { |part| add_part(part) }
|
16
14
|
else
|
17
15
|
add_part(content)
|
18
16
|
end
|
@@ -20,9 +18,7 @@ module SuperDiff
|
|
20
18
|
end
|
21
19
|
|
22
20
|
def add_part(part)
|
23
|
-
if !part.is_a?(ResetSequence) && !part.is_a?(ColorSequenceBlock)
|
24
|
-
super
|
25
|
-
end
|
21
|
+
super if !part.is_a?(ResetSequence) && !part.is_a?(ColorSequenceBlock)
|
26
22
|
end
|
27
23
|
end
|
28
24
|
end
|
data/lib/super_diff/csi.rb
CHANGED
@@ -41,21 +41,17 @@ module SuperDiff
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.inspect_colors_in(text)
|
44
|
-
[FourBitColor, EightBitColor, TwentyFourBitColor].
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
"(bg)"
|
54
|
-
end
|
55
|
-
|
56
|
-
"#{color_block} #{layer_indicator} ❮#{area}❯"
|
57
|
-
end
|
44
|
+
[FourBitColor, EightBitColor, TwentyFourBitColor].reduce(
|
45
|
+
text
|
46
|
+
) do |str, klass|
|
47
|
+
klass.sub_colorized_areas_in(str) do |area, color|
|
48
|
+
color_block = colorize("◼︎", color.to_foreground)
|
49
|
+
|
50
|
+
layer_indicator = (color.foreground? ? "(fg)" : "(bg)")
|
51
|
+
|
52
|
+
"#{color_block} #{layer_indicator} ❮#{area}❯"
|
58
53
|
end
|
54
|
+
end
|
59
55
|
end
|
60
56
|
|
61
57
|
self.color_enabled = false
|