amazing_print 1.0.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.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/Appraisals +60 -0
  4. data/CHANGELOG.md +2 -0
  5. data/CONTRIBUTING.md +81 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +21 -0
  8. data/README.md +356 -0
  9. data/Rakefile +23 -0
  10. data/lib/amazing_print.rb +46 -0
  11. data/lib/amazing_print/colorize.rb +25 -0
  12. data/lib/amazing_print/core_ext/awesome_method_array.rb +82 -0
  13. data/lib/amazing_print/core_ext/class.rb +23 -0
  14. data/lib/amazing_print/core_ext/kernel.rb +25 -0
  15. data/lib/amazing_print/core_ext/logger.rb +21 -0
  16. data/lib/amazing_print/core_ext/method.rb +21 -0
  17. data/lib/amazing_print/core_ext/object.rb +23 -0
  18. data/lib/amazing_print/core_ext/string.rb +42 -0
  19. data/lib/amazing_print/custom_defaults.rb +57 -0
  20. data/lib/amazing_print/ext/action_view.rb +22 -0
  21. data/lib/amazing_print/ext/active_record.rb +103 -0
  22. data/lib/amazing_print/ext/active_support.rb +45 -0
  23. data/lib/amazing_print/ext/mongo_mapper.rb +125 -0
  24. data/lib/amazing_print/ext/mongoid.rb +68 -0
  25. data/lib/amazing_print/ext/nobrainer.rb +53 -0
  26. data/lib/amazing_print/ext/nokogiri.rb +45 -0
  27. data/lib/amazing_print/ext/ostruct.rb +27 -0
  28. data/lib/amazing_print/ext/ripple.rb +71 -0
  29. data/lib/amazing_print/ext/sequel.rb +55 -0
  30. data/lib/amazing_print/formatter.rb +120 -0
  31. data/lib/amazing_print/formatters.rb +14 -0
  32. data/lib/amazing_print/formatters/array_formatter.rb +139 -0
  33. data/lib/amazing_print/formatters/base_formatter.rb +148 -0
  34. data/lib/amazing_print/formatters/class_formatter.rb +24 -0
  35. data/lib/amazing_print/formatters/dir_formatter.rb +21 -0
  36. data/lib/amazing_print/formatters/file_formatter.rb +21 -0
  37. data/lib/amazing_print/formatters/hash_formatter.rb +106 -0
  38. data/lib/amazing_print/formatters/method_formatter.rb +21 -0
  39. data/lib/amazing_print/formatters/object_formatter.rb +82 -0
  40. data/lib/amazing_print/formatters/simple_formatter.rb +20 -0
  41. data/lib/amazing_print/formatters/struct_formatter.rb +74 -0
  42. data/lib/amazing_print/indentator.rb +17 -0
  43. data/lib/amazing_print/inspector.rb +175 -0
  44. data/lib/amazing_print/version.rb +10 -0
  45. data/lib/ap.rb +10 -0
  46. data/spec/active_record_helper.rb +30 -0
  47. data/spec/colors_spec.rb +114 -0
  48. data/spec/core_ext/logger_spec.rb +44 -0
  49. data/spec/core_ext/string_spec.rb +20 -0
  50. data/spec/ext/action_view_spec.rb +17 -0
  51. data/spec/ext/active_record_spec.rb +297 -0
  52. data/spec/ext/active_support_spec.rb +26 -0
  53. data/spec/ext/mongo_mapper_spec.rb +259 -0
  54. data/spec/ext/mongoid_spec.rb +66 -0
  55. data/spec/ext/nobrainer_spec.rb +58 -0
  56. data/spec/ext/nokogiri_spec.rb +50 -0
  57. data/spec/ext/ostruct_spec.rb +22 -0
  58. data/spec/ext/ripple_spec.rb +47 -0
  59. data/spec/formats_spec.rb +779 -0
  60. data/spec/methods_spec.rb +478 -0
  61. data/spec/misc_spec.rb +245 -0
  62. data/spec/objects_spec.rb +219 -0
  63. data/spec/spec_helper.rb +106 -0
  64. data/spec/support/active_record_data.rb +20 -0
  65. data/spec/support/active_record_data/3_2_diana.txt +24 -0
  66. data/spec/support/active_record_data/3_2_diana_legacy.txt +24 -0
  67. data/spec/support/active_record_data/3_2_multi.txt +50 -0
  68. data/spec/support/active_record_data/3_2_multi_legacy.txt +50 -0
  69. data/spec/support/active_record_data/4_0_diana.txt +98 -0
  70. data/spec/support/active_record_data/4_0_multi.txt +198 -0
  71. data/spec/support/active_record_data/4_1_diana.txt +97 -0
  72. data/spec/support/active_record_data/4_1_multi.txt +196 -0
  73. data/spec/support/active_record_data/4_2_diana.txt +109 -0
  74. data/spec/support/active_record_data/4_2_diana_legacy.txt +109 -0
  75. data/spec/support/active_record_data/4_2_multi.txt +220 -0
  76. data/spec/support/active_record_data/4_2_multi_legacy.txt +220 -0
  77. data/spec/support/active_record_data/5_0_diana.txt +105 -0
  78. data/spec/support/active_record_data/5_0_multi.txt +212 -0
  79. data/spec/support/active_record_data/5_1_diana.txt +104 -0
  80. data/spec/support/active_record_data/5_1_multi.txt +210 -0
  81. data/spec/support/active_record_data/5_2_diana.txt +104 -0
  82. data/spec/support/active_record_data/5_2_multi.txt +210 -0
  83. data/spec/support/active_record_data/6_0_diana.txt +104 -0
  84. data/spec/support/active_record_data/6_0_multi.txt +210 -0
  85. data/spec/support/ext_verifier.rb +41 -0
  86. data/spec/support/mongoid_versions.rb +22 -0
  87. data/spec/support/rails_versions.rb +50 -0
  88. metadata +243 -0
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'bundler'
5
+ Bundler::GemHelper.install_tasks
6
+
7
+ task :default do
8
+ if ENV['BUNDLE_GEMFILE'] =~ /gemfiles/
9
+ Rake::Task['spec'].invoke
10
+ else
11
+ Rake::Task['appraise'].invoke
12
+ end
13
+ end
14
+
15
+ task :appraise do
16
+ exec 'appraisal install && appraisal rake'
17
+ end
18
+
19
+ desc 'Run all amazing_print gem specs'
20
+ task :spec do
21
+ # Run plain rspec command without RSpec::Core::RakeTask overrides.
22
+ exec 'rspec -c spec'
23
+ end
@@ -0,0 +1,46 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint is freely distributable under the terms of MIT license.
4
+ # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
6
+ #
7
+ # AmazingPrint might be loaded implicitly through ~/.irbrc or ~/.pryrc
8
+ # so do nothing for subsequent requires.
9
+ #
10
+ unless defined?(AmazingPrint::Inspector)
11
+ %w[awesome_method_array string method object class kernel].each do |file|
12
+ require "amazing_print/core_ext/#{file}"
13
+ end
14
+
15
+ require 'amazing_print/custom_defaults'
16
+ require 'amazing_print/inspector'
17
+ require 'amazing_print/formatter'
18
+ require 'amazing_print/version'
19
+ require 'amazing_print/core_ext/logger' if defined?(Logger)
20
+ #
21
+ # Load the following under normal circumstances as well as in Rails
22
+ # console when required from ~/.irbrc or ~/.pryrc.
23
+ #
24
+ if defined?(ActiveRecord) || AmazingPrint.rails_console?
25
+ require 'amazing_print/ext/active_record'
26
+ end
27
+ if defined?(ActiveSupport) || AmazingPrint.rails_console?
28
+ require 'amazing_print/ext/active_support'
29
+ end
30
+ #
31
+ # Load remaining extensions.
32
+ #
33
+ if defined?(ActiveSupport.on_load)
34
+ ActiveSupport.on_load(:action_view) do
35
+ require 'amazing_print/ext/action_view'
36
+ end
37
+ end
38
+ require 'amazing_print/ext/mongo_mapper' if defined?(MongoMapper)
39
+ require 'amazing_print/ext/mongoid' if defined?(Mongoid)
40
+ require 'amazing_print/ext/nokogiri' if defined?(Nokogiri)
41
+ require 'amazing_print/ext/nobrainer' if defined?(NoBrainer)
42
+ require 'amazing_print/ext/ripple' if defined?(Ripple)
43
+ require 'amazing_print/ext/sequel' if defined?(Sequel)
44
+ require 'amazing_print/ext/ostruct' if defined?(OpenStruct)
45
+ end
46
+ # test
@@ -0,0 +1,25 @@
1
+ autoload :CGI, 'cgi'
2
+
3
+ module AmazingPrint
4
+ module Colorize
5
+ # Pick the color and apply it to the given string as necessary.
6
+ #------------------------------------------------------------------------------
7
+ def colorize(str, type)
8
+ str = CGI.escapeHTML(str) if options[:html]
9
+ if options[:plain] || !options[:color][type] || !inspector.colorize?
10
+ str
11
+ #
12
+ # Check if the string color method is defined by amazing_print and accepts
13
+ # html parameter or it has been overriden by some gem such as colorize.
14
+ #
15
+ elsif str.method(options[:color][type]).arity == -1 # Accepts html parameter.
16
+ str.send(options[:color][type], options[:html])
17
+ else
18
+ if options[:html]
19
+ str = %(<kbd style="color:#{options[:color][type]}">#{str}</kbd>)
20
+ end
21
+ str.send(options[:color][type])
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,82 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint is freely distributable under the terms of MIT license.
4
+ # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
6
+ #
7
+ # The following makes it possible to invoke amazing_print while performing
8
+ # operations on method arrays, ex:
9
+ #
10
+ # ap [].methods - Object.methods
11
+ # ap ''.methods.grep(/!|\?/)
12
+ #
13
+ # If you could think of a better way please let me know :-)
14
+ #
15
+ module AwesomeMethodArray #:nodoc:
16
+ def -(_other_ary)
17
+ super.tap do |arr|
18
+ arr.instance_variable_set(:@__awesome_methods__, instance_variable_get(:@__awesome_methods__))
19
+ end
20
+ end
21
+
22
+ def &(_other_ary)
23
+ super.tap do |arr|
24
+ arr.instance_variable_set(:@__awesome_methods__, instance_variable_get(:@__awesome_methods__))
25
+ end
26
+ end
27
+
28
+ #
29
+ # Intercepting Array#grep needs a special treatment since grep accepts
30
+ # an optional block.
31
+ #
32
+ def grep(pattern, &blk)
33
+ #
34
+ # The following looks rather insane and I've sent numerous hours trying
35
+ # to figure it out. The problem is that if grep gets called with the
36
+ # block, for example:
37
+ #
38
+ # [].methods.grep(/(.+?)_by/) { $1.to_sym }
39
+ #
40
+ # ...then simple:
41
+ #
42
+ # original_grep(pattern, &blk)
43
+ #
44
+ # doesn't set $1 within the grep block which causes nil.to_sym failure.
45
+ # The workaround below has been tested with Ruby 1.8.7/Rails 2.3.8 and
46
+ # Ruby 1.9.2/Rails 3.0.0. For more info see the following thread dating
47
+ # back to 2003 when Ruby 1.8.0 was as fresh off the grill as Ruby 1.9.2
48
+ # is in 2010 :-)
49
+ #
50
+ # http://www.justskins.com/forums/bug-when-rerouting-string-52852.html
51
+ #
52
+ # BTW, if you figure out a better way of intercepting Array#grep please
53
+ # let me know: twitter.com/mid -- or just say hi so I know you've read
54
+ # the comment :-)
55
+ #
56
+ arr = if blk
57
+ super(pattern) do |match|
58
+ #
59
+ # The binding can only be used with Ruby-defined methods, therefore
60
+ # we must rescue potential "ArgumentError: Can't create Binding from
61
+ # C level Proc" error.
62
+ #
63
+ # For example, the following raises ArgumentError since #succ method
64
+ # is defined in C.
65
+ #
66
+ # [ 0, 1, 2, 3, 4 ].grep(1..2, &:succ)
67
+ #
68
+ begin
69
+ eval("%Q/#{match.to_s.gsub('/', '\/')}/ =~ #{pattern.inspect}", blk.binding)
70
+ rescue StandardError
71
+ ArgumentError
72
+ end
73
+ yield match
74
+ end
75
+ else
76
+ super(pattern)
77
+ end
78
+ arr.instance_variable_set(:@__awesome_methods__, instance_variable_get(:@__awesome_methods__))
79
+ arr.reject! { |item| !(item.is_a?(Symbol) || item.is_a?(String)) } # grep block might return crap.
80
+ arr
81
+ end
82
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint is freely distributable under the terms of MIT license.
4
+ # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
6
+ class Class #:nodoc:
7
+ #
8
+ # Intercept methods below to inject @__amazing_print__ instance variable
9
+ # so we know it is the *methods* array when formatting an array.
10
+ #
11
+ # Remaining public/private etc. '_methods' are handled in core_ext/object.rb.
12
+ #
13
+ %w[instance_methods private_instance_methods protected_instance_methods public_instance_methods].each do |name|
14
+ original_method = instance_method(name)
15
+
16
+ define_method name do |*args|
17
+ methods = original_method.bind(self).call(*args)
18
+ methods.instance_variable_set(:@__awesome_methods__, self)
19
+ methods.extend(AwesomeMethodArray)
20
+ methods
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint 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 Kernel
7
+ def ai(options = {})
8
+ ap = AmazingPrint::Inspector.new(options)
9
+ awesome = ap.awesome self
10
+ if options[:html]
11
+ awesome = "<pre>#{awesome}</pre>"
12
+ awesome = awesome.html_safe if defined? ActiveSupport
13
+ end
14
+ awesome
15
+ end
16
+ alias awesome_inspect ai
17
+
18
+ def ap(object, options = {})
19
+ puts object.ai(options)
20
+ object unless AmazingPrint.console?
21
+ end
22
+ alias amazing_print ap
23
+
24
+ module_function :ap
25
+ end
@@ -0,0 +1,21 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint 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 AmazingPrint
7
+ module Logger
8
+ # Add ap method to logger
9
+ #------------------------------------------------------------------------------
10
+ def ap(object, level = nil)
11
+ level ||= AmazingPrint.defaults[:log_level] if AmazingPrint.defaults
12
+ level ||= :debug
13
+ send level, object.ai
14
+ end
15
+ end
16
+ end
17
+
18
+ Logger.include AmazingPrint::Logger
19
+ if defined?(ActiveSupport::BufferedLogger)
20
+ ActiveSupport::BufferedLogger.include AmazingPrint::Logger
21
+ end
@@ -0,0 +1,21 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint is freely distributable under the terms of MIT license.
4
+ # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
6
+ #
7
+ # Method#name was intorduced in Ruby 1.8.7 so we define it here as necessary.
8
+ #
9
+ unless nil.method(:class).respond_to?(:name)
10
+ class Method
11
+ def name
12
+ inspect.split(/[#.>]/)[-1]
13
+ end
14
+ end
15
+
16
+ class UnboundMethod
17
+ def name
18
+ inspect.split(/[#.>]/)[-1]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint is freely distributable under the terms of MIT license.
4
+ # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
6
+ class Object #:nodoc:
7
+ #
8
+ # Intercept methods below to inject @__amazing_print__ instance variable
9
+ # so we know it is the *methods* array when formatting an array.
10
+ #
11
+ # Remaining instance '_methods' are handled in core_ext/class.rb.
12
+ #
13
+ %w[methods private_methods protected_methods public_methods singleton_methods].each do |name|
14
+ original_method = instance_method(name)
15
+
16
+ define_method name do |*args|
17
+ methods = original_method.bind(self).call(*args)
18
+ methods.instance_variable_set(:@__awesome_methods__, self)
19
+ methods.extend(AwesomeMethodArray)
20
+ methods
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,42 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint is freely distributable under the terms of MIT license.
4
+ # See LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
6
+
7
+ # frozen_string_literal: true
8
+
9
+ class String
10
+ #
11
+ # ANSI color codes:
12
+ # \e => escape
13
+ # 30 => color base
14
+ # 1 => bright
15
+ # 0 => normal
16
+ #
17
+ # For HTML coloring we use <kbd> tag instead of <span> to require monospace
18
+ # font. Note that beloved <tt> has been removed from HTML5.
19
+ #
20
+ %w[gray red green yellow blue purple cyan white].zip(
21
+ %w[black darkred darkgreen brown navy darkmagenta darkcyan slategray]
22
+ ).each_with_index do |(color, shade), i|
23
+ # NOTE: Format strings are created once only, for performance, and remembered by closures.
24
+
25
+ term_bright_seq = "\e[1;#{30 + i}m%s\e[0m"
26
+ html_bright_seq = %(<kbd style="color:#{color}">%s</kbd>)
27
+
28
+ define_method color do |html = false, *|
29
+ (html ? html_bright_seq : term_bright_seq) % self
30
+ end
31
+
32
+ term_normal_seq = "\e[0;#{30 + i}m%s\e[0m"
33
+ html_normal_seq = %(<kbd style="color:#{shade}">%s</kbd>)
34
+
35
+ define_method "#{color}ish" do |html = false, *|
36
+ (html ? html_normal_seq : term_normal_seq) % self
37
+ end
38
+ end
39
+
40
+ alias black grayish
41
+ alias pale whiteish
42
+ end
@@ -0,0 +1,57 @@
1
+ module AmazingPrint
2
+ class << self
3
+ attr_accessor :defaults, :force_colors
4
+
5
+ # Class accessor to force colorized output (ex. forked subprocess where TERM
6
+ # might be dumb).
7
+ #---------------------------------------------------------------------------
8
+ def force_colors!(value = true)
9
+ @force_colors = value
10
+ end
11
+
12
+ def console?
13
+ boolean(defined?(IRB) || defined?(Pry))
14
+ end
15
+
16
+ def rails_console?
17
+ console? && boolean(defined?(Rails::Console) || ENV['RAILS_ENV'])
18
+ end
19
+
20
+ def diet_rb
21
+ IRB.formatter = Class.new(IRB::Formatter) do
22
+ def inspect_object(object)
23
+ object.ai
24
+ end
25
+ end.new
26
+ end
27
+
28
+ def usual_rb
29
+ IRB::Irb.class_eval do
30
+ def output_value
31
+ ap @context.last_value
32
+ rescue NoMethodError
33
+ puts "(Object doesn't support #ai)"
34
+ end
35
+ end
36
+ end
37
+
38
+ def irb!
39
+ return unless defined?(IRB)
40
+
41
+ IRB.version.include?('DietRB') ? diet_rb : usual_rb
42
+ end
43
+
44
+ def pry!
45
+ Pry.print = proc { |output, value| output.puts value.ai } if defined?(Pry)
46
+ end
47
+
48
+ private
49
+
50
+ # Takes a value and returns true unless it is false or nil
51
+ # This is an alternative to the less readable !!(value)
52
+ # https://github.com/bbatsov/ruby-style-guide#no-bang-bang
53
+ def boolean(value)
54
+ value ? true : false
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,22 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint 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 AmazingPrint
7
+ module ActionView
8
+ # Use HTML colors and add default "debug_dump" class to the resulting HTML.
9
+ def ap_debug(object, options = {})
10
+ object.ai(
11
+ options.merge(html: true)
12
+ ).sub(
13
+ /^<pre([\s>])/,
14
+ '<pre class="debug_dump"\\1'
15
+ )
16
+ end
17
+
18
+ alias ap ap_debug
19
+ end
20
+ end
21
+
22
+ ActionView::Base.include AmazingPrint::ActionView
@@ -0,0 +1,103 @@
1
+ # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
+ #
3
+ # AmazingPrint 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 AmazingPrint
7
+ module ActiveRecord
8
+ def self.included(base)
9
+ base.send :alias_method, :cast_without_active_record, :cast
10
+ base.send :alias_method, :cast, :cast_with_active_record
11
+ end
12
+
13
+ # Add ActiveRecord class names to the dispatcher pipeline.
14
+ #------------------------------------------------------------------------------
15
+ def cast_with_active_record(object, type)
16
+ cast = cast_without_active_record(object, type)
17
+ return cast unless defined?(::ActiveRecord::Base)
18
+
19
+ if object.is_a?(::ActiveRecord::Base)
20
+ cast = :active_record_instance
21
+ elsif object.is_a?(::ActiveModel::Errors)
22
+ cast = :active_model_error
23
+ elsif object.is_a?(Class) && object.ancestors.include?(::ActiveRecord::Base)
24
+ cast = :active_record_class
25
+ elsif type == :activerecord_relation || object.class.ancestors.include?(::ActiveRecord::Relation)
26
+ cast = :array
27
+ end
28
+ cast
29
+ end
30
+
31
+ private
32
+
33
+ # Format ActiveRecord instance object.
34
+ #
35
+ # NOTE: by default only instance attributes (i.e. columns) are shown. To format
36
+ # ActiveRecord instance as regular object showing its instance variables and
37
+ # accessors use :raw => true option:
38
+ #
39
+ # ap record, :raw => true
40
+ #
41
+ #------------------------------------------------------------------------------
42
+ def awesome_active_record_instance(object)
43
+ return object.inspect unless defined?(::ActiveSupport::OrderedHash)
44
+ return awesome_object(object) if @options[:raw]
45
+
46
+ data = if object.class.column_names != object.attributes.keys
47
+ object.attributes
48
+ else
49
+ object.class.column_names.each_with_object(::ActiveSupport::OrderedHash.new) do |name, hash|
50
+ if object.has_attribute?(name) || object.new_record?
51
+ value = object.respond_to?(name) ? object.send(name) : object.read_attribute(name)
52
+ hash[name.to_sym] = value
53
+ end
54
+ end
55
+ end
56
+ "#{object} " << awesome_hash(data)
57
+ end
58
+
59
+ # Format ActiveRecord class object.
60
+ #------------------------------------------------------------------------------
61
+ def awesome_active_record_class(object)
62
+ if !defined?(::ActiveSupport::OrderedHash) || !object.respond_to?(:columns) || object.to_s == 'ActiveRecord::Base'
63
+ return object.inspect
64
+ end
65
+ if object.respond_to?(:abstract_class?) && object.abstract_class?
66
+ return awesome_class(object)
67
+ end
68
+
69
+ data = object.columns.each_with_object(::ActiveSupport::OrderedHash.new) do |c, hash|
70
+ hash[c.name.to_sym] = c.type
71
+ end
72
+
73
+ name = "class #{awesome_simple(object.to_s, :class)}"
74
+ base = "< #{awesome_simple(object.superclass.to_s, :class)}"
75
+
76
+ [name, base, awesome_hash(data)].join(' ')
77
+ end
78
+
79
+ # Format ActiveModel error object.
80
+ #------------------------------------------------------------------------------
81
+ def awesome_active_model_error(object)
82
+ return object.inspect unless defined?(::ActiveSupport::OrderedHash)
83
+ return awesome_object(object) if @options[:raw]
84
+
85
+ object_dump = object.marshal_dump.first
86
+ data = if object_dump.class.column_names != object_dump.attributes.keys
87
+ object_dump.attributes
88
+ else
89
+ object_dump.class.column_names.each_with_object(::ActiveSupport::OrderedHash.new) do |name, hash|
90
+ if object_dump.has_attribute?(name) || object_dump.new_record?
91
+ value = object_dump.respond_to?(name) ? object_dump.send(name) : object_dump.read_attribute(name)
92
+ hash[name.to_sym] = value
93
+ end
94
+ end
95
+ end
96
+
97
+ data.merge!({ details: object.details, messages: object.messages })
98
+ "#{object} " << awesome_hash(data)
99
+ end
100
+ end
101
+ end
102
+
103
+ AmazingPrint::Formatter.include AmazingPrint::ActiveRecord