mongoid-list 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mongoid-list.rb CHANGED
@@ -1 +1,2 @@
1
- require 'mongoid/list'
1
+ require 'mongoid/list'
2
+ require 'mongoid/relations/embedded/many_list_extension'
data/lib/mongoid/list.rb CHANGED
@@ -26,12 +26,8 @@ module Mongoid
26
26
 
27
27
  module ClassMethods
28
28
 
29
- def update_positions_in_list!(elements)
30
- return false if elements.size < count
31
- elements.each_with_index do |element, idx|
32
- id = element.kind_of?(Hash) ? element['id'] : element
33
- self.collection.update({ id: id }, { '$set' => { position: (idx + 1) } })
34
- end
29
+ def update_positions_in_list!(elements, binding=nil)
30
+ embedded? ? Embedded.update_positions!(binding, elements) : Collection.update_positions!(self, elements)
35
31
  end
36
32
 
37
33
  end
@@ -4,6 +4,27 @@ module Mongoid
4
4
  module List
5
5
  class Collection < Abstract
6
6
 
7
+ class << self
8
+
9
+ def update_positions!(klass, elements)
10
+ load_list_elements(klass, elements).each_with_index do |element, idx|
11
+ klass.collection.update({ _id: element.id }, { '$set' => { position: (idx + 1) } })
12
+ end
13
+ # return false if elements.size < klass.count
14
+ end
15
+
16
+ private
17
+
18
+ def load_list_elements(klass, elements)
19
+ elements.collect do |element|
20
+ id = element.kind_of?(Hash) ? element['id'] : element
21
+ klass.find(id)
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+
7
28
  def update_positions!
8
29
  obj.class.collection.update(
9
30
  criteria,
@@ -4,6 +4,29 @@ module Mongoid
4
4
  module List
5
5
  class Embedded < Abstract
6
6
 
7
+ class << self
8
+
9
+ def update_positions!(binding, elements)
10
+ load_list_elements(binding, elements).each_with_index do |element, idx|
11
+ binding.base.collection.update(
12
+ { "#{binding.metadata.key}._id" => element.id },
13
+ { "$set" => { "#{binding.metadata.key}.$.position" => (idx+1) } }
14
+ )
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def load_list_elements(binding, elements)
21
+ elements.collect do |element|
22
+ id = element.kind_of?(Hash) ? element['id'] : element
23
+ binding.base.send(binding.metadata.key).find(id)
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+
7
30
  def update_positions!
8
31
  items.each do |item|
9
32
  next unless should_operate_on_item?(item)
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module List
3
- VERSION = "0.1.3"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
@@ -0,0 +1,7 @@
1
+ Mongoid::Relations::Embedded::Many.class_eval do
2
+
3
+ def update_positions_in_list!(elements)
4
+ klass.update_positions_in_list!(elements, binding)
5
+ end
6
+
7
+ end
@@ -75,4 +75,67 @@ describe Mongoid::List::Collection do
75
75
  end
76
76
 
77
77
 
78
+ describe "#update_positions_in_list!" do
79
+
80
+ context "unscoped" do
81
+
82
+ setup do
83
+ @obj1 = Simple.create
84
+ @obj2 = Simple.create
85
+ @obj3 = Simple.create
86
+ Simple.update_positions_in_list!([ @obj2.id, @obj1.id, @obj3.id ])
87
+ end
88
+
89
+ should "change @obj1 from :position of 1 to 2" do
90
+ assert_equal 1, @obj1.position
91
+ assert_equal 2, @obj1.reload.position
92
+ end
93
+
94
+ should "change @obj2 from :position of 2 to 1" do
95
+ assert_equal 2, @obj2.position
96
+ assert_equal 1, @obj2.reload.position
97
+ end
98
+
99
+ should "not change @obj3 from :position of 3" do
100
+ assert_equal 3, @obj3.position
101
+ assert_equal 3, @obj3.reload.position
102
+ end
103
+
104
+ end
105
+
106
+ context "scoped" do
107
+
108
+ setup do
109
+ @obj1 = Scoped.create(group: "hell's angels")
110
+ @obj2 = Scoped.create(group: "hell's angels")
111
+ @obj3 = Scoped.create(group: "hell's angels")
112
+ @other = Scoped.create(group: "charlie's angels")
113
+
114
+ Scoped.update_positions_in_list!([ @obj3.id, @obj2.id, @obj1.id ])
115
+ end
116
+
117
+ should "change @obj1 from :position of 1 to 3" do
118
+ assert_equal 1, @obj1.position
119
+ assert_equal 3, @obj1.reload.position
120
+ end
121
+
122
+ should "not change @obj2 from :position of 2" do
123
+ assert_equal 2, @obj2.position
124
+ assert_equal 2, @obj2.reload.position
125
+ end
126
+
127
+ should "change @obj3 from :position of 3 to 1" do
128
+ assert_equal 3, @obj3.position
129
+ assert_equal 1, @obj3.reload.position
130
+ end
131
+
132
+ should "not have touched @other scoped" do
133
+ assert_equal 1, @other.position
134
+ assert_equal 1, @other.reload.position
135
+ end
136
+
137
+ end
138
+
139
+ end
140
+
78
141
  end
@@ -104,4 +104,71 @@ describe Mongoid::List::Embedded do
104
104
  end
105
105
 
106
106
 
107
+ describe "#update_positions_in_list!" do
108
+
109
+ let :container do
110
+ Container.create!
111
+ end
112
+
113
+ context "unscoped" do
114
+
115
+ setup do
116
+ @obj1 = container.items.create!
117
+ @obj2 = container.items.create!
118
+ @obj3 = container.items.create!
119
+ container.items.update_positions_in_list!([ @obj2.id, @obj1.id, @obj3.id ])
120
+ end
121
+
122
+ should "change @obj1 from :position of 1 to 2" do
123
+ assert_equal 1, @obj1.position
124
+ assert_equal 2, @obj1.reload.position
125
+ end
126
+
127
+ should "change @obj2 from :position of 2 to 1" do
128
+ assert_equal 2, @obj2.position
129
+ assert_equal 1, @obj2.reload.position
130
+ end
131
+
132
+ should "not change @obj3 from :position of 3" do
133
+ assert_equal 3, @obj3.position
134
+ assert_equal 3, @obj3.reload.position
135
+ end
136
+
137
+ end
138
+
139
+ context "scoped" do
140
+
141
+ setup do
142
+ @obj1 = container.scoped_items.create!(group: "hell's angels")
143
+ @obj2 = container.scoped_items.create!(group: "hell's angels")
144
+ @obj3 = container.scoped_items.create!(group: "hell's angels")
145
+ @other = container.scoped_items.create!(group: "charlie's angels")
146
+
147
+ container.scoped_items.update_positions_in_list!([ @obj3.id, @obj2.id, @obj1.id ])
148
+ end
149
+
150
+ should "change @obj1 from :position of 1 to 3" do
151
+ assert_equal 1, @obj1.position
152
+ assert_equal 3, @obj1.reload.position
153
+ end
154
+
155
+ should "not change @obj2 from :position of 2" do
156
+ assert_equal 2, @obj2.position
157
+ assert_equal 2, @obj2.reload.position
158
+ end
159
+
160
+ should "change @obj3 from :position of 3 to 1" do
161
+ assert_equal 3, @obj3.position
162
+ assert_equal 1, @obj3.reload.position
163
+ end
164
+
165
+ should "not have touched @other scoped" do
166
+ assert_equal 1, @other.position
167
+ assert_equal 1, @other.reload.position
168
+ end
169
+
170
+ end
171
+
172
+ end
173
+
107
174
  end
@@ -683,6 +683,59 @@ describe Mongoid::List do
683
683
 
684
684
  end
685
685
 
686
+ end
687
+
688
+
689
+
690
+ describe "#update_positions_in_list!" do
691
+
692
+ context "on a Collection" do
693
+
694
+ setup do
695
+ @obj1 = Simple.create
696
+ @obj2 = Simple.create
697
+ @obj3 = Simple.create
698
+ Simple.update_positions_in_list!([ @obj2.id, @obj1.id, @obj3.id ])
699
+ end
700
+
701
+ should "change @obj1 from :position of 1 to 2" do
702
+ assert_equal 1, @obj1.position
703
+ assert_equal 2, @obj1.reload.position
704
+ end
705
+
706
+ should "change @obj2 from :position of 2 to 1" do
707
+ assert_equal 2, @obj2.position
708
+ assert_equal 1, @obj2.reload.position
709
+ end
710
+
711
+ should "not change @obj3 from :position of 3" do
712
+ assert_equal 3, @obj3.position
713
+ assert_equal 3, @obj3.reload.position
714
+ end
715
+
716
+ end
717
+
718
+ context "on an Embedded Collection" do
719
+
720
+ let :container do
721
+ Container.create!
722
+ end
723
+
724
+ setup do
725
+ @obj1 = container.items.create!
726
+ @obj2 = container.items.create!
727
+ @obj3 = container.items.create!
728
+ @obj4 = container.items.create!
729
+ container.items.update_positions_in_list!([ @obj2.id, @obj1.id, @obj4.id, @obj3.id ])
730
+ end
731
+
732
+ should "change @obj1 from :position of 1 to 2" do
733
+ assert_equal 1, @obj1.position
734
+ assert_equal 2, @obj1.reload.position
735
+ end
736
+
737
+ end
686
738
 
687
739
  end
740
+
688
741
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-list
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-10-28 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mongoid
16
- requirement: &2164486340 !ruby/object:Gem::Requirement
16
+ requirement: &2153443220 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2164486340
24
+ version_requirements: *2153443220
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bson_ext
27
- requirement: &2164485920 !ruby/object:Gem::Requirement
27
+ requirement: &2153442720 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2164485920
35
+ version_requirements: *2153442720
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: minitest
38
- requirement: &2164485360 !ruby/object:Gem::Requirement
38
+ requirement: &2153441880 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.7.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2164485360
46
+ version_requirements: *2153441880
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: mini_shoulda
49
- requirement: &2164484820 !ruby/object:Gem::Requirement
49
+ requirement: &2153440960 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.4.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2164484820
57
+ version_requirements: *2153440960
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: spork
60
- requirement: &2164484300 !ruby/object:Gem::Requirement
60
+ requirement: &2153440480 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.9.0.rc
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2164484300
68
+ version_requirements: *2153440480
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: spork-testunit
71
- requirement: &2164483660 !ruby/object:Gem::Requirement
71
+ requirement: &2153431480 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.0.6
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2164483660
79
+ version_requirements: *2153431480
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: guard-minitest
82
- requirement: &2164483040 !ruby/object:Gem::Requirement
82
+ requirement: &2153431000 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.4.0
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2164483040
90
+ version_requirements: *2153431000
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: guard-spork
93
- requirement: &2164482400 !ruby/object:Gem::Requirement
93
+ requirement: &2153430500 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.3.1
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2164482400
101
+ version_requirements: *2153430500
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: turn
104
- requirement: &2164481620 !ruby/object:Gem::Requirement
104
+ requirement: &2153430020 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: 0.8.3
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *2164481620
112
+ version_requirements: *2153430020
113
113
  description:
114
114
  email: dave@davekrupinski.com
115
115
  executables: []
@@ -129,6 +129,7 @@ files:
129
129
  - lib/mongoid/list/collection.rb
130
130
  - lib/mongoid/list/embedded.rb
131
131
  - lib/mongoid/list/version.rb
132
+ - lib/mongoid/relations/embedded/many_list_extension.rb
132
133
  - mongoid-list.gemspec
133
134
  - test/mongoid/list/collection_test.rb
134
135
  - test/mongoid/list/embedded_test.rb