awesome_print 1.6.1 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|