acts_as_list 1.1.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ece77b4a7a9c6c50d1d7a188c91c6dedd4c1dba4c8ece714c2922b339c3b5490
4
- data.tar.gz: e7d925c76332e504d6a3db3706c4362b962d5bef2f9c882023bef99a0763e2d1
3
+ metadata.gz: f9d85921cd5b149fa3581d5868734c62fb42e449e4058db26cffb0e62a146b9c
4
+ data.tar.gz: 94b6b6a6599ec0fa381f737bd5b2132258b7620905016bb467e1663f9552021a
5
5
  SHA512:
6
- metadata.gz: 8ca617673d046ef18baab0a51d4e481ac10e7b044c569a9efb201c894be702aec66eb72cbc5364bb85b6374c144990fcc3c367b01cc62e0f431d87b6e41e0f4f
7
- data.tar.gz: c1ce411f1aa503b28a837b714db52a4bcb42ae78542183f6641aa0d0f483c9c98b3521a4557554e9de539b12effeee6f901632636d61408e423c55d67287f47b
6
+ metadata.gz: f991880d1399bdbe56e4ef2511368115fc382dfebe2549188e0b8123f5cd8a93b33f067a602aadd8dbfa70893662b6fe5072d9deea7aba26d8827b83b9e1ac41
7
+ data.tar.gz: df1570e602643b91b602ed3044c9fbe8457ce95e42cf8fdca5858d8bd1460f4105f8839bf87c5338cb0fb4cbac11c46b15c6206dc039cc39cc3c1b561129fcee
@@ -0,0 +1,62 @@
1
+ name: Continuous Integration
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ tests:
11
+ runs-on: ubuntu-latest
12
+ name: Ruby ${{ matrix.ruby }}, DB ${{ matrix.db }}, Rails ${{ matrix.rails }}
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ ruby:
17
+ - '3.0'
18
+ - '3.1'
19
+ - '3.2'
20
+ - '3.3'
21
+ rails:
22
+ - '6.1'
23
+ - '7.0'
24
+ - '7.1'
25
+ db:
26
+ - mysql
27
+ - postgresql
28
+ - sqlite
29
+ exclude:
30
+ - rails: '7.0'
31
+ ruby: '3.1'
32
+ - rails: '7.0'
33
+ ruby: '3.2'
34
+ - rails: '7.0'
35
+ ruby: '3.3'
36
+ env:
37
+ DB: ${{ matrix.db }}
38
+ RAILS_VERSION: ${{ matrix.rails }}
39
+ steps:
40
+ - uses: actions/checkout@v4
41
+ - name: Set up Ruby
42
+ uses: ruby/setup-ruby@v1
43
+ with:
44
+ ruby-version: ${{ matrix.ruby }}
45
+ bundler-cache: true
46
+ - name: Enable MySQL
47
+ if: ${{ matrix.db == 'mysql' }}
48
+ run: sudo systemctl start mysql.service
49
+ - name: Create MySQL Database
50
+ if: ${{ matrix.db == 'mysql' }}
51
+ run: mysql -u root -proot -e 'CREATE DATABASE runner;'
52
+ - name: Enable PostgreSQL
53
+ if: ${{ matrix.db == 'postgresql' }}
54
+ run: sudo systemctl start postgresql.service
55
+ - name: Create PostgreSQL User
56
+ if: ${{ matrix.db == 'postgresql' }}
57
+ run: sudo -u postgres -i createuser runner -s
58
+ - name: Create PostgreSQL Database
59
+ if: ${{ matrix.db == 'postgresql' }}
60
+ run: createdb runner
61
+ - name: Run the default task
62
+ run: bundle exec rake
data/.gitignore CHANGED
@@ -7,6 +7,7 @@ pkg/*
7
7
  .rbenv-version
8
8
  .ruby-gemset
9
9
  .ruby-version
10
- # Appraisal generated lockfiles
11
- *.gemfile.lock
12
10
  .DS_Store
11
+ /tmp/
12
+ /db/
13
+ file::memory*
data/CHANGELOG.md CHANGED
@@ -6,6 +6,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## v1.2.1 - 2024-06-06
10
+
11
+ ### Fixed
12
+ - We no longer delegate the class `connection` method to the instance. [\#436](https://github.com/brendon/acts_as_list/pull/436) ([davidcelis])
13
+
14
+ ## v1.2.0 - 2024-06-03
15
+
16
+ ### Added
17
+ - Add support for composite primary keys. [\#430](https://github.com/brendon/acts_as_list/pull/430) ([divagueame])
18
+
19
+ ### Changed
20
+ - Refactored CI testing framework and removed the Appraisals gem. Use RAILS_VERSION to switch the Rails version you are currently running the tests against.
21
+ - We now only explicitly test against Rails 6.1+ and Ruby 3.0+.
22
+
9
23
  ## v1.1.0 - 2023-02-01
10
24
 
11
25
  ### Fixed (Possibly Breaking)
@@ -256,7 +270,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
256
270
  **Closed issues:**
257
271
 
258
272
  - DEPRECATION WARNING on rails 5.0 as of acts\_as\_list 0.9 [\#251](https://github.com/brendon/acts_as_list/issues/251)
259
- - highter\_items returns items with the same position value [\#247](https://github.com/brendon/acts_as_list/issues/247)
273
+ - higher\_items returns items with the same position value [\#247](https://github.com/brendon/acts_as_list/issues/247)
260
274
  - Broken with unique constraint on position [\#245](https://github.com/brendon/acts_as_list/issues/245)
261
275
 
262
276
  **Merged pull requests:**
@@ -484,7 +498,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
484
498
  - Fix sanitize\_sql\_hash\_for\_conditions deprecation warning in Rails 4.2 [\#140](https://github.com/brendon/acts_as_list/pull/140) ([eagletmt](https://github.com/eagletmt))
485
499
  - Simpler method to find the subclass name [\#139](https://github.com/brendon/acts_as_list/pull/139) ([brendon](https://github.com/brendon))
486
500
  - Rails4 enum column support [\#130](https://github.com/brendon/acts_as_list/pull/130) ([arunagw](https://github.com/arunagw))
487
- - use eval for determing the self.class.name useful when this is used in an abstract class [\#123](https://github.com/brendon/acts_as_list/pull/123) ([flarik](https://github.com/flarik))
501
+ - use eval for determining the self.class.name useful when this is used in an abstract class [\#123](https://github.com/brendon/acts_as_list/pull/123) ([flarik](https://github.com/flarik))
488
502
 
489
503
  ## [0.5.0](https://github.com/brendon/acts_as_list/tree/0.5.0) (2014-10-31)
490
504
  [Full Changelog](https://github.com/brendon/acts_as_list/compare/0.4.0...0.5.0)
@@ -624,7 +638,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
624
638
  - acts\_as\_list :scope =\> "doesnt\_seem\_to\_work" [\#12](https://github.com/brendon/acts_as_list/issues/12)
625
639
  - don't work perfectly with default\_scope [\#11](https://github.com/brendon/acts_as_list/issues/11)
626
640
  - MySQL: Position column MUST NOT have default [\#10](https://github.com/brendon/acts_as_list/issues/10)
627
- - insert\_at fails on postgresql w/ non-null constraint on postion\_column [\#8](https://github.com/brendon/acts_as_list/issues/8)
641
+ - insert\_at fails on postgresql w/ non-null constraint on position\_column [\#8](https://github.com/brendon/acts_as_list/issues/8)
628
642
 
629
643
  **Merged pull requests:**
630
644
 
@@ -633,7 +647,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
633
647
  - Massive test refactorings. [\#24](https://github.com/brendon/acts_as_list/pull/24) ([splattael](https://github.com/splattael))
634
648
  - Silent migrations to reduce test noise. [\#22](https://github.com/brendon/acts_as_list/pull/22) ([splattael](https://github.com/splattael))
635
649
  - Should decrement lower items after the item has been destroyed to avoid unique key conflicts. [\#18](https://github.com/brendon/acts_as_list/pull/18) ([aepstein](https://github.com/aepstein))
636
- - Fix spelling and grammer [\#15](https://github.com/brendon/acts_as_list/pull/15) ([tmiller](https://github.com/tmiller))
650
+ - Fix spelling and grammar [\#15](https://github.com/brendon/acts_as_list/pull/15) ([tmiller](https://github.com/tmiller))
637
651
  - store\_at\_0 should yank item from the list then decrement items to avoid r [\#14](https://github.com/brendon/acts_as_list/pull/14) ([aepstein](https://github.com/aepstein))
638
652
  - Support default\_scope ordering by calling .unscoped [\#13](https://github.com/brendon/acts_as_list/pull/13) ([tanordheim](https://github.com/tanordheim))
639
653
 
data/Gemfile CHANGED
@@ -1,28 +1,13 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ # Specify your gem's dependencies in positioning.gemspec
3
4
  gemspec
4
5
 
5
- gem "rake"
6
- gem "appraisal"
6
+ gem "rake", "~> 13.0"
7
7
 
8
- group :development do
9
- gem "github_changelog_generator", "1.9.0"
10
- end
11
-
12
- group :test do
13
- gem "minitest", "~> 5.0"
14
- gem "timecop"
15
- gem "mocha"
16
- end
17
-
18
- group :sqlite do
19
- gem "sqlite3", "~> 1.4"
20
- end
21
-
22
- group :postgresql do
23
- gem "pg", "~> 1.2.0"
24
- end
8
+ gem "minitest", "~> 5.0"
25
9
 
26
- group :mysql do
27
- gem "mysql2", "~> 0.5.0"
10
+ if ENV["RAILS_VERSION"]
11
+ gem "activerecord", ENV["RAILS_VERSION"]
12
+ gem "activesupport", ENV["RAILS_VERSION"]
28
13
  end
data/README.md CHANGED
@@ -1,9 +1,14 @@
1
1
  # Acts As List
2
2
 
3
3
  ## Build Status
4
- [![Build Status](https://travis-ci.org/brendon/acts_as_list.svg?branch=master)](https://travis-ci.org/brendon/acts_as_list)
4
+ [![Continuous Integration](https://github.com/brendon/acts_as_list/actions/workflows/continuous_integration.yml/badge.svg)](https://github.com/brendon/acts_as_list/actions/workflows/continuous_integration.yml)
5
5
  [![Gem Version](https://badge.fury.io/rb/acts_as_list.svg)](https://badge.fury.io/rb/acts_as_list)
6
6
 
7
+ ## ANNOUNCING: Positioning, the gem
8
+ As maintainer of both Acts As List and the Ranked Model gems, I've become intimately acquainted with the strengths and weaknesses of each. I ended up writing a small scale Rails Concern for positioning database rows for a recent project and it worked really well so I've decided to release it as a gem: [Positioning](https://github.com/brendon/positioning)
9
+
10
+ Positioning works similarly to Acts As List in that it maintains a sequential list of integer values as positions. It differs in that it encourages a unique constraints on the position column and supports multiple lists per database table. It borrows Ranked Model's concept of relative positioning. I encourage you to check it out and give it a whirl on your project!
11
+
7
12
  ## Description
8
13
 
9
14
  This `acts_as` extension provides the capabilities for sorting and reordering a number of objects in a list. The class that has this specified needs to have a `position` column defined as an integer on the mapped database table.
@@ -117,7 +122,7 @@ When using PostgreSQL, it is also possible to leave this migration up to the dat
117
122
  ROW_NUMBER() OVER (
118
123
  PARTITION BY todo_list_id
119
124
  ORDER BY updated_at
120
- ) as new_position
125
+ ) AS new_position
121
126
  FROM todo_items
122
127
  ) AS mapping
123
128
  WHERE todo_items.id = mapping.id;
@@ -195,7 +200,7 @@ class TodoItem < ActiveRecord::Base
195
200
  end
196
201
 
197
202
  class TodoAttachment < ActiveRecord::Base
198
- belongs_to :todo_list
203
+ belongs_to :todo_item
199
204
  acts_as_list scope: :todo_item
200
205
  end
201
206
 
@@ -285,7 +290,7 @@ All versions `0.1.5` onwards require Rails 3.0.x and higher.
285
290
 
286
291
  We often hear complaints that `position` values are repeated, incorrect etc. For example, #254. To ensure data integrity, you should rely on your database. There are two things you can do:
287
292
 
288
- 1. Use constraints. If you model `Item` that `belongs_to` an `Order`, and it has a `position` column, then add a unique constraint on `items` with `[:order_id, :position]`. Think of it as a list invariant. What are the properties of your list that don't change no matter how many items you have in it? One such propery is that each item has a distinct position. Another _could be_ that position is always greater than 0. It is strongly recommended that you rely on your database to enforce these invariants or constraints. Here are the docs for [PostgreSQL](https://www.postgresql.org/docs/9.5/static/ddl-constraints.html) and [MySQL](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html).
293
+ 1. Use constraints. If you model `Item` that `belongs_to` an `Order`, and it has a `position` column, then add a unique constraint on `items` with `[:order_id, :position]`. Think of it as a list invariant. What are the properties of your list that don't change no matter how many items you have in it? One such property is that each item has a distinct position. Another _could be_ that position is always greater than 0. It is strongly recommended that you rely on your database to enforce these invariants or constraints. Here are the docs for [PostgreSQL](https://www.postgresql.org/docs/9.5/static/ddl-constraints.html) and [MySQL](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html).
289
294
  2. Use mutexes or row level locks. At its heart the duplicate problem is that of handling concurrency. Adding a contention resolution mechanism like locks will solve it to some extent. But it is not a solution or replacement for constraints. Locks are also prone to deadlocks.
290
295
 
291
296
  As a library, `acts_as_list` may not always have all the context needed to apply these tools. They are much better suited at the application level.
data/Rakefile CHANGED
@@ -32,11 +32,3 @@ rescue LoadError
32
32
  rescue StandardError
33
33
  puts "RDocTask is not supported on this platform."
34
34
  end
35
-
36
- # See https://github.com/skywinder/github-changelog-generator#rake-task for details
37
- # and github_changelog_generator --help for available options
38
- require 'github_changelog_generator/task'
39
- GitHubChangelogGenerator::RakeTask.new :changelog do |config|
40
- config.project = 'acts_as_list'
41
- config.user = 'brendon'
42
- end
data/acts_as_list.gemspec CHANGED
@@ -9,16 +9,17 @@ Gem::Specification.new do |s|
9
9
  s.platform = Gem::Platform::RUBY
10
10
  s.authors = ["Swanand Pagnis", "Brendon Muir"]
11
11
  s.email = %w(swanand.pagnis@gmail.com brendon@spikeatschool.co.nz)
12
- s.homepage = "http://github.com/brendon/acts_as_list"
12
+ s.homepage = "https://github.com/brendon/acts_as_list"
13
13
  s.summary = "A gem adding sorting, reordering capabilities to an active_record model, allowing it to act as a list"
14
14
  s.description = 'This "acts_as" extension provides the capabilities for sorting and reordering a number of objects in a list. The class that has this specified needs to have a "position" column defined as an integer on the mapped database table.'
15
15
  s.license = "MIT"
16
- s.required_ruby_version = ">= 2.4.7"
16
+ s.required_ruby_version = ">= 2.5"
17
17
 
18
18
  if s.respond_to?(:metadata)
19
19
  s.metadata['changelog_uri'] = 'https://github.com/brendon/acts_as_list/blob/master/CHANGELOG.md'
20
20
  s.metadata['source_code_uri'] = 'https://github.com/brendon/acts_as_list'
21
21
  s.metadata['bug_tracker_uri'] = 'https://github.com/brendon/acts_as_list/issues'
22
+ s.metadata['rubygems_mfa_required'] = 'true'
22
23
  end
23
24
 
24
25
  # Load Paths...
@@ -27,8 +28,13 @@ Gem::Specification.new do |s|
27
28
  s.executables = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f)}
28
29
  s.require_paths = ["lib"]
29
30
 
30
-
31
31
  # Dependencies (installed via "bundle install")
32
- s.add_dependency "activerecord", ">= 4.2"
33
- s.add_development_dependency "bundler", ">= 1.0.0"
32
+ s.add_dependency "activerecord", ">= 6.1"
33
+ s.add_dependency "activesupport", ">= 6.1"
34
+ s.add_development_dependency "minitest-hooks", "~> 1.5.1"
35
+ s.add_development_dependency "mocha", "~> 2.1.0"
36
+ s.add_development_dependency "timecop", "~> 0.9.8"
37
+ s.add_development_dependency "mysql2", "~> 0.5.6"
38
+ s.add_development_dependency "pg", "~> 1.5.5"
39
+ s.add_development_dependency "sqlite3", "~> 1.7.2"
34
40
  end
@@ -171,7 +171,7 @@ module ActiveRecord
171
171
  limit ||= acts_as_list_list.count
172
172
  acts_as_list_list.
173
173
  where("#{quoted_position_column_with_table_name} <= ?", current_position).
174
- where("#{quoted_table_name}.#{self.class.primary_key} != ?", self.send(self.class.primary_key)).
174
+ where.not(primary_key_condition).
175
175
  reorder(acts_as_list_order_argument(:desc)).
176
176
  limit(limit)
177
177
  end
@@ -188,7 +188,7 @@ module ActiveRecord
188
188
  limit ||= acts_as_list_list.count
189
189
  acts_as_list_list.
190
190
  where("#{quoted_position_column_with_table_name} >= ?", current_position).
191
- where("#{quoted_table_name}.#{self.class.primary_key} != ?", self.send(self.class.primary_key)).
191
+ where.not(primary_key_condition).
192
192
  reorder(acts_as_list_order_argument(:asc)).
193
193
  limit(limit)
194
194
  end
@@ -273,7 +273,7 @@ module ActiveRecord
273
273
  scope = acts_as_list_list
274
274
 
275
275
  if except
276
- scope = scope.where("#{quoted_table_name}.#{self.class.primary_key} != ?", except.id)
276
+ scope = scope.where.not(primary_key_condition(except.id))
277
277
  end
278
278
 
279
279
  scope.in_list.reorder(acts_as_list_order_argument(:desc)).first
@@ -300,7 +300,7 @@ module ActiveRecord
300
300
  scope = acts_as_list_list
301
301
 
302
302
  if avoid_id
303
- scope = scope.where("#{quoted_table_name}.#{self.class.primary_key} != ?", avoid_id)
303
+ scope = scope.where.not(primary_key_condition(avoid_id))
304
304
  end
305
305
 
306
306
  if sequential_updates?
@@ -341,7 +341,7 @@ module ActiveRecord
341
341
  scope = acts_as_list_list
342
342
 
343
343
  if avoid_id
344
- scope = scope.where("#{quoted_table_name}.#{self.class.primary_key} != ?", avoid_id)
344
+ scope = scope.where.not(primary_key_condition(avoid_id))
345
345
  end
346
346
 
347
347
  if old_position < new_position
@@ -480,6 +480,11 @@ module ActiveRecord
480
480
  version = Gem.loaded_specs['activerecord'].version
481
481
  requirement.satisfied_by?(version)
482
482
  end
483
+
484
+ def primary_key_condition(id = nil)
485
+ primary_keys = Array.wrap(self.class.primary_key)
486
+ id ? primary_keys.zip(Array.wrap(id)).to_h : slice(*primary_keys)
487
+ end
483
488
  end
484
489
 
485
490
  end
@@ -72,17 +72,18 @@ module ActiveRecord::Acts::List::PositionColumnMethodDefiner #:nodoc:
72
72
  cached_quoted_now = quoted_current_time_from_proper_timezone
73
73
 
74
74
  timestamp_attributes_for_update_in_model.map do |attr|
75
- ", #{connection.quote_column_name(attr)} = #{cached_quoted_now}"
75
+ ", #{self.class.connection.quote_column_name(attr)} = #{cached_quoted_now}"
76
76
  end.join
77
77
  end
78
78
 
79
79
  private
80
80
 
81
- delegate :connection, to: self
82
-
83
81
  def quoted_current_time_from_proper_timezone
84
- connection.quote(connection.quoted_date(
85
- current_time_from_proper_timezone))
82
+ self.class.connection.quote(
83
+ self.class.connection.quoted_date(
84
+ current_time_from_proper_timezone
85
+ )
86
+ )
86
87
  end
87
88
  end
88
89
  end
@@ -2,7 +2,6 @@
2
2
  require "active_support/inflector"
3
3
 
4
4
  module ActiveRecord::Acts::List::ScopeMethodDefiner #:nodoc:
5
- extend ActiveSupport::Inflector
6
5
 
7
6
  def self.call(caller_class, scope)
8
7
  scope = idify(caller_class, scope) if scope.is_a?(Symbol)
@@ -71,7 +70,7 @@ module ActiveRecord::Acts::List::ScopeMethodDefiner #:nodoc:
71
70
  if caller_class.reflections.key?(name.to_s)
72
71
  caller_class.reflections[name.to_s].foreign_key.to_sym
73
72
  else
74
- foreign_key(name).to_sym
73
+ ActiveSupport::Inflector.foreign_key(name).to_sym
75
74
  end
76
75
  end
77
76
  end
@@ -3,7 +3,7 @@
3
3
  module ActiveRecord
4
4
  module Acts
5
5
  module List
6
- VERSION = '1.1.0'
6
+ VERSION = '1.2.1'
7
7
  end
8
8
  end
9
9
  end
data/test/helper.rb CHANGED
@@ -16,6 +16,8 @@ require "minitest/autorun"
16
16
  require "mocha/minitest"
17
17
  require "#{File.dirname(__FILE__)}/../init"
18
18
 
19
+ ENV["DB"] = "mysql" unless ENV["DB"]
20
+
19
21
  if defined?(ActiveRecord::VERSION) &&
20
22
  ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR >= 2
21
23
 
@@ -23,8 +25,10 @@ if defined?(ActiveRecord::VERSION) &&
23
25
  ActiveRecord::Base.raise_in_transactional_callbacks = true
24
26
  end
25
27
 
26
- db_config = YAML.load_file(File.expand_path("../database.yml", __FILE__)).fetch(ENV["DB"] || "sqlite")
27
- ActiveRecord::Base.establish_connection(db_config)
28
+ database_configuration = ENV["CI"] ? "test/support/ci_database.yml" : "test/support/database.yml"
29
+
30
+ ActiveRecord::Base.configurations = YAML.safe_load(IO.read(database_configuration))
31
+ ActiveRecord::Base.establish_connection(ENV["DB"].to_sym)
28
32
  ActiveRecord::Schema.verbose = false
29
33
 
30
34
  def teardown_db
@@ -53,8 +57,8 @@ def assert_equal_or_nil(a, b)
53
57
  end
54
58
 
55
59
  def assert_no_deprecation_warning_raised_by(failure_message = 'ActiveRecord deprecation warning raised when we didn\'t expect it', pass_message = 'No ActiveRecord deprecation raised')
56
- original_behavior = ActiveSupport::Deprecation.behavior
57
- ActiveSupport::Deprecation.behavior = :raise
60
+ original_behavior = active_record_deprecator.behavior
61
+ active_record_deprecator.behavior = :raise
58
62
  begin
59
63
  yield
60
64
  rescue ActiveSupport::DeprecationException => e
@@ -65,5 +69,13 @@ def assert_no_deprecation_warning_raised_by(failure_message = 'ActiveRecord depr
65
69
  pass pass_message
66
70
  end
67
71
  ensure
68
- ActiveSupport::Deprecation.behavior = original_behavior
72
+ active_record_deprecator.behavior = original_behavior
73
+ end
74
+
75
+ def active_record_deprecator
76
+ if ActiveRecord::VERSION::MAJOR == 7 && ActiveRecord::VERSION::MINOR >= 1 || ActiveRecord::VERSION::MAJOR > 7
77
+ ActiveRecord.deprecator
78
+ else
79
+ ActiveSupport::Deprecation
80
+ end
69
81
  end