voteable_mongoid 0.4.3 → 0.4.4
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/.watchr +23 -0
- data/lib/voteable_mongoid.rb +4 -2
- data/lib/voteable_mongoid/railties/database.rake +10 -0
- data/lib/voteable_mongoid/version.rb +1 -1
- data/lib/{mongoid → voteable_mongoid}/voteable.rb +92 -76
- data/lib/voteable_mongoid/voteable/stats.rb +104 -0
- data/lib/{mongoid → voteable_mongoid}/voter.rb +0 -0
- data/spec/models/comment.rb +1 -1
- data/spec/{voteable_spec.rb → voteable_mongoid/voteable_spec.rb} +88 -5
- data/spec/{voter_spec.rb → voteable_mongoid/voter_spec.rb} +0 -0
- data/voteable_mongoid.gemspec +2 -1
- metadata +26 -10
data/.watchr
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# vim:set filetype=ruby:
|
2
|
+
def run(cmd)
|
3
|
+
puts cmd
|
4
|
+
system cmd
|
5
|
+
end
|
6
|
+
|
7
|
+
def spec(file)
|
8
|
+
if File.exists?(file)
|
9
|
+
run("rspec #{file}")
|
10
|
+
else
|
11
|
+
puts("Spec: #{file} does not exist.")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
watch("spec/.*/*_spec\.rb") do |match|
|
16
|
+
puts(match[0])
|
17
|
+
spec(match[0])
|
18
|
+
end
|
19
|
+
|
20
|
+
watch("lib/(.*/.*)\.rb") do |match|
|
21
|
+
puts(match[1])
|
22
|
+
spec("spec/#{match[1]}_spec.rb")
|
23
|
+
end
|
data/lib/voteable_mongoid.rb
CHANGED
@@ -3,17 +3,23 @@ module Mongoid
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
# How many points should be assigned for each up or down vote.
|
6
|
-
# This hash should
|
6
|
+
# This hash should manipulated using Voteable.vote_point method
|
7
7
|
VOTE_POINT = {}
|
8
8
|
|
9
9
|
included do
|
10
|
-
|
11
|
-
index "voteable.votes_point"
|
12
|
-
|
13
|
-
scope :most_voted, order_by(["voteable.votes_count", :desc])
|
14
|
-
scope :best_voted, order_by(["voteable.votes_point", :desc])
|
10
|
+
include Mongoid::Voteable::Stats
|
15
11
|
|
12
|
+
def self.voteable_related
|
13
|
+
foreign_keys = relations.values.map{ |meta| meta.try(:foreign_key) }.compact
|
14
|
+
only(foreign_keys + %w[voteable])
|
15
|
+
end
|
16
|
+
|
16
17
|
# Set vote point for each up (down) vote on an object of this class
|
18
|
+
#
|
19
|
+
# @param [Hash] options a hash containings:
|
20
|
+
#
|
21
|
+
# vote_point self, :up => +1, :down => -3
|
22
|
+
# vote_point Post, :up => +2, :down => -1, :update_counters => false
|
17
23
|
def self.vote_point(klass = self, options = nil)
|
18
24
|
VOTE_POINT[self.name] ||= {}
|
19
25
|
VOTE_POINT[self.name][klass.name] ||= options
|
@@ -48,52 +54,61 @@ module Mongoid
|
|
48
54
|
|
49
55
|
if options[:revote]
|
50
56
|
if value == :up
|
51
|
-
|
52
|
-
|
57
|
+
positive_voter_ids = 'voteable.up_voter_ids'
|
58
|
+
negative_voter_ids = 'voteable.down_voter_ids'
|
59
|
+
positive_votes_count = 'voteable.up_votes_count'
|
60
|
+
negative_votes_count = 'voteable.down_votes_count'
|
53
61
|
point_delta = value_point[:up] - value_point[:down]
|
54
62
|
else
|
55
|
-
|
56
|
-
|
63
|
+
positive_voter_ids = 'voteable.down_voter_ids'
|
64
|
+
negative_voter_ids = 'voteable.up_voter_ids'
|
65
|
+
positive_votes_count = 'voteable.down_votes_count'
|
66
|
+
negative_votes_count = 'voteable.up_votes_count'
|
57
67
|
point_delta = -value_point[:up] + value_point[:down]
|
58
68
|
end
|
59
69
|
|
60
70
|
update_result = collection.update({
|
61
71
|
# Validate voter_id did a vote with value for votee_id
|
62
72
|
:_id => votee_id,
|
63
|
-
|
64
|
-
|
73
|
+
positive_voter_ids => { '$ne' => voter_id },
|
74
|
+
negative_voter_ids => voter_id
|
65
75
|
}, {
|
66
76
|
# then update
|
67
|
-
'$pull' => {
|
68
|
-
'$push' => {
|
77
|
+
'$pull' => { negative_voter_ids => voter_id },
|
78
|
+
'$push' => { positive_voter_ids => voter_id },
|
69
79
|
'$inc' => {
|
70
|
-
|
80
|
+
positive_votes_count => +1,
|
81
|
+
negative_votes_count => -1,
|
82
|
+
'voteable.votes_point' => point_delta
|
71
83
|
}
|
72
84
|
}, {
|
73
85
|
:safe => true
|
74
86
|
})
|
75
87
|
|
76
88
|
elsif options[:unvote]
|
77
|
-
if value == :
|
78
|
-
|
79
|
-
|
89
|
+
if value == :up
|
90
|
+
positive_voter_ids = 'voteable.up_voter_ids'
|
91
|
+
negative_voter_ids = 'voteable.down_voter_ids'
|
92
|
+
positive_votes_count = 'voteable.up_votes_count'
|
80
93
|
else
|
81
|
-
|
82
|
-
|
94
|
+
positive_voter_ids = 'voteable.down_voter_ids'
|
95
|
+
negative_voter_ids = 'voteable.up_voter_ids'
|
96
|
+
positive_votes_count = 'voteable.down_votes_count'
|
83
97
|
end
|
84
98
|
|
85
99
|
# Check if voter_id did a vote with value for votee_id
|
86
100
|
update_result = collection.update({
|
87
101
|
# Validate voter_id did a vote with value for votee_id
|
88
102
|
:_id => votee_id,
|
89
|
-
|
90
|
-
|
103
|
+
negative_voter_ids => { '$ne' => voter_id },
|
104
|
+
positive_voter_ids => voter_id
|
91
105
|
}, {
|
92
106
|
# then update
|
93
|
-
'$pull' => {
|
107
|
+
'$pull' => { positive_voter_ids => voter_id },
|
94
108
|
'$inc' => {
|
95
|
-
|
96
|
-
|
109
|
+
positive_votes_count => -1,
|
110
|
+
'voteable.votes_count' => -1,
|
111
|
+
'voteable.votes_point' => -value_point[value]
|
97
112
|
}
|
98
113
|
}, {
|
99
114
|
:safe => true
|
@@ -101,22 +116,25 @@ module Mongoid
|
|
101
116
|
|
102
117
|
else # new vote
|
103
118
|
if value.to_sym == :up
|
104
|
-
|
119
|
+
positive_voter_ids = 'voteable.up_voter_ids'
|
120
|
+
positive_votes_count = 'voteable.up_votes_count'
|
105
121
|
else
|
106
|
-
|
122
|
+
positive_voter_ids = 'voteable.down_voter_ids'
|
123
|
+
positive_votes_count = 'voteable.down_votes_count'
|
107
124
|
end
|
108
125
|
|
109
126
|
update_result = collection.update({
|
110
127
|
# Validate voter_id did not vote for votee_id yet
|
111
128
|
:_id => votee_id,
|
112
|
-
|
113
|
-
|
129
|
+
'voteable.up_voter_ids' => { '$ne' => voter_id },
|
130
|
+
'voteable.down_voter_ids' => { '$ne' => voter_id }
|
114
131
|
}, {
|
115
132
|
# then update
|
116
|
-
'$push' => {
|
133
|
+
'$push' => { positive_voter_ids => voter_id },
|
117
134
|
'$inc' => {
|
118
|
-
|
119
|
-
|
135
|
+
'voteable.votes_count' => +1,
|
136
|
+
positive_votes_count => +1,
|
137
|
+
'voteable.votes_point' => value_point[value] }
|
120
138
|
}, {
|
121
139
|
:safe => true
|
122
140
|
})
|
@@ -131,27 +149,46 @@ module Mongoid
|
|
131
149
|
VOTE_POINT[klass].each do |class_name, value_point|
|
132
150
|
# For other class in VOTE_POINT options, if is parent of current class
|
133
151
|
next unless relation_metadata = relations[class_name.underscore]
|
134
|
-
votee ||= options[:votee] ||
|
152
|
+
next unless votee ||= options[:votee] || voteable_related.where(:id => options[:votee_id]).first
|
135
153
|
# If can find current votee foreign_key value for that class
|
136
|
-
next unless foreign_key_value = votee.read_attribute(relation_metadata.foreign_key
|
154
|
+
next unless foreign_key_value = votee.read_attribute(relation_metadata.foreign_key)
|
137
155
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
156
|
+
inc_options = {}
|
157
|
+
|
158
|
+
if options[:revote]
|
159
|
+
if value == :up
|
160
|
+
inc_options['voteable.votes_point'] = value_point[:up] - value_point[:down]
|
161
|
+
unless value_point[:update_counters] == false
|
162
|
+
inc_options['voteable.up_votes_count'] = +1
|
163
|
+
inc_options['voteable.down_votes_count'] = -1
|
164
|
+
end
|
165
|
+
else
|
166
|
+
inc_options['voteable.votes_point'] = -value_point[:up] + value_point[:down]
|
167
|
+
unless value_point[:update_counters] == false
|
168
|
+
inc_options['voteable.up_votes_count'] = -1
|
169
|
+
inc_options['voteable.down_votes_count'] = +1
|
170
|
+
end
|
171
|
+
end
|
145
172
|
elsif options[:unvote]
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
173
|
+
inc_options['voteable.votes_point'] = -value_point[value]
|
174
|
+
unless value_point[:update_counters] == false
|
175
|
+
inc_options['voteable.votes_count'] = -1
|
176
|
+
if value == :up
|
177
|
+
inc_options['voteable.up_votes_count'] = -1
|
178
|
+
else
|
179
|
+
inc_options['voteable.down_votes_count'] = -1
|
180
|
+
end
|
181
|
+
end
|
182
|
+
else # new vote
|
183
|
+
inc_options['voteable.votes_point'] = value_point[value]
|
184
|
+
unless value_point[:update_counters] == false
|
185
|
+
inc_options['voteable.votes_count'] = 1
|
186
|
+
if value == :up
|
187
|
+
inc_options['voteable.up_votes_count'] = 1
|
188
|
+
else
|
189
|
+
inc_options['voteable.down_votes_count'] = 1
|
190
|
+
end
|
191
|
+
end
|
155
192
|
end
|
156
193
|
|
157
194
|
class_name.constantize.collection.update(
|
@@ -160,8 +197,7 @@ module Mongoid
|
|
160
197
|
)
|
161
198
|
end
|
162
199
|
end
|
163
|
-
|
164
|
-
successed
|
200
|
+
true
|
165
201
|
end
|
166
202
|
|
167
203
|
end
|
@@ -193,26 +229,6 @@ module Mongoid
|
|
193
229
|
return :down if down_voter_ids.include?(voter_id)
|
194
230
|
end
|
195
231
|
|
196
|
-
# Get the number of up votes
|
197
|
-
def up_votes_count
|
198
|
-
up_voter_ids.length
|
199
|
-
end
|
200
|
-
|
201
|
-
# Get the number of down votes
|
202
|
-
def down_votes_count
|
203
|
-
down_voter_ids.length
|
204
|
-
end
|
205
|
-
|
206
|
-
# Get the number of votes count
|
207
|
-
def votes_count
|
208
|
-
voteable.try(:[], 'votes_count') || 0
|
209
|
-
end
|
210
|
-
|
211
|
-
# Get the votes point
|
212
|
-
def votes_point
|
213
|
-
voteable.try(:[], 'votes_point') || 0
|
214
|
-
end
|
215
|
-
|
216
232
|
# Array of up voter ids
|
217
233
|
def up_voter_ids
|
218
234
|
voteable.try(:[], 'up_voter_ids') || []
|
@@ -222,10 +238,10 @@ module Mongoid
|
|
222
238
|
def down_voter_ids
|
223
239
|
voteable.try(:[], 'down_voter_ids') || []
|
224
240
|
end
|
241
|
+
|
242
|
+
def voteable
|
243
|
+
read_attribute('voteable')
|
244
|
+
end
|
225
245
|
|
226
|
-
private
|
227
|
-
def voteable
|
228
|
-
read_attribute('voteable')
|
229
|
-
end
|
230
246
|
end
|
231
247
|
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Voteable
|
3
|
+
module Stats
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
index 'voteable.up_votes_count'
|
8
|
+
index 'voteable.down_votes_count'
|
9
|
+
index 'voteable.votes_count'
|
10
|
+
index 'voteable.votes_point'
|
11
|
+
|
12
|
+
scope :most_up_voted, order_by(['voteable.up_votes_count', :desc])
|
13
|
+
scope :most_down_voted, order_by(['voteable.down_votes_count', :desc])
|
14
|
+
scope :most_voted, order_by(['voteable.votes_count', :desc])
|
15
|
+
scope :best_voted, order_by(['voteable.votes_point', :desc])
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.remake_stats
|
19
|
+
Mongoid::Voteable::VOTE_POINT.each do |class_name, value_point|
|
20
|
+
klass = class_name.constantize
|
21
|
+
klass_value_point = value_point[class_name]
|
22
|
+
klass.voteable_related.each{ |doc|
|
23
|
+
doc.remake_stats(klass_value_point)
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
VOTE_POINT.each do |class_name, value_point|
|
28
|
+
klass = class_name.constantize
|
29
|
+
value_point.each do |parent_class_name, parent_value_point|
|
30
|
+
relation_metadata = klass.relations[parent_class_name.underscore]
|
31
|
+
if relation_metadata
|
32
|
+
parent_class = parent_class_name.constantize
|
33
|
+
foreign_key = relation_metadata.foreign_key
|
34
|
+
klass.voteable_related.each{ |doc|
|
35
|
+
doc.update_parent_stats(parent_class, foreign_key, parent_value_point)
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def remake_stats(value_point)
|
43
|
+
up_count = up_voter_ids.length
|
44
|
+
down_count = down_voter_ids.length
|
45
|
+
# puts "#{self.class}(#{id}): #{up_count}, #{down_count}" # DEBUG
|
46
|
+
update_attributes(
|
47
|
+
'voteable.up_votes_count' => up_count,
|
48
|
+
'voteable.down_votes_count' => down_count,
|
49
|
+
'voteable.votes_count' => up_count + down_count,
|
50
|
+
'voteable.votes_point' => value_point[:up]*up_count + value_point[:down]*down_count
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def update_parent_stats(parent_class, foreign_key, value_point)
|
55
|
+
parent_id = read_attribute(foreign_key.to_sym)
|
56
|
+
if parent_id
|
57
|
+
up_count = up_voter_ids.length
|
58
|
+
down_count = down_voter_ids.length
|
59
|
+
|
60
|
+
return if up_count == 0 && down_count == 0
|
61
|
+
|
62
|
+
inc_options = {
|
63
|
+
'voteable.votes_point' => value_point[:up]*up_count + value_point[:down]*down_count
|
64
|
+
}
|
65
|
+
|
66
|
+
unless value_point[:update_counters] == false
|
67
|
+
inc_options.merge!(
|
68
|
+
'voteable.votes_count' => up_count + down_count,
|
69
|
+
'voteable.up_votes_count' => up_count,
|
70
|
+
'voteable.down_votes_count' => down_count
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
# puts inc_options.inspect # DEBUG
|
75
|
+
parent_class.collection.update(
|
76
|
+
{ :_id => parent_id },
|
77
|
+
{ '$inc' => inc_options }
|
78
|
+
)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Get the number of up votes
|
83
|
+
def up_votes_count
|
84
|
+
voteable.try(:[], 'up_votes_count') || 0
|
85
|
+
end
|
86
|
+
|
87
|
+
# Get the number of down votes
|
88
|
+
def down_votes_count
|
89
|
+
voteable.try(:[], 'down_votes_count') || 0
|
90
|
+
end
|
91
|
+
|
92
|
+
# Get the number of votes
|
93
|
+
def votes_count
|
94
|
+
voteable.try(:[], 'votes_count') || 0
|
95
|
+
end
|
96
|
+
|
97
|
+
# Get the votes point
|
98
|
+
def votes_point
|
99
|
+
voteable.try(:[], 'votes_point') || 0
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
File without changes
|
data/spec/models/comment.rb
CHANGED
@@ -8,16 +8,19 @@ describe Mongoid::Voteable do
|
|
8
8
|
@post2 = Post.create!
|
9
9
|
|
10
10
|
@comment = @post2.comments.create!
|
11
|
-
|
12
11
|
@user1 = User.create!
|
13
12
|
@user2 = User.create!
|
14
13
|
end
|
15
14
|
|
16
15
|
context "just created" do
|
17
16
|
it 'voteable votes_count, votes_point should be zero' do
|
17
|
+
@post1.up_votes_count.should == 0
|
18
|
+
@post1.down_votes_count.should == 0
|
18
19
|
@post1.votes_count.should == 0
|
19
20
|
@post1.votes_point.should == 0
|
20
21
|
|
22
|
+
@post2.up_votes_count.should == 0
|
23
|
+
@post2.down_votes_count.should == 0
|
21
24
|
@post2.votes_count.should == 0
|
22
25
|
@post2.votes_point.should == 0
|
23
26
|
end
|
@@ -39,12 +42,16 @@ describe Mongoid::Voteable do
|
|
39
42
|
Post.vote(:revote => true, :votee_id => @post1.id, :voter_id => @user1.id, :value => 'up')
|
40
43
|
@post1.reload
|
41
44
|
|
45
|
+
@post1.up_votes_count.should == 0
|
46
|
+
@post1.down_votes_count.should == 0
|
42
47
|
@post1.votes_count.should == 0
|
43
48
|
@post1.votes_point.should == 0
|
44
49
|
|
45
50
|
Post.vote(:revote => true, :votee_id => @post2.id, :voter_id => @user2.id, :value => :down)
|
46
51
|
@post2.reload
|
47
52
|
|
53
|
+
@post2.up_votes_count.should == 0
|
54
|
+
@post2.down_votes_count.should == 0
|
48
55
|
@post2.votes_count.should == 0
|
49
56
|
@post2.votes_point.should == 0
|
50
57
|
end
|
@@ -53,10 +60,13 @@ describe Mongoid::Voteable do
|
|
53
60
|
context 'user1 vote up post1 the first time' do
|
54
61
|
before :all do
|
55
62
|
Post.vote(:votee_id => @post1.id, :voter_id => @user1.id, :value => :up)
|
63
|
+
Mongoid::Voteable::Stats.remake_stats
|
56
64
|
@post1.reload
|
57
65
|
end
|
58
66
|
|
59
67
|
it '' do
|
68
|
+
@post1.up_votes_count.should == 1
|
69
|
+
@post1.down_votes_count.should == 0
|
60
70
|
@post1.votes_count.should == 1
|
61
71
|
@post1.votes_point.should == 1
|
62
72
|
|
@@ -71,6 +81,8 @@ describe Mongoid::Voteable do
|
|
71
81
|
Post.vote(:revote => false, :votee_id => @post1.id, :voter_id => @user1.id, :value => :up)
|
72
82
|
@post1.reload
|
73
83
|
|
84
|
+
@post1.up_votes_count.should == 1
|
85
|
+
@post1.down_votes_count.should == 0
|
74
86
|
@post1.votes_count.should == 1
|
75
87
|
@post1.votes_point.should == 1
|
76
88
|
|
@@ -81,10 +93,13 @@ describe Mongoid::Voteable do
|
|
81
93
|
context 'user2 vote down post1 the first time' do
|
82
94
|
before :all do
|
83
95
|
Post.vote(:votee_id => @post1.id, :voter_id => @user2.id, :value => :down)
|
96
|
+
Mongoid::Voteable::Stats.remake_stats
|
84
97
|
@post1.reload
|
85
98
|
end
|
86
99
|
|
87
100
|
it '' do
|
101
|
+
@post1.up_votes_count.should == 1
|
102
|
+
@post1.down_votes_count.should == 1
|
88
103
|
@post1.votes_count.should == 2
|
89
104
|
@post1.votes_point.should == 0
|
90
105
|
|
@@ -99,10 +114,13 @@ describe Mongoid::Voteable do
|
|
99
114
|
context 'user1 change vote on post1 from up to down' do
|
100
115
|
before :all do
|
101
116
|
Post.vote(:revote => true, :votee_id => @post1.id, :voter_id => @user1.id, :value => :down)
|
117
|
+
Mongoid::Voteable::Stats.remake_stats
|
102
118
|
@post1.reload
|
103
119
|
end
|
104
120
|
|
105
121
|
it '' do
|
122
|
+
@post1.up_votes_count.should == 0
|
123
|
+
@post1.down_votes_count.should == 2
|
106
124
|
@post1.votes_count.should == 2
|
107
125
|
@post1.votes_point.should == -2
|
108
126
|
|
@@ -117,10 +135,13 @@ describe Mongoid::Voteable do
|
|
117
135
|
context 'user1 vote down post2 the first time' do
|
118
136
|
before :all do
|
119
137
|
Post.vote(:votee_id => @post2.id, :voter_id => @user1.id, :value => :down)
|
138
|
+
Mongoid::Voteable::Stats.remake_stats
|
120
139
|
@post2.reload
|
121
140
|
end
|
122
141
|
|
123
142
|
it '' do
|
143
|
+
@post2.up_votes_count.should == 0
|
144
|
+
@post2.down_votes_count.should == 1
|
124
145
|
@post2.votes_count.should == 1
|
125
146
|
@post2.votes_point.should == -1
|
126
147
|
|
@@ -134,10 +155,13 @@ describe Mongoid::Voteable do
|
|
134
155
|
context 'user1 change vote on post2 from down to up' do
|
135
156
|
before :all do
|
136
157
|
Post.vote(:revote => true, :votee_id => @post2.id.to_s, :voter_id => @user1.id.to_s, :value => :up)
|
158
|
+
Mongoid::Voteable::Stats.remake_stats
|
137
159
|
@post2.reload
|
138
160
|
end
|
139
161
|
|
140
162
|
it '' do
|
163
|
+
@post2.up_votes_count.should == 1
|
164
|
+
@post2.down_votes_count.should == 0
|
141
165
|
@post2.votes_count.should == 1
|
142
166
|
@post2.votes_point.should == 1
|
143
167
|
|
@@ -152,14 +176,19 @@ describe Mongoid::Voteable do
|
|
152
176
|
context 'user1 vote up post2 comment the first time' do
|
153
177
|
before :all do
|
154
178
|
@comment.vote(:voter_id => @user1.id, :value => :up)
|
179
|
+
Mongoid::Voteable::Stats.remake_stats
|
155
180
|
@comment.reload
|
156
181
|
@post2.reload
|
157
182
|
end
|
158
183
|
|
159
184
|
it '' do
|
185
|
+
@post2.up_votes_count.should == 2
|
186
|
+
@post2.down_votes_count.should == 0
|
160
187
|
@post2.votes_count.should == 2
|
161
188
|
@post2.votes_point.should == 3
|
162
189
|
|
190
|
+
@comment.up_votes_count.should == 1
|
191
|
+
@comment.down_votes_count.should == 0
|
163
192
|
@comment.votes_count.should == 1
|
164
193
|
@comment.votes_point.should == 1
|
165
194
|
end
|
@@ -169,14 +198,19 @@ describe Mongoid::Voteable do
|
|
169
198
|
context 'user1 revote post2 comment from up to down' do
|
170
199
|
before :all do
|
171
200
|
@user1.vote(:votee => @comment, :value => :down)
|
201
|
+
Mongoid::Voteable::Stats.remake_stats
|
172
202
|
@comment.reload
|
173
203
|
@post2.reload
|
174
204
|
end
|
175
205
|
|
176
206
|
it '' do
|
207
|
+
@post2.up_votes_count.should == 1
|
208
|
+
@post2.down_votes_count.should == 1
|
177
209
|
@post2.votes_count.should == 2
|
178
210
|
@post2.votes_point.should == 0
|
179
211
|
|
212
|
+
@comment.up_votes_count.should == 0
|
213
|
+
@comment.down_votes_count.should == 1
|
180
214
|
@comment.votes_count.should == 1
|
181
215
|
@comment.votes_point.should == -3
|
182
216
|
end
|
@@ -184,9 +218,13 @@ describe Mongoid::Voteable do
|
|
184
218
|
it 'revote with wrong value has no effect' do
|
185
219
|
@user1.vote(:votee => @comment, :value => :down)
|
186
220
|
|
221
|
+
@post2.up_votes_count.should == 1
|
222
|
+
@post2.down_votes_count.should == 1
|
187
223
|
@post2.votes_count.should == 2
|
188
224
|
@post2.votes_point.should == 0
|
189
225
|
|
226
|
+
@comment.up_votes_count.should == 0
|
227
|
+
@comment.down_votes_count.should == 1
|
190
228
|
@comment.votes_count.should == 1
|
191
229
|
@comment.votes_point.should == -3
|
192
230
|
end
|
@@ -195,10 +233,13 @@ describe Mongoid::Voteable do
|
|
195
233
|
context "user1 unvote on post1" do
|
196
234
|
before(:all) do
|
197
235
|
@post1.vote(:voter_id => @user1.id, :votee_id => @post1.id, :unvote => true)
|
236
|
+
Mongoid::Voteable::Stats.remake_stats
|
198
237
|
@post1.reload
|
199
238
|
end
|
200
239
|
|
201
240
|
it "" do
|
241
|
+
@post1.up_votes_count.should == 0
|
242
|
+
@post1.down_votes_count.should == 1
|
202
243
|
@post1.votes_count.should == 1
|
203
244
|
@post1.votes_point.should == -1
|
204
245
|
|
@@ -209,8 +250,24 @@ describe Mongoid::Voteable do
|
|
209
250
|
end
|
210
251
|
end
|
211
252
|
|
212
|
-
context "@post1 has 1 vote and -1 point, @post2 has
|
213
|
-
it "" do
|
253
|
+
context "@post1 has 1 down vote and -1 point, @post2 has 1 up vote, 1 down vote and 0 point" do
|
254
|
+
it "verify @post1 counters" do
|
255
|
+
@post1.up_votes_count.should == 0
|
256
|
+
@post1.down_votes_count.should == 1
|
257
|
+
@post1.votes_count.should == 1
|
258
|
+
@post1.votes_point.should == -1
|
259
|
+
end
|
260
|
+
|
261
|
+
it "verify @post2 counters" do
|
262
|
+
@post2.up_votes_count.should == 1
|
263
|
+
@post2.down_votes_count.should == 1
|
264
|
+
@post2.votes_count.should == 2
|
265
|
+
@post2.votes_point.should == 0
|
266
|
+
end
|
267
|
+
|
268
|
+
it "test scopes" do
|
269
|
+
Post.most_up_voted.first.should == @post2
|
270
|
+
Post.most_down_voted.first.should == @post1
|
214
271
|
Post.most_voted.first.should == @post2
|
215
272
|
Post.best_voted.first.should == @post2
|
216
273
|
end
|
@@ -219,16 +276,42 @@ describe Mongoid::Voteable do
|
|
219
276
|
context "user1 unvote on comment" do
|
220
277
|
before(:all) do
|
221
278
|
@user1.unvote(@comment)
|
279
|
+
Mongoid::Voteable::Stats.remake_stats
|
222
280
|
@comment.reload
|
223
281
|
@post2.reload
|
224
282
|
end
|
225
283
|
|
226
|
-
it "" do
|
284
|
+
it "" do
|
285
|
+
@post2.up_votes_count.should == 1
|
286
|
+
@post2.down_votes_count.should == 0
|
227
287
|
@post2.votes_count.should == 1
|
228
288
|
@post2.votes_point.should == 1
|
229
289
|
|
290
|
+
@comment.up_votes_count.should == 0
|
291
|
+
@comment.down_votes_count.should == 0
|
230
292
|
@comment.votes_count.should == 0
|
231
293
|
@comment.votes_point.should == 0
|
232
294
|
end
|
233
295
|
end
|
234
|
-
|
296
|
+
|
297
|
+
context 'final' do
|
298
|
+
it "test remake stats" do
|
299
|
+
Mongoid::Voteable::Stats.remake_stats
|
300
|
+
|
301
|
+
@post1.up_votes_count.should == 0
|
302
|
+
@post1.down_votes_count.should == 1
|
303
|
+
@post1.votes_count.should == 1
|
304
|
+
@post1.votes_point.should == -1
|
305
|
+
|
306
|
+
@post2.up_votes_count.should == 1
|
307
|
+
@post2.down_votes_count.should == 0
|
308
|
+
@post2.votes_count.should == 1
|
309
|
+
@post2.votes_point.should == 1
|
310
|
+
|
311
|
+
@comment.up_votes_count.should == 0
|
312
|
+
@comment.down_votes_count.should == 0
|
313
|
+
@comment.votes_count.should == 0
|
314
|
+
@comment.votes_point.should == 0
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
File without changes
|
data/voteable_mongoid.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "voteable_mongoid"
|
7
7
|
s.version = VoteableMongoid::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Alex Nguyen"
|
9
|
+
s.authors = ["Alex Nguyen"]
|
10
10
|
s.email = ["alex@vinova.sg"]
|
11
11
|
s.homepage = "http://vinova.sg"
|
12
12
|
s.summary = %q{Add Up / Down Voting for Mongoid}
|
@@ -15,6 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_dependency 'mongoid', '~> 2.0.0.rc'
|
16
16
|
s.add_development_dependency 'rspec'
|
17
17
|
s.add_development_dependency 'bson_ext'
|
18
|
+
s.add_development_dependency 'watchr'
|
18
19
|
|
19
20
|
s.rubyforge_project = "voteable_mongoid"
|
20
21
|
|
metadata
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: voteable_mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 4
|
10
|
+
version: 0.4.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Alex Nguyen
|
14
|
-
- Stefan Nguyen
|
15
14
|
autorequire:
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
@@ -64,6 +63,20 @@ dependencies:
|
|
64
63
|
version: "0"
|
65
64
|
type: :development
|
66
65
|
version_requirements: *id003
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: watchr
|
68
|
+
prerelease: false
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
type: :development
|
79
|
+
version_requirements: *id004
|
67
80
|
description: Add Up / Down Voting for Mongoid (built for speed by using one Mongodb update-in-place for each collection when provided enough information)
|
68
81
|
email:
|
69
82
|
- alex@vinova.sg
|
@@ -75,6 +88,7 @@ extra_rdoc_files: []
|
|
75
88
|
|
76
89
|
files:
|
77
90
|
- .gitignore
|
91
|
+
- .watchr
|
78
92
|
- Gemfile
|
79
93
|
- README.rdoc
|
80
94
|
- Rakefile
|
@@ -98,17 +112,19 @@ files:
|
|
98
112
|
- doc/js/jquery.js
|
99
113
|
- doc/method_list.html
|
100
114
|
- doc/top-level-namespace.html
|
101
|
-
- lib/mongoid/voteable.rb
|
102
|
-
- lib/mongoid/voter.rb
|
103
115
|
- lib/voteable_mongoid.rb
|
116
|
+
- lib/voteable_mongoid/railties/database.rake
|
104
117
|
- lib/voteable_mongoid/version.rb
|
118
|
+
- lib/voteable_mongoid/voteable.rb
|
119
|
+
- lib/voteable_mongoid/voteable/stats.rb
|
120
|
+
- lib/voteable_mongoid/voter.rb
|
105
121
|
- spec/.rspec
|
106
122
|
- spec/models/comment.rb
|
107
123
|
- spec/models/post.rb
|
108
124
|
- spec/models/user.rb
|
109
125
|
- spec/spec_helper.rb
|
110
|
-
- spec/voteable_spec.rb
|
111
|
-
- spec/voter_spec.rb
|
126
|
+
- spec/voteable_mongoid/voteable_spec.rb
|
127
|
+
- spec/voteable_mongoid/voter_spec.rb
|
112
128
|
- voteable_mongoid.gemspec
|
113
129
|
has_rdoc: true
|
114
130
|
homepage: http://vinova.sg
|
@@ -149,5 +165,5 @@ test_files:
|
|
149
165
|
- spec/models/post.rb
|
150
166
|
- spec/models/user.rb
|
151
167
|
- spec/spec_helper.rb
|
152
|
-
- spec/voteable_spec.rb
|
153
|
-
- spec/voter_spec.rb
|
168
|
+
- spec/voteable_mongoid/voteable_spec.rb
|
169
|
+
- spec/voteable_mongoid/voter_spec.rb
|