awesome_print 1.1.0 → 1.2.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.
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