acts_as_list 1.2.0 → 1.2.2

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: 97086f40e0296a92be25b988885cb618bd17323c31639c7b976e20e82005da54
4
- data.tar.gz: 225e05bc8973871d0a7955abaf181180ff5b8de3d2b461278eeb260df3a49b2c
3
+ metadata.gz: bc38c9c0378653bb5f8eb7194bd9cc22d906df7cf2b7a158e9fe763a0d6f5a94
4
+ data.tar.gz: c67158a399378bab4f1258ba6819f9cb7715eedc0b63e1f995869d0032075b75
5
5
  SHA512:
6
- metadata.gz: 6d43449915c885f64e477bff8c4a9e0d581e632e4cfab61e0f313fc0b67c4507f6cda9e3aab5afb53357cc44fee664f873e7ca2b93b0f22a22b1e272ed1e39db
7
- data.tar.gz: 24dfa6bf08290e1d18331ee5ad7c0eeb03ae1dce2191881503a889058136ccfb8007d0acbee9bc57e5363073740a8efec872225b4978922d0a1f1dcf49c3ca0a
6
+ metadata.gz: 8b4b29d19abf1dbc2b0c75b4f0a0e4123ec4580084a170af83ca3431ca0bc7d46fa108ba3d6573620585bb00332c0b2b10b68779d2a4fd899fcfc888601e83ab
7
+ data.tar.gz: 2c999ec1287f4fafacd7406317075c5a0410f84a8c7e0b96ec787fffee0209033ca78aa4947948aee830fe41a6de173ad031fe5895daf33b12679140507aa278
data/CHANGELOG.md CHANGED
@@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## v1.2.2 - 2024-07-16
10
+
11
+ ### Fixed
12
+ - Updated .gemspec to exclude unnecessary files from the gem package. [\#437](https://github.com/brendon/acts_as_list/pull/437) ([f440])
13
+
14
+ ## v1.2.1 - 2024-06-06
15
+
16
+ ### Fixed
17
+ - We no longer delegate the class `connection` method to the instance. [\#436](https://github.com/brendon/acts_as_list/pull/436) ([davidcelis])
18
+
9
19
  ## v1.2.0 - 2024-06-03
10
20
 
11
21
  ### Added
@@ -265,7 +275,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
265
275
  **Closed issues:**
266
276
 
267
277
  - DEPRECATION WARNING on rails 5.0 as of acts\_as\_list 0.9 [\#251](https://github.com/brendon/acts_as_list/issues/251)
268
- - highter\_items returns items with the same position value [\#247](https://github.com/brendon/acts_as_list/issues/247)
278
+ - higher\_items returns items with the same position value [\#247](https://github.com/brendon/acts_as_list/issues/247)
269
279
  - Broken with unique constraint on position [\#245](https://github.com/brendon/acts_as_list/issues/245)
270
280
 
271
281
  **Merged pull requests:**
@@ -493,7 +503,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
493
503
  - 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))
494
504
  - Simpler method to find the subclass name [\#139](https://github.com/brendon/acts_as_list/pull/139) ([brendon](https://github.com/brendon))
495
505
  - Rails4 enum column support [\#130](https://github.com/brendon/acts_as_list/pull/130) ([arunagw](https://github.com/arunagw))
496
- - 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))
506
+ - 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))
497
507
 
498
508
  ## [0.5.0](https://github.com/brendon/acts_as_list/tree/0.5.0) (2014-10-31)
499
509
  [Full Changelog](https://github.com/brendon/acts_as_list/compare/0.4.0...0.5.0)
@@ -633,7 +643,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
633
643
  - acts\_as\_list :scope =\> "doesnt\_seem\_to\_work" [\#12](https://github.com/brendon/acts_as_list/issues/12)
634
644
  - don't work perfectly with default\_scope [\#11](https://github.com/brendon/acts_as_list/issues/11)
635
645
  - MySQL: Position column MUST NOT have default [\#10](https://github.com/brendon/acts_as_list/issues/10)
636
- - insert\_at fails on postgresql w/ non-null constraint on postion\_column [\#8](https://github.com/brendon/acts_as_list/issues/8)
646
+ - insert\_at fails on postgresql w/ non-null constraint on position\_column [\#8](https://github.com/brendon/acts_as_list/issues/8)
637
647
 
638
648
  **Merged pull requests:**
639
649
 
@@ -642,7 +652,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
642
652
  - Massive test refactorings. [\#24](https://github.com/brendon/acts_as_list/pull/24) ([splattael](https://github.com/splattael))
643
653
  - Silent migrations to reduce test noise. [\#22](https://github.com/brendon/acts_as_list/pull/22) ([splattael](https://github.com/splattael))
644
654
  - 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))
645
- - Fix spelling and grammer [\#15](https://github.com/brendon/acts_as_list/pull/15) ([tmiller](https://github.com/tmiller))
655
+ - Fix spelling and grammar [\#15](https://github.com/brendon/acts_as_list/pull/15) ([tmiller](https://github.com/tmiller))
646
656
  - 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))
647
657
  - Support default\_scope ordering by calling .unscoped [\#13](https://github.com/brendon/acts_as_list/pull/13) ([tanordheim](https://github.com/tanordheim))
648
658
 
data/README.md CHANGED
@@ -1,11 +1,11 @@
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
7
  ## ANNOUNCING: Positioning, the gem
8
- As maintainer of both Acts As List and the Ranked Model gems, I've become intimately aquainted 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)
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
9
 
10
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
11
 
@@ -290,7 +290,7 @@ All versions `0.1.5` onwards require Rails 3.0.x and higher.
290
290
 
291
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:
292
292
 
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 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).
294
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.
295
295
 
296
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.
@@ -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
@@ -3,7 +3,7 @@
3
3
  module ActiveRecord
4
4
  module Acts
5
5
  module List
6
- VERSION = '1.2.0'
6
+ VERSION = '1.2.2'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_list
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Swanand Pagnis
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-06-02 00:00:00.000000000 Z
12
+ date: 2024-07-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -134,16 +134,10 @@ extensions: []
134
134
  extra_rdoc_files: []
135
135
  files:
136
136
  - ".gemtest"
137
- - ".github/FUNDING.yml"
138
- - ".github/dependabot.yml"
139
- - ".github/workflows/continuous_integration.yml"
140
- - ".gitignore"
141
137
  - CHANGELOG.md
142
- - Gemfile
143
138
  - MIT-LICENSE
144
139
  - README.md
145
140
  - Rakefile
146
- - acts_as_list.gemspec
147
141
  - init.rb
148
142
  - lib/acts_as_list.rb
149
143
  - lib/acts_as_list/active_record/acts/active_record.rb
@@ -157,24 +151,6 @@ files:
157
151
  - lib/acts_as_list/active_record/acts/sequential_updates_method_definer.rb
158
152
  - lib/acts_as_list/active_record/acts/top_of_list_method_definer.rb
159
153
  - lib/acts_as_list/version.rb
160
- - test/helper.rb
161
- - test/shared.rb
162
- - test/shared_array_scope_list.rb
163
- - test/shared_list.rb
164
- - test/shared_list_sub.rb
165
- - test/shared_no_addition.rb
166
- - test/shared_quoting.rb
167
- - test/shared_top_addition.rb
168
- - test/shared_zero_based.rb
169
- - test/support/ci_database.yml
170
- - test/support/database.yml
171
- - test/test_default_scope_with_select.rb
172
- - test/test_joined_list.rb
173
- - test/test_list.rb
174
- - test/test_no_update_for_extra_classes.rb
175
- - test/test_no_update_for_scope_destruction.rb
176
- - test/test_no_update_for_subclasses.rb
177
- - test/test_scope_with_user_defined_foreign_key.rb
178
154
  homepage: https://github.com/brendon/acts_as_list
179
155
  licenses:
180
156
  - MIT
@@ -182,6 +158,7 @@ metadata:
182
158
  changelog_uri: https://github.com/brendon/acts_as_list/blob/master/CHANGELOG.md
183
159
  source_code_uri: https://github.com/brendon/acts_as_list
184
160
  bug_tracker_uri: https://github.com/brendon/acts_as_list/issues
161
+ rubygems_mfa_required: 'true'
185
162
  post_install_message:
186
163
  rdoc_options: []
187
164
  require_paths:
@@ -190,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
190
167
  requirements:
191
168
  - - ">="
192
169
  - !ruby/object:Gem::Version
193
- version: 2.4.7
170
+ version: '2.5'
194
171
  required_rubygems_version: !ruby/object:Gem::Requirement
195
172
  requirements:
196
173
  - - ">="
@@ -202,22 +179,4 @@ signing_key:
202
179
  specification_version: 4
203
180
  summary: A gem adding sorting, reordering capabilities to an active_record model,
204
181
  allowing it to act as a list
205
- test_files:
206
- - test/helper.rb
207
- - test/shared.rb
208
- - test/shared_array_scope_list.rb
209
- - test/shared_list.rb
210
- - test/shared_list_sub.rb
211
- - test/shared_no_addition.rb
212
- - test/shared_quoting.rb
213
- - test/shared_top_addition.rb
214
- - test/shared_zero_based.rb
215
- - test/support/ci_database.yml
216
- - test/support/database.yml
217
- - test/test_default_scope_with_select.rb
218
- - test/test_joined_list.rb
219
- - test/test_list.rb
220
- - test/test_no_update_for_extra_classes.rb
221
- - test/test_no_update_for_scope_destruction.rb
222
- - test/test_no_update_for_subclasses.rb
223
- - test/test_scope_with_user_defined_foreign_key.rb
182
+ test_files: []
data/.github/FUNDING.yml DELETED
@@ -1,3 +0,0 @@
1
- # These are supported funding model platforms
2
-
3
- github: [brendon]
@@ -1,6 +0,0 @@
1
- version: 2
2
- updates:
3
- - package-ecosystem: "github-actions"
4
- directory: "/"
5
- schedule:
6
- interval: "weekly"
@@ -1,62 +0,0 @@
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 DELETED
@@ -1,13 +0,0 @@
1
- *.gem
2
- .bundle
3
- Gemfile.lock
4
- pkg/*
5
- .rvmrc
6
- *.tmproj
7
- .rbenv-version
8
- .ruby-gemset
9
- .ruby-version
10
- .DS_Store
11
- /tmp/
12
- /db/
13
- file::memory*
data/Gemfile DELETED
@@ -1,13 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in positioning.gemspec
4
- gemspec
5
-
6
- gem "rake", "~> 13.0"
7
-
8
- gem "minitest", "~> 5.0"
9
-
10
- if ENV["RAILS_VERSION"]
11
- gem "activerecord", ENV["RAILS_VERSION"]
12
- gem "activesupport", ENV["RAILS_VERSION"]
13
- end
data/acts_as_list.gemspec DELETED
@@ -1,39 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "acts_as_list/version"
4
-
5
- Gem::Specification.new do |s|
6
- # Description Meta...
7
- s.name = "acts_as_list"
8
- s.version = ActiveRecord::Acts::List::VERSION
9
- s.platform = Gem::Platform::RUBY
10
- s.authors = ["Swanand Pagnis", "Brendon Muir"]
11
- s.email = %w(swanand.pagnis@gmail.com brendon@spikeatschool.co.nz)
12
- s.homepage = "https://github.com/brendon/acts_as_list"
13
- s.summary = "A gem adding sorting, reordering capabilities to an active_record model, allowing it to act as a list"
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
- s.license = "MIT"
16
- s.required_ruby_version = ">= 2.4.7"
17
-
18
- if s.respond_to?(:metadata)
19
- s.metadata['changelog_uri'] = 'https://github.com/brendon/acts_as_list/blob/master/CHANGELOG.md'
20
- s.metadata['source_code_uri'] = 'https://github.com/brendon/acts_as_list'
21
- s.metadata['bug_tracker_uri'] = 'https://github.com/brendon/acts_as_list/issues'
22
- end
23
-
24
- # Load Paths...
25
- s.files = `git ls-files`.split("\n")
26
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
27
- s.executables = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f)}
28
- s.require_paths = ["lib"]
29
-
30
- # Dependencies (installed via "bundle install")
31
- s.add_dependency "activerecord", ">= 6.1"
32
- s.add_dependency "activesupport", ">= 6.1"
33
- s.add_development_dependency "minitest-hooks", "~> 1.5.1"
34
- s.add_development_dependency "mocha", "~> 2.1.0"
35
- s.add_development_dependency "timecop", "~> 0.9.8"
36
- s.add_development_dependency "mysql2", "~> 0.5.6"
37
- s.add_development_dependency "pg", "~> 1.5.5"
38
- s.add_development_dependency "sqlite3", "~> 1.7.2"
39
- end
data/test/helper.rb DELETED
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # $DEBUG = true
4
-
5
- require "rubygems"
6
- require "bundler/setup"
7
- begin
8
- Bundler.setup(:default, :development)
9
- rescue Bundler::BundlerError => e
10
- $stderr.puts e.message
11
- $stderr.puts "Run `bundle install` to install missing gems"
12
- exit e.status_code
13
- end
14
- require "active_record"
15
- require "minitest/autorun"
16
- require "mocha/minitest"
17
- require "#{File.dirname(__FILE__)}/../init"
18
-
19
- ENV["DB"] = "mysql" unless ENV["DB"]
20
-
21
- if defined?(ActiveRecord::VERSION) &&
22
- ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR >= 2
23
-
24
- # Was removed in Rails 5 and is effectively true.
25
- ActiveRecord::Base.raise_in_transactional_callbacks = true
26
- end
27
-
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)
32
- ActiveRecord::Schema.verbose = false
33
-
34
- def teardown_db
35
- if ActiveRecord::VERSION::MAJOR >= 5
36
- tables = ActiveRecord::Base.connection.data_sources
37
- else
38
- tables = ActiveRecord::Base.connection.tables
39
- end
40
-
41
- tables.each do |table|
42
- ActiveRecord::Base.connection.drop_table(table)
43
- end
44
- end
45
-
46
- require "shared"
47
-
48
- # require 'logger'
49
- # ActiveRecord::Base.logger = Logger.new(STDOUT)
50
-
51
- def assert_equal_or_nil(a, b)
52
- if a.nil?
53
- assert_nil b
54
- else
55
- assert_equal a, b
56
- end
57
- end
58
-
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')
60
- original_behavior = active_record_deprecator.behavior
61
- active_record_deprecator.behavior = :raise
62
- begin
63
- yield
64
- rescue ActiveSupport::DeprecationException => e
65
- flunk "#{failure_message}: #{e}"
66
- rescue
67
- raise
68
- else
69
- pass pass_message
70
- end
71
- ensure
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
81
- end
data/test/shared.rb DELETED
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Common shared behaviour.
4
- module Shared
5
- autoload :List, 'shared_list'
6
- autoload :ListSub, 'shared_list_sub'
7
- autoload :ZeroBased, 'shared_zero_based'
8
- autoload :ArrayScopeList, 'shared_array_scope_list'
9
- autoload :TopAddition, 'shared_top_addition'
10
- autoload :NoAddition, 'shared_no_addition'
11
- autoload :Quoting, 'shared_quoting'
12
- end
@@ -1,177 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Shared
4
- module ArrayScopeList
5
- def setup
6
- (1..4).each { |counter| ArrayScopeListMixin.create! pos: counter, parent_id: 5, parent_type: 'ParentClass' }
7
- (1..4).each { |counter| ArrayScopeListMixin.create! pos: counter, parent_id: 6, parent_type: 'ParentClass' }
8
- end
9
-
10
- def test_reordering
11
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
12
-
13
- ArrayScopeListMixin.where(id: 2).first.move_lower
14
- assert_equal [1, 3, 2, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
15
-
16
- ArrayScopeListMixin.where(id: 2).first.move_higher
17
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
18
-
19
- ArrayScopeListMixin.where(id: 1).first.move_to_bottom
20
- assert_equal [2, 3, 4, 1], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
21
-
22
- ArrayScopeListMixin.where(id: 1).first.move_to_top
23
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
24
-
25
- ArrayScopeListMixin.where(id: 2).first.move_to_bottom
26
- assert_equal [1, 3, 4, 2], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
27
-
28
- ArrayScopeListMixin.where(id: 4).first.move_to_top
29
- assert_equal [4, 1, 3, 2], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
30
-
31
- ArrayScopeListMixin.where(id: 4).first.insert_at(4)
32
- assert_equal [1, 3, 2, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
33
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:pos)
34
- end
35
-
36
- def test_move_to_bottom_with_next_to_last_item
37
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
38
- ArrayScopeListMixin.where(id: 3).first.move_to_bottom
39
- assert_equal [1, 2, 4, 3], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
40
- end
41
-
42
- def test_next_prev
43
- assert_equal ArrayScopeListMixin.where(id: 2).first, ArrayScopeListMixin.where(id: 1).first.lower_item
44
- assert_nil ArrayScopeListMixin.where(id: 1).first.higher_item
45
- assert_equal ArrayScopeListMixin.where(id: 3).first, ArrayScopeListMixin.where(id: 4).first.higher_item
46
- assert_nil ArrayScopeListMixin.where(id: 4).first.lower_item
47
- end
48
-
49
- def test_injection
50
- item = ArrayScopeListMixin.new(parent_id: 1, parent_type: 'ParentClass')
51
- assert_equal "pos", item.position_column
52
- end
53
-
54
- def test_insert
55
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
56
- assert_equal 1, new.pos
57
- assert new.first?
58
- assert new.last?
59
-
60
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
61
- assert_equal 2, new.pos
62
- assert !new.first?
63
- assert new.last?
64
-
65
- new = ArrayScopeListMixin.acts_as_list_no_update { ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass') }
66
- assert_equal_or_nil $default_position,new.pos
67
- assert_equal $default_position.is_a?(Integer), new.first?
68
- assert !new.last?
69
-
70
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
71
- assert_equal 3, new.pos
72
- assert !new.first?
73
- assert new.last?
74
-
75
- new = ArrayScopeListMixin.create(parent_id: 0, parent_type: 'ParentClass')
76
- assert_equal 1, new.pos
77
- assert new.first?
78
- assert new.last?
79
- end
80
-
81
- def test_insert_at
82
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
83
- assert_equal 1, new.pos
84
-
85
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
86
- assert_equal 2, new.pos
87
-
88
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
89
- assert_equal 3, new.pos
90
-
91
- new_noup = ArrayScopeListMixin.acts_as_list_no_update { ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass') }
92
- assert_equal_or_nil $default_position,new_noup.pos
93
-
94
- new4 = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
95
- assert_equal 4, new4.pos
96
-
97
- new4.insert_at(3)
98
- assert_equal 3, new4.pos
99
-
100
- new.reload
101
- assert_equal 4, new.pos
102
-
103
- new.insert_at(2)
104
- assert_equal 2, new.pos
105
-
106
- new4.reload
107
- assert_equal 4, new4.pos
108
-
109
- new5 = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
110
- assert_equal 5, new5.pos
111
-
112
- new5.insert_at(1)
113
- assert_equal 1, new5.pos
114
-
115
- new4.reload
116
- assert_equal 5, new4.pos
117
-
118
- new_noup.reload
119
- assert_equal_or_nil $default_position, new_noup.pos
120
- end
121
-
122
- def test_delete_middle
123
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
124
-
125
- ArrayScopeListMixin.where(id: 2).first.destroy
126
-
127
- assert_equal [1, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
128
-
129
- assert_equal 1, ArrayScopeListMixin.where(id: 1).first.pos
130
- assert_equal 2, ArrayScopeListMixin.where(id: 3).first.pos
131
- assert_equal 3, ArrayScopeListMixin.where(id: 4).first.pos
132
-
133
- ArrayScopeListMixin.where(id: 1).first.destroy
134
-
135
- assert_equal [3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
136
-
137
- assert_equal 1, ArrayScopeListMixin.where(id: 3).first.pos
138
- assert_equal 2, ArrayScopeListMixin.where(id: 4).first.pos
139
-
140
- ArrayScopeListMixin.acts_as_list_no_update { ArrayScopeListMixin.where(id: 3).first.destroy }
141
-
142
- assert_equal [4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
143
-
144
- assert_equal 2, ArrayScopeListMixin.where(id: 4).first.pos
145
- end
146
-
147
- def test_remove_from_list_should_then_fail_in_list?
148
- assert_equal true, ArrayScopeListMixin.where(id: 1).first.in_list?
149
- ArrayScopeListMixin.where(id: 1).first.remove_from_list
150
- assert_equal false, ArrayScopeListMixin.where(id: 1).first.in_list?
151
- end
152
-
153
- def test_remove_from_list_should_set_position_to_nil
154
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
155
-
156
- ArrayScopeListMixin.where(id: 2).first.remove_from_list
157
-
158
- assert_equal 1, ArrayScopeListMixin.where(id: 1).first.pos
159
- assert_nil ArrayScopeListMixin.where(id: 2).first.pos
160
- assert_equal 2, ArrayScopeListMixin.where(id: 3).first.pos
161
- assert_equal 3, ArrayScopeListMixin.where(id: 4).first.pos
162
- end
163
-
164
- def test_remove_before_destroy_does_not_shift_lower_items_twice
165
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
166
-
167
- ArrayScopeListMixin.where(id: 2).first.remove_from_list
168
- ArrayScopeListMixin.where(id: 2).first.destroy
169
-
170
- assert_equal [1, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
171
-
172
- assert_equal 1, ArrayScopeListMixin.where(id: 1).first.pos
173
- assert_equal 2, ArrayScopeListMixin.where(id: 3).first.pos
174
- assert_equal 3, ArrayScopeListMixin.where(id: 4).first.pos
175
- end
176
- end
177
- end