6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
# File 'lib/sumi.rb', line 6
def self.inspect(object, indent: 0, tab_width: 2, max_width: 60, max_depth: 5, max_instance_variables: 10, original_object: nil)
return "self" if object && object == original_object
original_object ||= object
case object
when Hash
return "{}" if object.empty?
buffer = +"{\n"
indent += 1
object.each do |key, value|
buffer << ("\t" * indent)
case key
when Symbol
buffer << "#{key.name}: "
else
buffer << inspect(key, indent:, original_object:)
buffer << " => "
end
buffer << inspect(value, indent:, original_object:)
buffer << ",\n"
end
indent -= 1
buffer << ("\t" * indent)
buffer << "}"
when Array
new_lines = false
length = 0
items = object.map do |item|
pretty_item = inspect(item, indent: indent + 1, original_object:)
new_lines = true if pretty_item.include?("\n")
length += pretty_item.bytesize
pretty_item
end
if new_lines || length > max_width - (indent * tab_width)
"[\n#{"\t" * (indent + 1)}#{items.join(",\n#{"\t" * (indent + 1)}")},\n#{"\t" * indent}]"
else
"[#{items.join(', ')}]"
end
when Set
new_lines = false
length = 0
items = object.to_a.sort!.map do |item|
pretty_item = inspect(item, indent: indent + 1, original_object:)
new_lines = true if pretty_item.include?("\n")
length += pretty_item.bytesize
pretty_item
end
if new_lines || length > max_width - (indent * tab_width)
"Set[\n#{"\t" * (indent + 1)}#{items.join(",\n#{"\t" * (indent + 1)}")},\n#{"\t" * indent}]"
else
"Set[#{items.join(', ')}]"
end
when Module
object.name
when Pathname
%(Pathname("#{object.to_path}"))
when Date, DateTime, Time
%(#{object.class.name}("#{object}"))
when Symbol, String, Integer, Float, Regexp, Range, Rational, Complex, true, false, nil
object.inspect
when Data
buffer = +""
members = object.members.take(max_instance_variables) total_count = object.members.length
items = members.map { |key| [key, object.__send__(key)] }
inspect_object(object:, original_object:, buffer:, items:, total_count:, indent:, max_depth:, max_instance_variables:, separator: ": ")
else
buffer = +""
instance_variables = object.instance_variables.take(max_instance_variables)
total_count = object.instance_variables.length
items = instance_variables.map { |name| [name, object.instance_variable_get(name)] }
inspect_object(object:, original_object:, buffer:, items:, total_count:, indent:, max_depth:, max_instance_variables:, separator: " = ")
end
end
|