acts_as_list 0.5.0 → 0.6.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 +4 -4
- data/.travis.yml +0 -5
- data/lib/acts_as_list/active_record/acts/list.rb +27 -23
- data/lib/acts_as_list/version.rb +1 -1
- data/test/shared_list.rb +1 -1
- data/test/shared_list_sub.rb +6 -1
- data/test/shared_top_addition.rb +1 -1
- data/test/test_list.rb +54 -5
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfacc8a69876f7c5ccd4935f23c19c536f0d22a6
|
4
|
+
data.tar.gz: 2bc0fca1b08221c3a200a8f9da5bf6576583dd7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73e20a1ce4c86cedd029f7b9b661294c64ce44befcc578be2b9ff7e48a39aaad23d2d0b83991e327da4ba640fdaa90da02ad8a5ab4f39b2220290c08144eeaa2
|
7
|
+
data.tar.gz: f62dbda7b65bd7e57a355ecb0774382acd0250d299096a688c8e647de3d20e9e8f97b3d08b73c451971da54d8fc972b59b4da9c40cbe7778cb76057a77f01a8a
|
data/.travis.yml
CHANGED
@@ -43,7 +43,7 @@ module ActiveRecord
|
|
43
43
|
if configuration[:scope].is_a?(Symbol)
|
44
44
|
scope_methods = %(
|
45
45
|
def scope_condition
|
46
|
-
|
46
|
+
{ :#{configuration[:scope].to_s} => send(:#{configuration[:scope].to_s}) }
|
47
47
|
end
|
48
48
|
|
49
49
|
def scope_changed?
|
@@ -54,7 +54,7 @@ module ActiveRecord
|
|
54
54
|
scope_methods = %(
|
55
55
|
def attrs
|
56
56
|
%w(#{configuration[:scope].join(" ")}).inject({}) do |memo,column|
|
57
|
-
memo[column.intern] =
|
57
|
+
memo[column.intern] = read_attribute(column.intern); memo
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -63,7 +63,7 @@ module ActiveRecord
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def scope_condition
|
66
|
-
|
66
|
+
attrs
|
67
67
|
end
|
68
68
|
)
|
69
69
|
else
|
@@ -84,7 +84,7 @@ module ActiveRecord
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def acts_as_list_class
|
87
|
-
|
87
|
+
self.class
|
88
88
|
end
|
89
89
|
|
90
90
|
def position_column
|
@@ -222,7 +222,7 @@ module ActiveRecord
|
|
222
222
|
def higher_item
|
223
223
|
return nil unless in_list?
|
224
224
|
acts_as_list_class.unscoped do
|
225
|
-
acts_as_list_class.where("#{
|
225
|
+
acts_as_list_class.where(scope_condition).where("#{position_column} < #{(send(position_column).to_i).to_s}").
|
226
226
|
order("#{acts_as_list_class.table_name}.#{position_column} DESC").first
|
227
227
|
end
|
228
228
|
end
|
@@ -243,7 +243,7 @@ module ActiveRecord
|
|
243
243
|
def lower_item
|
244
244
|
return nil unless in_list?
|
245
245
|
acts_as_list_class.unscoped do
|
246
|
-
acts_as_list_class.where("#{
|
246
|
+
acts_as_list_class.where(scope_condition).where("#{position_column} > #{(send(position_column).to_i).to_s}").
|
247
247
|
order("#{acts_as_list_class.table_name}.#{position_column} ASC").first
|
248
248
|
end
|
249
249
|
end
|
@@ -304,7 +304,7 @@ module ActiveRecord
|
|
304
304
|
end
|
305
305
|
|
306
306
|
# Overwrite this method to define the scope of the list changes
|
307
|
-
def scope_condition()
|
307
|
+
def scope_condition() {} end
|
308
308
|
|
309
309
|
# Returns the bottom position number in the list.
|
310
310
|
# bottom_position_in_list # => 2
|
@@ -316,9 +316,9 @@ module ActiveRecord
|
|
316
316
|
# Returns the bottom item
|
317
317
|
def bottom_item(except = nil)
|
318
318
|
conditions = scope_condition
|
319
|
-
conditions =
|
319
|
+
conditions = except ? "#{self.class.primary_key} != #{self.class.connection.quote(except.id)}" : {}
|
320
320
|
acts_as_list_class.unscoped do
|
321
|
-
acts_as_list_class.in_list.where(conditions).order("#{acts_as_list_class.table_name}.#{position_column} DESC").first
|
321
|
+
acts_as_list_class.in_list.where(scope_condition).where(conditions).order("#{acts_as_list_class.table_name}.#{position_column} DESC").first
|
322
322
|
end
|
323
323
|
end
|
324
324
|
|
@@ -335,8 +335,8 @@ module ActiveRecord
|
|
335
335
|
# This has the effect of moving all the higher items up one.
|
336
336
|
def decrement_positions_on_higher_items(position)
|
337
337
|
acts_as_list_class.unscoped do
|
338
|
-
acts_as_list_class.where(
|
339
|
-
"#{
|
338
|
+
acts_as_list_class.where(scope_condition).where(
|
339
|
+
"#{position_column} <= #{position}"
|
340
340
|
).update_all(
|
341
341
|
"#{position_column} = (#{position_column} - 1)"
|
342
342
|
)
|
@@ -348,8 +348,8 @@ module ActiveRecord
|
|
348
348
|
return unless in_list?
|
349
349
|
position ||= send(position_column).to_i
|
350
350
|
acts_as_list_class.unscoped do
|
351
|
-
acts_as_list_class.where(
|
352
|
-
"#{
|
351
|
+
acts_as_list_class.where(scope_condition).where(
|
352
|
+
"#{position_column} > #{position}"
|
353
353
|
).update_all(
|
354
354
|
"#{position_column} = (#{position_column} - 1)"
|
355
355
|
)
|
@@ -360,8 +360,8 @@ module ActiveRecord
|
|
360
360
|
def increment_positions_on_higher_items
|
361
361
|
return unless in_list?
|
362
362
|
acts_as_list_class.unscoped do
|
363
|
-
acts_as_list_class.where(
|
364
|
-
"#{
|
363
|
+
acts_as_list_class.where(scope_condition).where(
|
364
|
+
"#{position_column} < #{send(position_column).to_i}"
|
365
365
|
).update_all(
|
366
366
|
"#{position_column} = (#{position_column} + 1)"
|
367
367
|
)
|
@@ -373,8 +373,8 @@ module ActiveRecord
|
|
373
373
|
avoid_id_condition = avoid_id ? " AND #{self.class.primary_key} != #{self.class.connection.quote(avoid_id)}" : ''
|
374
374
|
|
375
375
|
acts_as_list_class.unscoped do
|
376
|
-
acts_as_list_class.where(
|
377
|
-
"#{
|
376
|
+
acts_as_list_class.where(scope_condition).where(
|
377
|
+
"#{position_column} >= #{position}#{avoid_id_condition}"
|
378
378
|
).update_all(
|
379
379
|
"#{position_column} = (#{position_column} + 1)"
|
380
380
|
)
|
@@ -385,7 +385,7 @@ module ActiveRecord
|
|
385
385
|
def increment_positions_on_all_items
|
386
386
|
acts_as_list_class.unscoped do
|
387
387
|
acts_as_list_class.where(
|
388
|
-
|
388
|
+
scope_condition
|
389
389
|
).update_all(
|
390
390
|
"#{position_column} = (#{position_column} + 1)"
|
391
391
|
)
|
@@ -403,8 +403,10 @@ module ActiveRecord
|
|
403
403
|
# e.g., if moving an item from 2 to 5,
|
404
404
|
# move [3, 4, 5] to [2, 3, 4]
|
405
405
|
acts_as_list_class.unscoped do
|
406
|
-
acts_as_list_class.where(
|
407
|
-
"#{
|
406
|
+
acts_as_list_class.where(scope_condition).where(
|
407
|
+
"#{position_column} > #{old_position}"
|
408
|
+
).where(
|
409
|
+
"#{position_column} <= #{new_position}#{avoid_id_condition}"
|
408
410
|
).update_all(
|
409
411
|
"#{position_column} = (#{position_column} - 1)"
|
410
412
|
)
|
@@ -415,8 +417,10 @@ module ActiveRecord
|
|
415
417
|
# e.g., if moving an item from 5 to 2,
|
416
418
|
# move [2, 3, 4] to [3, 4, 5]
|
417
419
|
acts_as_list_class.unscoped do
|
418
|
-
acts_as_list_class.where(
|
419
|
-
"#{
|
420
|
+
acts_as_list_class.where(scope_condition).where(
|
421
|
+
"#{position_column} >= #{new_position}"
|
422
|
+
).where(
|
423
|
+
"#{position_column} < #{old_position}#{avoid_id_condition}"
|
420
424
|
).update_all(
|
421
425
|
"#{position_column} = (#{position_column} + 1)"
|
422
426
|
)
|
@@ -450,7 +454,7 @@ module ActiveRecord
|
|
450
454
|
new_position = send(position_column).to_i
|
451
455
|
|
452
456
|
return unless acts_as_list_class.unscoped do
|
453
|
-
acts_as_list_class.where("#{
|
457
|
+
acts_as_list_class.where(scope_condition).where("#{position_column} = #{new_position}").count > 1
|
454
458
|
end
|
455
459
|
shuffle_positions_on_intermediate_items old_position, new_position, id
|
456
460
|
end
|
data/lib/acts_as_list/version.rb
CHANGED
data/test/shared_list.rb
CHANGED
data/test/shared_list_sub.rb
CHANGED
@@ -61,7 +61,7 @@ module Shared
|
|
61
61
|
|
62
62
|
def test_injection
|
63
63
|
item = ListMixin.new("parent_id"=>1)
|
64
|
-
assert_equal
|
64
|
+
assert_equal({ parent_id: 1 }, item.scope_condition)
|
65
65
|
assert_equal "pos", item.position_column
|
66
66
|
end
|
67
67
|
|
@@ -118,5 +118,10 @@ module Shared
|
|
118
118
|
assert_equal 1, ListMixin.where(id: 3).first.pos
|
119
119
|
assert_equal 2, ListMixin.where(id: 4).first.pos
|
120
120
|
end
|
121
|
+
|
122
|
+
def test_acts_as_list_class
|
123
|
+
assert_equal TheSubClass1, TheSubClass1.new.acts_as_list_class
|
124
|
+
assert_equal TheSubClass2, TheSubClass2.new.acts_as_list_class
|
125
|
+
end
|
121
126
|
end
|
122
127
|
end
|
data/test/shared_top_addition.rb
CHANGED
data/test/test_list.rb
CHANGED
@@ -13,13 +13,17 @@ def setup_db(position_options = {})
|
|
13
13
|
t.column :parent_type, :string
|
14
14
|
t.column :created_at, :datetime
|
15
15
|
t.column :updated_at, :datetime
|
16
|
+
t.column :state, :integer
|
16
17
|
end
|
17
|
-
|
18
|
-
|
19
|
-
[ Mixin, ListMixin, ListMixinSub1, ListMixinSub2, ListWithStringScopeMixin,
|
18
|
+
|
19
|
+
mixins = [ Mixin, ListMixin, ListMixinSub1, ListMixinSub2, ListWithStringScopeMixin,
|
20
20
|
ArrayScopeListMixin, ZeroBasedMixin, DefaultScopedMixin,
|
21
|
-
DefaultScopedWhereMixin, TopAdditionMixin, NoAdditionMixin ]
|
22
|
-
|
21
|
+
DefaultScopedWhereMixin, TopAdditionMixin, NoAdditionMixin ]
|
22
|
+
|
23
|
+
mixins << EnumArrayScopeListMixin if rails_4
|
24
|
+
|
25
|
+
ActiveRecord::Base.connection.schema_cache.clear!
|
26
|
+
mixins.each do |klass|
|
23
27
|
klass.reset_column_information
|
24
28
|
end
|
25
29
|
end
|
@@ -33,6 +37,10 @@ def rails_3
|
|
33
37
|
defined?(ActiveRecord::VERSION) && ActiveRecord::VERSION::MAJOR >= 3
|
34
38
|
end
|
35
39
|
|
40
|
+
def rails_4
|
41
|
+
defined?(ActiveRecord::VERSION) && ActiveRecord::VERSION::MAJOR >= 4
|
42
|
+
end
|
43
|
+
|
36
44
|
def teardown_db
|
37
45
|
ActiveRecord::Base.connection.tables.each do |table|
|
38
46
|
ActiveRecord::Base.connection.drop_table(table)
|
@@ -66,6 +74,15 @@ class ArrayScopeListMixin < Mixin
|
|
66
74
|
acts_as_list column: "pos", scope: [:parent_id, :parent_type]
|
67
75
|
end
|
68
76
|
|
77
|
+
if rails_4
|
78
|
+
class EnumArrayScopeListMixin < Mixin
|
79
|
+
STATE_VALUES = %w(active archived)
|
80
|
+
enum state: STATE_VALUES
|
81
|
+
|
82
|
+
acts_as_list column: "pos", scope: [:parent_id, :state]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
69
86
|
class ZeroBasedMixin < Mixin
|
70
87
|
acts_as_list column: "pos", top_of_list: 0, scope: [:parent_id]
|
71
88
|
end
|
@@ -92,6 +109,19 @@ class NoAdditionMixin < Mixin
|
|
92
109
|
acts_as_list column: "pos", add_new_at: nil, scope: :parent_id
|
93
110
|
end
|
94
111
|
|
112
|
+
class TheBaseClass < ActiveRecord::Base
|
113
|
+
self.abstract_class = true
|
114
|
+
acts_as_list column: "pos", scope: :parent
|
115
|
+
end
|
116
|
+
|
117
|
+
class TheSubClass1 < TheBaseClass
|
118
|
+
self.table_name = 'mixins'
|
119
|
+
end
|
120
|
+
|
121
|
+
class TheSubClass2 < TheBaseClass
|
122
|
+
self.table_name = 'mixins'
|
123
|
+
end
|
124
|
+
|
95
125
|
class ActsAsListTestCase < Minitest::Test
|
96
126
|
# No default test required as this class is abstract.
|
97
127
|
# Need for test/unit.
|
@@ -459,6 +489,25 @@ class MultipleListsTest < ActsAsListTestCase
|
|
459
489
|
end
|
460
490
|
end
|
461
491
|
|
492
|
+
if rails_4
|
493
|
+
class EnumArrayScopeListMixinTest < ActsAsListTestCase
|
494
|
+
def setup
|
495
|
+
setup_db
|
496
|
+
EnumArrayScopeListMixin.create! :parent_id => 1, :state => EnumArrayScopeListMixin.states['active']
|
497
|
+
EnumArrayScopeListMixin.create! :parent_id => 1, :state => EnumArrayScopeListMixin.states['archived']
|
498
|
+
EnumArrayScopeListMixin.create! :parent_id => 2, :state => EnumArrayScopeListMixin.states["active"]
|
499
|
+
EnumArrayScopeListMixin.create! :parent_id => 2, :state => EnumArrayScopeListMixin.states["archived"]
|
500
|
+
end
|
501
|
+
|
502
|
+
def test_positions
|
503
|
+
assert_equal [1], EnumArrayScopeListMixin.where(:parent_id => 1, :state => EnumArrayScopeListMixin.states['active']).map(&:pos)
|
504
|
+
assert_equal [1], EnumArrayScopeListMixin.where(:parent_id => 1, :state => EnumArrayScopeListMixin.states['archived']).map(&:pos)
|
505
|
+
assert_equal [1], EnumArrayScopeListMixin.where(:parent_id => 2, :state => EnumArrayScopeListMixin.states['active']).map(&:pos)
|
506
|
+
assert_equal [1], EnumArrayScopeListMixin.where(:parent_id => 2, :state => EnumArrayScopeListMixin.states['archived']).map(&:pos)
|
507
|
+
end
|
508
|
+
end
|
509
|
+
end
|
510
|
+
|
462
511
|
class MultipleListsArrayScopeTest < ActsAsListTestCase
|
463
512
|
def setup
|
464
513
|
setup_db
|
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: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
@@ -10,34 +10,34 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-12-24 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '3.0'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: bundler
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: 1.0.0
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: 1.0.0
|
43
43
|
description: This "acts_as" extension provides the capabilities for sorting and reordering
|
@@ -49,9 +49,9 @@ executables: []
|
|
49
49
|
extensions: []
|
50
50
|
extra_rdoc_files: []
|
51
51
|
files:
|
52
|
-
- .gemtest
|
53
|
-
- .gitignore
|
54
|
-
- .travis.yml
|
52
|
+
- ".gemtest"
|
53
|
+
- ".gitignore"
|
54
|
+
- ".travis.yml"
|
55
55
|
- Gemfile
|
56
56
|
- MIT-LICENSE
|
57
57
|
- README.md
|
@@ -82,17 +82,17 @@ require_paths:
|
|
82
82
|
- lib
|
83
83
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
|
-
- -
|
85
|
+
- - ">="
|
86
86
|
- !ruby/object:Gem::Version
|
87
87
|
version: 1.9.2
|
88
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
89
|
requirements:
|
90
|
-
- -
|
90
|
+
- - ">="
|
91
91
|
- !ruby/object:Gem::Version
|
92
92
|
version: '0'
|
93
93
|
requirements: []
|
94
94
|
rubyforge_project: acts_as_list
|
95
|
-
rubygems_version: 2.
|
95
|
+
rubygems_version: 2.2.2
|
96
96
|
signing_key:
|
97
97
|
specification_version: 4
|
98
98
|
summary: A gem allowing a active_record model to act_as_list.
|