awesome_print 1.6.1 → 1.7.0
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/Appraisals +16 -3
- data/{CHANGELOG → CHANGELOG.md} +55 -18
- data/CONTRIBUTING.md +43 -3
- data/README.md +13 -52
- data/lib/awesome_print.rb +2 -2
- data/lib/awesome_print/colorize.rb +24 -0
- data/lib/awesome_print/ext/nobrainer.rb +49 -0
- data/lib/awesome_print/formatter.rb +53 -326
- data/lib/awesome_print/formatters/array_formatter.rb +73 -0
- data/lib/awesome_print/formatters/base_formatter.rb +138 -0
- data/lib/awesome_print/formatters/class_formatter.rb +24 -0
- data/lib/awesome_print/formatters/dir_formatter.rb +22 -0
- data/lib/awesome_print/formatters/file_formatter.rb +22 -0
- data/lib/awesome_print/formatters/hash_formatter.rb +54 -0
- data/lib/awesome_print/formatters/method_formatter.rb +22 -0
- data/lib/awesome_print/formatters/object_formatter.rb +80 -0
- data/lib/awesome_print/formatters/simple_formatter.rb +21 -0
- data/lib/awesome_print/indentator.rb +18 -0
- data/lib/awesome_print/inspector.rb +12 -1
- data/lib/awesome_print/version.rb +1 -1
- data/spec/active_record_helper.rb +19 -29
- data/spec/colors_spec.rb +2 -2
- data/spec/formats_spec.rb +73 -34
- data/spec/methods_spec.rb +6 -6
- data/spec/misc_spec.rb +4 -2
- data/spec/objects_spec.rb +52 -8
- data/spec/spec_helper.rb +49 -34
- metadata +31 -6
- data/lib/awesome_print/ext/no_brainer.rb +0 -58
@@ -1,34 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
if ExtVerifier.has_rails?
|
2
|
+
# Required to use the column support
|
3
|
+
module Rails
|
4
|
+
def self.env
|
5
|
+
{}
|
6
|
+
end
|
7
7
|
end
|
8
|
-
end
|
9
|
-
|
10
|
-
# Establish connection to in-memory SQLite DB
|
11
|
-
ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
|
12
|
-
|
13
|
-
# Create the users table
|
14
|
-
ActiveRecord::Migration.verbose = false
|
15
|
-
ActiveRecord::Migration.create_table :users do |t|
|
16
|
-
t.string :name
|
17
|
-
t.integer :rank
|
18
|
-
t.boolean :admin
|
19
|
-
t.datetime :created_at
|
20
|
-
end
|
21
|
-
|
22
|
-
# Create models
|
23
|
-
class User < ActiveRecord::Base; end
|
24
|
-
class SubUser < User; end
|
25
8
|
|
9
|
+
# Establish connection to in-memory SQLite DB
|
10
|
+
ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
|
26
11
|
|
27
|
-
#
|
28
|
-
|
12
|
+
# Create the users table
|
13
|
+
ActiveRecord::Migration.verbose = false
|
14
|
+
ActiveRecord::Migration.create_table :users do |t|
|
15
|
+
t.string :name
|
16
|
+
t.integer :rank
|
17
|
+
t.boolean :admin
|
18
|
+
t.datetime :created_at
|
19
|
+
end
|
29
20
|
|
30
|
-
#
|
31
|
-
|
32
|
-
|
21
|
+
# Create models
|
22
|
+
class User < ActiveRecord::Base; end
|
23
|
+
class SubUser < User; end
|
33
24
|
end
|
34
|
-
|
data/spec/colors_spec.rb
CHANGED
data/spec/formats_spec.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
require "bigdecimal"
|
3
3
|
require "rational"
|
4
4
|
require "set"
|
5
5
|
|
6
|
-
describe "AwesomePrint" do
|
6
|
+
RSpec.describe "AwesomePrint" do
|
7
7
|
before do
|
8
8
|
stub_dotfile!
|
9
9
|
end
|
@@ -451,11 +451,11 @@ EOS
|
|
451
451
|
|
452
452
|
#------------------------------------------------------------------------------
|
453
453
|
describe "Class" do
|
454
|
-
it "
|
454
|
+
it "should show superclass (plain)" do
|
455
455
|
expect(self.class.ai(:plain => true)).to eq("#{self.class} < #{self.class.superclass}")
|
456
456
|
end
|
457
457
|
|
458
|
-
it "
|
458
|
+
it "should show superclass (color)" do
|
459
459
|
expect(self.class.ai).to eq("#{self.class} < #{self.class.superclass}".yellow)
|
460
460
|
end
|
461
461
|
end
|
@@ -576,56 +576,44 @@ EOS
|
|
576
576
|
|
577
577
|
it "plain multiline" do
|
578
578
|
s1 = <<-EOS.strip
|
579
|
-
|
580
|
-
|
581
|
-
:name => "Herman Munster"
|
582
|
-
}
|
579
|
+
address = \"1313 Mockingbird Lane\",
|
580
|
+
name = \"Herman Munster\"
|
583
581
|
EOS
|
584
582
|
s2 = <<-EOS.strip
|
585
|
-
|
586
|
-
|
587
|
-
:address => "1313 Mockingbird Lane"
|
588
|
-
}
|
583
|
+
name = \"Herman Munster\",
|
584
|
+
address = \"1313 Mockingbird Lane\"
|
589
585
|
EOS
|
590
|
-
expect(@struct.ai(:plain => true)).to satisfy { |
|
586
|
+
expect(@struct.ai(:plain => true)).to satisfy { |out| out.match(s1) || out.match(s2) }
|
591
587
|
end
|
592
588
|
|
593
589
|
it "plain multiline indented" do
|
594
590
|
s1 = <<-EOS.strip
|
595
|
-
|
596
|
-
|
597
|
-
:name => "Herman Munster"
|
598
|
-
}
|
591
|
+
address = "1313 Mockingbird Lane",
|
592
|
+
name = "Herman Munster"
|
599
593
|
EOS
|
600
594
|
s2 = <<-EOS.strip
|
601
|
-
|
602
|
-
|
603
|
-
:address => "1313 Mockingbird Lane"
|
604
|
-
}
|
595
|
+
name = "Herman Munster",
|
596
|
+
address = "1313 Mockingbird Lane"
|
605
597
|
EOS
|
606
|
-
expect(@struct.ai(:plain => true, :indent => 1)).to satisfy { |
|
598
|
+
expect(@struct.ai(:plain => true, :indent => 1)).to satisfy { |out| out.match(s1) || out.match(s2) }
|
607
599
|
end
|
608
600
|
|
609
601
|
it "plain single line" do
|
610
|
-
s1 = "
|
611
|
-
s2 = "
|
612
|
-
expect(@struct.ai(:plain => true, :multiline => false)).to satisfy { |
|
602
|
+
s1 = "address = \"1313 Mockingbird Lane\", name = \"Herman Munster\""
|
603
|
+
s2 = "name = \"Herman Munster\", address = \"1313 Mockingbird Lane\""
|
604
|
+
expect(@struct.ai(:plain => true, :multiline => false)).to satisfy { |out| out.match(s1) || out.match(s2) }
|
613
605
|
end
|
614
606
|
|
615
607
|
it "colored multiline (default)" do
|
616
608
|
s1 = <<-EOS.strip
|
617
|
-
|
618
|
-
|
619
|
-
:name\e[0;37m => \e[0m\e[0;33m\"Herman Munster\"\e[0m
|
620
|
-
}
|
609
|
+
address\e[0;37m = \e[0m\e[0;33m\"1313 Mockingbird Lane\"\e[0m,
|
610
|
+
name\e[0;37m = \e[0m\e[0;33m\"Herman Munster\"\e[0m
|
621
611
|
EOS
|
622
612
|
s2 = <<-EOS.strip
|
623
|
-
|
624
|
-
|
625
|
-
:address\e[0;37m => \e[0m\e[0;33m\"1313 Mockingbird Lane\"\e[0m
|
626
|
-
}
|
613
|
+
name\e[0;37m = \e[0m\e[0;33m\"Herman Munster\"\e[0m,
|
614
|
+
address\e[0;37m = \e[0m\e[0;33m\"1313 Mockingbird Lane\"\e[0m
|
627
615
|
EOS
|
628
|
-
expect(@struct.ai).to satisfy { |
|
616
|
+
expect(@struct.ai).to satisfy { |out| out.include?(s1) || out.include?(s2) }
|
629
617
|
end
|
630
618
|
end
|
631
619
|
|
@@ -708,5 +696,56 @@ EOS
|
|
708
696
|
my = My.new
|
709
697
|
expect { my.methods.ai(:plain => true) }.not_to raise_error
|
710
698
|
end
|
699
|
+
|
700
|
+
describe "should handle a class that defines its own #to_hash method" do
|
701
|
+
it "that takes arguments" do
|
702
|
+
class My
|
703
|
+
def to_hash(a, b)
|
704
|
+
end
|
705
|
+
end
|
706
|
+
|
707
|
+
my = My.new
|
708
|
+
expect { my.ai(:plain => true) }.not_to raise_error
|
709
|
+
end
|
710
|
+
|
711
|
+
it "that returns nil" do
|
712
|
+
class My
|
713
|
+
def to_hash()
|
714
|
+
return nil
|
715
|
+
end
|
716
|
+
end
|
717
|
+
|
718
|
+
my = My.new
|
719
|
+
expect { my.ai(:plain => true) }.not_to raise_error
|
720
|
+
end
|
721
|
+
|
722
|
+
it "that returns an object that doesn't support #keys" do
|
723
|
+
class My
|
724
|
+
def to_hash()
|
725
|
+
object = Object.new
|
726
|
+
object.define_singleton_method('[]') { return nil }
|
727
|
+
|
728
|
+
return object
|
729
|
+
end
|
730
|
+
end
|
731
|
+
|
732
|
+
my = My.new
|
733
|
+
expect { my.ai(:plain => true) }.not_to raise_error
|
734
|
+
end
|
735
|
+
|
736
|
+
it "that returns an object that doesn't support subscripting" do
|
737
|
+
class My
|
738
|
+
def to_hash()
|
739
|
+
object = Object.new
|
740
|
+
object.define_singleton_method(:keys) { return [:foo] }
|
741
|
+
|
742
|
+
return object
|
743
|
+
end
|
744
|
+
end
|
745
|
+
|
746
|
+
my = My.new
|
747
|
+
expect { my.ai(:plain => true) }.not_to raise_error
|
748
|
+
end
|
749
|
+
end
|
711
750
|
end
|
712
751
|
end
|
data/spec/methods_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "Single method" do
|
3
|
+
RSpec.describe "Single method" do
|
4
4
|
before do
|
5
5
|
stub_dotfile!
|
6
6
|
end
|
@@ -80,7 +80,7 @@ describe "Single method" do
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
describe "Object methods" do
|
83
|
+
RSpec.describe "Object methods" do
|
84
84
|
before do
|
85
85
|
stub_dotfile!
|
86
86
|
end
|
@@ -202,7 +202,7 @@ describe "Object methods" do
|
|
202
202
|
end
|
203
203
|
end
|
204
204
|
|
205
|
-
describe "Class methods" do
|
205
|
+
RSpec.describe "Class methods" do
|
206
206
|
before do
|
207
207
|
stub_dotfile!
|
208
208
|
end
|
@@ -313,7 +313,7 @@ describe "Class methods" do
|
|
313
313
|
end
|
314
314
|
|
315
315
|
if RUBY_VERSION >= '1.9.2'
|
316
|
-
describe "Ruby 1.9.2+ Method#parameters" do
|
316
|
+
RSpec.describe "Ruby 1.9.2+ Method#parameters" do
|
317
317
|
before do
|
318
318
|
stub_dotfile!
|
319
319
|
end
|
@@ -364,7 +364,7 @@ if RUBY_VERSION >= '1.9.2'
|
|
364
364
|
end
|
365
365
|
end
|
366
366
|
|
367
|
-
describe "Methods arrays" do
|
367
|
+
RSpec.describe "Methods arrays" do
|
368
368
|
after do
|
369
369
|
Object.instance_eval{ remove_const :Hello } if defined?(Hello)
|
370
370
|
Object.instance_eval{ remove_const :World } if defined?(World)
|
data/spec/misc_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "AwesomePrint" do
|
3
|
+
RSpec.describe "AwesomePrint" do
|
4
4
|
|
5
5
|
describe "Misc" do
|
6
6
|
before do
|
@@ -204,6 +204,7 @@ EOS
|
|
204
204
|
describe "Console" do
|
205
205
|
it "should detect IRB" do
|
206
206
|
class IRB; end
|
207
|
+
ENV.delete('RAILS_ENV')
|
207
208
|
expect(AwesomePrint.console?).to eq(true)
|
208
209
|
expect(AwesomePrint.rails_console?).to eq(false)
|
209
210
|
Object.instance_eval{ remove_const :IRB }
|
@@ -211,6 +212,7 @@ EOS
|
|
211
212
|
|
212
213
|
it "should detect Pry" do
|
213
214
|
class Pry; end
|
215
|
+
ENV.delete('RAILS_ENV')
|
214
216
|
expect(AwesomePrint.console?).to eq(true)
|
215
217
|
expect(AwesomePrint.rails_console?).to eq(false)
|
216
218
|
Object.instance_eval{ remove_const :Pry }
|
data/spec/objects_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "Objects" do
|
3
|
+
RSpec.describe "Objects" do
|
4
4
|
before do
|
5
5
|
stub_dotfile!
|
6
6
|
end
|
@@ -24,13 +24,13 @@ describe "Objects" do
|
|
24
24
|
hello = Hello.new
|
25
25
|
out = hello.ai(:plain => true, :raw => true)
|
26
26
|
str = <<-EOS.strip
|
27
|
-
#<Hello:
|
27
|
+
#<Hello:placeholder_id
|
28
28
|
attr_accessor :dabra = 3,
|
29
29
|
attr_reader :abra = 1,
|
30
30
|
attr_writer :ca = 2
|
31
31
|
>
|
32
32
|
EOS
|
33
|
-
expect(out
|
33
|
+
expect(out).to be_similar_to(str)
|
34
34
|
expect(hello.ai(:plain => true, :raw => false)).to eq(hello.inspect)
|
35
35
|
end
|
36
36
|
|
@@ -44,13 +44,13 @@ EOS
|
|
44
44
|
hello = Hello.new
|
45
45
|
out = hello.ai(:plain => true, :raw => true)
|
46
46
|
str = <<-EOS.strip
|
47
|
-
#<Hello:
|
47
|
+
#<Hello:placeholder_id
|
48
48
|
@abra = 1,
|
49
49
|
@ca = 2,
|
50
50
|
@dabra = 3
|
51
51
|
>
|
52
52
|
EOS
|
53
|
-
expect(out
|
53
|
+
expect(out).to be_similar_to(str)
|
54
54
|
expect(hello.ai(:plain => true, :raw => false)).to eq(hello.inspect)
|
55
55
|
end
|
56
56
|
|
@@ -69,7 +69,7 @@ EOS
|
|
69
69
|
hello = Hello.new
|
70
70
|
out = hello.ai(:plain => true, :raw => true)
|
71
71
|
str = <<-EOS.strip
|
72
|
-
#<Hello:
|
72
|
+
#<Hello:placeholder_id
|
73
73
|
@doo = 1,
|
74
74
|
@dooby = 2,
|
75
75
|
@scooby = 3,
|
@@ -78,7 +78,51 @@ EOS
|
|
78
78
|
attr_writer :ca = 2
|
79
79
|
>
|
80
80
|
EOS
|
81
|
-
expect(out
|
81
|
+
expect(out).to be_similar_to(str)
|
82
|
+
expect(hello.ai(:plain => true, :raw => false)).to eq(hello.inspect)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "without the plain options print the colorized values" do
|
86
|
+
class Hello
|
87
|
+
attr_reader :abra
|
88
|
+
attr_writer :ca
|
89
|
+
|
90
|
+
def initialize
|
91
|
+
@abra, @ca = 1, 2
|
92
|
+
@dabra = 3
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
hello = Hello.new
|
97
|
+
out = hello.ai(:raw => true)
|
98
|
+
str = <<-EOS.strip
|
99
|
+
#<Hello:placeholder_id
|
100
|
+
\e[0;36m@dabra\e[0m\e[0;37m = \e[0m\e[1;34m3\e[0m,
|
101
|
+
\e[1;36mattr_reader\e[0m \e[0;35m:abra\e[0m\e[0;37m = \e[0m\e[1;34m1\e[0m,
|
102
|
+
\e[1;36mattr_writer\e[0m \e[0;35m:ca\e[0m\e[0;37m = \e[0m\e[1;34m2\e[0m
|
103
|
+
>
|
104
|
+
EOS
|
105
|
+
expect(out).to be_similar_to(str)
|
106
|
+
expect(hello.ai(:plain => true, :raw => false)).to eq(hello.inspect)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "with multine as false show inline values" do
|
110
|
+
class Hello
|
111
|
+
attr_reader :abra
|
112
|
+
attr_writer :ca
|
113
|
+
|
114
|
+
def initialize
|
115
|
+
@abra, @ca = 1, 2
|
116
|
+
@dabra = 3
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
hello = Hello.new
|
121
|
+
out = hello.ai(:multiline => false, :plain => true, :raw => true)
|
122
|
+
str = <<-EOS.strip
|
123
|
+
#<Hello:placeholder_id @dabra = 3, attr_reader :abra = 1, attr_writer :ca = 2>
|
124
|
+
EOS
|
125
|
+
expect(out).to be_similar_to(str)
|
82
126
|
expect(hello.ai(:plain => true, :raw => false)).to eq(hello.inspect)
|
83
127
|
end
|
84
128
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -14,14 +14,62 @@
|
|
14
14
|
# $ gem install bundler -v=1.0.2
|
15
15
|
# $ gem install rspec -v=2.6.0
|
16
16
|
#
|
17
|
+
require 'codeclimate-test-reporter'
|
18
|
+
CodeClimate::TestReporter.start
|
17
19
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
18
20
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
19
|
-
require 'awesome_print'
|
20
21
|
|
21
22
|
Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each do |file|
|
22
23
|
require file
|
23
24
|
end
|
24
25
|
|
26
|
+
ExtVerifier.require_dependencies!(%w{rails active_record action_view
|
27
|
+
active_support/all mongoid mongo_mapper ripple nobrainer})
|
28
|
+
require 'nokogiri'
|
29
|
+
require 'awesome_print'
|
30
|
+
|
31
|
+
RSpec.configure do |config|
|
32
|
+
config.disable_monkey_patching!
|
33
|
+
# TODO: Make specs not order dependent
|
34
|
+
# config.order = :random
|
35
|
+
Kernel.srand config.seed
|
36
|
+
config.filter_run focus: true
|
37
|
+
config.run_all_when_everything_filtered = true
|
38
|
+
config.expect_with :rspec do |expectations|
|
39
|
+
expectations.syntax = :expect
|
40
|
+
end
|
41
|
+
config.mock_with :rspec do |mocks|
|
42
|
+
mocks.syntax = :expect
|
43
|
+
mocks.verify_partial_doubles = true
|
44
|
+
end
|
45
|
+
if config.files_to_run.one?
|
46
|
+
config.default_formatter = 'doc'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# This matcher handles the normalization of objects to replace non deterministic
|
51
|
+
# parts (such as object IDs) with simple placeholder strings before doing a
|
52
|
+
# comparison with a given string. It's important that this method only matches
|
53
|
+
# a string which strictly conforms to the expected object ID format.
|
54
|
+
RSpec::Matchers.define :be_similar_to do |expected, options|
|
55
|
+
match do |actual|
|
56
|
+
options ||= {}
|
57
|
+
@actual = normalize_object_id_strings(actual, options)
|
58
|
+
values_match? expected, @actual
|
59
|
+
end
|
60
|
+
|
61
|
+
diffable
|
62
|
+
end
|
63
|
+
|
64
|
+
# Override the Object IDs with a placeholder so that we are only checking
|
65
|
+
# that an ID is present and not that it matches a certain value. This is
|
66
|
+
# necessary as the Object IDs are not deterministic.
|
67
|
+
def normalize_object_id_strings(str, options)
|
68
|
+
str = str.gsub(/#<(.*?):0x[a-f\d]+/, '#<\1:placeholder_id') unless options[:skip_standard]
|
69
|
+
str = str.gsub(/BSON::ObjectId\('[a-f\d]{24}'\)/, 'placeholder_bson_id') unless options[:skip_bson]
|
70
|
+
str
|
71
|
+
end
|
72
|
+
|
25
73
|
def stub_dotfile!
|
26
74
|
dotfile = File.join(ENV["HOME"], ".aprc")
|
27
75
|
expect(File).to receive(:readable?).at_least(:once).with(dotfile).and_return(false)
|
@@ -33,36 +81,3 @@ def capture!
|
|
33
81
|
ensure
|
34
82
|
$stdout = standard
|
35
83
|
end
|
36
|
-
|
37
|
-
# The following is needed for the Infinity Test. It runs tests as subprocesses,
|
38
|
-
# which sets STDOUT.tty? to false and would otherwise prematurely disallow colors.
|
39
|
-
### AwesomePrint.force_colors!
|
40
|
-
|
41
|
-
# Ruby 1.8.6 only: define missing String methods that are needed for the specs to pass.
|
42
|
-
if RUBY_VERSION < '1.8.7'
|
43
|
-
class String
|
44
|
-
def shellescape # Taken from Ruby 1.9.2 standard library, see lib/shellwords.rb.
|
45
|
-
return "''" if self.empty?
|
46
|
-
str = self.dup
|
47
|
-
str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/n, "\\\\\\1")
|
48
|
-
str.gsub!(/\n/, "'\n'")
|
49
|
-
str
|
50
|
-
end
|
51
|
-
|
52
|
-
def start_with?(*prefixes)
|
53
|
-
prefixes.each do |prefix|
|
54
|
-
prefix = prefix.to_s
|
55
|
-
return true if prefix == self[0, prefix.size]
|
56
|
-
end
|
57
|
-
false
|
58
|
-
end
|
59
|
-
|
60
|
-
def end_with?(*suffixes)
|
61
|
-
suffixes.each do |suffix|
|
62
|
-
suffix = suffix.to_s
|
63
|
-
return true if suffix == self[-suffix.size, suffix.size]
|
64
|
-
end
|
65
|
-
false
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|