Module: Sumi

Defined in:
lib/sumi.rb,
lib/sumi/version.rb

Constant Summary collapse

VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.inspect(object, indent: 0, tab_width: 2, max_width: 60, max_depth: 5, max_instance_variables: 10, original_object: nil) ⇒ Object



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) # TODO: either rename max_instance_variables to max_properties or define a max_members specifcally for data objects
		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

.inspect_object(object:, original_object:, buffer:, items:, total_count:, indent:, max_depth:, max_instance_variables:, separator:) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/sumi.rb', line 87

def self.inspect_object(object:, original_object:, buffer:, items:, total_count:, indent:, max_depth:, max_instance_variables:, separator:)
	if total_count > 0 && indent < max_depth
		buffer << "#{object.class.name}(\n"
		indent += 1

		if indent < max_depth
			items.take(max_instance_variables).each do |key, value|
				buffer << ("\t" * indent)
				buffer << "#{key}#{separator}"

				buffer << inspect(value, indent:, original_object:)
				buffer << ",\n"
			end

			if total_count > max_instance_variables
				buffer << ("\t" * indent)
				buffer << "...\n"
			end
		else
			buffer << ("\t" * indent)
			buffer << "...\n"
		end

		indent -= 1
		buffer << ("\t" * indent)
		buffer << ")"
	elsif indent >= max_depth
		buffer << "#{object.class.name}(...)"
	else
		buffer << "#{object.class.name}()"
	end
end