awesome_print 1.9.2 → 2.0.0.pre

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