xprint 0.9.5 → 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 +353 -349
- metadata +6 -6
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.9.
|
3
|
-
end
|
2
|
+
VERSION = '0.9.52'
|
3
|
+
end
|
data/lib/xprint.rb
CHANGED
@@ -5,383 +5,387 @@ require 'yaml'
|
|
5
5
|
# TODO: Add ability for alphabetically sorting
|
6
6
|
# items in hashes and objects.
|
7
7
|
module XPrint
|
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
|
-
return
|
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
|
75
73
|
end
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
if config_data.key? :'color codes'
|
96
|
-
self.set_color_code_for **config_data[:'color codes']
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def self.load(config)
|
101
|
-
calling_file = caller_locations.first.absolute_path
|
102
|
-
base_dir = File.dirname calling_file
|
103
|
-
relative_config = File.expand_path config, base_dir
|
104
|
-
|
105
|
-
self.load_file relative_config
|
106
|
-
end
|
107
|
-
|
108
|
-
private_class_method def self.symbolize_keys(hash)
|
109
|
-
hash.inject({}) do |result, (key, value)|
|
110
|
-
new_key = key.to_sym
|
111
|
-
new_value = value.is_a?(Hash) ? symbolize_keys(value) : value
|
112
|
-
|
113
|
-
result[new_key] = new_value
|
114
|
-
|
115
|
-
result
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def self.set_color_for(**kwargs)
|
120
|
-
kwargs.each do |keyword, arg|
|
121
|
-
@colors[keyword] = arg
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def self.set_color_code_for(**kwargs)
|
126
|
-
kwargs.each do |keyword, arg|
|
127
|
-
@color_codes[keyword] = arg
|
128
|
-
end
|
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)
|
81
|
+
|
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]
|
129
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
|
130
108
|
|
131
|
-
def self.xp(*args)
|
132
|
-
args.each do |arg|
|
133
|
-
xpanded_text = self.xpand(arg, tab: @tab)
|
134
109
|
|
135
|
-
unless @braces
|
136
|
-
xpanded_text = self.shift_indentation_down(xpanded_text).lstrip()
|
137
|
-
end
|
138
110
|
|
139
|
-
|
140
|
-
|
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
|
141
119
|
end
|
142
|
-
|
143
|
-
|
144
|
-
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.set_color_for(**kwargs)
|
123
|
+
kwargs.each do |keyword, arg|
|
124
|
+
@colors[keyword] = arg
|
145
125
|
end
|
146
|
-
|
147
|
-
|
148
|
-
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.set_color_code_for(**kwargs)
|
129
|
+
kwargs.each do |keyword, arg|
|
130
|
+
@color_codes[keyword] = arg
|
149
131
|
end
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
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
|
158
141
|
end
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
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
|
176
158
|
end
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
# X is a "primitive" kind of data that has no subitems, so
|
183
|
-
# we can just print it.
|
184
|
-
if x.class == String
|
185
|
-
return colorize(x.inspect, :string)
|
186
|
-
elsif x.class == Integer
|
187
|
-
return colorize(x.inspect, :integer)
|
188
|
-
elsif x.class == Float
|
189
|
-
return colorize(x.inspect, :float)
|
190
|
-
elsif x.class == TrueClass
|
191
|
-
return colorize(x.inspect, :true)
|
192
|
-
elsif x.class == FalseClass
|
193
|
-
return colorize(x.inspect, :false)
|
194
|
-
elsif x.class == NilClass
|
195
|
-
return colorize(x.inspect, :nil)
|
196
|
-
elsif x.class == Symbol
|
197
|
-
return colorize(x.inspect, :symbol)
|
198
|
-
|
199
|
-
# X is a Proc, print more compact version of standard Proc.inspect
|
200
|
-
# text.
|
201
|
-
elsif x.class == Proc
|
202
|
-
type = x.lambda? ? 'Lambda' : 'Proc'
|
203
|
-
source, line = x.source_location
|
204
|
-
source = source.gsub('\\', '/')
|
205
|
-
|
206
|
-
unless @full_proc_path
|
207
|
-
source = source.split('/')[-2..-1].join('/')
|
208
|
-
end
|
209
|
-
|
210
|
-
return colorize("<#{type} @ #{source} [Line #{line}]>", :proc)
|
211
|
-
|
212
|
-
elsif x.class == Class
|
213
|
-
return colorize("<Class #{x}>", :classobject)
|
214
|
-
|
215
|
-
# X is an Array, print list of all items.
|
216
|
-
elsif x.class == Array
|
217
|
-
result = "#{@braces ? colorize('[', :square_brace) : ''}\n"
|
218
|
-
comma = colorize(',', :comma)
|
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/)
|
219
164
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
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
|
228
176
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
177
|
+
return result
|
178
|
+
end
|
179
|
+
|
180
|
+
def self.xpand(x, indent: '', tab: ' ')
|
233
181
|
|
234
|
-
|
235
|
-
show_commas = @commas && @braces
|
236
|
-
|
237
|
-
result += "#{show_commas ? "#{comma}" : ''}"
|
238
|
-
result += "\n" unless result.end_with? "\n"
|
239
|
-
end
|
240
|
-
end
|
182
|
+
_indent = "#{tab}#{indent}"
|
241
183
|
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
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)
|
268
215
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
data_value = xpand(value, indent: _indent, tab: tab)
|
281
|
-
|
282
|
-
hash_separator = colorize(@hash_separator, :hash_separator)
|
283
|
-
result += "#{_indent}#{data_key}#{hash_separator}#{data_value}"
|
284
|
-
|
285
|
-
unless index + 1 == x.length
|
286
|
-
show_commas = @commas && @braces
|
287
|
-
result += "#{show_commas ? "#{comma} " : ''}"
|
288
|
-
result += "\n" unless result.end_with? "\n"
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
result += "\n#{indent}#{colorize('}', :curly_brace)}" if @braces
|
293
|
-
|
294
|
-
return result
|
295
|
-
|
296
|
-
# X is a commonly used special kind of object.
|
297
|
-
elsif x.class == DateTime
|
298
|
-
datetime = x.strftime @datetime_format
|
299
|
-
p1 = colorize('(', :parentheses)
|
300
|
-
p2 = colorize(')', :parentheses)
|
301
|
-
return colorize("DateTime#{p1}#{datetime}#{p2}", :datetime)
|
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)
|
302
226
|
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
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}"
|
308
237
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
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)}"
|
314
275
|
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
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
|
+
)
|
319
283
|
|
320
|
-
|
321
|
-
p1 = colorize('(', :parentheses)
|
322
|
-
p2 = colorize(')', :parentheses)
|
323
|
-
return colorize("Rational#{p1}#{x}#{p2}", :rational)
|
284
|
+
data_value = xpand(value, indent: _indent, tab: tab)
|
324
285
|
|
325
|
-
|
326
|
-
|
327
|
-
struct_word = colorize('Struct', :struct)
|
328
|
-
classname = colorize(x.class, :struct)
|
329
|
-
p1 = colorize('(', :parentheses)
|
330
|
-
p2 = colorize(')', :parentheses)
|
331
|
-
result = "#{struct_word} #{classname}#{@braces ? p1 : ''}\n"
|
332
|
-
longest_item = x.members.map { |m| m.to_s.length }.max()
|
333
|
-
eq_sign = colorize('=', :equals)
|
334
|
-
|
335
|
-
x.each_pair do |name, value|
|
336
|
-
attr_name = colorize(name.to_s.ljust(longest_item), :attribute)
|
337
|
-
attr_data = xpand(value, indent: _indent, tab: tab)
|
338
|
-
|
339
|
-
result += "#{_indent}#{attr_name} #{eq_sign} #{attr_data}"
|
340
|
-
result += "\n" unless result.end_with? "\n"
|
341
|
-
end
|
342
|
-
|
343
|
-
result += "#{indent}#{p2}" if @braces
|
344
|
-
|
345
|
-
return result
|
286
|
+
hash_separator = colorize(@hash_separator, :hash_separator)
|
287
|
+
result += "#{_indent}#{data_key}#{hash_separator}#{data_value}"
|
346
288
|
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
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)
|
360
306
|
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
indent: _indent,
|
367
|
-
tab: tab
|
368
|
-
)
|
369
|
-
|
370
|
-
result += "#{_indent}#{attr_name} #{eq_sign} #{attr_data}"
|
371
|
-
result += "\n" unless result.end_with? "\n"
|
372
|
-
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)
|
373
312
|
|
374
|
-
|
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)
|
375
318
|
|
376
|
-
|
377
|
-
|
378
|
-
|
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
|
379
383
|
end
|
380
384
|
|
381
385
|
def xp(*args)
|
382
|
-
|
386
|
+
XPrint.xp(*args)
|
383
387
|
end
|
384
388
|
|
385
389
|
def xpand(item, tab: "\t")
|
386
|
-
|
390
|
+
XPrint.xpand(item, tab: tab)
|
387
391
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xprint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
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
14
|
indentation, and works with objects as well as basic data types. Also allows color,
|
@@ -25,7 +25,7 @@ homepage: https://github.com/JCabr/xprint.rb
|
|
25
25
|
licenses:
|
26
26
|
- MIT
|
27
27
|
metadata: {}
|
28
|
-
post_install_message:
|
28
|
+
post_install_message:
|
29
29
|
rdoc_options: []
|
30
30
|
require_paths:
|
31
31
|
- lib
|
@@ -40,8 +40,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
42
|
requirements: []
|
43
|
-
rubygems_version: 3.
|
44
|
-
signing_key:
|
43
|
+
rubygems_version: 3.2.15
|
44
|
+
signing_key:
|
45
45
|
specification_version: 4
|
46
46
|
summary: Gem for pretty printing any kind of object.
|
47
47
|
test_files: []
|