awesome_print 0.2.0 → 0.2.1
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.
- data/CHANGELOG +4 -0
- data/README.md +7 -1
- data/VERSION +1 -1
- data/lib/ap.rb +1 -0
- data/lib/ap/awesome_print.rb +18 -4
- data/lib/ap/core_ext/string.rb +6 -0
- data/lib/ap/mixin/action_view.rb +38 -0
- data/spec/action_view_spec.rb +35 -0
- data/spec/awesome_print_spec.rb +84 -11
- data/spec/string_spec.rb +2 -0
- metadata +6 -3
data/CHANGELOG
CHANGED
data/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
## Awesome Print ##
|
|
2
2
|
Awesome Print is Ruby library that pretty prints Ruby objects in full color
|
|
3
3
|
exposing their internal structure with proper indentation. Rails ActiveRecord
|
|
4
|
-
objects are supported via included
|
|
4
|
+
objects and usage within Rails templates are supported via included mixins.
|
|
5
5
|
|
|
6
6
|
### Installation ###
|
|
7
7
|
# Installing as Ruby gem
|
|
@@ -170,6 +170,12 @@ in the custom defaults (see below), or you can override on a per call basis with
|
|
|
170
170
|
|
|
171
171
|
logger.ap object, :warn
|
|
172
172
|
|
|
173
|
+
### ActionView Convenience Method ###
|
|
174
|
+
awesome_print adds an ap method to the ActionView::Base class making it available
|
|
175
|
+
within Rails templates. For example:
|
|
176
|
+
|
|
177
|
+
<%= ap @accounts.first %>
|
|
178
|
+
|
|
173
179
|
### Setting Custom Defaults ###
|
|
174
180
|
You can set your own default options by creating ``.aprc`` file in your home
|
|
175
181
|
directory. Within that file assign your defaults to ``AwesomePrint.defaults``.
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.2.
|
|
1
|
+
0.2.1
|
data/lib/ap.rb
CHANGED
|
@@ -9,6 +9,7 @@ require File.dirname(__FILE__) + "/ap/awesome_print"
|
|
|
9
9
|
|
|
10
10
|
require File.dirname(__FILE__) + "/ap/core_ext/logger" if defined?(::Logger) or defined?(::ActiveSupport::BufferedLogger)
|
|
11
11
|
|
|
12
|
+
require File.dirname(__FILE__) + "/ap/mixin/action_view" if defined?(::ActionView)
|
|
12
13
|
require File.dirname(__FILE__) + "/ap/mixin/active_record" if defined?(::ActiveRecord)
|
|
13
14
|
require File.dirname(__FILE__) + "/ap/mixin/active_support" if defined?(::ActiveSupport)
|
|
14
15
|
|
data/lib/ap/awesome_print.rb
CHANGED
|
@@ -7,7 +7,7 @@ require "shellwords"
|
|
|
7
7
|
|
|
8
8
|
class AwesomePrint
|
|
9
9
|
AP = :__awesome_print__
|
|
10
|
-
CORE = [ :array, :hash, :class, :file, :dir, :bigdecimal, :rational ]
|
|
10
|
+
CORE = [ :array, :hash, :class, :file, :dir, :bigdecimal, :rational, :struct ]
|
|
11
11
|
|
|
12
12
|
def initialize(options = {})
|
|
13
13
|
@options = {
|
|
@@ -23,6 +23,7 @@ class AwesomePrint
|
|
|
23
23
|
:fixnum => :blue,
|
|
24
24
|
:float => :blue,
|
|
25
25
|
:hash => :pale,
|
|
26
|
+
:struct => :pale,
|
|
26
27
|
:nilclass => :red,
|
|
27
28
|
:string => :yellowish,
|
|
28
29
|
:symbol => :cyanish,
|
|
@@ -92,6 +93,14 @@ class AwesomePrint
|
|
|
92
93
|
end
|
|
93
94
|
end
|
|
94
95
|
|
|
96
|
+
# Format a Struct. If @options[:indent] if negative left align hash keys.
|
|
97
|
+
#------------------------------------------------------------------------------
|
|
98
|
+
def awesome_struct(s)
|
|
99
|
+
h = {}
|
|
100
|
+
s.each_pair { |k,v| h[k] = v }
|
|
101
|
+
awesome_hash(h)
|
|
102
|
+
end
|
|
103
|
+
|
|
95
104
|
# Format Class object.
|
|
96
105
|
#------------------------------------------------------------------------------
|
|
97
106
|
def awesome_class(c)
|
|
@@ -152,8 +161,9 @@ class AwesomePrint
|
|
|
152
161
|
#------------------------------------------------------------------------------
|
|
153
162
|
def nested(object)
|
|
154
163
|
case printable(object)
|
|
155
|
-
when :array
|
|
156
|
-
when :hash
|
|
164
|
+
when :array then colorize("[...]", :array)
|
|
165
|
+
when :hash then colorize("{...}", :hash)
|
|
166
|
+
when :struct then colorize("{...}", :struct)
|
|
157
167
|
else colorize("...#{object.class}...", :class)
|
|
158
168
|
end
|
|
159
169
|
end
|
|
@@ -167,7 +177,11 @@ class AwesomePrint
|
|
|
167
177
|
# Turn class name into symbol, ex: Hello::World => :hello_world.
|
|
168
178
|
#------------------------------------------------------------------------------
|
|
169
179
|
def declassify(object)
|
|
170
|
-
object.
|
|
180
|
+
if object.is_a?(Struct)
|
|
181
|
+
:struct
|
|
182
|
+
else
|
|
183
|
+
object.class.to_s.gsub(/:+/, "_").downcase.to_sym
|
|
184
|
+
end
|
|
171
185
|
end
|
|
172
186
|
|
|
173
187
|
# Pick the color and apply it to the given string as necessary.
|
data/lib/ap/core_ext/string.rb
CHANGED
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
#------------------------------------------------------------------------------
|
|
6
6
|
class String
|
|
7
7
|
|
|
8
|
+
# ANSI color codes:
|
|
9
|
+
# \033 => escape
|
|
10
|
+
# 30 => color base
|
|
11
|
+
# 1 => bright
|
|
12
|
+
# 0 => normal
|
|
13
|
+
|
|
8
14
|
[ :gray, :red, :green, :yellow, :blue, :purple, :cyan, :white ].each_with_index do |color, i|
|
|
9
15
|
if STDOUT.tty? && ENV['TERM'] && ENV['TERM'] != 'dumb'
|
|
10
16
|
define_method color do "\033[1;#{30+i}m#{self}\033[0m" end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Copyright (c) 2010 Michael Dvorkin
|
|
2
|
+
#
|
|
3
|
+
# Awesome Print is freely distributable under the terms of MIT license.
|
|
4
|
+
# See LICENSE file or http://www.opensource.org/licenses/mit-license.php
|
|
5
|
+
#------------------------------------------------------------------------------
|
|
6
|
+
module AwesomePrintActionView
|
|
7
|
+
|
|
8
|
+
def self.included(base)
|
|
9
|
+
unless base.const_defined?(:AP_ANSI_TO_HTML)
|
|
10
|
+
hash = {} # Build ANSI => HTML color map.
|
|
11
|
+
[ :gray, :red, :green, :yellow, :blue, :purple, :cyan, :white ].each_with_index do |color, i|
|
|
12
|
+
hash["\033[1;#{30+i}m"] = color
|
|
13
|
+
end
|
|
14
|
+
[ :black, :darkred, :darkgreen, :brown, :navy, :darkmagenta, :darkcyan, :slategray ].each_with_index do |color, i|
|
|
15
|
+
hash["\033[0;#{30+i}m"] = color
|
|
16
|
+
end
|
|
17
|
+
base.const_set(:AP_ANSI_TO_HTML, hash.freeze)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def ap_debug(object, options = {})
|
|
22
|
+
formatted = h(object.ai(options))
|
|
23
|
+
|
|
24
|
+
unless options[:plain]
|
|
25
|
+
self.class::AP_ANSI_TO_HTML.each do |key, value|
|
|
26
|
+
formatted.gsub!(key, %Q|<font color="#{value}">|)
|
|
27
|
+
end
|
|
28
|
+
formatted.gsub!("\033[0m", "</font>")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
content_tag(:pre, formatted, :class => "debug_dump")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
alias_method :ap, :ap_debug
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
ActionView::Base.send(:include, AwesomePrintActionView) if defined?(::ActionView)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
|
+
|
|
3
|
+
require 'action_view'
|
|
4
|
+
require 'ap/mixin/action_view'
|
|
5
|
+
|
|
6
|
+
describe "AwesomePrint ActionView extensions" do
|
|
7
|
+
before(:each) do
|
|
8
|
+
@view = ActionView::Base.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should wrap ap output with <pre> tag" do
|
|
12
|
+
obj = 42
|
|
13
|
+
@view.ap(obj, :plain => true).should == '<pre class="debug_dump">42</pre>'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should encode HTML entities" do
|
|
17
|
+
obj = " &<hello>"
|
|
18
|
+
@view.ap(obj, :plain => true).should == '<pre class="debug_dump">" &<hello>"</pre>'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should convert primary ANSI colors to HTML" do
|
|
22
|
+
obj = 42
|
|
23
|
+
[ :gray, :red, :green, :yellow, :blue, :purple, :cyan, :white ].each do |color|
|
|
24
|
+
@view.ap(obj, :color => { :fixnum => color }).should == %Q|<pre class="debug_dump"><font color="#{color}">42</font></pre>|
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should convert mixed ANSI colors to HTML" do
|
|
29
|
+
obj = 42
|
|
30
|
+
[ :grayish, :redish, :greenish, :yellowish, :blueish, :purpleish, :cyanish, :whiteish, :black, :pale ].zip(
|
|
31
|
+
[ :black, :darkred, :darkgreen, :brown, :navy, :darkmagenta, :darkcyan, :slategray, :black, :slategray ]) do |ansi, html|
|
|
32
|
+
@view.ap(obj, :color => { :fixnum => ansi }).should == %Q|<pre class="debug_dump"><font color="#{html}">42</font></pre>|
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
data/spec/awesome_print_spec.rb
CHANGED
|
@@ -164,11 +164,11 @@ EOS
|
|
|
164
164
|
it "colored multiline (default)" do
|
|
165
165
|
@hash.ai.should == <<-EOS.strip
|
|
166
166
|
{
|
|
167
|
-
1\e[
|
|
168
|
-
:sym\e[
|
|
169
|
-
\"str\"\e[
|
|
170
|
-
[ 1, 2, 3 ]\e[
|
|
171
|
-
{ :k => :v }\e[
|
|
167
|
+
1\e[0;37m => \e[0m{
|
|
168
|
+
:sym\e[0;37m => \e[0m{
|
|
169
|
+
\"str\"\e[0;37m => \e[0m{
|
|
170
|
+
[ 1, 2, 3 ]\e[0;37m => \e[0m{
|
|
171
|
+
{ :k => :v }\e[0;37m => \e[0m\e[1;33mHash < Object\e[0m
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
}
|
|
@@ -180,11 +180,11 @@ EOS
|
|
|
180
180
|
it "colored multiline indented" do
|
|
181
181
|
@hash.ai(:indent => 2).should == <<-EOS.strip
|
|
182
182
|
{
|
|
183
|
-
1\e[
|
|
184
|
-
:sym\e[
|
|
185
|
-
\"str\"\e[
|
|
186
|
-
[ 1, 2, 3 ]\e[
|
|
187
|
-
{ :k => :v }\e[
|
|
183
|
+
1\e[0;37m => \e[0m{
|
|
184
|
+
:sym\e[0;37m => \e[0m{
|
|
185
|
+
\"str\"\e[0;37m => \e[0m{
|
|
186
|
+
[ 1, 2, 3 ]\e[0;37m => \e[0m{
|
|
187
|
+
{ :k => :v }\e[0;37m => \e[0m\e[1;33mHash < Object\e[0m
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
190
|
}
|
|
@@ -194,7 +194,7 @@ EOS
|
|
|
194
194
|
end
|
|
195
195
|
|
|
196
196
|
it "colored single line" do
|
|
197
|
-
@hash.ai(:multiline => false).should == "{ 1\e[
|
|
197
|
+
@hash.ai(:multiline => false).should == "{ 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 } } } } }"
|
|
198
198
|
end
|
|
199
199
|
|
|
200
200
|
end
|
|
@@ -288,4 +288,77 @@ EOS
|
|
|
288
288
|
end
|
|
289
289
|
end
|
|
290
290
|
|
|
291
|
+
|
|
292
|
+
#------------------------------------------------------------------------------
|
|
293
|
+
describe "Struct" do
|
|
294
|
+
before(:each) do
|
|
295
|
+
@struct = unless defined?(Struct::SimpleStruct)
|
|
296
|
+
Struct.new("SimpleStruct", :name, :address).new
|
|
297
|
+
else
|
|
298
|
+
Struct::SimpleStruct.new
|
|
299
|
+
end
|
|
300
|
+
@struct.name = "Herman Munster"
|
|
301
|
+
@struct.address = "1313 Mockingbird Lane"
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
it "empty struct" do
|
|
305
|
+
Struct.new("EmptyStruct").ai.should == "\e[1;33mStruct::EmptyStruct < Struct\e[0m"
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
it "plain multiline" do
|
|
309
|
+
s1 = <<-EOS.strip
|
|
310
|
+
{
|
|
311
|
+
:address => "1313 Mockingbird Lane",
|
|
312
|
+
:name => "Herman Munster"
|
|
313
|
+
}
|
|
314
|
+
EOS
|
|
315
|
+
s2 = <<-EOS.strip
|
|
316
|
+
{
|
|
317
|
+
:name => "Herman Munster",
|
|
318
|
+
:address => "1313 Mockingbird Lane"
|
|
319
|
+
}
|
|
320
|
+
EOS
|
|
321
|
+
@struct.ai(:plain => true).should satisfy { |match| match == s1 || match == s2 }
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
it "plain multiline indented" do
|
|
325
|
+
s1 = <<-EOS.strip
|
|
326
|
+
{
|
|
327
|
+
:address => "1313 Mockingbird Lane",
|
|
328
|
+
:name => "Herman Munster"
|
|
329
|
+
}
|
|
330
|
+
EOS
|
|
331
|
+
s2 = <<-EOS.strip
|
|
332
|
+
{
|
|
333
|
+
:name => "Herman Munster",
|
|
334
|
+
:address => "1313 Mockingbird Lane"
|
|
335
|
+
}
|
|
336
|
+
EOS
|
|
337
|
+
@struct.ai(:plain => true, :indent => 1).should satisfy { |match| match == s1 || match == s2 }
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
it "plain single line" do
|
|
341
|
+
s1 = "{ :address => \"1313 Mockingbird Lane\", :name => \"Herman Munster\" }"
|
|
342
|
+
s2 = "{ :name => \"Herman Munster\", :address => \"1313 Mockingbird Lane\" }"
|
|
343
|
+
@struct.ai(:plain => true, :multiline => false).should satisfy { |match| match == s1 || match == s2 }
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
it "colored multiline (default)" do
|
|
347
|
+
s1 = <<-EOS.strip
|
|
348
|
+
{
|
|
349
|
+
:address\e[0;37m => \e[0m\e[0;33m\"1313 Mockingbird Lane\"\e[0m,
|
|
350
|
+
:name\e[0;37m => \e[0m\e[0;33m\"Herman Munster\"\e[0m
|
|
351
|
+
}
|
|
352
|
+
EOS
|
|
353
|
+
s2 = <<-EOS.strip
|
|
354
|
+
{
|
|
355
|
+
:name\e[0;37m => \e[0m\e[0;33m\"Herman Munster\"\e[0m,
|
|
356
|
+
:address\e[0;37m => \e[0m\e[0;33m\"1313 Mockingbird Lane\"\e[0m
|
|
357
|
+
}
|
|
358
|
+
EOS
|
|
359
|
+
@struct.ai.should satisfy { |match| match == s1 || match == s2 }
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
|
|
291
364
|
end
|
data/spec/string_spec.rb
CHANGED
|
@@ -14,5 +14,7 @@ describe "String extensions" do
|
|
|
14
14
|
it "should have black and pale colors" do
|
|
15
15
|
"black".send(:black).should == "black".send(:grayish)
|
|
16
16
|
"pale".send(:pale).should == "pale".send(:whiteish)
|
|
17
|
+
"pale".send(:pale).should == "\e[0;37mpale\e[0m"
|
|
18
|
+
"whiteish".send(:whiteish).should == "\e[0;37mwhiteish\e[0m"
|
|
17
19
|
end
|
|
18
20
|
end
|
metadata
CHANGED
|
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
7
|
- 2
|
|
8
|
-
-
|
|
9
|
-
version: 0.2.
|
|
8
|
+
- 1
|
|
9
|
+
version: 0.2.1
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Michael Dvorkin
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date: 2010-
|
|
17
|
+
date: 2010-06-03 00:00:00 -07:00
|
|
18
18
|
default_executable:
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|
|
@@ -52,9 +52,11 @@ files:
|
|
|
52
52
|
- lib/ap/core_ext/kernel.rb
|
|
53
53
|
- lib/ap/core_ext/logger.rb
|
|
54
54
|
- lib/ap/core_ext/string.rb
|
|
55
|
+
- lib/ap/mixin/action_view.rb
|
|
55
56
|
- lib/ap/mixin/active_record.rb
|
|
56
57
|
- lib/ap/mixin/active_support.rb
|
|
57
58
|
- rails/init.rb
|
|
59
|
+
- spec/action_view_spec.rb
|
|
58
60
|
- spec/active_record_spec.rb
|
|
59
61
|
- spec/awesome_print_spec.rb
|
|
60
62
|
- spec/logger_spec.rb
|
|
@@ -92,6 +94,7 @@ signing_key:
|
|
|
92
94
|
specification_version: 3
|
|
93
95
|
summary: Pretty print Ruby objects with proper indentation and colors.
|
|
94
96
|
test_files:
|
|
97
|
+
- spec/action_view_spec.rb
|
|
95
98
|
- spec/active_record_spec.rb
|
|
96
99
|
- spec/awesome_print_spec.rb
|
|
97
100
|
- spec/logger_spec.rb
|