mongoid-list 0.1.8 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Guardfile CHANGED
@@ -1,12 +1,8 @@
1
- guard 'spork' do
1
+ guard 'spork', wait: 20 do
2
2
  watch('Gemfile')
3
- watch('Gemfile.lock')
4
- watch('test/test_helper.rb')
5
3
  end
6
4
 
7
- guard 'minitest' do
8
- watch(%r|^test/test_(.*)\.rb|)
9
- watch(%r|^test/(.*)_test\.rb|)
10
- watch(%r|^lib/(.*)([^/]+)\.rb|) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
11
- watch(%r|^test/test_helper\.rb|) { "test" }
5
+ guard :rspec, version: 2 do
6
+ watch('spec/spec_helper.rb') { "spec" }
7
+ watch(%r{^spec/.+_spec\.rb})
12
8
  end
data/lib/mongoid/list.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  module Mongoid
2
2
 
3
+ Fields.option :scope do |model, field, value|
4
+
5
+ end
6
+
3
7
  module List
4
8
 
5
9
  extend ActiveSupport::Concern
@@ -18,7 +22,7 @@ module Mongoid
18
22
  before_destroy :mark_for_removal_processing_from_list
19
23
  after_destroy :update_positions_in_list!, if: :_process_list_change
20
24
 
21
- scope :ordered, order_by: :position.asc
25
+ scope :ordered, asc(:position)
22
26
  end
23
27
 
24
28
 
@@ -9,7 +9,7 @@ module Mongoid
9
9
  def update_positions!(klass, elements)
10
10
  elements.each_with_index do |element, idx|
11
11
  id = element.kind_of?(Hash) ? element['id'] : element
12
- klass.collection.update({ _id: id }, { '$set' => { position: (idx + 1) } })
12
+ klass.collection.find({ _id: id }).update({ '$set' => { position: (idx + 1) } })
13
13
  end
14
14
  end
15
15
 
@@ -17,10 +17,8 @@ module Mongoid
17
17
 
18
18
 
19
19
  def update_positions!
20
- obj.class.collection.update(
21
- criteria,
22
- { '$inc' => { position: changes[:by] } },
23
- multi: true
20
+ obj.class.collection.find(criteria).update_all(
21
+ { '$inc' => { position: changes[:by] } }
24
22
  )
25
23
  end
26
24
 
@@ -8,8 +8,7 @@ module Mongoid
8
8
 
9
9
  def update_positions!(binding, elements)
10
10
  load_list_elements(binding, elements).each_with_index do |element, idx|
11
- (binding.base._parent || binding.base).collection.update(
12
- element.atomic_selector,
11
+ (binding.base._parent || binding.base).collection.find(element.atomic_selector).update(
13
12
  { "$set" => { "#{element.atomic_path}.$.position" => (idx+1) } }
14
13
  )
15
14
  end
@@ -32,7 +31,7 @@ module Mongoid
32
31
  next unless should_operate_on_item?(item)
33
32
  criteria = item.atomic_selector
34
33
  updates = { '$inc' => { "#{item.atomic_path}.$.position" => changes[:by] } }
35
- item._root.class.collection.update(criteria, updates)
34
+ item._root.class.collection.find(criteria).update(updates)
36
35
  end
37
36
  end
38
37
 
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module List
3
- VERSION = "0.1.8"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
data/mongoid-list.gemspec CHANGED
@@ -13,20 +13,20 @@ Gem::Specification.new do |s|
13
13
  s.summary = 'Simple list behavior for Mongoid'
14
14
  s.homepage = 'https://github.com/davekrupinski/mongoid-list'
15
15
 
16
- s.add_dependency('mongoid', [ '>= 2.4.0' ])
17
-
18
- s.add_development_dependency('bson_ext')
19
- s.add_development_dependency('minitest', [ '>= 2.11.0' ])
20
- s.add_development_dependency('mini_shoulda', [ '>= 0.4.0' ])
21
- s.add_development_dependency('spork', [ '>= 1.0.0.rc' ])
22
- s.add_development_dependency('spork-testunit', [ '>= 0.0.8' ])
23
- s.add_development_dependency('guard-minitest', [ '>= 0.5.0' ])
24
- s.add_development_dependency('guard-spork', [ '>= 0.5.2' ])
25
- s.add_development_dependency('turn', [ '>= 0.9.4' ])
26
-
27
16
  s.files = `git ls-files`.split("\n")
28
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
29
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
30
19
  s.require_paths = ["lib"]
31
20
 
21
+ s.add_dependency('mongoid', [ '>= 3.0.0' ])
22
+
23
+ s.add_development_dependency('rspec', [ '>= 2.13.0' ])
24
+ s.add_development_dependency('guard', [ '>= 1.8.0' ])
25
+ s.add_development_dependency('guard-rspec', [ '>= 2.5.0' ])
26
+ s.add_development_dependency('guard-spork', [ '>= 1.5.0' ])
27
+ s.add_development_dependency('listen', [ '>= 1.0.0' ])
28
+ s.add_development_dependency('database_cleaner', [ '~> 0.9.0 ' ])
29
+
30
+ s.add_development_dependency('rspecify')
31
+
32
32
  end
data/mongoid.yml ADDED
@@ -0,0 +1,12 @@
1
+ test:
2
+ sessions:
3
+ default:
4
+ database: mongoid-list_test
5
+ hosts:
6
+ - localhost:27017
7
+ options:
8
+ consistency: :strong
9
+ # In the test environment we lower the retries and retry interval to
10
+ # low amounts for fast failures.
11
+ max_retries: 1
12
+ retry_interval: 0
@@ -0,0 +1,147 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::List::Collection do
4
+
5
+ describe "#initialization" do
6
+
7
+ let(:simple) do
8
+ Simple.create
9
+ end
10
+
11
+ let(:collection) do
12
+ Mongoid::List::Collection.new(simple)
13
+ end
14
+
15
+ it "should assign simple to :obj" do
16
+ collection.obj.should eq simple
17
+ end
18
+
19
+ end
20
+
21
+
22
+ describe "#count" do
23
+
24
+ context "when unscoped" do
25
+ let(:collection) do
26
+ Mongoid::List::Collection.new(Simple.new)
27
+ end
28
+
29
+ before do
30
+ 5.times do
31
+ Simple.create
32
+ end
33
+ end
34
+
35
+ it "should be 5" do
36
+ collection.count.should eq 5
37
+ end
38
+
39
+ end
40
+
41
+ context "when scoped" do
42
+
43
+ before do
44
+ 4.times do
45
+ Scoped.create(group: "airplane 1")
46
+ end
47
+
48
+ 3.times do
49
+ Scoped.create(group: "airplane 2")
50
+ end
51
+
52
+ end
53
+
54
+ context "group 1" do
55
+
56
+ let(:collection) do
57
+ Mongoid::List::Collection.new(Scoped.new(group: "airplane 1"))
58
+ end
59
+
60
+ it "should be 4" do
61
+ collection.count.should eq 4
62
+ end
63
+
64
+ end
65
+
66
+ context "group 2" do
67
+
68
+ let(:collection) do
69
+ Mongoid::List::Collection.new(Scoped.new(group: "airplane 2"))
70
+ end
71
+
72
+ it "should be 3" do
73
+ collection.count.should eq 3
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+
82
+
83
+ describe "#update_positions_in_list!" do
84
+
85
+ context "unscoped" do
86
+
87
+ let!(:obj1) { Simple.create }
88
+ let!(:obj2) { Simple.create }
89
+ let!(:obj3) { Simple.create }
90
+
91
+ before do
92
+ Simple.update_positions_in_list!([obj2.id, obj1.id, obj3.id])
93
+ end
94
+
95
+ it "should change obj1 from :position of 1 to 2" do
96
+ obj1.position.should eq 1
97
+ obj1.reload.position.should eq 2
98
+ end
99
+
100
+ it "should change obj2 from :position of 2 to 1" do
101
+ obj2.position.should eq 2
102
+ obj2.reload.position.should eq 1
103
+ end
104
+
105
+ it "should not change obj3 from :position of 3" do
106
+ obj3.position.should eq 3
107
+ obj3.reload.position.should eq 3
108
+ end
109
+
110
+ end
111
+
112
+ context "scoped" do
113
+
114
+ let!(:obj1) { Scoped.create(group: "hell's angels") }
115
+ let!(:obj2) { Scoped.create(group: "hell's angels") }
116
+ let!(:obj3) { Scoped.create(group: "hell's angels") }
117
+ let!(:other) { Scoped.create(group: "charlie's angels") }
118
+
119
+ before do
120
+ Scoped.update_positions_in_list!([obj3.id, obj2.id, obj1.id])
121
+ end
122
+
123
+ it "should change obj1 from :position of 1 to 3" do
124
+ obj1.position.should eq 1
125
+ obj1.reload.position.should eq 3
126
+ end
127
+
128
+ it "should not change obj2 from :position of 2" do
129
+ obj2.position.should eq 2
130
+ obj2.reload.position.should eq 2
131
+ end
132
+
133
+ it "should change obj3 from :position of 3 to 1" do
134
+ obj3.position.should eq 3
135
+ obj3.reload.position.should eq 1
136
+ end
137
+
138
+ it "should not have touched other scoped" do
139
+ other.position.should eq 1
140
+ other.reload.position.should eq 1
141
+ end
142
+
143
+ end
144
+
145
+ end
146
+
147
+ end
@@ -0,0 +1,181 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::List::Embedded do
4
+
5
+ describe "#initialization" do
6
+
7
+ let(:container) do
8
+ Container.create
9
+ end
10
+
11
+ let(:item) do
12
+ container.items.create
13
+ end
14
+
15
+ let(:embedded) do
16
+ Mongoid::List::Embedded.new(item)
17
+ end
18
+
19
+ it "should assign item to :obj" do
20
+ embedded.obj.should eq item
21
+ end
22
+
23
+ end
24
+
25
+
26
+ describe "#count" do
27
+
28
+ context "when unscoped" do
29
+
30
+ let(:container) do
31
+ Container.create!
32
+ end
33
+
34
+ let(:container2) do
35
+ Container.create!
36
+ end
37
+
38
+ let(:item) do
39
+ container.items.build
40
+ end
41
+
42
+ let(:embedded) do
43
+ Mongoid::List::Embedded.new(item)
44
+ end
45
+
46
+ before do
47
+ 3.times do
48
+ container.items.create!
49
+ end
50
+ 2.times do
51
+ container2.items.create!
52
+ end
53
+ end
54
+
55
+ it "should be 3" do
56
+ embedded.count.should eq 3
57
+ end
58
+
59
+ end
60
+
61
+ context "when scoped" do
62
+
63
+ let(:container) do
64
+ Container.create!
65
+ end
66
+
67
+ before do
68
+ 3.times do
69
+ container.scoped_items.create!(group: "alien")
70
+ end
71
+ 2.times do
72
+ container.scoped_items.create!(group: "aliens")
73
+ end
74
+ end
75
+
76
+ context "group 1" do
77
+
78
+ let(:item) do
79
+ container.scoped_items.build(group: "alien")
80
+ end
81
+
82
+ let(:embedded) do
83
+ Mongoid::List::Embedded.new(item)
84
+ end
85
+
86
+ it "should be 3" do
87
+ embedded.count.should eq 3
88
+ end
89
+
90
+ end
91
+
92
+ context "group 2" do
93
+
94
+ let(:item) do
95
+ container.scoped_items.build(group: "aliens")
96
+ end
97
+
98
+ let(:embedded) do
99
+ Mongoid::List::Embedded.new(item)
100
+ end
101
+
102
+ it "should be 2" do
103
+ embedded.count.should eq 2
104
+ end
105
+
106
+ end
107
+
108
+ end
109
+
110
+ end
111
+
112
+
113
+ describe "#update_positions_in_list!" do
114
+
115
+ let(:container) do
116
+ Container.create!
117
+ end
118
+
119
+ context "unscoped" do
120
+
121
+ let!(:obj1) { container.items.create! }
122
+ let!(:obj2) { container.items.create! }
123
+ let!(:obj3) { container.items.create! }
124
+
125
+ before do
126
+ container.items.update_positions_in_list!([obj2.id, obj1.id, obj3.id])
127
+ end
128
+
129
+ it "should change obj1 from :position of 1 to 2" do
130
+ obj1.position.should eq 1
131
+ obj1.reload.position.should eq 2
132
+ end
133
+
134
+ it "should change obj2 from :position of 2 to 1" do
135
+ obj2.position.should eq 2
136
+ obj2.reload.position.should eq 1
137
+ end
138
+
139
+ it "should not change obj3 from :position of 3" do
140
+ obj3.position.should eq 3
141
+ obj3.reload.position.should eq 3
142
+ end
143
+
144
+ end
145
+
146
+ context "scoped" do
147
+
148
+ let!(:obj1) { container.scoped_items.create!(group: "hell's angels") }
149
+ let!(:obj2) { container.scoped_items.create!(group: "hell's angels") }
150
+ let!(:obj3) { container.scoped_items.create!(group: "hell's angels") }
151
+ let!(:other) { container.scoped_items.create!(group: "charlie's angels") }
152
+
153
+ before do
154
+ container.scoped_items.update_positions_in_list!([obj3.id, obj2.id, obj1.id])
155
+ end
156
+
157
+ it "should change obj1 from :position of 1 to 3" do
158
+ obj1.position.should eq 1
159
+ obj1.reload.position.should eq 3
160
+ end
161
+
162
+ it "should not change obj2 from :position of 2" do
163
+ obj2.position.should eq 2
164
+ obj2.reload.position.should eq 2
165
+ end
166
+
167
+ it "should change obj3 from :position of 3 to 1" do
168
+ obj3.position.should eq 3
169
+ obj3.reload.position.should eq 1
170
+ end
171
+
172
+ it "should not have touched other scoped" do
173
+ other.position.should eq 1
174
+ other.reload.position.should eq 1
175
+ end
176
+
177
+ end
178
+
179
+ end
180
+
181
+ end