xprint 0.8.1 → 0.9.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/version.rb +2 -2
- data/lib/xprint.rb +357 -279
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28bf765d84d5c5524bb16b450ec410d38458ac07eda20dde13671fb4d616b075
|
4
|
+
data.tar.gz: dae561c390ce9de47468327ecddfc32e997780b310f802384adbd358cb5c8138
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 851b4ded37108b45c3bfb879038ce7c0256259f1b1f410f262f8bb97cb52fa36f000f30fa898bbfbb6de49415f2d908ff42f87fa7cb50d91e1732a45e14499bf
|
7
|
+
data.tar.gz: 3368c16e1ad863e91dbdc339774f78e898979e584bb82c257758b598c2c1d836f9e801c9584624f10461d4bed5e5bac2ef7ad042cbd60f252c892ed0ce576b9c
|
data/lib/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module XPrint
|
2
|
-
VERSION = '0.
|
3
|
-
end
|
2
|
+
VERSION = '0.9.52'
|
3
|
+
end
|
data/lib/xprint.rb
CHANGED
@@ -1,313 +1,391 @@
|
|
1
1
|
require 'bigdecimal'
|
2
2
|
require 'date'
|
3
|
+
require 'yaml'
|
3
4
|
|
5
|
+
# TODO: Add ability for alphabetically sorting
|
6
|
+
# items in hashes and objects.
|
4
7
|
module XPrint
|
5
|
-
|
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
|
-
|
8
|
+
@data_classes = [
|
9
|
+
String, Integer, Float, TrueClass, FalseClass, NilClass,
|
10
|
+
Symbol, Date, Time, DateTime, BigDecimal, Rational
|
11
|
+
]
|
12
|
+
@hash_name_classes = @data_classes + [Proc]
|
13
|
+
@tab = " "
|
14
|
+
@indexes = true
|
15
|
+
@full_proc_path = false
|
16
|
+
@braces = true
|
17
|
+
@date_format = '%F'
|
18
|
+
@time_format = '%c'
|
19
|
+
@datetime_format = '%FT%T%:z'
|
20
|
+
@hash_separator = ' => '
|
21
|
+
@commas = true
|
22
|
+
@color = true
|
23
|
+
@colors = {
|
24
|
+
attribute: :blue,
|
25
|
+
bigdecimal: :darkcyan,
|
26
|
+
classname: :darkgreen,
|
27
|
+
classobject: :green,
|
28
|
+
comma: :default,
|
29
|
+
curly_brace: :default,
|
30
|
+
date: :red,
|
31
|
+
datetime: :purple,
|
32
|
+
equals: :default,
|
33
|
+
false: :darkred,
|
34
|
+
float: :cyan,
|
35
|
+
hash_separator: :default,
|
36
|
+
index: :darkgrey,
|
37
|
+
integer: :cyan,
|
38
|
+
module: :green,
|
39
|
+
nil: :darkpurple,
|
40
|
+
parentheses: :default,
|
41
|
+
proc: :darkyellow,
|
42
|
+
rational: :darkcyan,
|
43
|
+
regexp: :darkyellow,
|
44
|
+
string: :yellow,
|
45
|
+
struct: :green,
|
46
|
+
square_brace: :default,
|
47
|
+
symbol: :darkblue,
|
48
|
+
time: :darkblue,
|
49
|
+
true: :darkgreen
|
50
|
+
}
|
51
|
+
@color_codes = {
|
52
|
+
black: "\e[30m",
|
53
|
+
blue: "\e[94m",
|
54
|
+
darkblue: "\e[34m",
|
55
|
+
cyan: "\e[96m",
|
56
|
+
darkcyan: "\e[36m",
|
57
|
+
green: "\e[92m",
|
58
|
+
darkgreen: "\e[32m",
|
59
|
+
grey: "\e[37m",
|
60
|
+
darkgrey: "\e[90m",
|
61
|
+
red: "\e[91m",
|
62
|
+
darkred: "\e[31m",
|
63
|
+
purple: "\e[95m",
|
64
|
+
darkpurple: "\e[35m",
|
65
|
+
yellow: "\e[93m",
|
66
|
+
darkyellow: "\e[33m",
|
67
|
+
default: "\e[0m"
|
68
|
+
}
|
69
|
+
|
70
|
+
def self.set(**kwargs)
|
71
|
+
kwargs.each do |keyword, arg|
|
72
|
+
instance_variable_set "@#{keyword}", arg
|
73
|
+
end
|
69
74
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
+
return
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.load_file(config)
|
79
|
+
config_data = YAML.load(File.read config)
|
80
|
+
config_data = symbolize_keys(config_data)
|
75
81
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
kwargs.each do |keyword, arg|
|
87
|
-
@color_codes[keyword] = arg
|
88
|
-
end
|
82
|
+
set **config_data[:general] if config_data.key?
|
83
|
+
|
84
|
+
if config_data.key? :colors
|
85
|
+
color_data = config_data[:colors]
|
86
|
+
|
87
|
+
color_data.each do |name, color|
|
88
|
+
color_data[name] = color.to_sym
|
89
|
+
end
|
90
|
+
|
91
|
+
set_color_for **config_data[:colors]
|
89
92
|
end
|
93
|
+
|
94
|
+
codekey = :'color codes'
|
95
|
+
|
96
|
+
set_color_code_for(**config_data[codekey]) if config_data.key codekey
|
97
|
+
|
98
|
+
return
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.load(config)
|
102
|
+
calling_file = caller_locations.first.absolute_path
|
103
|
+
base_dir = File.dirname calling_file
|
104
|
+
relative_config = File.expand_path config, base_dir
|
105
|
+
|
106
|
+
load_file relative_config
|
107
|
+
end
|
90
108
|
|
91
|
-
def self.xp(*args)
|
92
|
-
args.each do |arg|
|
93
|
-
xpanded_text = self.xpand(arg, tab: @tab)
|
94
109
|
|
95
|
-
unless @braces
|
96
|
-
xpanded_text = self.shift_indentation_down(xpanded_text).lstrip()
|
97
|
-
end
|
98
110
|
|
99
|
-
|
100
|
-
|
111
|
+
private_class_method def self.symbolize_keys(hash)
|
112
|
+
hash.inject({}) do |result, (key, value)|
|
113
|
+
new_key = key.to_sym
|
114
|
+
new_value = value.is_a?(Hash) ? symbolize_keys(value) : value
|
115
|
+
|
116
|
+
result[new_key] = new_value
|
117
|
+
|
118
|
+
result
|
101
119
|
end
|
102
|
-
|
103
|
-
|
104
|
-
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.set_color_for(**kwargs)
|
123
|
+
kwargs.each do |keyword, arg|
|
124
|
+
@colors[keyword] = arg
|
105
125
|
end
|
106
|
-
|
107
|
-
|
108
|
-
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.set_color_code_for(**kwargs)
|
129
|
+
kwargs.each do |keyword, arg|
|
130
|
+
@color_codes[keyword] = arg
|
109
131
|
end
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.xp(*args)
|
135
|
+
args.each do |arg|
|
136
|
+
xpanded_text = xpand(arg, tab: @tab)
|
137
|
+
|
138
|
+
xpanded_text = shift_indentation_down(xpanded_text).lstrip unless @braces
|
139
|
+
|
140
|
+
puts xpanded_text
|
118
141
|
end
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
return result
|
142
|
+
end
|
143
|
+
|
144
|
+
private_class_method def self.color_for(colorname)
|
145
|
+
@color_codes[colorname]
|
146
|
+
end
|
147
|
+
|
148
|
+
private_class_method def self.reset_color()
|
149
|
+
@color_codes[:default]
|
150
|
+
end
|
151
|
+
|
152
|
+
private_class_method def self.colorize(text, type)
|
153
|
+
if @color
|
154
|
+
item_color = color_for @colors[type]
|
155
|
+
"#{item_color}#{text}#{reset_color}"
|
156
|
+
else
|
157
|
+
text
|
136
158
|
end
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
# X is a "primitive" kind of data that has no subitems, so
|
143
|
-
# we can just print it.
|
144
|
-
if x.class == String
|
145
|
-
return colorize(x.inspect, :string)
|
146
|
-
elsif x.class == Integer
|
147
|
-
return colorize(x.inspect, :integer)
|
148
|
-
elsif x.class == Float
|
149
|
-
return colorize(x.inspect, :float)
|
150
|
-
elsif x.class == TrueClass
|
151
|
-
return colorize(x.inspect, :true)
|
152
|
-
elsif x.class == FalseClass
|
153
|
-
return colorize(x.inspect, :false)
|
154
|
-
elsif x.class == NilClass
|
155
|
-
return colorize(x.inspect, :nil)
|
156
|
-
elsif x.class == Symbol
|
157
|
-
return colorize(x.inspect, :symbol)
|
158
|
-
|
159
|
-
# X is a Proc, print more compact version of standard Proc.inspect
|
160
|
-
# text.
|
161
|
-
elsif x.class == Proc
|
162
|
-
type = x.lambda? ? 'Lambda' : 'Proc'
|
163
|
-
source, line = x.source_location
|
164
|
-
source = source.gsub('\\', '/')
|
165
|
-
|
166
|
-
unless @full_proc_path
|
167
|
-
source = source.split('/')[-2..-1].join('/')
|
168
|
-
end
|
169
|
-
|
170
|
-
return colorize("<#{type} @ #{source} [Line #{line}]>", :proc)
|
171
|
-
|
172
|
-
elsif x.class == Class
|
173
|
-
return colorize("<Class #{x}>", :classobject)
|
174
|
-
|
175
|
-
# X is an Array, print list of all items.
|
176
|
-
elsif x.class == Array
|
177
|
-
result = "#{@braces ? '[' : ''}\n"
|
178
|
-
|
179
|
-
x.each_with_index do |item, index|
|
180
|
-
data = xpand(item, indent: _indent, tab: tab)
|
181
|
-
|
182
|
-
result += "#{_indent}"
|
183
|
-
result += "#{colorize("[#{index}]", :index)} " if @indexes
|
184
|
-
result += "#{data}"
|
159
|
+
end
|
160
|
+
|
161
|
+
private_class_method def self.shift_indentation_down(text)
|
162
|
+
# Only shift if no
|
163
|
+
return text if text.match?(/^\S/)
|
185
164
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
longest_key = (
|
199
|
-
x.keys.filter do |k, v|
|
200
|
-
@hash_name_classes.include? k.class
|
201
|
-
end.
|
202
|
-
map do |k, v|
|
203
|
-
k.to_s.length
|
204
|
-
end.
|
205
|
-
max()
|
206
|
-
)
|
207
|
-
|
208
|
-
longest_key = 0 if longest_key.nil?
|
165
|
+
result = ''
|
166
|
+
|
167
|
+
text.each_line do |line|
|
168
|
+
result += (
|
169
|
+
if line.start_with? @tab
|
170
|
+
line[@tab.length..-1]
|
171
|
+
else
|
172
|
+
line
|
173
|
+
end
|
174
|
+
)
|
175
|
+
end
|
209
176
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
# so the total length to add when using color is 9.
|
215
|
-
longest_key += 9 if @color
|
177
|
+
return result
|
178
|
+
end
|
179
|
+
|
180
|
+
def self.xpand(x, indent: '', tab: ' ')
|
216
181
|
|
217
|
-
|
218
|
-
data_key = "#{xpand(key, indent: _indent, tab: tab)}"
|
219
|
-
|
220
|
-
data_key = (
|
221
|
-
if @hash_name_classes.include? key.class
|
222
|
-
data_key.ljust(longest_key + 1)
|
223
|
-
else
|
224
|
-
data_key.ljust(data_key.length + longest_key)
|
225
|
-
end
|
226
|
-
)
|
227
|
-
|
228
|
-
data_value = xpand(value, indent: _indent, tab: tab)
|
229
|
-
|
230
|
-
result += "#{_indent}#{data_key} => #{data_value}"
|
231
|
-
|
232
|
-
unless index + 1 == x.length
|
233
|
-
result += "#{@braces ? ', ' : ''} \n"
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
result += "\n#{indent}}" if @braces
|
182
|
+
_indent = "#{tab}#{indent}"
|
238
183
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
184
|
+
# X is a "primitive" kind of data that has no subitems, so
|
185
|
+
# we can just print it.
|
186
|
+
if x.class == String
|
187
|
+
return colorize(x.inspect, :string)
|
188
|
+
elsif x.class == Integer
|
189
|
+
return colorize(x.inspect, :integer)
|
190
|
+
elsif x.class == Float
|
191
|
+
return colorize(x.inspect, :float)
|
192
|
+
elsif x.class == TrueClass
|
193
|
+
return colorize(x.inspect, :true)
|
194
|
+
elsif x.class == FalseClass
|
195
|
+
return colorize(x.inspect, :false)
|
196
|
+
elsif x.class == NilClass
|
197
|
+
return colorize(x.inspect, :nil)
|
198
|
+
elsif x.class == Symbol
|
199
|
+
return colorize(x.inspect, :symbol)
|
200
|
+
elsif x.class == Regexp
|
201
|
+
return colorize(x.inspect, :regexp)
|
202
|
+
|
203
|
+
# X is a Proc, print more compact version of standard Proc.inspect
|
204
|
+
# text.
|
205
|
+
elsif x.class == Proc
|
206
|
+
type = x.lambda? ? 'Lambda' : 'Proc'
|
207
|
+
source, line = x.source_location
|
208
|
+
source = source.gsub('\\', '/')
|
209
|
+
|
210
|
+
unless @full_proc_path
|
211
|
+
source = source.split('/')[-2..-1].join('/')
|
212
|
+
end
|
213
|
+
|
214
|
+
return colorize("<#{type} @ #{source} [Line #{line}]>", :proc)
|
215
|
+
|
216
|
+
elsif x.class == Class
|
217
|
+
return colorize("<Class #{x}>", :classobject)
|
218
|
+
|
219
|
+
# X is an Array, print list of all items.
|
220
|
+
elsif x.class == Array
|
221
|
+
result = "#{@braces ? colorize('[', :square_brace) : ''}\n"
|
222
|
+
comma = colorize(',', :comma)
|
223
|
+
|
224
|
+
x.each_with_index do |item, index|
|
225
|
+
data = xpand(item, indent: _indent, tab: tab)
|
245
226
|
|
246
|
-
|
247
|
-
|
248
|
-
|
227
|
+
result += "#{_indent}"
|
228
|
+
if @indexes
|
229
|
+
adjustment = x.length.to_s.length + 3
|
230
|
+
# Account for characters used for color coding.
|
231
|
+
adjustment += 9 if @color
|
232
|
+
|
233
|
+
result += "#{colorize("[#{index}]", :index)} ".
|
234
|
+
ljust(adjustment)
|
235
|
+
end
|
236
|
+
result += "#{data}"
|
249
237
|
|
250
|
-
|
251
|
-
|
252
|
-
|
238
|
+
unless index + 1 == x.length
|
239
|
+
show_commas = @commas && @braces
|
240
|
+
|
241
|
+
result += "#{show_commas ? "#{comma}" : ''}"
|
242
|
+
result += "\n" unless result.end_with? "\n"
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
result += "\n#{indent}#{colorize(']', :square_brace)}" if @braces
|
247
|
+
return result
|
248
|
+
|
249
|
+
# X is a Hash, print all keys and values.
|
250
|
+
elsif x.class == Hash
|
251
|
+
comma = colorize(',', :comma)
|
252
|
+
result = "#{@braces ? colorize('{', :curly_brace) : ''}\n"
|
253
|
+
|
254
|
+
longest_key = (
|
255
|
+
x.keys.filter do |k, v|
|
256
|
+
@hash_name_classes.include? k.class
|
257
|
+
end.
|
258
|
+
map do |k, v|
|
259
|
+
k.to_s.length
|
260
|
+
end.
|
261
|
+
max()
|
262
|
+
)
|
263
|
+
|
264
|
+
longest_key = 0 if longest_key.nil?
|
265
|
+
|
266
|
+
# Color codes throw the text length, so we need to add the
|
267
|
+
# length of the color code and the code to reset the color
|
268
|
+
# that wrap around the colored word.
|
269
|
+
# The color code is like "\e[99m" and the reset "\e[0m",
|
270
|
+
# so the total length to add when using color is 9.
|
271
|
+
longest_key += 9 if @color
|
272
|
+
|
273
|
+
x.each_with_index do |(key, value), index|
|
274
|
+
data_key = "#{xpand(key, indent: _indent, tab: tab)}"
|
253
275
|
|
254
|
-
|
255
|
-
|
276
|
+
data_key = (
|
277
|
+
if @hash_name_classes.include? key.class
|
278
|
+
data_key.ljust(longest_key + 1)
|
279
|
+
else
|
280
|
+
data_key.ljust(data_key.length + longest_key)
|
281
|
+
end
|
282
|
+
)
|
256
283
|
|
257
|
-
|
258
|
-
return colorize("Rational(#{x})", :rational)
|
284
|
+
data_value = xpand(value, indent: _indent, tab: tab)
|
259
285
|
|
260
|
-
|
261
|
-
|
262
|
-
struct_word = colorize('Struct', :struct)
|
263
|
-
classname = colorize(x.class, :struct)
|
264
|
-
result = "#{struct_word} #{classname}#{@braces ? '(' : ''}\n"
|
265
|
-
longest_item = x.members.map { |m| m.to_s.length }.max()
|
266
|
-
|
267
|
-
x.each_pair do |name, value|
|
268
|
-
attr_name = colorize(name.to_s.ljust(longest_item), :attribute)
|
269
|
-
attr_data = xpand(value, indent: _indent, tab: tab)
|
270
|
-
|
271
|
-
result += "#{_indent}#{attr_name} = #{attr_data}\n"
|
272
|
-
end
|
273
|
-
|
274
|
-
result += "#{indent})" if @braces
|
275
|
-
|
276
|
-
return result
|
286
|
+
hash_separator = colorize(@hash_separator, :hash_separator)
|
287
|
+
result += "#{_indent}#{data_key}#{hash_separator}#{data_value}"
|
277
288
|
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
289
|
+
unless index + 1 == x.length
|
290
|
+
show_commas = @commas && @braces
|
291
|
+
result += "#{show_commas ? "#{comma} " : ''}"
|
292
|
+
result += "\n" unless result.end_with? "\n"
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
result += "\n#{indent}#{colorize('}', :curly_brace)}" if @braces
|
297
|
+
|
298
|
+
return result
|
299
|
+
|
300
|
+
# X is a commonly used special kind of object.
|
301
|
+
elsif x.class == DateTime
|
302
|
+
datetime = x.strftime @datetime_format
|
303
|
+
p1 = colorize('(', :parentheses)
|
304
|
+
p2 = colorize(')', :parentheses)
|
305
|
+
return colorize("DateTime#{p1}#{datetime}#{p2}", :datetime)
|
287
306
|
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
indent: _indent,
|
294
|
-
tab: tab
|
295
|
-
)
|
296
|
-
|
297
|
-
result += "#{_indent}#{attr_name} = #{attr_data}\n"
|
298
|
-
end
|
307
|
+
elsif x.class == Date
|
308
|
+
date = x.strftime @date_format
|
309
|
+
p1 = colorize('(', :parentheses)
|
310
|
+
p2 = colorize(')', :parentheses)
|
311
|
+
return colorize("Date#{p1}#{date}#{p2}", :date)
|
299
312
|
|
300
|
-
|
313
|
+
elsif x.class == Time
|
314
|
+
time = x.strftime @time_format
|
315
|
+
p1 = colorize('(', :parentheses)
|
316
|
+
p2 = colorize(')', :parentheses)
|
317
|
+
return colorize("Time#{p1}#{time}#{p2}", :time)
|
301
318
|
|
302
|
-
|
303
|
-
|
304
|
-
|
319
|
+
elsif x.class == BigDecimal
|
320
|
+
p1 = colorize('(', :parentheses)
|
321
|
+
p2 = colorize(')', :parentheses)
|
322
|
+
return colorize("BigDecimal#{p1}#{x.to_s('f')}#{p2}", :bigdecimal)
|
323
|
+
|
324
|
+
elsif x.class == Rational
|
325
|
+
p1 = colorize('(', :parentheses)
|
326
|
+
p2 = colorize(')', :parentheses)
|
327
|
+
return colorize("Rational#{p1}#{x}#{p2}", :rational)
|
328
|
+
|
329
|
+
# X is a Structure; essentially a special case of X being an object.
|
330
|
+
elsif x.is_a? Struct
|
331
|
+
struct_word = colorize('Struct', :struct)
|
332
|
+
classname = colorize(x.class, :struct)
|
333
|
+
p1 = colorize('(', :parentheses)
|
334
|
+
p2 = colorize(')', :parentheses)
|
335
|
+
result = "#{struct_word} #{classname}#{@braces ? p1 : ''}\n"
|
336
|
+
longest_item = x.members.map { |m| m.to_s.length }.max()
|
337
|
+
eq_sign = colorize('=', :equals)
|
338
|
+
|
339
|
+
x.each_pair do |name, value|
|
340
|
+
attr_name = colorize(name.to_s.ljust(longest_item), :attribute)
|
341
|
+
attr_data = xpand(value, indent: _indent, tab: tab)
|
342
|
+
|
343
|
+
result += "#{_indent}#{attr_name} #{eq_sign} #{attr_data}"
|
344
|
+
result += "\n" unless result.end_with? "\n"
|
345
|
+
end
|
346
|
+
|
347
|
+
result += "#{indent}#{p2}" if @braces
|
348
|
+
|
349
|
+
return result
|
350
|
+
|
351
|
+
# X is any arbitrary object; print all instance variables.
|
352
|
+
else
|
353
|
+
p1 = colorize('(', :parentheses)
|
354
|
+
p2 = colorize(')', :parentheses)
|
355
|
+
|
356
|
+
is_module = x.class == Module
|
357
|
+
classname = is_module ? "Module #{x}" : x.class
|
358
|
+
classname = colorize(classname, is_module ? :module : :classname)
|
359
|
+
result = "#{classname}#{@braces ? p1 : ''}"
|
360
|
+
ivars = x.instance_variables
|
361
|
+
result += "\n" if ivars.length > 0
|
362
|
+
longest_var = ivars.map { |v| v.to_s.length }.max()
|
363
|
+
eq_sign = colorize('=', :equals)
|
364
|
+
|
365
|
+
ivars.each_with_index do |var, index|
|
366
|
+
attr_name = var.to_s.ljust(longest_var)
|
367
|
+
attr_name = colorize(attr_name, :attribute)
|
368
|
+
attr_data = xpand(
|
369
|
+
x.instance_variable_get(var),
|
370
|
+
indent: _indent,
|
371
|
+
tab: tab
|
372
|
+
)
|
373
|
+
|
374
|
+
result += "#{_indent}#{attr_name} #{eq_sign} #{attr_data}"
|
375
|
+
result += "\n" unless result.end_with? "\n"
|
376
|
+
end
|
377
|
+
|
378
|
+
result += "#{ivars.length > 0 ? indent : ''}#{p2}" if @braces
|
379
|
+
|
380
|
+
return result
|
381
|
+
end
|
382
|
+
end
|
305
383
|
end
|
306
384
|
|
307
385
|
def xp(*args)
|
308
|
-
|
386
|
+
XPrint.xp(*args)
|
309
387
|
end
|
310
388
|
|
311
389
|
def xpand(item, tab: "\t")
|
312
|
-
|
313
|
-
end
|
390
|
+
XPrint.xpand(item, tab: tab)
|
391
|
+
end
|
metadata
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xprint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.52
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JCabr
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Gem that allows for pretty printing data over multiple lines and with
|
14
|
-
indentation, and works with objects as well as basic data types.
|
14
|
+
indentation, and works with objects as well as basic data types. Also allows color,
|
15
|
+
and loading settings via a YAML config file.
|
15
16
|
email:
|
16
17
|
- jcabr.dev@gmail.com
|
17
18
|
executables: []
|
@@ -24,7 +25,7 @@ homepage: https://github.com/JCabr/xprint.rb
|
|
24
25
|
licenses:
|
25
26
|
- MIT
|
26
27
|
metadata: {}
|
27
|
-
post_install_message:
|
28
|
+
post_install_message:
|
28
29
|
rdoc_options: []
|
29
30
|
require_paths:
|
30
31
|
- lib
|
@@ -39,8 +40,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: '0'
|
41
42
|
requirements: []
|
42
|
-
rubygems_version: 3.
|
43
|
-
signing_key:
|
43
|
+
rubygems_version: 3.2.15
|
44
|
+
signing_key:
|
44
45
|
specification_version: 4
|
45
46
|
summary: Gem for pretty printing any kind of object.
|
46
47
|
test_files: []
|