awesome_print 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/ap.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -29,4 +29,7 @@ unless defined?(AwesomePrint::Inspector)
29
29
  require File.dirname(__FILE__) + "/awesome_print/ext/mongo_mapper" if defined?(MongoMapper)
30
30
  require File.dirname(__FILE__) + "/awesome_print/ext/mongoid" if defined?(Mongoid)
31
31
  require File.dirname(__FILE__) + "/awesome_print/ext/nokogiri" if defined?(Nokogiri)
32
+ require File.dirname(__FILE__) + "/awesome_print/ext/no_brainer" if defined?(NoBrainer)
33
+ require File.dirname(__FILE__) + "/awesome_print/ext/ripple" if defined?(Ripple)
34
+ require File.dirname(__FILE__) + "/awesome_print/ext/sequel" if defined?(Sequel)
32
35
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -7,7 +7,12 @@ module Kernel
7
7
 
8
8
  def ai(options = {})
9
9
  ap = AwesomePrint::Inspector.new(options)
10
- ap.awesome self
10
+ awesome = ap.awesome self
11
+ if options[:html]
12
+ awesome = "<pre>#{awesome}</pre>"
13
+ awesome = awesome.html_safe if defined? ActiveSupport
14
+ end
15
+ awesome
11
16
  end
12
17
  alias :awesome_inspect :ai
13
18
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -43,7 +43,10 @@ module AwesomePrint
43
43
  return awesome_object(object) if @options[:raw]
44
44
 
45
45
  data = object.class.column_names.inject(::ActiveSupport::OrderedHash.new) do |hash, name|
46
- hash[name.to_sym] = object.send(name) if object.has_attribute?(name) || object.new_record?
46
+ if object.has_attribute?(name) || object.new_record?
47
+ value = object.respond_to?(name) ? object.send(name) : object.read_attribute(name)
48
+ hash[name.to_sym] = value
49
+ end
47
50
  hash
48
51
  end
49
52
  "#{object} " << awesome_hash(data)
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -44,7 +44,7 @@ module AwesomePrint
44
44
  def awesome_mongoid_document(object)
45
45
  return object.inspect if !defined?(::ActiveSupport::OrderedHash)
46
46
 
47
- data = object.attributes.sort_by { |key| key }.inject(::ActiveSupport::OrderedHash.new) do |hash, c|
47
+ data = (object.attributes || {}).sort_by { |key| key }.inject(::ActiveSupport::OrderedHash.new) do |hash, c|
48
48
  hash[c[0].to_sym] = c[1]
49
49
  hash
50
50
  end
@@ -0,0 +1,58 @@
1
+ # Copyright (c) 2010-2013 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 AwesomePrint
7
+ module NoBrainer
8
+
9
+ def self.included(base)
10
+ base.send :alias_method, :cast_without_no_brainer, :cast
11
+ base.send :alias_method, :cast, :cast_with_no_brainer
12
+ end
13
+
14
+ # Add NoBrainer class names to the dispatcher pipeline.
15
+ #------------------------------------------------------------------------------
16
+ def cast_with_no_brainer(object, type)
17
+ cast = cast_without_no_brainer(object, type)
18
+ if defined?(::NoBrainer::Document)
19
+ if object.is_a?(Class) && object.ancestors.include?(::NoBrainer::Document)
20
+ cast = :no_brainer_class
21
+ elsif object.class.ancestors.include?(::NoBrainer::Document)
22
+ cast = :no_brainer_document
23
+ end
24
+ end
25
+ cast
26
+ end
27
+
28
+ # Format NoBrainer class object.
29
+ #------------------------------------------------------------------------------
30
+ def awesome_no_brainer_class(object)
31
+ return object.inspect if !defined?(::ActiveSupport::OrderedHash) || !object.respond_to?(:fields)
32
+
33
+ # We want id first
34
+ data = object.fields.sort_by { |key| key[0] == :id ? '_id' : key[0].to_s }.inject(::ActiveSupport::OrderedHash.new) do |hash, c|
35
+ hash[c[0]] = :object
36
+ hash
37
+ end
38
+ "class #{object} < #{object.superclass} " << awesome_hash(data)
39
+ end
40
+
41
+ # Format NoBrainer Document object.
42
+ #------------------------------------------------------------------------------
43
+ def awesome_no_brainer_document(object)
44
+ return object.inspect if !defined?(::ActiveSupport::OrderedHash)
45
+
46
+ data = object.attributes.sort_by { |key| key }.inject(::ActiveSupport::OrderedHash.new) do |hash, c|
47
+ hash[c[0].to_sym] = c[1]
48
+ hash
49
+ end
50
+ if !object.errors.empty?
51
+ data = {:errors => object.errors, :attributes => data}
52
+ end
53
+ "#{object} #{awesome_hash(data)}"
54
+ end
55
+ end
56
+ end
57
+
58
+ AwesomePrint::Formatter.send(:include, AwesomePrint::NoBrainer)
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -0,0 +1,72 @@
1
+ # Copyright (c) 2010-2013 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 AwesomePrint
7
+ module Ripple
8
+
9
+ def self.included(base)
10
+ base.send :alias_method, :cast_without_ripple, :cast
11
+ base.send :alias_method, :cast, :cast_with_ripple
12
+ end
13
+
14
+ # Add Ripple class names to the dispatcher pipeline.
15
+ #------------------------------------------------------------------------------
16
+ def cast_with_ripple(object, type)
17
+ cast = cast_without_ripple(object, type)
18
+ return cast if !defined?(::Ripple)
19
+
20
+ if object.is_a?(::Ripple::AttributeMethods) # Module used to access attributes across documents and embedded documents
21
+ cast = :ripple_document_instance
22
+ elsif object.is_a?(::Ripple::Properties) # Used to access property metadata on Ripple classes
23
+ cast = :ripple_document_class
24
+ end
25
+ cast
26
+ end
27
+
28
+ private
29
+
30
+ # Format Ripple instance object.
31
+ #
32
+ # NOTE: by default only instance attributes are shown. To format a Ripple document instance
33
+ # as a regular object showing its instance variables and accessors use :raw => true option:
34
+ #
35
+ # ap document, :raw => true
36
+ #
37
+ #------------------------------------------------------------------------------
38
+ def awesome_ripple_document_instance(object)
39
+ return object.inspect if !defined?(::ActiveSupport::OrderedHash)
40
+ return awesome_object(object) if @options[:raw]
41
+ exclude_assoc = @options[:exclude_assoc] or @options[:exclude_associations]
42
+
43
+ data = object.attributes.inject(::ActiveSupport::OrderedHash.new) do |hash, (name, value)|
44
+ hash[name.to_sym] = object.send(name)
45
+ hash
46
+ end
47
+
48
+ unless exclude_assoc
49
+ data = object.class.embedded_associations.inject(data) do |hash, assoc|
50
+ hash[assoc.name] = object.get_proxy(assoc) # Should always be array or Ripple::EmbeddedDocument for embedded associations
51
+ hash
52
+ end
53
+ end
54
+
55
+ "##{object} " << awesome_hash(data)
56
+ end
57
+
58
+ # Format Ripple class object.
59
+ #------------------------------------------------------------------------------
60
+ def awesome_ripple_document_class(object)
61
+ return object.inspect if !defined?(::ActiveSupport::OrderedHash) || !object.respond_to?(:properties)
62
+
63
+ data = object.properties.inject(::ActiveSupport::OrderedHash.new) do |hash, (name, defn)|
64
+ hash[name.to_sym] = defn.type.to_s.downcase.to_sym
65
+ hash
66
+ end
67
+ "class #{object} < #{object.superclass} " << awesome_hash(data)
68
+ end
69
+ end
70
+ end
71
+
72
+ AwesomePrint::Formatter.send(:include, AwesomePrint::Ripple)
@@ -0,0 +1,57 @@
1
+ # Copyright (c) 2010-2013 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 AwesomePrint
7
+ module Sequel
8
+
9
+ def self.included(base)
10
+ base.send :alias_method, :cast_without_sequel, :cast
11
+ base.send :alias_method, :cast, :cast_with_sequel
12
+ end
13
+
14
+ # Add Sequel class names to the dispatcher pipeline.
15
+ #------------------------------------------------------------------------------
16
+ def cast_with_sequel(object, type)
17
+ cast = cast_without_sequel(object, type)
18
+ if defined?(::Sequel::Model) && object.is_a?(::Sequel::Model)
19
+ cast = :sequel_document
20
+ elsif defined?(::Sequel::Model) && object.is_a?(Class) && object.ancestors.include?(::Sequel::Model)
21
+ cast = :sequel_model_class
22
+ elsif defined?(::Sequel::Mysql2::Dataset) && object.class.ancestors.include?(::Sequel::Mysql2::Dataset)
23
+ cast = :sequel_dataset
24
+ end
25
+ cast
26
+ end
27
+
28
+ # Format Sequel Document object.
29
+ #------------------------------------------------------------------------------
30
+ def awesome_sequel_document(object)
31
+ data = object.values.sort_by { |key| key.to_s }.inject({}) do |hash, c|
32
+ hash[c[0].to_sym] = c[1]
33
+ hash
34
+ end
35
+ if !object.errors.empty?
36
+ data = {:errors => object.errors, :values => data}
37
+ end
38
+ "#{object} #{awesome_hash(data)}"
39
+ end
40
+
41
+ # Format Sequel Dataset object.
42
+ #------------------------------------------------------------------------------
43
+ def awesome_sequel_dataset(dataset)
44
+ [awesome_array(dataset.to_a), awesome_print(dataset.sql)].join("\n")
45
+ end
46
+
47
+ # Format Sequel Model class.
48
+ #------------------------------------------------------------------------------
49
+ def awesome_sequel_model_class(object)
50
+ data = object.db_schema.inject({}) {|h, (name,data)| h.merge(name => data[:db_type])}
51
+ "class #{object} < #{object.superclass} " << awesome_hash(data)
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ AwesomePrint::Formatter.send(:include, AwesomePrint::Sequel)
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -9,7 +9,7 @@ require "shellwords"
9
9
  module AwesomePrint
10
10
  class Formatter
11
11
 
12
- CORE = [ :array, :hash, :class, :file, :dir, :bigdecimal, :rational, :struct, :method, :unboundmethod ]
12
+ CORE = [ :array, :bigdecimal, :class, :dir, :file, :hash, :method, :rational, :set, :struct, :unboundmethod ]
13
13
  DEFAULT_LIMIT_SIZE = 7
14
14
 
15
15
  def initialize(inspector)
@@ -27,7 +27,7 @@ module AwesomePrint
27
27
  else
28
28
  awesome_self(object, type) # Catch all that falls back to object.inspect.
29
29
  end
30
- @options[:html] ? "<pre>#{awesome}</pre>" : awesome
30
+ awesome
31
31
  end
32
32
 
33
33
  # Hook this when adding custom formatters. Check out lib/awesome_print/ext
@@ -63,6 +63,8 @@ module AwesomePrint
63
63
  def awesome_self(object, type)
64
64
  if @options[:raw] && object.instance_variables.any?
65
65
  awesome_object(object)
66
+ elsif object == ENV
67
+ awesome_hash(object.to_hash)
66
68
  else
67
69
  colorize(object.inspect.to_s, type)
68
70
  end
@@ -126,7 +128,7 @@ module AwesomePrint
126
128
  #------------------------------------------------------------------------------
127
129
  def awesome_object(o)
128
130
  vars = o.instance_variables.map do |var|
129
- property = var[1..-1].to_sym
131
+ property = var.to_s[1..-1].to_sym # to_s because of some monkey patching done by Puppet.
130
132
  accessor = if o.respond_to?(:"#{property}=")
131
133
  o.respond_to?(property) ? :accessor : :writer
132
134
  else
@@ -162,6 +164,12 @@ module AwesomePrint
162
164
  end
163
165
  end
164
166
 
167
+ # Format a set.
168
+ #------------------------------------------------------------------------------
169
+ def awesome_set(s)
170
+ awesome_array(s.to_a)
171
+ end
172
+
165
173
  # Format a Struct.
166
174
  #------------------------------------------------------------------------------
167
175
  def awesome_struct(s)
@@ -237,9 +245,9 @@ module AwesomePrint
237
245
  if the_method && the_method.respond_to?(:arity) # Is this original object#method?
238
246
  method_tuple(the_method) # Yes, we are good.
239
247
  end
240
- elsif object.respond_to?(:instance_method) # Is this an unbound method?
241
- method_tuple(object.instance_method(name))
242
- end
248
+ elsif object.respond_to?(:instance_method) # Is this an unbound method?
249
+ method_tuple(object.instance_method(name)) rescue nil # Rescue to avoid NameError when the method is not
250
+ end # available (ex. File.lchmod on Ubuntu 12).
243
251
  end
244
252
  tuple || [ name.to_s, '(?)', '?' ] # Return WTF default if all the above fails.
245
253
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
@@ -1,10 +1,10 @@
1
- # Copyright (c) 2010-2012 Michael Dvorkin
1
+ # Copyright (c) 2010-2013 Michael Dvorkin
2
2
  #
3
3
  # Awesome Print is freely distributable under the terms of MIT license.
4
4
  # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
5
  #------------------------------------------------------------------------------
6
6
  module AwesomePrint
7
7
  def self.version
8
- '1.1.0'
8
+ "1.2.0"
9
9
  end
10
10
  end
@@ -1,6 +1,7 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
  require "bigdecimal"
3
3
  require "rational"
4
+ require "set"
4
5
 
5
6
  describe "AwesomePrint" do
6
7
  before do
@@ -511,6 +512,52 @@ EOS
511
512
  end
512
513
  end
513
514
 
515
+ #------------------------------------------------------------------------------
516
+ describe "Set" do
517
+ before do
518
+ @arr = [1, :two, "three" ]
519
+ @set = Set.new(@arr)
520
+ end
521
+
522
+ it "empty set" do
523
+ Set.new.ai.should == [].ai
524
+ end
525
+
526
+ if RUBY_VERSION > "1.9"
527
+ it "plain multiline" do
528
+ @set.ai(:plain => true).should == @arr.ai(:plain => true)
529
+ end
530
+
531
+ it "plain multiline indented" do
532
+ @set.ai(:plain => true, :indent => 1).should == @arr.ai(:plain => true, :indent => 1)
533
+ end
534
+
535
+ it "plain single line" do
536
+ @set.ai(:plain => true, :multiline => false).should == @arr.ai(:plain => true, :multiline => false)
537
+ end
538
+
539
+ it "colored multiline (default)" do
540
+ @set.ai.should == @arr.ai
541
+ end
542
+ else # Prior to Ruby 1.9 the order of set values is unpredicatble.
543
+ it "plain multiline" do
544
+ @set.sort_by{ |x| x.to_s }.ai(:plain => true).should == @arr.sort_by{ |x| x.to_s }.ai(:plain => true)
545
+ end
546
+
547
+ it "plain multiline indented" do
548
+ @set.sort_by{ |x| x.to_s }.ai(:plain => true, :indent => 1).should == @arr.sort_by{ |x| x.to_s }.ai(:plain => true, :indent => 1)
549
+ end
550
+
551
+ it "plain single line" do
552
+ @set.sort_by{ |x| x.to_s }.ai(:plain => true, :multiline => false).should == @arr.sort_by{ |x| x.to_s }.ai(:plain => true, :multiline => false)
553
+ end
554
+
555
+ it "colored multiline (default)" do
556
+ @set.sort_by{ |x| x.to_s }.ai.should == @arr.sort_by{ |x| x.to_s }.ai
557
+ end
558
+ end
559
+ end
560
+
514
561
  #------------------------------------------------------------------------------
515
562
  describe "Struct" do
516
563
  before do