acts_as_list 0.9.19 → 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.
- checksums.yaml +5 -5
- data/.travis.yml +11 -40
- data/Appraisals +15 -34
- data/CHANGELOG.md +10 -0
- data/Gemfile +6 -5
- data/README.md +80 -4
- data/acts_as_list.gemspec +9 -9
- data/gemfiles/rails_4_2.gemfile +6 -7
- data/gemfiles/rails_5_0.gemfile +4 -6
- data/gemfiles/rails_5_1.gemfile +4 -6
- data/gemfiles/rails_5_2.gemfile +4 -6
- data/gemfiles/rails_6_0.gemfile +31 -0
- data/lib/acts_as_list/active_record/acts/list.rb +43 -48
- data/lib/acts_as_list/active_record/acts/position_column_method_definer.rb +1 -1
- data/lib/acts_as_list/active_record/acts/scope_method_definer.rb +0 -2
- data/lib/acts_as_list/active_record/acts/sequential_updates_method_definer.rb +1 -1
- data/lib/acts_as_list/version.rb +1 -1
- data/test/helper.rb +1 -10
- data/test/shared_list.rb +8 -4
- data/test/shared_list_sub.rb +1 -1
- data/test/test_list.rb +36 -56
- data/test/test_no_update_for_extra_classes.rb +5 -5
- data/test/test_no_update_for_scope_destruction.rb +2 -7
- data/test/test_no_update_for_subclasses.rb +3 -3
- metadata +9 -10
- data/gemfiles/rails_3_2.gemfile +0 -34
- data/gemfiles/rails_4_1.gemfile +0 -34
data/gemfiles/rails_5_2.gemfile
CHANGED
@@ -2,10 +2,9 @@
|
|
2
2
|
|
3
3
|
source "http://rubygems.org"
|
4
4
|
|
5
|
-
gem "rack", "~> 1", platforms: [:ruby_19, :ruby_20, :ruby_21]
|
6
5
|
gem "rake"
|
7
6
|
gem "appraisal"
|
8
|
-
gem "activerecord", "~> 5.2.
|
7
|
+
gem "activerecord", "~> 5.2.0"
|
9
8
|
|
10
9
|
group :development do
|
11
10
|
gem "github_changelog_generator", "1.9.0"
|
@@ -13,21 +12,20 @@ end
|
|
13
12
|
|
14
13
|
group :test do
|
15
14
|
gem "minitest", "~> 5.0"
|
16
|
-
gem "test_after_commit", "~> 0.4.2"
|
17
15
|
gem "timecop"
|
18
16
|
gem "mocha"
|
19
17
|
end
|
20
18
|
|
21
19
|
group :sqlite do
|
22
|
-
gem "sqlite3", "~> 1.3.13"
|
20
|
+
gem "sqlite3", "~> 1.3.13"
|
23
21
|
end
|
24
22
|
|
25
23
|
group :postgresql do
|
26
|
-
gem "pg", "~>
|
24
|
+
gem "pg", "~> 1.1.4"
|
27
25
|
end
|
28
26
|
|
29
27
|
group :mysql do
|
30
|
-
gem "mysql2", "~> 0.
|
28
|
+
gem "mysql2", "~> 0.5.0"
|
31
29
|
end
|
32
30
|
|
33
31
|
gemspec path: "../"
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "http://rubygems.org"
|
4
|
+
|
5
|
+
gem "rake"
|
6
|
+
gem "appraisal"
|
7
|
+
gem "activerecord", "~> 6.0.0"
|
8
|
+
|
9
|
+
group :development do
|
10
|
+
gem "github_changelog_generator", "1.9.0"
|
11
|
+
end
|
12
|
+
|
13
|
+
group :test do
|
14
|
+
gem "minitest", "~> 5.0"
|
15
|
+
gem "timecop"
|
16
|
+
gem "mocha"
|
17
|
+
end
|
18
|
+
|
19
|
+
group :sqlite do
|
20
|
+
gem "sqlite3", "~> 1.4"
|
21
|
+
end
|
22
|
+
|
23
|
+
group :postgresql do
|
24
|
+
gem "pg", "~> 1.1.4"
|
25
|
+
end
|
26
|
+
|
27
|
+
group :mysql do
|
28
|
+
gem "mysql2", "~> 0.5.0"
|
29
|
+
end
|
30
|
+
|
31
|
+
gemspec path: "../"
|
@@ -65,6 +65,12 @@ module ActiveRecord
|
|
65
65
|
end
|
66
66
|
|
67
67
|
module InstanceMethods
|
68
|
+
# Get the current position of the item in the list
|
69
|
+
def current_position
|
70
|
+
position = send(position_column)
|
71
|
+
position ? position.to_i : nil
|
72
|
+
end
|
73
|
+
|
68
74
|
# Insert the item at the given position (defaults to the top position of 1).
|
69
75
|
def insert_at(position = acts_as_list_top)
|
70
76
|
insert_at_position(position)
|
@@ -79,8 +85,8 @@ module ActiveRecord
|
|
79
85
|
return unless lower_item
|
80
86
|
|
81
87
|
acts_as_list_class.transaction do
|
82
|
-
if lower_item.
|
83
|
-
|
88
|
+
if lower_item.current_position != current_position
|
89
|
+
swap_positions_with(lower_item)
|
84
90
|
else
|
85
91
|
lower_item.decrement_position
|
86
92
|
increment_position
|
@@ -93,8 +99,8 @@ module ActiveRecord
|
|
93
99
|
return unless higher_item
|
94
100
|
|
95
101
|
acts_as_list_class.transaction do
|
96
|
-
if higher_item.
|
97
|
-
|
102
|
+
if higher_item.current_position != current_position
|
103
|
+
swap_positions_with(higher_item)
|
98
104
|
else
|
99
105
|
higher_item.increment_position
|
100
106
|
decrement_position
|
@@ -134,13 +140,13 @@ module ActiveRecord
|
|
134
140
|
# Increase the position of this item without adjusting the rest of the list.
|
135
141
|
def increment_position
|
136
142
|
return unless in_list?
|
137
|
-
set_list_position(
|
143
|
+
set_list_position(current_position + 1)
|
138
144
|
end
|
139
145
|
|
140
146
|
# Decrease the position of this item without adjusting the rest of the list.
|
141
147
|
def decrement_position
|
142
148
|
return unless in_list?
|
143
|
-
set_list_position(
|
149
|
+
set_list_position(current_position - 1)
|
144
150
|
end
|
145
151
|
|
146
152
|
def first?
|
@@ -163,9 +169,8 @@ module ActiveRecord
|
|
163
169
|
# selects all higher items by default
|
164
170
|
def higher_items(limit=nil)
|
165
171
|
limit ||= acts_as_list_list.count
|
166
|
-
position_value = send(position_column)
|
167
172
|
acts_as_list_list.
|
168
|
-
where("#{quoted_position_column_with_table_name} <= ?",
|
173
|
+
where("#{quoted_position_column_with_table_name} <= ?", current_position).
|
169
174
|
where("#{quoted_table_name}.#{self.class.primary_key} != ?", self.send(self.class.primary_key)).
|
170
175
|
reorder(acts_as_list_order_argument(:desc)).
|
171
176
|
limit(limit)
|
@@ -181,9 +186,8 @@ module ActiveRecord
|
|
181
186
|
# selects all lower items by default
|
182
187
|
def lower_items(limit=nil)
|
183
188
|
limit ||= acts_as_list_list.count
|
184
|
-
position_value = send(position_column)
|
185
189
|
acts_as_list_list.
|
186
|
-
where("#{quoted_position_column_with_table_name} >= ?",
|
190
|
+
where("#{quoted_position_column_with_table_name} >= ?", current_position).
|
187
191
|
where("#{quoted_table_name}.#{self.class.primary_key} != ?", self.send(self.class.primary_key)).
|
188
192
|
reorder(acts_as_list_order_argument(:asc)).
|
189
193
|
limit(limit)
|
@@ -195,40 +199,34 @@ module ActiveRecord
|
|
195
199
|
end
|
196
200
|
|
197
201
|
def not_in_list?
|
198
|
-
|
202
|
+
current_position.nil?
|
199
203
|
end
|
200
204
|
|
201
205
|
def default_position
|
202
|
-
acts_as_list_class.
|
206
|
+
acts_as_list_class.column_defaults[position_column.to_s]
|
203
207
|
end
|
204
208
|
|
205
209
|
def default_position?
|
206
|
-
default_position && default_position
|
210
|
+
default_position && default_position == current_position
|
207
211
|
end
|
208
212
|
|
209
213
|
# Sets the new position and saves it
|
210
214
|
def set_list_position(new_position, raise_exception_if_save_fails=false)
|
211
|
-
|
215
|
+
self[position_column] = new_position
|
212
216
|
raise_exception_if_save_fails ? save! : save
|
213
217
|
end
|
214
218
|
|
215
219
|
private
|
216
220
|
|
217
|
-
def
|
218
|
-
|
221
|
+
def swap_positions_with(item)
|
222
|
+
item_position = item.current_position
|
219
223
|
|
220
|
-
|
221
|
-
|
224
|
+
item.set_list_position(current_position)
|
225
|
+
set_list_position(item_position)
|
222
226
|
end
|
223
227
|
|
224
228
|
def acts_as_list_list
|
225
|
-
|
226
|
-
acts_as_list_class.unscoped do
|
227
|
-
acts_as_list_class.where(scope_condition)
|
228
|
-
end
|
229
|
-
else
|
230
|
-
acts_as_list_class.unscope(:select, :where).where(scope_condition)
|
231
|
-
end
|
229
|
+
acts_as_list_class.unscope(:select, :where).where(scope_condition)
|
232
230
|
end
|
233
231
|
|
234
232
|
# Poorly named methods. They will insert the item at the desired position if the position
|
@@ -276,7 +274,7 @@ module ActiveRecord
|
|
276
274
|
# bottom_position_in_list # => 2
|
277
275
|
def bottom_position_in_list(except = nil)
|
278
276
|
item = bottom_item(except)
|
279
|
-
item ? item.
|
277
|
+
item ? item.current_position : acts_as_list_top - 1
|
280
278
|
end
|
281
279
|
|
282
280
|
# Returns the bottom item
|
@@ -303,7 +301,7 @@ module ActiveRecord
|
|
303
301
|
# This has the effect of moving all the higher items down one.
|
304
302
|
def increment_positions_on_higher_items
|
305
303
|
return unless in_list?
|
306
|
-
acts_as_list_list.where("#{quoted_position_column_with_table_name} < ?",
|
304
|
+
acts_as_list_list.where("#{quoted_position_column_with_table_name} < ?", current_position).increment_all
|
307
305
|
end
|
308
306
|
|
309
307
|
# This has the effect of moving all the lower items down one.
|
@@ -323,9 +321,8 @@ module ActiveRecord
|
|
323
321
|
end
|
324
322
|
|
325
323
|
# This has the effect of moving all the lower items up one.
|
326
|
-
def decrement_positions_on_lower_items(position=
|
324
|
+
def decrement_positions_on_lower_items(position=current_position)
|
327
325
|
return unless in_list?
|
328
|
-
position ||= send(position_column).to_i
|
329
326
|
|
330
327
|
if sequential_updates?
|
331
328
|
acts_as_list_list.where("#{quoted_position_column_with_table_name} > ?", position).reorder(acts_as_list_order_argument(:asc)).decrement_sequentially
|
@@ -392,7 +389,7 @@ module ActiveRecord
|
|
392
389
|
return set_list_position(position, raise_exception_if_save_fails) if new_record?
|
393
390
|
with_lock do
|
394
391
|
if in_list?
|
395
|
-
old_position =
|
392
|
+
old_position = current_position
|
396
393
|
return if position == old_position
|
397
394
|
# temporary move after bottom with gap, avoiding duplicate values
|
398
395
|
# gap is required to leave room for position increments
|
@@ -411,31 +408,27 @@ module ActiveRecord
|
|
411
408
|
return unless position_before_save_changed?
|
412
409
|
|
413
410
|
old_position = position_before_save || bottom_position_in_list + 1
|
414
|
-
new_position = send(position_column).to_i
|
415
411
|
|
416
|
-
return unless acts_as_list_list.where(
|
417
|
-
"#{quoted_position_column_with_table_name} = #{
|
412
|
+
return unless current_position && acts_as_list_list.where(
|
413
|
+
"#{quoted_position_column_with_table_name} = #{current_position}"
|
418
414
|
).count > 1
|
419
|
-
|
415
|
+
|
416
|
+
shuffle_positions_on_intermediate_items old_position, current_position, id
|
420
417
|
end
|
421
418
|
|
422
419
|
def position_before_save_changed?
|
423
|
-
if
|
424
|
-
ActiveRecord::VERSION::MAJOR > 5
|
425
|
-
|
420
|
+
if active_record_version_is?('>= 5.1')
|
426
421
|
saved_change_to_attribute? position_column
|
427
422
|
else
|
428
|
-
|
423
|
+
attribute_changed? position_column
|
429
424
|
end
|
430
425
|
end
|
431
426
|
|
432
427
|
def position_before_save
|
433
|
-
if
|
434
|
-
ActiveRecord::VERSION::MAJOR > 5
|
435
|
-
|
428
|
+
if active_record_version_is?('>= 5.1')
|
436
429
|
attribute_before_last_save position_column
|
437
430
|
else
|
438
|
-
|
431
|
+
attribute_was position_column
|
439
432
|
end
|
440
433
|
end
|
441
434
|
|
@@ -464,7 +457,7 @@ module ActiveRecord
|
|
464
457
|
# This check is skipped if the position is currently the default position from the table
|
465
458
|
# as modifying the default position on creation is handled elsewhere
|
466
459
|
def check_top_position
|
467
|
-
if
|
460
|
+
if current_position && !default_position? && current_position < acts_as_list_top
|
468
461
|
self[position_column] = acts_as_list_top
|
469
462
|
end
|
470
463
|
end
|
@@ -484,11 +477,13 @@ module ActiveRecord
|
|
484
477
|
end
|
485
478
|
|
486
479
|
def acts_as_list_order_argument(direction = :asc)
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
480
|
+
{ position_column => direction }
|
481
|
+
end
|
482
|
+
|
483
|
+
def active_record_version_is?(version_requirement)
|
484
|
+
requirement = Gem::Requirement.new(version_requirement)
|
485
|
+
version = Gem.loaded_specs['activerecord'].version
|
486
|
+
requirement.satisfied_by?(version)
|
492
487
|
end
|
493
488
|
end
|
494
489
|
|
@@ -21,7 +21,6 @@ module ActiveRecord::Acts::List::ScopeMethodDefiner #:nodoc:
|
|
21
21
|
end
|
22
22
|
|
23
23
|
define_method :destroyed_via_scope? do
|
24
|
-
return false if ActiveRecord::VERSION::MAJOR < 4
|
25
24
|
scope == (destroyed_by_association && destroyed_by_association.foreign_key.to_sym)
|
26
25
|
end
|
27
26
|
elsif scope.is_a?(Array)
|
@@ -45,7 +44,6 @@ module ActiveRecord::Acts::List::ScopeMethodDefiner #:nodoc:
|
|
45
44
|
end
|
46
45
|
|
47
46
|
define_method :destroyed_via_scope? do
|
48
|
-
return false if ActiveRecord::VERSION::MAJOR < 4
|
49
47
|
scope_condition.keys.include? (destroyed_by_association && destroyed_by_association.foreign_key.to_sym)
|
50
48
|
end
|
51
49
|
else
|
@@ -7,7 +7,7 @@ module ActiveRecord::Acts::List::SequentialUpdatesMethodDefiner #:nodoc:
|
|
7
7
|
if !defined?(@sequential_updates)
|
8
8
|
if sequential_updates_option.nil?
|
9
9
|
table_exists =
|
10
|
-
if
|
10
|
+
if active_record_version_is?('>= 5')
|
11
11
|
caller_class.connection.data_source_exists?(caller_class.table_name)
|
12
12
|
else
|
13
13
|
caller_class.connection.table_exists?(caller_class.table_name)
|
data/lib/acts_as_list/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -13,7 +13,7 @@ rescue Bundler::BundlerError => e
|
|
13
13
|
end
|
14
14
|
require "active_record"
|
15
15
|
require "minitest/autorun"
|
16
|
-
require "mocha/
|
16
|
+
require "mocha/minitest"
|
17
17
|
require "#{File.dirname(__FILE__)}/../init"
|
18
18
|
|
19
19
|
if defined?(ActiveRecord::VERSION) &&
|
@@ -27,15 +27,6 @@ db_config = YAML.load_file(File.expand_path("../database.yml", __FILE__)).fetch(
|
|
27
27
|
ActiveRecord::Base.establish_connection(db_config)
|
28
28
|
ActiveRecord::Schema.verbose = false
|
29
29
|
|
30
|
-
# Returns true if ActiveRecord is rails 3, 4 version
|
31
|
-
def rails_3
|
32
|
-
defined?(ActiveRecord::VERSION) && ActiveRecord::VERSION::MAJOR >= 3
|
33
|
-
end
|
34
|
-
|
35
|
-
def rails_4
|
36
|
-
defined?(ActiveRecord::VERSION) && ActiveRecord::VERSION::MAJOR >= 4
|
37
|
-
end
|
38
|
-
|
39
30
|
def teardown_db
|
40
31
|
if ActiveRecord::VERSION::MAJOR >= 5
|
41
32
|
tables = ActiveRecord::Base.connection.data_sources
|
data/test/shared_list.rb
CHANGED
@@ -10,6 +10,13 @@ module Shared
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
def test_current_position
|
14
|
+
first_item = ListMixin.where(parent_id: 5).first
|
15
|
+
assert_equal 1, first_item.current_position
|
16
|
+
first_item.remove_from_list
|
17
|
+
assert_nil first_item.current_position
|
18
|
+
end
|
19
|
+
|
13
20
|
def test_reordering
|
14
21
|
assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
|
15
22
|
|
@@ -230,12 +237,9 @@ module Shared
|
|
230
237
|
# We need to trigger all the before_destroy callbacks without actually
|
231
238
|
# destroying the record so we can see the affect the callbacks have on
|
232
239
|
# the record.
|
233
|
-
# NOTE: Hotfix for rails3 ActiveRecord
|
234
240
|
list = ListMixin.where(id: 2).first
|
235
241
|
if list.respond_to?(:run_callbacks)
|
236
|
-
|
237
|
-
list.run_callbacks(:destroy) if rails_3
|
238
|
-
list.run_callbacks(:before_destroy) if !rails_3
|
242
|
+
list.run_callbacks(:destroy)
|
239
243
|
else
|
240
244
|
list.send(:callback, :before_destroy)
|
241
245
|
end
|
data/test/shared_list_sub.rb
CHANGED
@@ -47,7 +47,7 @@ module Shared
|
|
47
47
|
|
48
48
|
def test_next_prev_not_regular_sequence
|
49
49
|
ListMixin.all.each do |item|
|
50
|
-
item.
|
50
|
+
item.update pos: item.pos * 5
|
51
51
|
end
|
52
52
|
|
53
53
|
assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
|
data/test/test_list.rb
CHANGED
@@ -49,11 +49,9 @@ def setup_db(position_options = {})
|
|
49
49
|
ActiveRecord::Base.connection.add_index 'altid-table', :pos, unique: true
|
50
50
|
|
51
51
|
mixins = [ Mixin, ListMixin, ListMixinSub1, ListMixinSub2, ListWithStringScopeMixin,
|
52
|
-
ArrayScopeListMixin, ZeroBasedMixin, DefaultScopedMixin,
|
52
|
+
ArrayScopeListMixin, ZeroBasedMixin, DefaultScopedMixin, EnumArrayScopeListMixin,
|
53
53
|
DefaultScopedWhereMixin, TopAdditionMixin, NoAdditionMixin, QuotedList, TouchDisabledMixin ]
|
54
54
|
|
55
|
-
mixins << EnumArrayScopeListMixin if rails_4
|
56
|
-
|
57
55
|
ActiveRecord::Base.connection.schema_cache.clear!
|
58
56
|
mixins.each do |klass|
|
59
57
|
klass.reset_column_information
|
@@ -80,19 +78,11 @@ class ListMixinSub1 < ListMixin
|
|
80
78
|
end
|
81
79
|
|
82
80
|
class ListMixinSub2 < ListMixin
|
83
|
-
|
84
|
-
validates :pos, presence: true
|
85
|
-
else
|
86
|
-
validates_presence_of :pos
|
87
|
-
end
|
81
|
+
validates :pos, presence: true
|
88
82
|
end
|
89
83
|
|
90
84
|
class ListMixinError < ListMixin
|
91
|
-
|
92
|
-
validates :state, presence: true
|
93
|
-
else
|
94
|
-
validates_presence_of :state
|
95
|
-
end
|
85
|
+
validates :state, presence: true
|
96
86
|
end
|
97
87
|
|
98
88
|
class ListWithStringScopeMixin < Mixin
|
@@ -107,13 +97,11 @@ class ArrayScopeListWithHashMixin < Mixin
|
|
107
97
|
acts_as_list column: "pos", scope: [:parent_id, state: nil]
|
108
98
|
end
|
109
99
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
enum state: STATE_VALUES
|
100
|
+
class EnumArrayScopeListMixin < Mixin
|
101
|
+
STATE_VALUES = %w(active archived)
|
102
|
+
enum state: STATE_VALUES
|
114
103
|
|
115
|
-
|
116
|
-
end
|
104
|
+
acts_as_list column: "pos", scope: [:parent_id, :state]
|
117
105
|
end
|
118
106
|
|
119
107
|
class ZeroBasedMixin < Mixin
|
@@ -130,13 +118,7 @@ class DefaultScopedWhereMixin < Mixin
|
|
130
118
|
default_scope { order('pos ASC').where(active: true) }
|
131
119
|
|
132
120
|
def self.for_active_false_tests
|
133
|
-
|
134
|
-
unscoped do
|
135
|
-
order('pos ASC').where(active: false)
|
136
|
-
end
|
137
|
-
else
|
138
|
-
unscope(:where).where(active: false)
|
139
|
-
end
|
121
|
+
unscope(:where).where(active: false)
|
140
122
|
end
|
141
123
|
end
|
142
124
|
|
@@ -170,7 +152,7 @@ end
|
|
170
152
|
##
|
171
153
|
# The way we track changes to
|
172
154
|
# scope and position can get tripped up
|
173
|
-
# by someone using
|
155
|
+
# by someone using update within
|
174
156
|
# a callback because it causes multiple passes
|
175
157
|
# through the callback chain
|
176
158
|
module CallbackMixin
|
@@ -185,7 +167,7 @@ module CallbackMixin
|
|
185
167
|
# doesn't matter what column changes, just
|
186
168
|
# need to change something
|
187
169
|
|
188
|
-
self.
|
170
|
+
self.update active: !self.active
|
189
171
|
end
|
190
172
|
end
|
191
173
|
end
|
@@ -649,7 +631,7 @@ class MultipleListsTest < ActsAsListTestCase
|
|
649
631
|
def test_check_scope_order
|
650
632
|
assert_equal [1, 2, 3, 4], ListMixin.where(:parent_id => 1).order('pos').map(&:id)
|
651
633
|
assert_equal [5, 6, 7, 8], ListMixin.where(:parent_id => 2).order('pos').map(&:id)
|
652
|
-
ListMixin.find(4).
|
634
|
+
ListMixin.find(4).update :parent_id => 2, :pos => 2
|
653
635
|
assert_equal [1, 2, 3], ListMixin.where(:parent_id => 1).order('pos').map(&:id)
|
654
636
|
assert_equal [5, 4, 6, 7, 8], ListMixin.where(:parent_id => 2).order('pos').map(&:id)
|
655
637
|
end
|
@@ -657,34 +639,32 @@ class MultipleListsTest < ActsAsListTestCase
|
|
657
639
|
def test_check_scope_position
|
658
640
|
assert_equal [1, 2, 3, 4], ListMixin.where(:parent_id => 1).map(&:pos)
|
659
641
|
assert_equal [1, 2, 3, 4], ListMixin.where(:parent_id => 2).map(&:pos)
|
660
|
-
ListMixin.find(4).
|
642
|
+
ListMixin.find(4).update :parent_id => 2, :pos => 2
|
661
643
|
assert_equal [1, 2, 3], ListMixin.where(:parent_id => 1).order('pos').map(&:pos)
|
662
644
|
assert_equal [1, 2, 3, 4, 5], ListMixin.where(:parent_id => 2).order('pos').map(&:pos)
|
663
645
|
end
|
664
646
|
end
|
665
647
|
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
end
|
648
|
+
class EnumArrayScopeListMixinTest < ActsAsListTestCase
|
649
|
+
def setup
|
650
|
+
setup_db
|
651
|
+
EnumArrayScopeListMixin.create! :parent_id => 1, :state => EnumArrayScopeListMixin.states['active']
|
652
|
+
EnumArrayScopeListMixin.create! :parent_id => 1, :state => EnumArrayScopeListMixin.states['archived']
|
653
|
+
EnumArrayScopeListMixin.create! :parent_id => 2, :state => EnumArrayScopeListMixin.states["active"]
|
654
|
+
EnumArrayScopeListMixin.create! :parent_id => 2, :state => EnumArrayScopeListMixin.states["archived"]
|
655
|
+
end
|
675
656
|
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
657
|
+
def test_positions
|
658
|
+
assert_equal [1], EnumArrayScopeListMixin.where(:parent_id => 1, :state => EnumArrayScopeListMixin.states['active']).map(&:pos)
|
659
|
+
assert_equal [1], EnumArrayScopeListMixin.where(:parent_id => 1, :state => EnumArrayScopeListMixin.states['archived']).map(&:pos)
|
660
|
+
assert_equal [1], EnumArrayScopeListMixin.where(:parent_id => 2, :state => EnumArrayScopeListMixin.states['active']).map(&:pos)
|
661
|
+
assert_equal [1], EnumArrayScopeListMixin.where(:parent_id => 2, :state => EnumArrayScopeListMixin.states['archived']).map(&:pos)
|
662
|
+
end
|
682
663
|
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
end
|
664
|
+
def test_update_state
|
665
|
+
active_item = EnumArrayScopeListMixin.find_by(:parent_id => 2, :state => EnumArrayScopeListMixin.states['active'])
|
666
|
+
active_item.update(state: EnumArrayScopeListMixin.states['archived'])
|
667
|
+
assert_equal [1, 2], EnumArrayScopeListMixin.where(:parent_id => 2, :state => EnumArrayScopeListMixin.states['archived']).map(&:pos).sort
|
688
668
|
end
|
689
669
|
end
|
690
670
|
|
@@ -699,7 +679,7 @@ class MultipleListsArrayScopeTest < ActsAsListTestCase
|
|
699
679
|
def test_order_after_all_scope_properties_are_changed
|
700
680
|
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(:parent_id => 1, :parent_type => 'anything').order('pos').map(&:id)
|
701
681
|
assert_equal [5, 6, 7, 8], ArrayScopeListMixin.where(:parent_id => 2, :parent_type => 'something').order('pos').map(&:id)
|
702
|
-
ArrayScopeListMixin.find(2).
|
682
|
+
ArrayScopeListMixin.find(2).update :parent_id => 2, :pos => 2,:parent_type => 'something'
|
703
683
|
assert_equal [1, 3, 4], ArrayScopeListMixin.where(:parent_id => 1,:parent_type => 'anything').order('pos').map(&:id)
|
704
684
|
assert_equal [5, 2, 6, 7, 8], ArrayScopeListMixin.where(:parent_id => 2,:parent_type => 'something').order('pos').map(&:id)
|
705
685
|
end
|
@@ -707,7 +687,7 @@ class MultipleListsArrayScopeTest < ActsAsListTestCase
|
|
707
687
|
def test_position_after_all_scope_properties_are_changed
|
708
688
|
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(:parent_id => 1, :parent_type => 'anything').map(&:pos)
|
709
689
|
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(:parent_id => 2, :parent_type => 'something').map(&:pos)
|
710
|
-
ArrayScopeListMixin.find(4).
|
690
|
+
ArrayScopeListMixin.find(4).update :parent_id => 2, :pos => 2, :parent_type => 'something'
|
711
691
|
assert_equal [1, 2, 3], ArrayScopeListMixin.where(:parent_id => 1, :parent_type => 'anything').order('pos').map(&:pos)
|
712
692
|
assert_equal [1, 2, 3, 4, 5], ArrayScopeListMixin.where(:parent_id => 2, :parent_type => 'something').order('pos').map(&:pos)
|
713
693
|
end
|
@@ -715,7 +695,7 @@ class MultipleListsArrayScopeTest < ActsAsListTestCase
|
|
715
695
|
def test_order_after_one_scope_property_is_changed
|
716
696
|
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(:parent_id => 1, :parent_type => 'anything').order('pos').map(&:id)
|
717
697
|
assert_equal [9, 10, 11, 12], ArrayScopeListMixin.where(:parent_id => 3, :parent_type => 'anything').order('pos').map(&:id)
|
718
|
-
ArrayScopeListMixin.find(2).
|
698
|
+
ArrayScopeListMixin.find(2).update :parent_id => 3, :pos => 2
|
719
699
|
assert_equal [1, 3, 4], ArrayScopeListMixin.where(:parent_id => 1,:parent_type => 'anything').order('pos').map(&:id)
|
720
700
|
assert_equal [9, 2, 10, 11, 12], ArrayScopeListMixin.where(:parent_id => 3,:parent_type => 'anything').order('pos').map(&:id)
|
721
701
|
end
|
@@ -723,7 +703,7 @@ class MultipleListsArrayScopeTest < ActsAsListTestCase
|
|
723
703
|
def test_position_after_one_scope_property_is_changed
|
724
704
|
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(:parent_id => 1, :parent_type => 'anything').map(&:pos)
|
725
705
|
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(:parent_id => 3, :parent_type => 'anything').map(&:pos)
|
726
|
-
ArrayScopeListMixin.find(4).
|
706
|
+
ArrayScopeListMixin.find(4).update :parent_id => 3, :pos => 2
|
727
707
|
assert_equal [1, 2, 3], ArrayScopeListMixin.where(:parent_id => 1, :parent_type => 'anything').order('pos').map(&:pos)
|
728
708
|
assert_equal [1, 2, 3, 4, 5], ArrayScopeListMixin.where(:parent_id => 3, :parent_type => 'anything').order('pos').map(&:pos)
|
729
709
|
end
|
@@ -731,7 +711,7 @@ class MultipleListsArrayScopeTest < ActsAsListTestCase
|
|
731
711
|
def test_order_after_moving_to_empty_list
|
732
712
|
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(:parent_id => 1, :parent_type => 'anything').order('pos').map(&:id)
|
733
713
|
assert_equal [], ArrayScopeListMixin.where(:parent_id => 4, :parent_type => 'anything').order('pos').map(&:id)
|
734
|
-
ArrayScopeListMixin.find(2).
|
714
|
+
ArrayScopeListMixin.find(2).update :parent_id => 4, :pos => 1
|
735
715
|
assert_equal [1, 3, 4], ArrayScopeListMixin.where(:parent_id => 1,:parent_type => 'anything').order('pos').map(&:id)
|
736
716
|
assert_equal [2], ArrayScopeListMixin.where(:parent_id => 4,:parent_type => 'anything').order('pos').map(&:id)
|
737
717
|
end
|
@@ -739,7 +719,7 @@ class MultipleListsArrayScopeTest < ActsAsListTestCase
|
|
739
719
|
def test_position_after_moving_to_empty_list
|
740
720
|
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(:parent_id => 1, :parent_type => 'anything').map(&:pos)
|
741
721
|
assert_equal [], ArrayScopeListMixin.where(:parent_id => 4, :parent_type => 'anything').map(&:pos)
|
742
|
-
ArrayScopeListMixin.find(2).
|
722
|
+
ArrayScopeListMixin.find(2).update :parent_id => 4, :pos => 1
|
743
723
|
assert_equal [1, 2, 3], ArrayScopeListMixin.where(:parent_id => 1, :parent_type => 'anything').order('pos').map(&:pos)
|
744
724
|
assert_equal [1], ArrayScopeListMixin.where(:parent_id => 4, :parent_type => 'anything').order('pos').map(&:pos)
|
745
725
|
end
|