amazing_print 1.6.0 → 1.7.2
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/CHANGELOG.md +15 -2
- data/lib/amazing_print/ext/active_record.rb +32 -2
- data/lib/amazing_print/ext/nobrainer.rb +2 -2
- data/lib/amazing_print/formatters/base_formatter.rb +5 -1
- data/lib/amazing_print/formatters/hash_formatter.rb +29 -9
- data/lib/amazing_print/formatters/mswin_helper.rb +4 -4
- data/lib/amazing_print/formatters/object_formatter.rb +1 -1
- data/lib/amazing_print/formatters/struct_formatter.rb +1 -1
- data/lib/amazing_print/inspector.rb +1 -1
- data/lib/amazing_print/version.rb +1 -1
- metadata +6 -63
- data/.gitignore +0 -35
- data/Appraisals +0 -66
- data/Gemfile +0 -18
- data/Gemfile.lock +0 -94
- data/LICENSE +0 -22
- data/Rakefile +0 -25
- data/spec/active_record_helper.rb +0 -43
- data/spec/colors_spec.rb +0 -120
- data/spec/core_ext/logger_spec.rb +0 -70
- data/spec/ext/action_controller_spec.rb +0 -40
- data/spec/ext/action_view_spec.rb +0 -24
- data/spec/ext/active_model_spec.rb +0 -37
- data/spec/ext/active_record_spec.rb +0 -302
- data/spec/ext/active_support_spec.rb +0 -37
- data/spec/ext/mongo_mapper_spec.rb +0 -265
- data/spec/ext/mongoid_spec.rb +0 -135
- data/spec/ext/nobrainer_spec.rb +0 -64
- data/spec/ext/nokogiri_spec.rb +0 -52
- data/spec/ext/ostruct_spec.rb +0 -24
- data/spec/ext/ripple_spec.rb +0 -53
- data/spec/ext/sequel_spec.rb +0 -45
- data/spec/formats_spec.rb +0 -795
- data/spec/methods_spec.rb +0 -520
- data/spec/misc_spec.rb +0 -206
- data/spec/objects_spec.rb +0 -225
- data/spec/sequel_helper.rb +0 -18
- data/spec/spec_helper.rb +0 -112
- data/spec/support/active_record_data/3_2_diana.txt +0 -24
- data/spec/support/active_record_data/3_2_diana_legacy.txt +0 -24
- data/spec/support/active_record_data/3_2_multi.txt +0 -50
- data/spec/support/active_record_data/3_2_multi_legacy.txt +0 -50
- data/spec/support/active_record_data/4_0_diana.txt +0 -98
- data/spec/support/active_record_data/4_0_multi.txt +0 -198
- data/spec/support/active_record_data/4_1_diana.txt +0 -97
- data/spec/support/active_record_data/4_1_multi.txt +0 -196
- data/spec/support/active_record_data/4_2_diana.txt +0 -109
- data/spec/support/active_record_data/4_2_diana_legacy.txt +0 -109
- data/spec/support/active_record_data/4_2_multi.txt +0 -220
- data/spec/support/active_record_data/4_2_multi_legacy.txt +0 -220
- data/spec/support/active_record_data/5_0_diana.txt +0 -105
- data/spec/support/active_record_data/5_0_multi.txt +0 -212
- data/spec/support/active_record_data/5_1_diana.txt +0 -104
- data/spec/support/active_record_data/5_1_multi.txt +0 -210
- data/spec/support/active_record_data/5_2_diana.txt +0 -104
- data/spec/support/active_record_data/5_2_multi.txt +0 -210
- data/spec/support/active_record_data/6_0_diana.txt +0 -104
- data/spec/support/active_record_data/6_0_multi.txt +0 -210
- data/spec/support/active_record_data/6_1_diana.txt +0 -109
- data/spec/support/active_record_data/6_1_multi.txt +0 -220
- data/spec/support/active_record_data/7_0_diana.txt +0 -110
- data/spec/support/active_record_data/7_0_multi.txt +0 -222
- data/spec/support/active_record_data.rb +0 -22
- data/spec/support/ext_verifier.rb +0 -46
- data/spec/support/mongoid_versions.rb +0 -24
- data/spec/support/rails_versions.rb +0 -62
data/spec/formats_spec.rb
DELETED
@@ -1,795 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# rubocop:disable Lint/ConstantDefinitionInBlock
|
4
|
-
|
5
|
-
require 'spec_helper'
|
6
|
-
require 'bigdecimal'
|
7
|
-
require 'set'
|
8
|
-
|
9
|
-
RSpec.describe 'AmazingPrint' do
|
10
|
-
describe 'Array' do
|
11
|
-
before do
|
12
|
-
@arr = [1, :two, 'three', [nil, [true, false]]]
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'empty array' do
|
16
|
-
expect([].ai).to eq('[]')
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'plain multiline' do
|
20
|
-
expect(@arr.ai(plain: true)).to eq <<~EOS.strip
|
21
|
-
[
|
22
|
-
[0] 1,
|
23
|
-
[1] :two,
|
24
|
-
[2] "three",
|
25
|
-
[3] [
|
26
|
-
[0] nil,
|
27
|
-
[1] [
|
28
|
-
[0] true,
|
29
|
-
[1] false
|
30
|
-
]
|
31
|
-
]
|
32
|
-
]
|
33
|
-
EOS
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'plain multiline without index' do
|
37
|
-
expect(@arr.ai(plain: true, index: false)).to eq <<~EOS.strip
|
38
|
-
[
|
39
|
-
1,
|
40
|
-
:two,
|
41
|
-
"three",
|
42
|
-
[
|
43
|
-
nil,
|
44
|
-
[
|
45
|
-
true,
|
46
|
-
false
|
47
|
-
]
|
48
|
-
]
|
49
|
-
]
|
50
|
-
EOS
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'plain multiline indented' do
|
54
|
-
expect(@arr.ai(plain: true, indent: 2)).to eq <<~EOS.strip
|
55
|
-
[
|
56
|
-
[0] 1,
|
57
|
-
[1] :two,
|
58
|
-
[2] "three",
|
59
|
-
[3] [
|
60
|
-
[0] nil,
|
61
|
-
[1] [
|
62
|
-
[0] true,
|
63
|
-
[1] false
|
64
|
-
]
|
65
|
-
]
|
66
|
-
]
|
67
|
-
EOS
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'plain multiline indented without index' do
|
71
|
-
expect(@arr.ai(plain: true, indent: 2, index: false)).to eq <<~EOS.strip
|
72
|
-
[
|
73
|
-
1,
|
74
|
-
:two,
|
75
|
-
"three",
|
76
|
-
[
|
77
|
-
nil,
|
78
|
-
[
|
79
|
-
true,
|
80
|
-
false
|
81
|
-
]
|
82
|
-
]
|
83
|
-
]
|
84
|
-
EOS
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'plain single line' do
|
88
|
-
expect(@arr.ai(plain: true, multiline: false)).to eq('[ 1, :two, "three", [ nil, [ true, false ] ] ]')
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'colored multiline (default)' do
|
92
|
-
expect(@arr.ai).to eq <<~EOS.strip
|
93
|
-
[
|
94
|
-
\e[1;37m[0] \e[0m\e[1;34m1\e[0m,
|
95
|
-
\e[1;37m[1] \e[0m\e[0;36m:two\e[0m,
|
96
|
-
\e[1;37m[2] \e[0m\e[0;33m"three"\e[0m,
|
97
|
-
\e[1;37m[3] \e[0m[
|
98
|
-
\e[1;37m[0] \e[0m\e[1;31mnil\e[0m,
|
99
|
-
\e[1;37m[1] \e[0m[
|
100
|
-
\e[1;37m[0] \e[0m\e[1;32mtrue\e[0m,
|
101
|
-
\e[1;37m[1] \e[0m\e[1;31mfalse\e[0m
|
102
|
-
]
|
103
|
-
]
|
104
|
-
]
|
105
|
-
EOS
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'colored multiline indented' do
|
109
|
-
expect(@arr.ai(indent: 8)).to eq <<~EOS.strip
|
110
|
-
[
|
111
|
-
\e[1;37m[0] \e[0m\e[1;34m1\e[0m,
|
112
|
-
\e[1;37m[1] \e[0m\e[0;36m:two\e[0m,
|
113
|
-
\e[1;37m[2] \e[0m\e[0;33m"three"\e[0m,
|
114
|
-
\e[1;37m[3] \e[0m[
|
115
|
-
\e[1;37m[0] \e[0m\e[1;31mnil\e[0m,
|
116
|
-
\e[1;37m[1] \e[0m[
|
117
|
-
\e[1;37m[0] \e[0m\e[1;32mtrue\e[0m,
|
118
|
-
\e[1;37m[1] \e[0m\e[1;31mfalse\e[0m
|
119
|
-
]
|
120
|
-
]
|
121
|
-
]
|
122
|
-
EOS
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'colored single line' do
|
126
|
-
expect(@arr.ai(multiline: false)).to eq("[ \e[1;34m1\e[0m, \e[0;36m:two\e[0m, \e[0;33m\"three\"\e[0m, [ \e[1;31mnil\e[0m, [ \e[1;32mtrue\e[0m, \e[1;31mfalse\e[0m ] ] ]")
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
#------------------------------------------------------------------------------
|
131
|
-
describe 'Nested Array' do
|
132
|
-
before do
|
133
|
-
@arr = [1, 2]
|
134
|
-
@arr << @arr
|
135
|
-
end
|
136
|
-
|
137
|
-
it 'plain multiline' do
|
138
|
-
expect(@arr.ai(plain: true)).to eq <<~EOS.strip
|
139
|
-
[
|
140
|
-
[0] 1,
|
141
|
-
[1] 2,
|
142
|
-
[2] [...]
|
143
|
-
]
|
144
|
-
EOS
|
145
|
-
end
|
146
|
-
|
147
|
-
it 'plain multiline without index' do
|
148
|
-
expect(@arr.ai(plain: true, index: false)).to eq <<~EOS.strip
|
149
|
-
[
|
150
|
-
1,
|
151
|
-
2,
|
152
|
-
[...]
|
153
|
-
]
|
154
|
-
EOS
|
155
|
-
end
|
156
|
-
|
157
|
-
it 'plain single line' do
|
158
|
-
expect(@arr.ai(plain: true, multiline: false)).to eq('[ 1, 2, [...] ]')
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
#------------------------------------------------------------------------------
|
163
|
-
describe 'Limited Output Array' do
|
164
|
-
before do
|
165
|
-
@arr = (1..1000).to_a
|
166
|
-
end
|
167
|
-
|
168
|
-
it 'plain limited output large' do
|
169
|
-
expect(@arr.ai(plain: true, limit: true)).to eq <<~EOS.strip
|
170
|
-
[
|
171
|
-
[ 0] 1,
|
172
|
-
[ 1] 2,
|
173
|
-
[ 2] 3,
|
174
|
-
[ 3] .. [996],
|
175
|
-
[997] 998,
|
176
|
-
[998] 999,
|
177
|
-
[999] 1000
|
178
|
-
]
|
179
|
-
EOS
|
180
|
-
end
|
181
|
-
|
182
|
-
it 'plain limited output small' do
|
183
|
-
@arr = @arr[0..3]
|
184
|
-
expect(@arr.ai(plain: true, limit: true)).to eq <<~EOS.strip
|
185
|
-
[
|
186
|
-
[0] 1,
|
187
|
-
[1] 2,
|
188
|
-
[2] 3,
|
189
|
-
[3] 4
|
190
|
-
]
|
191
|
-
EOS
|
192
|
-
end
|
193
|
-
|
194
|
-
it 'plain limited output with 10 lines' do
|
195
|
-
expect(@arr.ai(plain: true, limit: 10)).to eq <<~EOS.strip
|
196
|
-
[
|
197
|
-
[ 0] 1,
|
198
|
-
[ 1] 2,
|
199
|
-
[ 2] 3,
|
200
|
-
[ 3] 4,
|
201
|
-
[ 4] 5,
|
202
|
-
[ 5] .. [995],
|
203
|
-
[996] 997,
|
204
|
-
[997] 998,
|
205
|
-
[998] 999,
|
206
|
-
[999] 1000
|
207
|
-
]
|
208
|
-
EOS
|
209
|
-
end
|
210
|
-
|
211
|
-
it 'plain limited output with 11 lines' do
|
212
|
-
expect(@arr.ai(plain: true, limit: 11)).to eq <<~EOS.strip
|
213
|
-
[
|
214
|
-
[ 0] 1,
|
215
|
-
[ 1] 2,
|
216
|
-
[ 2] 3,
|
217
|
-
[ 3] 4,
|
218
|
-
[ 4] 5,
|
219
|
-
[ 5] .. [994],
|
220
|
-
[995] 996,
|
221
|
-
[996] 997,
|
222
|
-
[997] 998,
|
223
|
-
[998] 999,
|
224
|
-
[999] 1000
|
225
|
-
]
|
226
|
-
EOS
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
#------------------------------------------------------------------------------
|
231
|
-
describe 'Limited Output Hash' do
|
232
|
-
before do
|
233
|
-
@hash = ('a'..'z').inject({}) { |h, v| h.merge({ v => v.to_sym }) }
|
234
|
-
end
|
235
|
-
|
236
|
-
it 'plain limited output' do
|
237
|
-
expect(@hash.ai(sort_keys: true, plain: true, limit: true)).to eq <<~EOS.strip
|
238
|
-
{
|
239
|
-
"a" => :a,
|
240
|
-
"b" => :b,
|
241
|
-
"c" => :c,
|
242
|
-
"d" => :d .. "w" => :w,
|
243
|
-
"x" => :x,
|
244
|
-
"y" => :y,
|
245
|
-
"z" => :z
|
246
|
-
}
|
247
|
-
EOS
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
#------------------------------------------------------------------------------
|
252
|
-
describe 'Hash' do
|
253
|
-
before do
|
254
|
-
@hash = { 1 => { sym: { 'str' => { [1, 2, 3] => { { k: :v } => Hash } } } } }
|
255
|
-
end
|
256
|
-
|
257
|
-
it 'empty hash' do
|
258
|
-
expect({}.ai).to eq('{}')
|
259
|
-
end
|
260
|
-
|
261
|
-
it 'plain multiline' do
|
262
|
-
expect(@hash.ai(plain: true)).to eq <<~EOS.strip
|
263
|
-
{
|
264
|
-
1 => {
|
265
|
-
:sym => {
|
266
|
-
"str" => {
|
267
|
-
[ 1, 2, 3 ] => {
|
268
|
-
{ :k => :v } => Hash < Object
|
269
|
-
}
|
270
|
-
}
|
271
|
-
}
|
272
|
-
}
|
273
|
-
}
|
274
|
-
EOS
|
275
|
-
end
|
276
|
-
|
277
|
-
it 'new hash syntax' do
|
278
|
-
expect(@hash.ai(plain: true, ruby19_syntax: true)).to eq <<~EOS.strip
|
279
|
-
{
|
280
|
-
1 => {
|
281
|
-
sym: {
|
282
|
-
"str" => {
|
283
|
-
[ 1, 2, 3 ] => {
|
284
|
-
{ k: :v } => Hash < Object
|
285
|
-
}
|
286
|
-
}
|
287
|
-
}
|
288
|
-
}
|
289
|
-
}
|
290
|
-
EOS
|
291
|
-
end
|
292
|
-
|
293
|
-
it 'plain multiline indented' do
|
294
|
-
expect(@hash.ai(plain: true, indent: 1)).to eq <<~EOS.strip
|
295
|
-
{
|
296
|
-
1 => {
|
297
|
-
:sym => {
|
298
|
-
"str" => {
|
299
|
-
[ 1, 2, 3 ] => {
|
300
|
-
{ :k => :v } => Hash < Object
|
301
|
-
}
|
302
|
-
}
|
303
|
-
}
|
304
|
-
}
|
305
|
-
}
|
306
|
-
EOS
|
307
|
-
end
|
308
|
-
|
309
|
-
it 'plain single line' do
|
310
|
-
expect(@hash.ai(plain: true,
|
311
|
-
multiline: false)).to eq('{ 1 => { :sym => { "str" => { [ 1, 2, 3 ] => { { :k => :v } => Hash < Object } } } } }')
|
312
|
-
end
|
313
|
-
|
314
|
-
it 'colored multiline (default)' do
|
315
|
-
expect(@hash.ai).to eq <<~EOS.strip
|
316
|
-
{
|
317
|
-
\e[1;34m1\e[0m\e[0;37m => \e[0m{
|
318
|
-
\e[0;36m:sym\e[0m\e[0;37m => \e[0m{
|
319
|
-
\e[0;33m"str"\e[0m\e[0;37m => \e[0m{
|
320
|
-
[ \e[1;34m1\e[0m, \e[1;34m2\e[0m, \e[1;34m3\e[0m ]\e[0;37m => \e[0m{
|
321
|
-
{ \e[0;36m:k\e[0m\e[0;37m => \e[0m\e[0;36m:v\e[0m }\e[0;37m => \e[0m\e[1;33mHash < Object\e[0m
|
322
|
-
}
|
323
|
-
}
|
324
|
-
}
|
325
|
-
}
|
326
|
-
}
|
327
|
-
EOS
|
328
|
-
end
|
329
|
-
|
330
|
-
it 'colored with new hash syntax' do
|
331
|
-
expect(@hash.ai(ruby19_syntax: true)).to eq <<~EOS.strip
|
332
|
-
{
|
333
|
-
\e[1;34m1\e[0m\e[0;37m => \e[0m{
|
334
|
-
\e[0;36m:sym\e[0m\e[0;37m => \e[0m{
|
335
|
-
\e[0;33m"str"\e[0m\e[0;37m => \e[0m{
|
336
|
-
[ \e[1;34m1\e[0m, \e[1;34m2\e[0m, \e[1;34m3\e[0m ]\e[0;37m => \e[0m{
|
337
|
-
{ \e[0;36m:k\e[0m\e[0;37m => \e[0m\e[0;36m:v\e[0m }\e[0;37m => \e[0m\e[1;33mHash < Object\e[0m
|
338
|
-
}
|
339
|
-
}
|
340
|
-
}
|
341
|
-
}
|
342
|
-
}
|
343
|
-
EOS
|
344
|
-
end
|
345
|
-
|
346
|
-
it 'colored multiline indented' do
|
347
|
-
expect(@hash.ai(indent: 2)).to eq <<~EOS.strip
|
348
|
-
{
|
349
|
-
\e[1;34m1\e[0m\e[0;37m => \e[0m{
|
350
|
-
\e[0;36m:sym\e[0m\e[0;37m => \e[0m{
|
351
|
-
\e[0;33m"str"\e[0m\e[0;37m => \e[0m{
|
352
|
-
[ \e[1;34m1\e[0m, \e[1;34m2\e[0m, \e[1;34m3\e[0m ]\e[0;37m => \e[0m{
|
353
|
-
{ \e[0;36m:k\e[0m\e[0;37m => \e[0m\e[0;36m:v\e[0m }\e[0;37m => \e[0m\e[1;33mHash < Object\e[0m
|
354
|
-
}
|
355
|
-
}
|
356
|
-
}
|
357
|
-
}
|
358
|
-
}
|
359
|
-
EOS
|
360
|
-
end
|
361
|
-
|
362
|
-
it 'colored single line' do
|
363
|
-
puts @hash.ai(multiline: false)
|
364
|
-
expect(@hash.ai(multiline: false)).to eq(
|
365
|
-
"{ \e[1;34m1\e[0m\e[0;37m => \e[0m{ \e[0;36m:sym\e[0m\e[0;37m => \e[0m{ \e[0;33m\"str\"\e[0m\e[0;37m => \e[0m{ [ \e[1;34m1\e[0m, \e[1;34m2\e[0m, \e[1;34m3\e[0m ]\e[0;37m => \e[0m{ { \e[0;36m:k\e[0m\e[0;37m => \e[0m\e[0;36m:v\e[0m }\e[0;37m => \e[0m\e[1;33mHash < Object\e[0m } } } } }" # rubocop:disable Layout/LineLength
|
366
|
-
)
|
367
|
-
end
|
368
|
-
end
|
369
|
-
|
370
|
-
#------------------------------------------------------------------------------
|
371
|
-
describe 'Nested Hash' do
|
372
|
-
before do
|
373
|
-
@hash = {}
|
374
|
-
@hash[:a] = @hash
|
375
|
-
end
|
376
|
-
|
377
|
-
it 'plain multiline' do
|
378
|
-
expect(@hash.ai(plain: true)).to eq <<~EOS.strip
|
379
|
-
{
|
380
|
-
:a => {...}
|
381
|
-
}
|
382
|
-
EOS
|
383
|
-
end
|
384
|
-
|
385
|
-
it 'plain single line' do
|
386
|
-
expect(@hash.ai(plain: true, multiline: false)).to eq('{ :a => {...} }')
|
387
|
-
end
|
388
|
-
end
|
389
|
-
|
390
|
-
#------------------------------------------------------------------------------
|
391
|
-
describe 'Hash with several keys' do
|
392
|
-
before do
|
393
|
-
@hash = { 'b' => 'b', :a => 'a', :z => 'z', 'alpha' => 'alpha' }
|
394
|
-
end
|
395
|
-
|
396
|
-
it 'plain multiline' do
|
397
|
-
out = @hash.ai(plain: true)
|
398
|
-
expect(out).to eq <<~EOS.strip
|
399
|
-
{
|
400
|
-
"b" => "b",
|
401
|
-
:a => "a",
|
402
|
-
:z => "z",
|
403
|
-
"alpha" => "alpha"
|
404
|
-
}
|
405
|
-
EOS
|
406
|
-
end
|
407
|
-
|
408
|
-
it 'plain multiline with sorted keys' do
|
409
|
-
expect(@hash.ai(plain: true, sort_keys: true)).to eq <<~EOS.strip
|
410
|
-
{
|
411
|
-
:a => "a",
|
412
|
-
"alpha" => "alpha",
|
413
|
-
"b" => "b",
|
414
|
-
:z => "z"
|
415
|
-
}
|
416
|
-
EOS
|
417
|
-
end
|
418
|
-
end
|
419
|
-
|
420
|
-
#------------------------------------------------------------------------------
|
421
|
-
describe 'Negative options[:indent]' do
|
422
|
-
#
|
423
|
-
# With Ruby < 1.9 the order of hash keys is not defined so we can't
|
424
|
-
# reliably compare the output string.
|
425
|
-
#
|
426
|
-
it 'hash keys must be left aligned' do
|
427
|
-
hash = { [0, 0, 255] => :yellow, :red => 'rgb(255, 0, 0)', 'magenta' => 'rgb(255, 0, 255)' }
|
428
|
-
out = hash.ai(plain: true, indent: -4, sort_keys: true)
|
429
|
-
expect(out).to eq <<~EOS.strip
|
430
|
-
{
|
431
|
-
[ 0, 0, 255 ] => :yellow,
|
432
|
-
"magenta" => "rgb(255, 0, 255)",
|
433
|
-
:red => "rgb(255, 0, 0)"
|
434
|
-
}
|
435
|
-
EOS
|
436
|
-
end
|
437
|
-
|
438
|
-
it 'nested hash keys should be indented (array of hashes)' do
|
439
|
-
arr = [{ a: 1, bb: 22, ccc: 333 }, { 1 => :a, 22 => :bb, 333 => :ccc }]
|
440
|
-
out = arr.ai(plain: true, indent: -4, sort_keys: true)
|
441
|
-
expect(out).to eq <<~EOS.strip
|
442
|
-
[
|
443
|
-
[0] {
|
444
|
-
:a => 1,
|
445
|
-
:bb => 22,
|
446
|
-
:ccc => 333
|
447
|
-
},
|
448
|
-
[1] {
|
449
|
-
1 => :a,
|
450
|
-
22 => :bb,
|
451
|
-
333 => :ccc
|
452
|
-
}
|
453
|
-
]
|
454
|
-
EOS
|
455
|
-
end
|
456
|
-
|
457
|
-
it 'nested hash keys should be indented (hash of hashes)' do
|
458
|
-
arr = { first: { a: 1, bb: 22, ccc: 333 }, second: { 1 => :a, 22 => :bb, 333 => :ccc } }
|
459
|
-
out = arr.ai(plain: true, indent: -4, sort_keys: true)
|
460
|
-
expect(out).to eq <<~EOS.strip
|
461
|
-
{
|
462
|
-
:first => {
|
463
|
-
:a => 1,
|
464
|
-
:bb => 22,
|
465
|
-
:ccc => 333
|
466
|
-
},
|
467
|
-
:second => {
|
468
|
-
1 => :a,
|
469
|
-
22 => :bb,
|
470
|
-
333 => :ccc
|
471
|
-
}
|
472
|
-
}
|
473
|
-
EOS
|
474
|
-
end
|
475
|
-
end
|
476
|
-
|
477
|
-
#
|
478
|
-
# With Ruby 1.9 syntax
|
479
|
-
#
|
480
|
-
it 'hash keys must be left aligned' do
|
481
|
-
hash = { [0, 0, 255] => :yellow, :bloodiest_red => 'rgb(255, 0, 0)', 'magenta' => 'rgb(255, 0, 255)' }
|
482
|
-
out = hash.ai(plain: true, indent: -2, ruby19_syntax: true, sort_keys: true)
|
483
|
-
expect(out).to eq <<~EOS.strip
|
484
|
-
{
|
485
|
-
[ 0, 0, 255 ] => :yellow,
|
486
|
-
bloodiest_red: "rgb(255, 0, 0)",
|
487
|
-
"magenta" => "rgb(255, 0, 255)"
|
488
|
-
}
|
489
|
-
EOS
|
490
|
-
end
|
491
|
-
|
492
|
-
#------------------------------------------------------------------------------
|
493
|
-
describe 'Class' do
|
494
|
-
it 'shows superclass (plain)' do
|
495
|
-
expect(self.class.ai(plain: true)).to eq("#{self.class} < #{self.class.superclass}")
|
496
|
-
end
|
497
|
-
|
498
|
-
it 'shows superclass (color)' do
|
499
|
-
expect(self.class.ai).to eq(AmazingPrint::Colors.yellow("#{self.class} < #{self.class.superclass}"))
|
500
|
-
end
|
501
|
-
end
|
502
|
-
|
503
|
-
#------------------------------------------------------------------------------
|
504
|
-
describe 'File' do
|
505
|
-
it 'displays a file (plain)', :unix do
|
506
|
-
File.open(__FILE__, 'r') do |f|
|
507
|
-
expect(f.ai(plain: true)).to eq("#{f.inspect}\n" + `ls -alF #{f.path}`.chop)
|
508
|
-
end
|
509
|
-
end
|
510
|
-
|
511
|
-
it 'displays a file (plain) akin to powershell Get-ChildItem', :mswin do
|
512
|
-
File.open(__FILE__, 'r') do |f|
|
513
|
-
expect(f.ai(plain: true)).to eq("#{f.inspect}\n" + AmazingPrint::Formatters::GetChildItem.new(f.path).to_s)
|
514
|
-
end
|
515
|
-
end
|
516
|
-
end
|
517
|
-
|
518
|
-
#------------------------------------------------------------------------------
|
519
|
-
describe 'Dir' do
|
520
|
-
it 'displays a direcory (plain)', :unix do
|
521
|
-
Dir.open(File.dirname(__FILE__)) do |d|
|
522
|
-
expect(d.ai(plain: true)).to eq("#{d.inspect}\n" + `ls -alF #{d.path}`.chop)
|
523
|
-
end
|
524
|
-
end
|
525
|
-
|
526
|
-
it 'displays a directory (plain) akin to powershell Get-ChildItem', :mswin do
|
527
|
-
Dir.open(File.dirname(__FILE__)) do |d|
|
528
|
-
expect(d.ai(plain: true)).to eq("#{d.inspect}\n" + AmazingPrint::Formatters::GetChildItem.new(d.path).to_s)
|
529
|
-
end
|
530
|
-
end
|
531
|
-
end
|
532
|
-
|
533
|
-
#------------------------------------------------------------------------------
|
534
|
-
describe 'BigDecimal and Rational' do
|
535
|
-
it 'presents BigDecimal object with arbitrary precision' do
|
536
|
-
big = BigDecimal('201020102010201020102010201020102010.4')
|
537
|
-
expect(big.ai(plain: true)).to eq('201020102010201020102010201020102010.4')
|
538
|
-
end
|
539
|
-
|
540
|
-
it 'presents Rational object with arbitrary precision' do
|
541
|
-
rat = Rational(201_020_102_010_201_020_102_010_201_020_102_010, 2)
|
542
|
-
out = rat.ai(plain: true)
|
543
|
-
expect(out).to eq('100510051005100510051005100510051005/1')
|
544
|
-
end
|
545
|
-
end
|
546
|
-
|
547
|
-
#------------------------------------------------------------------------------
|
548
|
-
describe 'Utility methods' do
|
549
|
-
it 'merges options' do
|
550
|
-
ap = AmazingPrint::Inspector.new
|
551
|
-
ap.send(:merge_options!, { color: { array: :black }, indent: 0 })
|
552
|
-
options = ap.instance_variable_get('@options')
|
553
|
-
expect(options[:color][:array]).to eq(:black)
|
554
|
-
expect(options[:indent]).to eq(0)
|
555
|
-
end
|
556
|
-
end
|
557
|
-
|
558
|
-
#------------------------------------------------------------------------------
|
559
|
-
describe 'Set' do
|
560
|
-
before do
|
561
|
-
@arr = [1, :two, 'three']
|
562
|
-
@set = Set.new(@arr)
|
563
|
-
end
|
564
|
-
|
565
|
-
it 'empty set' do
|
566
|
-
expect(Set.new.ai).to eq([].ai)
|
567
|
-
end
|
568
|
-
|
569
|
-
it 'plain multiline' do
|
570
|
-
expect(@set.ai(plain: true)).to eq(@arr.ai(plain: true))
|
571
|
-
end
|
572
|
-
|
573
|
-
it 'plain multiline indented' do
|
574
|
-
expect(@set.ai(plain: true, indent: 1)).to eq(@arr.ai(plain: true, indent: 1))
|
575
|
-
end
|
576
|
-
|
577
|
-
it 'plain single line' do
|
578
|
-
expect(@set.ai(plain: true, multiline: false)).to eq(@arr.ai(plain: true, multiline: false))
|
579
|
-
end
|
580
|
-
|
581
|
-
it 'colored multiline (default)' do
|
582
|
-
expect(@set.ai).to eq(@arr.ai)
|
583
|
-
end
|
584
|
-
end
|
585
|
-
|
586
|
-
#------------------------------------------------------------------------------
|
587
|
-
describe 'Struct' do
|
588
|
-
before do
|
589
|
-
@struct = if defined?(Struct::SimpleStruct)
|
590
|
-
Struct::SimpleStruct.new
|
591
|
-
else
|
592
|
-
Struct.new('SimpleStruct', :name, :address).new
|
593
|
-
end
|
594
|
-
@struct.name = 'Herman Munster'
|
595
|
-
@struct.address = '1313 Mockingbird Lane'
|
596
|
-
end
|
597
|
-
|
598
|
-
it 'empty struct' do
|
599
|
-
expect(Struct.new('EmptyStruct').ai).to eq("\e[1;33mStruct::EmptyStruct < Struct\e[0m")
|
600
|
-
end
|
601
|
-
|
602
|
-
it 'plain multiline' do
|
603
|
-
s1 = <<-EOS.strip
|
604
|
-
address = "1313 Mockingbird Lane",
|
605
|
-
name = "Herman Munster"
|
606
|
-
EOS
|
607
|
-
s2 = <<-EOS.strip
|
608
|
-
name = "Herman Munster",
|
609
|
-
address = "1313 Mockingbird Lane"
|
610
|
-
EOS
|
611
|
-
expect(@struct.ai(plain: true)).to satisfy { |out| out.match(s1) || out.match(s2) }
|
612
|
-
end
|
613
|
-
|
614
|
-
it 'plain multiline indented' do
|
615
|
-
s1 = <<-EOS.strip
|
616
|
-
address = "1313 Mockingbird Lane",
|
617
|
-
name = "Herman Munster"
|
618
|
-
EOS
|
619
|
-
s2 = <<-EOS.strip
|
620
|
-
name = "Herman Munster",
|
621
|
-
address = "1313 Mockingbird Lane"
|
622
|
-
EOS
|
623
|
-
expect(@struct.ai(plain: true, indent: 1)).to satisfy { |out| out.match(s1) || out.match(s2) }
|
624
|
-
end
|
625
|
-
|
626
|
-
it 'plain single line' do
|
627
|
-
s1 = 'address = "1313 Mockingbird Lane", name = "Herman Munster"'
|
628
|
-
s2 = 'name = "Herman Munster", address = "1313 Mockingbird Lane"'
|
629
|
-
expect(@struct.ai(plain: true, multiline: false)).to satisfy { |out| out.match(s1) || out.match(s2) }
|
630
|
-
end
|
631
|
-
|
632
|
-
it 'colored multiline (default)' do
|
633
|
-
s1 = <<-EOS.strip
|
634
|
-
address\e[0;37m = \e[0m\e[0;33m"1313 Mockingbird Lane"\e[0m,
|
635
|
-
name\e[0;37m = \e[0m\e[0;33m"Herman Munster"\e[0m
|
636
|
-
EOS
|
637
|
-
s2 = <<-EOS.strip
|
638
|
-
name\e[0;37m = \e[0m\e[0;33m"Herman Munster"\e[0m,
|
639
|
-
address\e[0;37m = \e[0m\e[0;33m"1313 Mockingbird Lane"\e[0m
|
640
|
-
EOS
|
641
|
-
expect(@struct.ai).to satisfy { |out| out.include?(s1) || out.include?(s2) }
|
642
|
-
end
|
643
|
-
end
|
644
|
-
|
645
|
-
#------------------------------------------------------------------------------
|
646
|
-
describe 'Inherited from standard Ruby classes' do
|
647
|
-
after do
|
648
|
-
Object.instance_eval { remove_const :My } if defined?(My)
|
649
|
-
end
|
650
|
-
|
651
|
-
it 'inherited from Array should be displayed as Array' do
|
652
|
-
class My < Array; end
|
653
|
-
|
654
|
-
my = My.new([1, :two, 'three', [nil, [true, false]]])
|
655
|
-
expect(my.ai(plain: true)).to eq <<~EOS.strip
|
656
|
-
[
|
657
|
-
[0] 1,
|
658
|
-
[1] :two,
|
659
|
-
[2] "three",
|
660
|
-
[3] [
|
661
|
-
[0] nil,
|
662
|
-
[1] [
|
663
|
-
[0] true,
|
664
|
-
[1] false
|
665
|
-
]
|
666
|
-
]
|
667
|
-
]
|
668
|
-
EOS
|
669
|
-
end
|
670
|
-
|
671
|
-
it 'inherited from Hash should be displayed as Hash' do
|
672
|
-
class My < Hash; end
|
673
|
-
|
674
|
-
my = My[{ 1 => { sym: { 'str' => { [1, 2, 3] => { { k: :v } => Hash } } } } }]
|
675
|
-
expect(my.ai(plain: true)).to eq <<~EOS.strip
|
676
|
-
{
|
677
|
-
1 => {
|
678
|
-
:sym => {
|
679
|
-
"str" => {
|
680
|
-
[ 1, 2, 3 ] => {
|
681
|
-
{ :k => :v } => Hash < Object
|
682
|
-
}
|
683
|
-
}
|
684
|
-
}
|
685
|
-
}
|
686
|
-
}
|
687
|
-
EOS
|
688
|
-
end
|
689
|
-
|
690
|
-
it 'inherited from File should be displayed as File', :unix do
|
691
|
-
class My < File; end
|
692
|
-
|
693
|
-
my = begin
|
694
|
-
File.new('/dev/null')
|
695
|
-
rescue StandardError
|
696
|
-
File.new('nul')
|
697
|
-
end
|
698
|
-
expect(my.ai(plain: true)).to eq("#{my.inspect}\n" + `ls -alF #{my.path}`.chop)
|
699
|
-
end
|
700
|
-
|
701
|
-
it 'inherited from File should be displayed as File', :mswin do
|
702
|
-
class My < File; end
|
703
|
-
my = My.new('nul') # it's /dev/null in Windows
|
704
|
-
expect(my.ai(plain: true)).to eq("#{my.inspect}\n" + AmazingPrint::Formatters::GetChildItem.new(my.path).to_s)
|
705
|
-
end
|
706
|
-
|
707
|
-
it 'inherited from Dir should be displayed as Dir', :unix do
|
708
|
-
class My < Dir; end
|
709
|
-
|
710
|
-
require 'tmpdir'
|
711
|
-
my = My.new(Dir.tmpdir)
|
712
|
-
expect(my.ai(plain: true)).to eq("#{my.inspect}\n" + `ls -alF #{my.path}`.chop)
|
713
|
-
end
|
714
|
-
|
715
|
-
it 'inherited from Dir are displayed as Dir', :mswin do
|
716
|
-
class My < Dir; end
|
717
|
-
|
718
|
-
require 'tmpdir'
|
719
|
-
my = My.new(Dir.tmpdir)
|
720
|
-
expect(my.ai(plain: true)).to eq("#{my.inspect}\n" + AmazingPrint::Formatters::GetChildItem.new(my.path).to_s)
|
721
|
-
end
|
722
|
-
|
723
|
-
it 'handles a class that defines its own #send method' do
|
724
|
-
class My
|
725
|
-
def send(arg1, arg2, arg3); end
|
726
|
-
end
|
727
|
-
|
728
|
-
my = My.new
|
729
|
-
expect { my.methods.ai(plain: true) }.not_to raise_error
|
730
|
-
end
|
731
|
-
|
732
|
-
it 'handles a class defines its own #method method (ex. request.method)' do
|
733
|
-
class My
|
734
|
-
def method
|
735
|
-
'POST'
|
736
|
-
end
|
737
|
-
end
|
738
|
-
|
739
|
-
my = My.new
|
740
|
-
expect { my.methods.ai(plain: true) }.not_to raise_error
|
741
|
-
end
|
742
|
-
|
743
|
-
describe 'should handle a class that defines its own #to_hash method' do
|
744
|
-
it 'that takes arguments' do
|
745
|
-
class My
|
746
|
-
def to_hash(a, b); end
|
747
|
-
end
|
748
|
-
|
749
|
-
my = My.new
|
750
|
-
expect { my.ai(plain: true) }.not_to raise_error
|
751
|
-
end
|
752
|
-
|
753
|
-
it 'that returns nil' do
|
754
|
-
class My
|
755
|
-
def to_hash
|
756
|
-
nil
|
757
|
-
end
|
758
|
-
end
|
759
|
-
|
760
|
-
my = My.new
|
761
|
-
expect { my.ai(plain: true) }.not_to raise_error
|
762
|
-
end
|
763
|
-
|
764
|
-
it "that returns an object that doesn't support #keys" do
|
765
|
-
class My
|
766
|
-
def to_hash
|
767
|
-
object = Object.new
|
768
|
-
object.define_singleton_method('[]') { nil }
|
769
|
-
|
770
|
-
object
|
771
|
-
end
|
772
|
-
end
|
773
|
-
|
774
|
-
my = My.new
|
775
|
-
expect { my.ai(plain: true) }.not_to raise_error
|
776
|
-
end
|
777
|
-
|
778
|
-
it "that returns an object that doesn't support subscripting" do
|
779
|
-
class My
|
780
|
-
def to_hash
|
781
|
-
object = Object.new
|
782
|
-
object.define_singleton_method(:keys) { [:foo] }
|
783
|
-
|
784
|
-
object
|
785
|
-
end
|
786
|
-
end
|
787
|
-
|
788
|
-
my = My.new
|
789
|
-
expect { my.ai(plain: true) }.not_to raise_error
|
790
|
-
end
|
791
|
-
end
|
792
|
-
end
|
793
|
-
end
|
794
|
-
|
795
|
-
# rubocop:enable Lint/ConstantDefinitionInBlock
|