amazing_print 1.0.0 → 1.3.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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/Appraisals +47 -51
  4. data/CHANGELOG.md +32 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE +1 -0
  7. data/README.md +20 -13
  8. data/Rakefile +2 -0
  9. data/lib/amazing_print.rb +19 -17
  10. data/lib/amazing_print/colorize.rb +2 -0
  11. data/lib/amazing_print/core_ext/awesome_method_array.rb +3 -1
  12. data/lib/amazing_print/core_ext/class.rb +2 -0
  13. data/lib/amazing_print/core_ext/kernel.rb +2 -0
  14. data/lib/amazing_print/core_ext/logger.rb +11 -2
  15. data/lib/amazing_print/core_ext/object.rb +2 -0
  16. data/lib/amazing_print/core_ext/string.rb +5 -2
  17. data/lib/amazing_print/custom_defaults.rb +3 -1
  18. data/lib/amazing_print/ext/action_view.rb +3 -1
  19. data/lib/amazing_print/ext/active_record.rb +9 -18
  20. data/lib/amazing_print/ext/active_support.rb +2 -0
  21. data/lib/amazing_print/ext/mongo_mapper.rb +4 -2
  22. data/lib/amazing_print/ext/mongoid.rb +2 -0
  23. data/lib/amazing_print/ext/nobrainer.rb +6 -0
  24. data/lib/amazing_print/ext/nokogiri.rb +2 -0
  25. data/lib/amazing_print/ext/ostruct.rb +2 -0
  26. data/lib/amazing_print/ext/ripple.rb +2 -0
  27. data/lib/amazing_print/ext/sequel.rb +4 -2
  28. data/lib/amazing_print/formatter.rb +9 -2
  29. data/lib/amazing_print/formatters.rb +12 -10
  30. data/lib/amazing_print/formatters/array_formatter.rb +3 -1
  31. data/lib/amazing_print/formatters/base_formatter.rb +5 -2
  32. data/lib/amazing_print/formatters/class_formatter.rb +2 -0
  33. data/lib/amazing_print/formatters/dir_formatter.rb +4 -1
  34. data/lib/amazing_print/formatters/file_formatter.rb +4 -1
  35. data/lib/amazing_print/formatters/hash_formatter.rb +4 -2
  36. data/lib/amazing_print/formatters/method_formatter.rb +2 -0
  37. data/lib/amazing_print/formatters/object_formatter.rb +14 -13
  38. data/lib/amazing_print/formatters/simple_formatter.rb +2 -0
  39. data/lib/amazing_print/formatters/struct_formatter.rb +9 -7
  40. data/lib/amazing_print/indentator.rb +2 -0
  41. data/lib/amazing_print/inspector.rb +9 -9
  42. data/lib/amazing_print/version.rb +3 -1
  43. data/lib/ap.rb +3 -1
  44. data/spec/active_record_helper.rb +10 -0
  45. data/spec/colors_spec.rb +43 -46
  46. data/spec/core_ext/logger_spec.rb +40 -14
  47. data/spec/core_ext/string_spec.rb +2 -7
  48. data/spec/ext/action_controller_spec.rb +40 -0
  49. data/spec/ext/action_view_spec.rb +8 -1
  50. data/spec/ext/active_model_spec.rb +37 -0
  51. data/spec/ext/active_record_spec.rb +42 -7
  52. data/spec/ext/active_support_spec.rb +12 -1
  53. data/spec/ext/mongo_mapper_spec.rb +8 -6
  54. data/spec/ext/mongoid_spec.rb +2 -0
  55. data/spec/ext/nobrainer_spec.rb +2 -0
  56. data/spec/ext/nokogiri_spec.rb +2 -0
  57. data/spec/ext/ostruct_spec.rb +2 -0
  58. data/spec/ext/ripple_spec.rb +2 -0
  59. data/spec/ext/sequel_spec.rb +45 -0
  60. data/spec/formats_spec.rb +10 -8
  61. data/spec/methods_spec.rb +37 -3
  62. data/spec/misc_spec.rb +3 -1
  63. data/spec/objects_spec.rb +2 -0
  64. data/spec/sequel_helper.rb +18 -0
  65. data/spec/spec_helper.rb +5 -1
  66. data/spec/support/active_record_data.rb +2 -0
  67. data/spec/support/active_record_data/6_1_diana.txt +109 -0
  68. data/spec/support/active_record_data/6_1_multi.txt +220 -0
  69. data/spec/support/ext_verifier.rb +9 -4
  70. data/spec/support/mongoid_versions.rb +2 -0
  71. data/spec/support/rails_versions.rb +7 -0
  72. metadata +79 -54
  73. data/lib/amazing_print/core_ext/method.rb +0 -21
@@ -1,6 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'AmazingPrint::ActiveSupport', skip: -> { !ExtVerifier.has_rails? }.call do
6
+ let(:expected_ar_time_str) do
7
+ if activerecord_6_1?
8
+ '15:30:45.000000000'
9
+ else
10
+ '15:30:45'
11
+ end
12
+ end
13
+
4
14
  before do
5
15
  @ap = AmazingPrint::Inspector.new
6
16
  end
@@ -8,7 +18,8 @@ RSpec.describe 'AmazingPrint::ActiveSupport', skip: -> { !ExtVerifier.has_rails?
8
18
  it 'should format ActiveSupport::TimeWithZone as regular Time' do
9
19
  Time.zone = 'Eastern Time (US & Canada)'
10
20
  time = Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone
11
- expect(@ap.send(:awesome, time)).to eq("\e[0;32mSat, 10 Feb 2007 15:30:45 EST -05:00\e[0m")
21
+ expect(@ap.send(:awesome, time))
22
+ .to eq("\e[0;32mSat, 10 Feb 2007 #{expected_ar_time_str} EST -05:00\e[0m")
12
23
  end
13
24
 
14
25
  it 'should format HashWithIndifferentAccess as regular Hash' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'AmazingPrint/MongoMapper', skip: -> { !ExtVerifier.has_mongo_mapper? }.call do
@@ -29,8 +31,8 @@ RSpec.describe 'AmazingPrint/MongoMapper', skip: -> { !ExtVerifier.has_mongo_map
29
31
  user = MongoUser.new(first_name: 'Al', last_name: 'Capone')
30
32
 
31
33
  out = @ap.send(:awesome, user)
32
- out.gsub!(/#\<Proc:.+?\>/, 'amazing_print_PROC_STUB')
33
- out.gsub!(/BSON::ObjectId\('[\da-f]+?'\)/, "BSON::ObjectId('123456789')")
34
+ .gsub(/#\<Proc:.+?\>/, 'amazing_print_PROC_STUB')
35
+ .gsub(/BSON::ObjectId\('[\da-f]+?'\)/, "BSON::ObjectId('123456789')")
34
36
 
35
37
  str = if MongoMapper::Version >= '0.13'
36
38
  <<~EOS.strip
@@ -232,10 +234,10 @@ RSpec.describe 'AmazingPrint/MongoMapper', skip: -> { !ExtVerifier.has_mongo_map
232
234
  describe 'with show associations turned on and inline embedded turned on' do
233
235
  before :each do
234
236
  @ap = AmazingPrint::Inspector.new plain: true,
235
- mongo_mapper: {
236
- show_associations: true,
237
- inline_embedded: true
238
- }
237
+ mongo_mapper: {
238
+ show_associations: true,
239
+ inline_embedded: true
240
+ }
239
241
  end
240
242
 
241
243
  it 'should render an instance with associations shown and embeds there' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'AmazingPrint/Mongoid', skip: -> { !ExtVerifier.has_mongoid? }.call do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'AmazingPrint/NoBrainer', skip: -> { !ExtVerifier.has_nobrainer? }.call do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'AmazingPrint/Nokogiri' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'AmazingPrint Ostruct extension' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'AmazingPrint/Ripple', skip: -> { !ExtVerifier.has_ripple? }.call do
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'sequel_helper'
5
+
6
+ RSpec.describe 'AmazingPrint/Sequel', skip: -> { !ExtVerifier.has_sequel? }.call do
7
+ before do
8
+ @ap = AmazingPrint::Inspector.new plain: true, sort_keys: true
9
+ @user1 = SequelUser.new first_name: 'Jeremy', last_name: 'Evans'
10
+ @user2 = SequelUser.new first_name: 'Sequel', last_name: 'Five'
11
+ end
12
+
13
+ it 'display single record' do
14
+ out = @ap.awesome(@user1)
15
+ str = <<~EOS.strip
16
+ #<SequelUser:placeholder_id> {
17
+ :first_name => "Jeremy",
18
+ :last_name => "Evans"
19
+ }
20
+ EOS
21
+ expect(out).to be_similar_to(str)
22
+ end
23
+
24
+ it 'display multiple records' do
25
+ out = @ap.awesome([@user1, @user2])
26
+ str = <<~EOS.strip
27
+ [
28
+ [0] #<SequelUser:placeholder_id> {
29
+ :first_name => "Jeremy",
30
+ :last_name => "Evans"
31
+ },
32
+ [1] #<SequelUser:placeholder_id> {
33
+ :first_name => "Sequel",
34
+ :last_name => "Five"
35
+ }
36
+ ]
37
+ EOS
38
+ expect(out).to be_similar_to(str)
39
+ end
40
+
41
+ it 'does not crash if on Sequel::Model' do
42
+ out = @ap.awesome(::Sequel::Model)
43
+ expect(out).to be_similar_to('Sequel::Model < Object')
44
+ end
45
+ end
data/spec/formats_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'bigdecimal'
3
5
  require 'set'
@@ -489,7 +491,7 @@ RSpec.describe 'AmazingPrint' do
489
491
  describe 'File' do
490
492
  it 'should display a file (plain)' do
491
493
  File.open(__FILE__, 'r') do |f|
492
- expect(f.ai(plain: true)).to eq("#{f.inspect}\n" << `ls -alF #{f.path}`.chop)
494
+ expect(f.ai(plain: true)).to eq("#{f.inspect}\n" + `ls -alF #{f.path}`.chop)
493
495
  end
494
496
  end
495
497
  end
@@ -498,7 +500,7 @@ RSpec.describe 'AmazingPrint' do
498
500
  describe 'Dir' do
499
501
  it 'should display a direcory (plain)' do
500
502
  Dir.open(File.dirname(__FILE__)) do |d|
501
- expect(d.ai(plain: true)).to eq("#{d.inspect}\n" << `ls -alF #{d.path}`.chop)
503
+ expect(d.ai(plain: true)).to eq("#{d.inspect}\n" + `ls -alF #{d.path}`.chop)
502
504
  end
503
505
  end
504
506
  end
@@ -566,19 +568,19 @@ RSpec.describe 'AmazingPrint' do
566
568
  end
567
569
  else # Prior to Ruby 1.9 the order of set values is unpredicatble.
568
570
  it 'plain multiline' do
569
- expect(@set.sort_by { |x| x.to_s }.ai(plain: true)).to eq(@arr.sort_by { |x| x.to_s }.ai(plain: true))
571
+ expect(@set.sort_by(&:to_s).ai(plain: true)).to eq(@arr.sort_by(&:to_s).ai(plain: true))
570
572
  end
571
573
 
572
574
  it 'plain multiline indented' do
573
- expect(@set.sort_by { |x| x.to_s }.ai(plain: true, indent: 1)).to eq(@arr.sort_by { |x| x.to_s }.ai(plain: true, indent: 1))
575
+ expect(@set.sort_by(&:to_s).ai(plain: true, indent: 1)).to eq(@arr.sort_by(&:to_s).ai(plain: true, indent: 1))
574
576
  end
575
577
 
576
578
  it 'plain single line' do
577
- expect(@set.sort_by { |x| x.to_s }.ai(plain: true, multiline: false)).to eq(@arr.sort_by { |x| x.to_s }.ai(plain: true, multiline: false))
579
+ expect(@set.sort_by(&:to_s).ai(plain: true, multiline: false)).to eq(@arr.sort_by(&:to_s).ai(plain: true, multiline: false))
578
580
  end
579
581
 
580
582
  it 'colored multiline (default)' do
581
- expect(@set.sort_by { |x| x.to_s }.ai).to eq(@arr.sort_by { |x| x.to_s }.ai)
583
+ expect(@set.sort_by(&:to_s).ai).to eq(@arr.sort_by(&:to_s).ai)
582
584
  end
583
585
  end
584
586
  end
@@ -695,7 +697,7 @@ RSpec.describe 'AmazingPrint' do
695
697
  rescue StandardError
696
698
  File.new('nul')
697
699
  end
698
- expect(my.ai(plain: true)).to eq("#{my.inspect}\n" << `ls -alF #{my.path}`.chop)
700
+ expect(my.ai(plain: true)).to eq("#{my.inspect}\n" + `ls -alF #{my.path}`.chop)
699
701
  end
700
702
 
701
703
  it 'inherited from Dir should be displayed as Dir' do
@@ -703,7 +705,7 @@ RSpec.describe 'AmazingPrint' do
703
705
 
704
706
  require 'tmpdir'
705
707
  my = My.new(Dir.tmpdir)
706
- expect(my.ai(plain: true)).to eq("#{my.inspect}\n" << `ls -alF #{my.path}`.chop)
708
+ expect(my.ai(plain: true)).to eq("#{my.inspect}\n" + `ls -alF #{my.path}`.chop)
707
709
  end
708
710
 
709
711
  it 'should handle a class that defines its own #send method' do
data/spec/methods_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'Single method' do
@@ -33,6 +35,38 @@ RSpec.describe 'Single method' do
33
35
  expect(method.ai).to eq("\e[1;33mString\e[0m#\e[0;35minclude?\e[0m\e[0;37m(arg1)\e[0m")
34
36
  end
35
37
 
38
+ it 'plain: should handle a method with one required keyword argument' do
39
+ class A
40
+ def one(foo:); end
41
+ end
42
+ method = A.new.method(:one)
43
+ expect(method.ai(plain: true)).to eq('A#one(foo:)')
44
+ end
45
+
46
+ it 'color: should handle a method with one required keyword argument' do
47
+ class A
48
+ def one(foo:); end
49
+ end
50
+ method = A.new.method(:one)
51
+ expect(method.ai).to eq("\e[1;33mA\e[0m#\e[0;35mone\e[0m\e[0;37m(foo:)\e[0m")
52
+ end
53
+
54
+ it 'plain: should handle a method with one required and one optional keyword arguments' do
55
+ class A
56
+ def one(foo:, bar: 'baz'); end
57
+ end
58
+ method = A.new.method(:one)
59
+ expect(method.ai(plain: true)).to eq('A#one(foo:, *bar:)')
60
+ end
61
+
62
+ it 'color: should handle a method with one required and one optional keyword arguments' do
63
+ class A
64
+ def one(foo:, bar: 'baz'); end
65
+ end
66
+ method = A.new.method(:one)
67
+ expect(method.ai).to eq("\e[1;33mA\e[0m#\e[0;35mone\e[0m\e[0;37m(foo:, *bar:)\e[0m")
68
+ end
69
+
36
70
  it 'plain: should handle a method with two arguments' do
37
71
  method = ''.method(:tr)
38
72
  expect(method.ai(plain: true)).to eq('String#tr(arg1, arg2)')
@@ -454,16 +488,16 @@ RSpec.describe 'Methods arrays' do
454
488
  def him; end
455
489
 
456
490
  def his
457
- private_methods.grep(/^h..$/) { |n| n.to_sym }
491
+ private_methods.grep(/^h..$/, &:to_sym)
458
492
  end
459
493
 
460
494
  def her
461
- private_methods.grep(/^.e.$/) { |n| n.to_sym }
495
+ private_methods.grep(/^.e.$/, &:to_sym)
462
496
  end
463
497
  end
464
498
 
465
499
  hello = Hello.new
466
- expect((hello.send(:his) - hello.send(:her)).sort_by { |x| x.to_s }).to eq(%i[him his])
500
+ expect((hello.send(:his) - hello.send(:her)).sort_by(&:to_s)).to eq(%i[him his])
467
501
  end
468
502
 
469
503
  it 'appending garbage to methods array should not raise error' do
data/spec/misc_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'AmazingPrint' do
@@ -14,7 +16,7 @@ RSpec.describe 'AmazingPrint' do
14
16
  it 'handle frozen object.inspect' do
15
17
  weird = Class.new do
16
18
  def inspect
17
- 'ice'.freeze
19
+ 'ice'
18
20
  end
19
21
  end
20
22
  expect(weird.new.ai(plain: false)).to eq('ice')
data/spec/objects_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'Objects' do
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ if ExtVerifier.has_sequel?
4
+ # Establish connection to in-memory SQLite DB
5
+ DB = RUBY_PLATFORM == 'java' ? Sequel.connect('jdbc:sqlite::memory:') : Sequel.sqlite
6
+
7
+ # Create the users table
8
+ DB.create_table :sequel_users do
9
+ primary_key :id
10
+ String :first_name
11
+ String :last_name
12
+ TrueClass :admin
13
+ DateTime :created_at
14
+ end
15
+
16
+ # Create models
17
+ class SequelUser < Sequel::Model; end
18
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright (c) 2010-2016 Michael Dvorkin and contributors
2
4
  #
3
5
  # AmazingPrint is freely distributable under the terms of MIT license.
@@ -21,7 +23,7 @@
21
23
  $LOAD_PATH.unshift(File.dirname(__FILE__))
22
24
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
23
25
 
24
- Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each do |file|
26
+ Dir[File.dirname(__FILE__) + '/support/**/*.rb'].sort.each do |file|
25
27
  require file
26
28
  end
27
29
 
@@ -29,12 +31,14 @@ ExtVerifier.require_dependencies!(
29
31
  %w[
30
32
  rails
31
33
  active_record
34
+ action_controller
32
35
  action_view
33
36
  active_support/all
34
37
  mongoid
35
38
  mongo_mapper
36
39
  ripple nobrainer
37
40
  ostruct
41
+ sequel
38
42
  ]
39
43
  )
40
44
  require 'nokogiri'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathname'
2
4
 
3
5
  class ActiveRecordData
@@ -0,0 +1,109 @@
1
+ #<User:placeholder_id
2
+ @_start_transaction_state = nil,
3
+ @association_cache = {},
4
+ @destroyed = false,
5
+ @marked_for_destruction = false,
6
+ @new_record = true,
7
+ @previously_new_record = false,
8
+ @primary_key = "id",
9
+ @readonly = false,
10
+ @strict_loading = false,
11
+ attr_accessor :attributes = #<ActiveModel::AttributeSet:placeholder_id
12
+ @attributes = {
13
+ "admin" => #<ActiveModel::Attribute::FromUser:placeholder_id
14
+ @original_attribute = #<ActiveModel::Attribute::FromDatabase:placeholder_id
15
+ @original_attribute = nil,
16
+ attr_reader :name = "admin",
17
+ attr_reader :type = #<ActiveModel::Type::Boolean:placeholder_id
18
+ attr_reader :limit = nil,
19
+ attr_reader :precision = nil,
20
+ attr_reader :scale = nil
21
+ >,
22
+ attr_reader :value_before_type_cast = nil
23
+ >,
24
+ attr_reader :name = "admin",
25
+ attr_reader :type = #<ActiveModel::Type::Boolean:placeholder_id
26
+ attr_reader :limit = nil,
27
+ attr_reader :precision = nil,
28
+ attr_reader :scale = nil
29
+ >,
30
+ attr_reader :value_before_type_cast = false
31
+ >,
32
+ "created_at" => #<ActiveModel::Attribute::FromUser:placeholder_id
33
+ @original_attribute = #<ActiveModel::Attribute::FromDatabase:placeholder_id
34
+ @original_attribute = nil,
35
+ attr_reader :name = "created_at",
36
+ attr_reader :type = #<ActiveRecord::Type::DateTime:placeholder_id
37
+ attr_reader :limit = nil,
38
+ attr_reader :precision = nil,
39
+ attr_reader :scale = nil
40
+ >,
41
+ attr_reader :value_before_type_cast = nil
42
+ >,
43
+ attr_reader :name = "created_at",
44
+ attr_reader :type = #<ActiveRecord::Type::DateTime:placeholder_id
45
+ attr_reader :limit = nil,
46
+ attr_reader :precision = nil,
47
+ attr_reader :scale = nil
48
+ >,
49
+ attr_reader :value_before_type_cast = "1992-10-10 12:30:00"
50
+ >,
51
+ "id" => #<ActiveModel::Attribute::FromDatabase:placeholder_id
52
+ @original_attribute = nil,
53
+ attr_reader :name = "id",
54
+ attr_reader :type = #<ActiveRecord::ConnectionAdapters::SQLite3Adapter::SQLite3Integer:placeholder_id
55
+ @range = -9223372036854775808...9223372036854775808,
56
+ attr_reader :limit = nil,
57
+ attr_reader :precision = nil,
58
+ attr_reader :scale = nil
59
+ >,
60
+ attr_reader :value_before_type_cast = nil
61
+ >,
62
+ "name" => #<ActiveModel::Attribute::FromUser:placeholder_id
63
+ @original_attribute = #<ActiveModel::Attribute::FromDatabase:placeholder_id
64
+ @original_attribute = nil,
65
+ attr_reader :name = "name",
66
+ attr_reader :type = #<ActiveModel::Type::String:placeholder_id
67
+ @false = "f",
68
+ @true = "t",
69
+ attr_reader :limit = nil,
70
+ attr_reader :precision = nil,
71
+ attr_reader :scale = nil
72
+ >,
73
+ attr_reader :value_before_type_cast = nil
74
+ >,
75
+ attr_reader :name = "name",
76
+ attr_reader :type = #<ActiveModel::Type::String:placeholder_id
77
+ @false = "f",
78
+ @true = "t",
79
+ attr_reader :limit = nil,
80
+ attr_reader :precision = nil,
81
+ attr_reader :scale = nil
82
+ >,
83
+ attr_reader :value_before_type_cast = "Diana"
84
+ >,
85
+ "rank" => #<ActiveModel::Attribute::FromUser:placeholder_id
86
+ @original_attribute = #<ActiveModel::Attribute::FromDatabase:placeholder_id
87
+ @original_attribute = nil,
88
+ attr_reader :name = "rank",
89
+ attr_reader :type = #<ActiveRecord::ConnectionAdapters::SQLite3Adapter::SQLite3Integer:placeholder_id
90
+ @range = -9223372036854775808...9223372036854775808,
91
+ attr_reader :limit = nil,
92
+ attr_reader :precision = nil,
93
+ attr_reader :scale = nil
94
+ >,
95
+ attr_reader :value_before_type_cast = nil
96
+ >,
97
+ attr_reader :name = "rank",
98
+ attr_reader :type = #<ActiveRecord::ConnectionAdapters::SQLite3Adapter::SQLite3Integer:placeholder_id
99
+ @range = -9223372036854775808...9223372036854775808,
100
+ attr_reader :limit = nil,
101
+ attr_reader :precision = nil,
102
+ attr_reader :scale = nil
103
+ >,
104
+ attr_reader :value_before_type_cast = 1
105
+ >
106
+ }
107
+ >,
108
+ attr_accessor :destroyed_by_association = nil
109
+ >