acts_as_restful_list 0.5.0 → 0.6
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.
- data/History.rdoc +7 -1
- data/lib/acts_as_restful_list.rb +51 -10
- metadata +33 -31
- data/.document +0 -5
- data/Rakefile +0 -45
- data/acts_as_restful_list.gemspec +0 -57
- data/spec/acts_as_restful_list_spec.rb +0 -524
- data/spec/spec.opts +0 -1
- data/spec/spec_helper.rb +0 -14
data/History.rdoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== Version 0.6.0 / 2011-07-18
|
2
|
+
|
3
|
+
* enhancements
|
4
|
+
* Automatically initialize the order of the list under conditions that would
|
5
|
+
otherwise break things. Thanks evizitei!!
|
6
|
+
|
1
7
|
=== Version 0.5.0 / 2011-02-08
|
2
8
|
|
3
9
|
* enhancements
|
@@ -21,4 +27,4 @@
|
|
21
27
|
=== Version 0.0.3 / 2010-02-14
|
22
28
|
|
23
29
|
* enhancements
|
24
|
-
* can set the position column
|
30
|
+
* can set the position column
|
data/lib/acts_as_restful_list.rb
CHANGED
@@ -57,19 +57,24 @@ module ActsAsRestfulList
|
|
57
57
|
|
58
58
|
module InstanceMethods
|
59
59
|
def set_position
|
60
|
-
|
61
|
-
|
60
|
+
initialize_order if !last_record.nil? and last_record_position.nil?
|
61
|
+
|
62
|
+
self.send( "#{position_column}=", last_record.nil? ? 1 : last_record_position + 1)
|
62
63
|
end
|
63
64
|
|
64
65
|
def reset_order_after_update
|
65
|
-
if
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
self.class.update_all(
|
71
|
-
|
72
|
-
|
66
|
+
if previous_position.nil?
|
67
|
+
initialize_order
|
68
|
+
else
|
69
|
+
if scope_condition != scope_condition_was
|
70
|
+
self.class.update_all( decrement_position_sql, [scope_condition_was, "#{position_column} > #{previous_position}", "id != #{id}"].compact.join(' AND '))
|
71
|
+
self.class.update_all( increment_position_sql, [scope_condition, "#{position_column} >= #{current_position}", "id != #{id}"].compact.join(' AND '))
|
72
|
+
elsif self.send( "#{position_column}_changed?" )
|
73
|
+
if previous_position > current_position
|
74
|
+
self.class.update_all( increment_position_sql, [scope_condition, "#{position_column} >= #{current_position}", "id != #{id}", "#{position_column} < #{previous_position}"].compact.join(' AND '))
|
75
|
+
else
|
76
|
+
self.class.update_all( decrement_position_sql, [scope_condition, "#{position_column} <= #{current_position}", "#{position_column} >= #{previous_position}", "id != #{id}"].compact.join(' AND '))
|
77
|
+
end
|
73
78
|
end
|
74
79
|
end
|
75
80
|
end
|
@@ -77,6 +82,42 @@ module ActsAsRestfulList
|
|
77
82
|
def reset_order_after_destroy
|
78
83
|
self.class.update_all("#{position_column} = (#{position_column} - 1) #{optimistic_locking_update}", [scope_condition, "#{position_column} > #{self.send( position_column )}"].compact.join(' AND '))
|
79
84
|
end
|
85
|
+
|
86
|
+
def initialize_order
|
87
|
+
initial_set = self.class.find(:all,:conditions=>scope_condition,:select=>"id",:order=>"created_at ASC")
|
88
|
+
|
89
|
+
initial_set.each_with_index do |item,idx|
|
90
|
+
ActiveRecord::Base.connection.execute("update #{self.class.table_name} set position = #{idx + 1} where id = #{item.id};")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def last_record
|
95
|
+
self.class.last( :conditions => scope_condition, :order => "#{position_column} ASC" )
|
96
|
+
end
|
97
|
+
|
98
|
+
def last_record_position
|
99
|
+
last_record.send(position_column)
|
100
|
+
end
|
101
|
+
|
102
|
+
def current_position
|
103
|
+
self.send( position_column )
|
104
|
+
end
|
105
|
+
|
106
|
+
def current_position=(value)
|
107
|
+
self.send( "#{position_column}=", value )
|
108
|
+
end
|
109
|
+
|
110
|
+
def previous_position
|
111
|
+
self.send( "#{position_column}_was" )
|
112
|
+
end
|
113
|
+
|
114
|
+
def increment_position_sql
|
115
|
+
"#{position_column} = (#{position_column} + 1) #{optimistic_locking_update}"
|
116
|
+
end
|
117
|
+
|
118
|
+
def decrement_position_sql
|
119
|
+
"#{position_column} = (#{position_column} - 1) #{optimistic_locking_update}"
|
120
|
+
end
|
80
121
|
end
|
81
122
|
end
|
82
123
|
|
metadata
CHANGED
@@ -1,39 +1,51 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_restful_list
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 5
|
9
|
-
- 0
|
10
|
-
version: 0.5.0
|
4
|
+
prerelease:
|
5
|
+
version: "0.6"
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
|
-
-
|
8
|
+
- Trey Bean
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date: 2011-
|
13
|
+
date: 2011-07-18 00:00:00 -06:00
|
19
14
|
default_executable:
|
20
15
|
dependencies:
|
21
16
|
- !ruby/object:Gem::Dependency
|
22
17
|
name: rspec
|
23
|
-
prerelease: false
|
24
18
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
19
|
none: false
|
26
20
|
requirements:
|
27
21
|
- - ">="
|
28
22
|
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 1
|
32
|
-
- 2
|
33
|
-
- 9
|
34
|
-
version: 1.2.9
|
23
|
+
version: "0"
|
35
24
|
type: :development
|
25
|
+
prerelease: false
|
36
26
|
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: sqlite3
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: *id003
|
37
49
|
description: Just like acts_as_list, but allows updating through standard restful methods.
|
38
50
|
email: trey@12spokes.com
|
39
51
|
executables: []
|
@@ -44,19 +56,13 @@ extra_rdoc_files:
|
|
44
56
|
- LICENSE
|
45
57
|
- README.rdoc
|
46
58
|
files:
|
47
|
-
- .
|
59
|
+
- lib/acts_as_restful_list.rb
|
48
60
|
- .gitignore
|
49
61
|
- History.rdoc
|
50
62
|
- LICENSE
|
51
63
|
- README.rdoc
|
52
|
-
- Rakefile
|
53
64
|
- Todo.rdoc
|
54
65
|
- VERSION
|
55
|
-
- acts_as_restful_list.gemspec
|
56
|
-
- lib/acts_as_restful_list.rb
|
57
|
-
- spec/acts_as_restful_list_spec.rb
|
58
|
-
- spec/spec.opts
|
59
|
-
- spec/spec_helper.rb
|
60
66
|
has_rdoc: true
|
61
67
|
homepage: http://github.com/12spokes/acts_as_restful_list
|
62
68
|
licenses: []
|
@@ -71,7 +77,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
71
77
|
requirements:
|
72
78
|
- - ">="
|
73
79
|
- !ruby/object:Gem::Version
|
74
|
-
hash:
|
80
|
+
hash: -2292716820751671520
|
75
81
|
segments:
|
76
82
|
- 0
|
77
83
|
version: "0"
|
@@ -80,17 +86,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
86
|
requirements:
|
81
87
|
- - ">="
|
82
88
|
- !ruby/object:Gem::Version
|
83
|
-
hash: 3
|
84
|
-
segments:
|
85
|
-
- 0
|
86
89
|
version: "0"
|
87
90
|
requirements: []
|
88
91
|
|
89
92
|
rubyforge_project:
|
90
|
-
rubygems_version: 1.
|
93
|
+
rubygems_version: 1.6.2
|
91
94
|
signing_key:
|
92
95
|
specification_version: 3
|
93
96
|
summary: Restful acts_as_list
|
94
|
-
test_files:
|
95
|
-
|
96
|
-
- spec/spec_helper.rb
|
97
|
+
test_files: []
|
98
|
+
|
data/.document
DELETED
data/Rakefile
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rake'
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "acts_as_restful_list"
|
8
|
-
gem.summary = %Q{Restful acts_as_list}
|
9
|
-
gem.description = %Q{Just like acts_as_list, but allows updating through standard restful methods.}
|
10
|
-
gem.email = "trey@12spokes.com"
|
11
|
-
gem.homepage = "http://github.com/12spokes/acts_as_restful_list"
|
12
|
-
gem.authors = ["'Trey Bean'"]
|
13
|
-
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
-
end
|
16
|
-
Jeweler::GemcutterTasks.new
|
17
|
-
rescue LoadError
|
18
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
-
end
|
20
|
-
|
21
|
-
require 'spec/rake/spectask'
|
22
|
-
Spec::Rake::SpecTask.new(:spec) do |spec|
|
23
|
-
spec.libs << 'lib' << 'spec'
|
24
|
-
spec.spec_files = FileList['spec/**/*_spec.rb']
|
25
|
-
end
|
26
|
-
|
27
|
-
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
28
|
-
spec.libs << 'lib' << 'spec'
|
29
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
30
|
-
spec.rcov = true
|
31
|
-
end
|
32
|
-
|
33
|
-
task :spec => :check_dependencies
|
34
|
-
|
35
|
-
task :default => :spec
|
36
|
-
|
37
|
-
require 'rake/rdoctask'
|
38
|
-
Rake::RDocTask.new do |rdoc|
|
39
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
40
|
-
|
41
|
-
rdoc.rdoc_dir = 'rdoc'
|
42
|
-
rdoc.title = "acts_as_restful_list #{version}"
|
43
|
-
rdoc.rdoc_files.include('README*')
|
44
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
45
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{acts_as_restful_list}
|
8
|
-
s.version = "0.5.0"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["'Trey Bean'"]
|
12
|
-
s.date = %q{2011-02-08}
|
13
|
-
s.description = %q{Just like acts_as_list, but allows updating through standard restful methods.}
|
14
|
-
s.email = %q{trey@12spokes.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
".gitignore",
|
22
|
-
"History.rdoc",
|
23
|
-
"LICENSE",
|
24
|
-
"README.rdoc",
|
25
|
-
"Rakefile",
|
26
|
-
"Todo.rdoc",
|
27
|
-
"VERSION",
|
28
|
-
"acts_as_restful_list.gemspec",
|
29
|
-
"lib/acts_as_restful_list.rb",
|
30
|
-
"spec/acts_as_restful_list_spec.rb",
|
31
|
-
"spec/spec.opts",
|
32
|
-
"spec/spec_helper.rb"
|
33
|
-
]
|
34
|
-
s.homepage = %q{http://github.com/12spokes/acts_as_restful_list}
|
35
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
36
|
-
s.require_paths = ["lib"]
|
37
|
-
s.rubygems_version = %q{1.3.7}
|
38
|
-
s.summary = %q{Restful acts_as_list}
|
39
|
-
s.test_files = [
|
40
|
-
"spec/acts_as_restful_list_spec.rb",
|
41
|
-
"spec/spec_helper.rb"
|
42
|
-
]
|
43
|
-
|
44
|
-
if s.respond_to? :specification_version then
|
45
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
46
|
-
s.specification_version = 3
|
47
|
-
|
48
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
49
|
-
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
50
|
-
else
|
51
|
-
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
52
|
-
end
|
53
|
-
else
|
54
|
-
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
@@ -1,524 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe "ActsAsRestfulList" do
|
4
|
-
after(:each) do
|
5
|
-
ActiveRecord::Base.connection.execute("DELETE FROM mixins")
|
6
|
-
ActiveRecord::Base.connection.execute("DELETE FROM sqlite_sequence where name='mixins'")
|
7
|
-
end
|
8
|
-
|
9
|
-
describe 'standard declaration with no options' do
|
10
|
-
before(:all) do
|
11
|
-
ActiveRecord::Schema.define(:version => 1) do
|
12
|
-
create_table :mixins do |t|
|
13
|
-
t.column :position, :integer
|
14
|
-
t.column :parent_id, :integer
|
15
|
-
t.column :created_at, :datetime
|
16
|
-
t.column :updated_at, :datetime
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class Mixin < ActiveRecord::Base
|
21
|
-
acts_as_restful_list
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
after(:all) do
|
26
|
-
Object.send(:remove_const, :Mixin)
|
27
|
-
|
28
|
-
ActiveRecord::Base.connection.tables.each do |table|
|
29
|
-
ActiveRecord::Base.connection.drop_table(table)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should return position as it's position column" do
|
34
|
-
Mixin.new.position_column.should == 'position'
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'should set the position before creating the record' do
|
38
|
-
mixin = Mixin.new
|
39
|
-
mixin.should_receive(:set_position).and_return(true)
|
40
|
-
mixin.save!
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'should save the first record with position 1' do
|
44
|
-
Mixin.create!.position.should == 1
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'should put each new record at the end of the list' do
|
48
|
-
(1..4).each do |n|
|
49
|
-
Mixin.create!.position.should == n
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe 'reordering on update' do
|
54
|
-
before(:each) do
|
55
|
-
(1..4).each{ Mixin.create! }
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'should reset order after updating a record' do
|
59
|
-
mixin = Mixin.create
|
60
|
-
mixin.should_receive(:reset_order_after_update).and_return(true)
|
61
|
-
mixin.save!
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'should automatically reorder the list if a record is updated with a lower position' do
|
65
|
-
fourth_mixin = Mixin.first( :conditions => { :position => 4 } )
|
66
|
-
fourth_mixin.position = 2
|
67
|
-
fourth_mixin.save!
|
68
|
-
fourth_mixin.reload.position.should == 2
|
69
|
-
Mixin.all(:order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'should reorder the list correctly if a record in the middle is updated with a lower position' do
|
73
|
-
third_mixin = Mixin.first( :conditions => { :position => 3 } )
|
74
|
-
third_mixin.position = 2
|
75
|
-
third_mixin.save!
|
76
|
-
third_mixin.reload.position.should == 2
|
77
|
-
Mixin.all(:order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'should automatically reorder the list if a record is updated with a higher position' do
|
81
|
-
second_mixin = Mixin.first( :conditions => { :position => 2 } )
|
82
|
-
second_mixin.position = 4
|
83
|
-
second_mixin.save!
|
84
|
-
second_mixin.reload.position.should == 4
|
85
|
-
Mixin.all(:order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe 'reordering on deletion' do
|
90
|
-
it 'should reset the order after deleting a record' do
|
91
|
-
mixin = Mixin.create
|
92
|
-
mixin.should_receive(:reset_order_after_destroy).and_return(true)
|
93
|
-
mixin.destroy
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'should automatically reorder the list if the record is deleted' do
|
97
|
-
(1..4).each{ Mixin.create! }
|
98
|
-
second_mixin = Mixin.first( :conditions => { :position => 2 } )
|
99
|
-
second_mixin.destroy
|
100
|
-
Mixin.all(:order => 'position ASC').collect(&:position).should == [1,2,3]
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'should return nil for scope_condition since it was not set' do
|
105
|
-
Mixin.new.scope_condition.should be_nil
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
describe 'optimistic locking' do
|
110
|
-
before(:all) do
|
111
|
-
ActiveRecord::Schema.define(:version => 1) do
|
112
|
-
create_table :mixins do |t|
|
113
|
-
t.column :position, :integer
|
114
|
-
t.column :parent_id, :integer
|
115
|
-
t.column :lock_version, :integer, :default => 0
|
116
|
-
t.column :created_at, :datetime
|
117
|
-
t.column :updated_at, :datetime
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
class Mixin < ActiveRecord::Base
|
122
|
-
acts_as_restful_list
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
after(:all) do
|
127
|
-
Object.send(:remove_const, :Mixin)
|
128
|
-
|
129
|
-
ActiveRecord::Base.connection.tables.each do |table|
|
130
|
-
ActiveRecord::Base.connection.drop_table(table)
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
before(:each) do
|
135
|
-
(1..4).each{ Mixin.create! }
|
136
|
-
end
|
137
|
-
|
138
|
-
describe 'reordering on destroy' do
|
139
|
-
it 'should raise an error for stale objects' do
|
140
|
-
second_mixin = Mixin.first( :conditions => { :position => 2 } )
|
141
|
-
third_mixin = Mixin.first( :conditions => { :position => 3 } )
|
142
|
-
second_mixin.destroy
|
143
|
-
lambda {
|
144
|
-
third_mixin.destroy
|
145
|
-
}.should raise_error(ActiveRecord::StaleObjectError)
|
146
|
-
end
|
147
|
-
|
148
|
-
it 'should NOT raise an error if update did not affect existing position' do
|
149
|
-
second_mixin = Mixin.first( :conditions => { :position => 2 } )
|
150
|
-
third_mixin = Mixin.first( :conditions => { :position => 3 } )
|
151
|
-
third_mixin.destroy
|
152
|
-
lambda {
|
153
|
-
second_mixin.destroy
|
154
|
-
}.should_not raise_error(ActiveRecord::StaleObjectError)
|
155
|
-
Mixin.all(:order => 'position ASC').collect(&:position).should == [1,2]
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
describe 'reordering on update' do
|
160
|
-
it 'should raise an error for stale objects' do
|
161
|
-
first_mixin = Mixin.first( :conditions => { :position => 1 } )
|
162
|
-
fourth_mixin = Mixin.first( :conditions => { :position => 4 } )
|
163
|
-
fourth_mixin.update_attributes(:position => 1)
|
164
|
-
lambda {
|
165
|
-
first_mixin.update_attributes(:position => 2)
|
166
|
-
}.should raise_error(ActiveRecord::StaleObjectError)
|
167
|
-
end
|
168
|
-
|
169
|
-
it 'should NOT raise an error if update did not affect existing position' do
|
170
|
-
first_mixin = Mixin.first( :conditions => { :position => 1 } )
|
171
|
-
fourth_mixin = Mixin.first( :conditions => { :position => 4 } )
|
172
|
-
fourth_mixin.update_attributes(:position => 2)
|
173
|
-
lambda {
|
174
|
-
first_mixin.update_attributes(:position => 3)
|
175
|
-
}.should_not raise_error(ActiveRecord::StaleObjectError)
|
176
|
-
Mixin.all(:order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
end
|
181
|
-
|
182
|
-
describe 'declaring acts_as_restful_list and setting the column' do
|
183
|
-
before(:all) do
|
184
|
-
ActiveRecord::Schema.define(:version => 1) do
|
185
|
-
create_table :mixins do |t|
|
186
|
-
t.column :pos, :integer
|
187
|
-
t.column :parent_id, :integer
|
188
|
-
t.column :created_at, :datetime
|
189
|
-
t.column :updated_at, :datetime
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
class Mixin < ActiveRecord::Base
|
194
|
-
acts_as_restful_list :column => :pos
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
after(:all) do
|
199
|
-
Object.send(:remove_const, :Mixin)
|
200
|
-
|
201
|
-
ActiveRecord::Base.connection.tables.each do |table|
|
202
|
-
ActiveRecord::Base.connection.drop_table(table)
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
it "should return pos as it's position column" do
|
207
|
-
Mixin.new.position_column.should == 'pos'
|
208
|
-
end
|
209
|
-
|
210
|
-
it 'should set the position before creating the record' do
|
211
|
-
mixin = Mixin.new
|
212
|
-
mixin.should_receive(:set_position).and_return(true)
|
213
|
-
mixin.save!
|
214
|
-
end
|
215
|
-
|
216
|
-
it 'should save the first record with position 1' do
|
217
|
-
Mixin.create!.pos.should == 1
|
218
|
-
end
|
219
|
-
|
220
|
-
it 'should put each new record at the end of the list' do
|
221
|
-
(1..4).each do |n|
|
222
|
-
Mixin.create!.pos.should == n
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
describe 'reordering on update' do
|
227
|
-
before(:each) do
|
228
|
-
(1..4).each{ Mixin.create! }
|
229
|
-
end
|
230
|
-
|
231
|
-
it 'should reset order after updating a record' do
|
232
|
-
mixin = Mixin.create
|
233
|
-
mixin.should_receive(:reset_order_after_update).and_return(true)
|
234
|
-
mixin.save!
|
235
|
-
end
|
236
|
-
|
237
|
-
it 'should automatically reorder the list if a record is updated with a lower position' do
|
238
|
-
fourth_mixin = Mixin.first( :conditions => { :pos => 4 } )
|
239
|
-
fourth_mixin.pos = 2
|
240
|
-
fourth_mixin.save!
|
241
|
-
fourth_mixin.reload.pos.should == 2
|
242
|
-
Mixin.all(:order => 'pos ASC').collect(&:pos).should == [1,2,3,4]
|
243
|
-
end
|
244
|
-
|
245
|
-
it 'should automatically reorder the list if a record is updated with a higher position' do
|
246
|
-
second_mixin = Mixin.first( :conditions => { :pos => 2 } )
|
247
|
-
second_mixin.pos = 4
|
248
|
-
second_mixin.save!
|
249
|
-
second_mixin.reload.pos.should == 4
|
250
|
-
Mixin.all(:order => 'pos ASC').collect(&:pos).should == [1,2,3,4]
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
describe 'reordering on deletion' do
|
255
|
-
it 'should reset the order after deleting a record' do
|
256
|
-
mixin = Mixin.create
|
257
|
-
mixin.should_receive(:reset_order_after_destroy).and_return(true)
|
258
|
-
mixin.destroy
|
259
|
-
end
|
260
|
-
|
261
|
-
it 'should automatically reorder the list if the record is deleted' do
|
262
|
-
(1..4).each{ Mixin.create! }
|
263
|
-
second_mixin = Mixin.first( :conditions => { :pos => 2 } )
|
264
|
-
second_mixin.destroy
|
265
|
-
Mixin.all(:order => 'pos ASC').collect(&:pos).should == [1,2,3]
|
266
|
-
end
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
describe 'declaring acts_as_restful_list and setting the scope' do
|
271
|
-
before(:all) do
|
272
|
-
ActiveRecord::Schema.define(:version => 1) do
|
273
|
-
create_table :mixins do |t|
|
274
|
-
t.column :position, :integer
|
275
|
-
t.column :parent_id, :integer
|
276
|
-
t.column :created_at, :datetime
|
277
|
-
t.column :updated_at, :datetime
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
class Mixin < ActiveRecord::Base
|
282
|
-
acts_as_restful_list :scope => :parent_id
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
after(:all) do
|
287
|
-
Object.send(:remove_const, :Mixin)
|
288
|
-
|
289
|
-
ActiveRecord::Base.connection.tables.each do |table|
|
290
|
-
ActiveRecord::Base.connection.drop_table(table)
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
it 'should define scope_condition as an instance method' do
|
295
|
-
Mixin.new.should respond_to(:scope_condition)
|
296
|
-
end
|
297
|
-
|
298
|
-
it 'should return a scope condition that limits based on the parent_id' do
|
299
|
-
Mixin.new(:parent_id => 3).scope_condition.should == "parent_id = 3"
|
300
|
-
end
|
301
|
-
|
302
|
-
it 'should return a scope limiting based parent_id being NULL if parent_id is nil' do
|
303
|
-
Mixin.new.scope_condition.should == "parent_id IS NULL"
|
304
|
-
end
|
305
|
-
|
306
|
-
it 'should set the position based on the scope list when adding a new item' do
|
307
|
-
Mixin.create!.position.should == 1
|
308
|
-
Mixin.create!(:parent_id => 1).position.should == 1
|
309
|
-
Mixin.create!(:parent_id => 1).position.should == 2
|
310
|
-
Mixin.create!(:parent_id => 2).position.should == 1
|
311
|
-
end
|
312
|
-
|
313
|
-
describe 'reordering on update' do
|
314
|
-
before(:each) do
|
315
|
-
(1..4).each{ Mixin.create!(:parent_id => 1) }
|
316
|
-
(1..6).each{ Mixin.create!(:parent_id => 2) }
|
317
|
-
end
|
318
|
-
|
319
|
-
it 'should automatically reorder the list if a record is updated with a lower position' do
|
320
|
-
fourth_mixin = Mixin.first( :conditions => { :position => 4, :parent_id => 1 } )
|
321
|
-
fourth_mixin.position = 2
|
322
|
-
fourth_mixin.save!
|
323
|
-
fourth_mixin.reload.position.should == 2
|
324
|
-
Mixin.all(:conditions => { :parent_id => 1 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
325
|
-
Mixin.all(:conditions => { :parent_id => 2 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4,5,6]
|
326
|
-
end
|
327
|
-
|
328
|
-
it 'should automatically reorder the list if a record is updated with a higher position' do
|
329
|
-
second_mixin = Mixin.first( :conditions => { :position => 2, :parent_id => 1 } )
|
330
|
-
second_mixin.position = 4
|
331
|
-
second_mixin.save!
|
332
|
-
second_mixin.reload.position.should == 4
|
333
|
-
Mixin.all(:conditions => { :parent_id => 1 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
334
|
-
Mixin.all(:conditions => { :parent_id => 2 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4,5,6]
|
335
|
-
end
|
336
|
-
|
337
|
-
it 'should report the old and new scope correctly' do
|
338
|
-
second_mixin = Mixin.first( :conditions => { :position => 2, :parent_id => 1 } )
|
339
|
-
second_mixin.parent_id = 2
|
340
|
-
second_mixin.position = 4
|
341
|
-
second_mixin.scope_condition_was.should == 'parent_id = 1'
|
342
|
-
second_mixin.scope_condition.should == 'parent_id = 2'
|
343
|
-
end
|
344
|
-
|
345
|
-
it 'should automatically reorder both lists if a record is moved between them' do
|
346
|
-
second_mixin = Mixin.first( :conditions => { :position => 2, :parent_id => 1 } )
|
347
|
-
second_mixin.parent_id = 2
|
348
|
-
second_mixin.position = 4
|
349
|
-
second_mixin.save!
|
350
|
-
second_mixin.reload.parent_id.should == 2
|
351
|
-
second_mixin.reload.position.should == 4
|
352
|
-
Mixin.all(:conditions => { :parent_id => 1 }, :order => 'position ASC').collect(&:position).should == [1,2,3]
|
353
|
-
Mixin.all(:conditions => { :parent_id => 2 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4,5,6,7]
|
354
|
-
end
|
355
|
-
end
|
356
|
-
|
357
|
-
it 'should automatically reorder the list scoped by parent if the record is deleted' do
|
358
|
-
(1..4).each{ Mixin.create!(:parent_id => 1) }
|
359
|
-
(1..6).each{ Mixin.create!(:parent_id => 2) }
|
360
|
-
second_mixin = Mixin.first( :conditions => { :position => 2, :parent_id => 1 } )
|
361
|
-
second_mixin.destroy
|
362
|
-
Mixin.all(:conditions => { :parent_id => 1 }, :order => 'position ASC').collect(&:position).should == [1,2,3]
|
363
|
-
Mixin.all(:conditions => { :parent_id => 2 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4,5,6]
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
describe 'declaring acts_as_restful_list and setting the scope without the _id' do
|
368
|
-
before(:all) do
|
369
|
-
ActiveRecord::Schema.define(:version => 1) do
|
370
|
-
create_table :mixins do |t|
|
371
|
-
t.column :position, :integer
|
372
|
-
t.column :parent_id, :integer
|
373
|
-
t.column :created_at, :datetime
|
374
|
-
t.column :updated_at, :datetime
|
375
|
-
end
|
376
|
-
end
|
377
|
-
|
378
|
-
class Mixin < ActiveRecord::Base
|
379
|
-
acts_as_restful_list :scope => :parent
|
380
|
-
end
|
381
|
-
end
|
382
|
-
|
383
|
-
after(:all) do
|
384
|
-
Object.send(:remove_const, :Mixin)
|
385
|
-
|
386
|
-
ActiveRecord::Base.connection.tables.each do |table|
|
387
|
-
ActiveRecord::Base.connection.drop_table(table)
|
388
|
-
end
|
389
|
-
end
|
390
|
-
|
391
|
-
it 'should define scope_condition as an instance method' do
|
392
|
-
Mixin.new.should respond_to(:scope_condition)
|
393
|
-
end
|
394
|
-
|
395
|
-
it 'should return a scope condition that limits based on the parent_id' do
|
396
|
-
Mixin.new(:parent_id => 3).scope_condition.should == "parent_id = 3"
|
397
|
-
end
|
398
|
-
end
|
399
|
-
|
400
|
-
|
401
|
-
describe 'declaring acts_as_restful_list and setting the scope on a column that is not an _id column' do
|
402
|
-
before(:all) do
|
403
|
-
ActiveRecord::Schema.define(:version => 1) do
|
404
|
-
create_table :mixins do |t|
|
405
|
-
t.column :position, :integer
|
406
|
-
t.column :parent_name, :string
|
407
|
-
t.column :created_at, :datetime
|
408
|
-
t.column :updated_at, :datetime
|
409
|
-
end
|
410
|
-
end
|
411
|
-
|
412
|
-
class Mixin < ActiveRecord::Base
|
413
|
-
acts_as_restful_list :scope => :parent_name
|
414
|
-
end
|
415
|
-
end
|
416
|
-
|
417
|
-
after(:all) do
|
418
|
-
Object.send(:remove_const, :Mixin)
|
419
|
-
|
420
|
-
ActiveRecord::Base.connection.tables.each do |table|
|
421
|
-
ActiveRecord::Base.connection.drop_table(table)
|
422
|
-
end
|
423
|
-
end
|
424
|
-
|
425
|
-
it 'should define scope_condition as an instance method' do
|
426
|
-
Mixin.new.should respond_to(:scope_condition)
|
427
|
-
end
|
428
|
-
|
429
|
-
it 'should return a scope condition that limits based on the parent_id' do
|
430
|
-
Mixin.new(:parent_name => 'Brandy').scope_condition.should == "parent_name = 'Brandy'"
|
431
|
-
end
|
432
|
-
end
|
433
|
-
|
434
|
-
|
435
|
-
describe 'declaring acts_as_restful_list and setting the scope to multiple columns' do
|
436
|
-
before(:all) do
|
437
|
-
ActiveRecord::Schema.define(:version => 1) do
|
438
|
-
create_table :mixins do |t|
|
439
|
-
t.column :position, :integer
|
440
|
-
t.column :user_id, :integer
|
441
|
-
t.column :parent_id, :integer
|
442
|
-
t.column :created_at, :datetime
|
443
|
-
t.column :updated_at, :datetime
|
444
|
-
end
|
445
|
-
end
|
446
|
-
|
447
|
-
class Mixin < ActiveRecord::Base
|
448
|
-
acts_as_restful_list :scope => [:parent, :user]
|
449
|
-
end
|
450
|
-
end
|
451
|
-
|
452
|
-
after(:all) do
|
453
|
-
Object.send(:remove_const, :Mixin)
|
454
|
-
|
455
|
-
ActiveRecord::Base.connection.tables.each do |table|
|
456
|
-
ActiveRecord::Base.connection.drop_table(table)
|
457
|
-
end
|
458
|
-
end
|
459
|
-
|
460
|
-
it 'should define scope_condition as an instance method' do
|
461
|
-
Mixin.new.should respond_to(:scope_condition)
|
462
|
-
end
|
463
|
-
|
464
|
-
it 'should return a scope condition that limits based on the parent_id' do
|
465
|
-
Mixin.new(:user_id => 4, :parent_id => 3).scope_condition.should == "parent_id = 3 AND user_id = 4"
|
466
|
-
end
|
467
|
-
|
468
|
-
describe 'reordering on update' do
|
469
|
-
before(:each) do
|
470
|
-
(1..4).each{ Mixin.create!(:parent_id => 1, :user_id => 5) }
|
471
|
-
(1..4).each{ Mixin.create!(:parent_id => 2, :user_id => 5) }
|
472
|
-
(1..4).each{ Mixin.create!(:parent_id => 1, :user_id => 7) }
|
473
|
-
(1..4).each{ Mixin.create!(:parent_id => 2, :user_id => 7) }
|
474
|
-
end
|
475
|
-
|
476
|
-
it 'should automatically reorder the list if a record is updated with a lower position' do
|
477
|
-
user5_parent1_fourth_mixin = Mixin.first( :conditions => { :position => 4, :parent_id => 1, :user_id => 5 } )
|
478
|
-
user5_parent1_fourth_mixin.position = 2
|
479
|
-
user5_parent1_fourth_mixin.save!
|
480
|
-
user5_parent1_fourth_mixin.reload.position.should == 2
|
481
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 5 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
482
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 5 }, :order => 'position ASC').collect(&:id).should == [1,4,2,3]
|
483
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 5 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
484
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 5 }, :order => 'position ASC').collect(&:id).should == [5,6,7,8]
|
485
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 7 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
486
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 7 }, :order => 'position ASC').collect(&:id).should == [9,10,11,12]
|
487
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 7 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
488
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 7 }, :order => 'position ASC').collect(&:id).should == [13,14,15,16]
|
489
|
-
end
|
490
|
-
|
491
|
-
it 'should automatically reorder the list if a record is updated with a higher position' do
|
492
|
-
second_mixin = Mixin.first( :conditions => { :position => 2, :parent_id => 1, :user_id => 5 } )
|
493
|
-
second_mixin.position = 4
|
494
|
-
second_mixin.save!
|
495
|
-
second_mixin.reload.position.should == 4
|
496
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 5 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
497
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 5 }, :order => 'position ASC').collect(&:id).should == [1,3,4,2]
|
498
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 5 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
499
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 5 }, :order => 'position ASC').collect(&:id).should == [5,6,7,8]
|
500
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 7 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
501
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 7 }, :order => 'position ASC').collect(&:id).should == [9,10,11,12]
|
502
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 7 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
503
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 7 }, :order => 'position ASC').collect(&:id).should == [13,14,15,16]
|
504
|
-
end
|
505
|
-
end
|
506
|
-
|
507
|
-
it 'should automatically reorder if the record is deleted' do
|
508
|
-
(1..4).each{ Mixin.create!(:parent_id => 1, :user_id => 5) }
|
509
|
-
(1..4).each{ Mixin.create!(:parent_id => 2, :user_id => 5) }
|
510
|
-
(1..4).each{ Mixin.create!(:parent_id => 1, :user_id => 7) }
|
511
|
-
(1..4).each{ Mixin.create!(:parent_id => 2, :user_id => 7) }
|
512
|
-
second_mixin = Mixin.first( :conditions => { :position => 2, :parent_id => 1, :user_id => 5 } )
|
513
|
-
second_mixin.destroy
|
514
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 5 }, :order => 'position ASC').collect(&:position).should == [1,2,3]
|
515
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 5 }, :order => 'position ASC').collect(&:id).should == [1,3,4]
|
516
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 5 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
517
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 5 }, :order => 'position ASC').collect(&:id).should == [5,6,7,8]
|
518
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 7 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
519
|
-
Mixin.all(:conditions => { :parent_id => 1, :user_id => 7 }, :order => 'position ASC').collect(&:id).should == [9,10,11,12]
|
520
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 7 }, :order => 'position ASC').collect(&:position).should == [1,2,3,4]
|
521
|
-
Mixin.all(:conditions => { :parent_id => 2, :user_id => 7 }, :order => 'position ASC').collect(&:id).should == [13,14,15,16]
|
522
|
-
end
|
523
|
-
end
|
524
|
-
end
|
data/spec/spec.opts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--color
|
data/spec/spec_helper.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
gem 'activerecord', '>= 3'
|
3
|
-
require 'active_record'
|
4
|
-
|
5
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
6
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
|
-
require 'acts_as_restful_list'
|
8
|
-
require 'rspec'
|
9
|
-
require 'rspec/autorun'
|
10
|
-
|
11
|
-
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
12
|
-
|
13
|
-
RSpec.configure do |config|
|
14
|
-
end
|