acts_as_votable 0.4.0 → 0.5.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.
- data/Gemfile.lock +33 -32
- data/README.markdown +38 -3
- data/lib/acts_as_votable/version.rb +1 -1
- data/lib/acts_as_votable/votable.rb +20 -10
- data/lib/acts_as_votable/vote.rb +1 -1
- data/lib/acts_as_votable/voter.rb +27 -23
- data/lib/generators/acts_as_votable/migration/templates/active_record/migration.rb +4 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/votable_spec.rb +41 -0
- data/spec/voter_spec.rb +65 -1
- metadata +4 -4
data/Gemfile.lock
CHANGED
@@ -1,37 +1,37 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
acts_as_votable (0.
|
4
|
+
acts_as_votable (0.5.0)
|
5
5
|
rails (>= 3.0.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
|
-
actionmailer (3.2.
|
11
|
-
actionpack (= 3.2.
|
10
|
+
actionmailer (3.2.11)
|
11
|
+
actionpack (= 3.2.11)
|
12
12
|
mail (~> 2.4.4)
|
13
|
-
actionpack (3.2.
|
14
|
-
activemodel (= 3.2.
|
15
|
-
activesupport (= 3.2.
|
13
|
+
actionpack (3.2.11)
|
14
|
+
activemodel (= 3.2.11)
|
15
|
+
activesupport (= 3.2.11)
|
16
16
|
builder (~> 3.0.0)
|
17
17
|
erubis (~> 2.7.0)
|
18
18
|
journey (~> 1.0.4)
|
19
19
|
rack (~> 1.4.0)
|
20
20
|
rack-cache (~> 1.2)
|
21
21
|
rack-test (~> 0.6.1)
|
22
|
-
sprockets (~> 2.1
|
23
|
-
activemodel (3.2.
|
24
|
-
activesupport (= 3.2.
|
22
|
+
sprockets (~> 2.2.1)
|
23
|
+
activemodel (3.2.11)
|
24
|
+
activesupport (= 3.2.11)
|
25
25
|
builder (~> 3.0.0)
|
26
|
-
activerecord (3.2.
|
27
|
-
activemodel (= 3.2.
|
28
|
-
activesupport (= 3.2.
|
26
|
+
activerecord (3.2.11)
|
27
|
+
activemodel (= 3.2.11)
|
28
|
+
activesupport (= 3.2.11)
|
29
29
|
arel (~> 3.0.2)
|
30
30
|
tzinfo (~> 0.3.29)
|
31
|
-
activeresource (3.2.
|
32
|
-
activemodel (= 3.2.
|
33
|
-
activesupport (= 3.2.
|
34
|
-
activesupport (3.2.
|
31
|
+
activeresource (3.2.11)
|
32
|
+
activemodel (= 3.2.11)
|
33
|
+
activesupport (= 3.2.11)
|
34
|
+
activesupport (3.2.11)
|
35
35
|
i18n (~> 0.6)
|
36
36
|
multi_json (~> 1.0)
|
37
37
|
arel (3.0.2)
|
@@ -41,37 +41,37 @@ GEM
|
|
41
41
|
hike (1.2.1)
|
42
42
|
i18n (0.6.1)
|
43
43
|
journey (1.0.4)
|
44
|
-
json (1.7.
|
44
|
+
json (1.7.6)
|
45
45
|
mail (2.4.4)
|
46
46
|
i18n (>= 0.4.0)
|
47
47
|
mime-types (~> 1.16)
|
48
48
|
treetop (~> 1.4.8)
|
49
49
|
mime-types (1.19)
|
50
|
-
multi_json (1.
|
50
|
+
multi_json (1.5.0)
|
51
51
|
polyglot (0.3.3)
|
52
|
-
rack (1.4.
|
52
|
+
rack (1.4.4)
|
53
53
|
rack-cache (1.2)
|
54
54
|
rack (>= 0.4)
|
55
55
|
rack-ssl (1.3.2)
|
56
56
|
rack
|
57
57
|
rack-test (0.6.2)
|
58
58
|
rack (>= 1.0)
|
59
|
-
rails (3.2.
|
60
|
-
actionmailer (= 3.2.
|
61
|
-
actionpack (= 3.2.
|
62
|
-
activerecord (= 3.2.
|
63
|
-
activeresource (= 3.2.
|
64
|
-
activesupport (= 3.2.
|
59
|
+
rails (3.2.11)
|
60
|
+
actionmailer (= 3.2.11)
|
61
|
+
actionpack (= 3.2.11)
|
62
|
+
activerecord (= 3.2.11)
|
63
|
+
activeresource (= 3.2.11)
|
64
|
+
activesupport (= 3.2.11)
|
65
65
|
bundler (~> 1.0)
|
66
|
-
railties (= 3.2.
|
67
|
-
railties (3.2.
|
68
|
-
actionpack (= 3.2.
|
69
|
-
activesupport (= 3.2.
|
66
|
+
railties (= 3.2.11)
|
67
|
+
railties (3.2.11)
|
68
|
+
actionpack (= 3.2.11)
|
69
|
+
activesupport (= 3.2.11)
|
70
70
|
rack-ssl (~> 1.3.2)
|
71
71
|
rake (>= 0.8.7)
|
72
72
|
rdoc (~> 3.4)
|
73
73
|
thor (>= 0.14.6, < 2.0)
|
74
|
-
rake (0.
|
74
|
+
rake (10.0.3)
|
75
75
|
rdoc (3.12)
|
76
76
|
json (~> 1.4)
|
77
77
|
rspec (2.9.0)
|
@@ -82,8 +82,9 @@ GEM
|
|
82
82
|
rspec-expectations (2.9.1)
|
83
83
|
diff-lcs (~> 1.1.3)
|
84
84
|
rspec-mocks (2.9.0)
|
85
|
-
sprockets (2.
|
85
|
+
sprockets (2.2.2)
|
86
86
|
hike (~> 1.2)
|
87
|
+
multi_json (~> 1.0)
|
87
88
|
rack (~> 1.0)
|
88
89
|
tilt (~> 1.1, != 1.3.0)
|
89
90
|
sqlite3 (1.3.5)
|
@@ -92,7 +93,7 @@ GEM
|
|
92
93
|
treetop (1.4.12)
|
93
94
|
polyglot
|
94
95
|
polyglot (>= 0.3.1)
|
95
|
-
tzinfo (0.3.
|
96
|
+
tzinfo (0.3.35)
|
96
97
|
|
97
98
|
PLATFORMS
|
98
99
|
ruby
|
data/README.markdown
CHANGED
@@ -4,17 +4,18 @@ Acts As Votable is a Ruby Gem specifically written for Rails/ActiveRecord models
|
|
4
4
|
The main goals of this gem are:
|
5
5
|
|
6
6
|
- Allow any model to be voted on, like/dislike, upvote/downvote, etc.
|
7
|
+
- Allow any model to be voted under arbitrary scopes.
|
7
8
|
- Allow any model to vote. In other words, votes do not have to come from a user,
|
8
9
|
they can come from any model (such as a Group or Team).
|
9
10
|
- Provide an easy to write/read syntax.
|
10
11
|
|
11
12
|
## Installation
|
12
13
|
|
13
|
-
### Rails 3
|
14
|
+
### Rails 3+
|
14
15
|
|
15
16
|
Just add the following to your Gemfile.
|
16
17
|
|
17
|
-
gem 'acts_as_votable', '~> 0.
|
18
|
+
gem 'acts_as_votable', '~> 0.5.0'
|
18
19
|
|
19
20
|
And follow that up with a ``bundle install``.
|
20
21
|
|
@@ -105,13 +106,42 @@ voter/votable
|
|
105
106
|
You can also 'unvote' a model to remove a previous vote.
|
106
107
|
|
107
108
|
@post.liked_by @user1
|
108
|
-
@post.
|
109
|
+
@post.unliked_by @user1
|
109
110
|
|
110
111
|
@post.disliked_by @user1
|
111
112
|
@post.undisliked_by @user1
|
112
113
|
|
113
114
|
Unvoting works for both positive and negative votes.
|
114
115
|
|
116
|
+
### Examples with scopes
|
117
|
+
|
118
|
+
You can add an scope to your vote
|
119
|
+
|
120
|
+
# positive votes
|
121
|
+
@post.liked_by @user1, :vote_scope => 'rank'
|
122
|
+
@post.vote :voter => @user3, :vote_scope => 'rank'
|
123
|
+
@post.vote :voter => @user5, :vote => 'like', :vote_scope => 'rank'
|
124
|
+
|
125
|
+
# negative votes
|
126
|
+
@post.downvote_from @user2, :vote_scope => 'rank'
|
127
|
+
@post.vote :voter => @user2, :vote => 'bad', :vote_scope => 'rank'
|
128
|
+
|
129
|
+
# tally them up!
|
130
|
+
@post.find_votes(:vote_scope => 'rank').size # => 5
|
131
|
+
@post.likes(:vote_scope => 'rank').size # => 3
|
132
|
+
@post.upvotes(:vote_scope => 'rank').size # => 3
|
133
|
+
@post.dislikes(:vote_scope => 'rank').size # => 2
|
134
|
+
@post.downvotes(:vote_scope => 'rank').size # => 2
|
135
|
+
|
136
|
+
# votable model can be voted under different scopes
|
137
|
+
# by the same user
|
138
|
+
@post.vote :voter => @user1, :vote_scope => 'week'
|
139
|
+
@post.vote :voter => @user1, :vote_scope => 'month'
|
140
|
+
|
141
|
+
@post.votes.size # => 2
|
142
|
+
@post.find_votes(:vote_scope => 'week').size # => 1
|
143
|
+
@post.find_votes(:vote_scope => 'month').size # => 1
|
144
|
+
|
115
145
|
### The Voter
|
116
146
|
|
117
147
|
You can have your voters ``acts_as_voter`` to provide some reserve functionality.
|
@@ -156,6 +186,8 @@ You can also check whether the voter has voted up or down.
|
|
156
186
|
@user.voted_up_on? @comment3 # => false
|
157
187
|
@user.voted_down_on? @comment3 # => false
|
158
188
|
|
189
|
+
Aliases for methods ``voted_up_on?`` and ``voted_down_on?`` are: ``voted_up_for?``, ``voted_down_for?``, ``liked?`` and ``disliked?``.
|
190
|
+
|
159
191
|
Also, you can obtain a list of all the objects a user has voted for.
|
160
192
|
This returns the actual objects instead of instances of the Vote model.
|
161
193
|
All objects are eager loaded
|
@@ -213,15 +245,18 @@ to speed up @post we would use the following migration:
|
|
213
245
|
class AddCachedVotesToPosts < ActiveRecord::Migration
|
214
246
|
def self.up
|
215
247
|
add_column :posts, :cached_votes_total, :integer, :default => 0
|
248
|
+
add_column :posts, :cached_votes_score, :integer, :default => 0
|
216
249
|
add_column :posts, :cached_votes_up, :integer, :default => 0
|
217
250
|
add_column :posts, :cached_votes_down, :integer, :default => 0
|
218
251
|
add_index :posts, :cached_votes_total
|
252
|
+
add_index :posts, :cached_votes_score
|
219
253
|
add_index :posts, :cached_votes_up
|
220
254
|
add_index :posts, :cached_votes_down
|
221
255
|
end
|
222
256
|
|
223
257
|
def self.down
|
224
258
|
remove_column :posts, :cached_votes_total
|
259
|
+
remove_column :posts, :cached_votes_score
|
225
260
|
remove_column :posts, :cached_votes_up
|
226
261
|
remove_column :posts, :cached_votes_down
|
227
262
|
end
|
@@ -68,6 +68,7 @@ module ActsAsVotable
|
|
68
68
|
|
69
69
|
options = {
|
70
70
|
:vote => true,
|
71
|
+
:vote_scope => nil
|
71
72
|
}.merge(args)
|
72
73
|
|
73
74
|
self.vote_registered = false
|
@@ -79,6 +80,7 @@ module ActsAsVotable
|
|
79
80
|
# find the vote
|
80
81
|
_votes_ = find_votes({
|
81
82
|
:voter_id => options[:voter].id,
|
83
|
+
:vote_scope => options[:vote_scope],
|
82
84
|
:voter_type => options[:voter].class.name
|
83
85
|
})
|
84
86
|
|
@@ -86,7 +88,8 @@ module ActsAsVotable
|
|
86
88
|
# this voter has never voted
|
87
89
|
vote = ActsAsVotable::Vote.new(
|
88
90
|
:votable => self,
|
89
|
-
:voter => options[:voter]
|
91
|
+
:voter => options[:voter],
|
92
|
+
:vote_scope => options[:vote_scope]
|
90
93
|
)
|
91
94
|
else
|
92
95
|
# this voter is potentially changing his vote
|
@@ -110,7 +113,7 @@ module ActsAsVotable
|
|
110
113
|
|
111
114
|
def unvote args = {}
|
112
115
|
return false if args[:voter].nil?
|
113
|
-
_votes_ = find_votes(:voter_id => args[:voter].id, :voter_type => args[:voter].class.name)
|
116
|
+
_votes_ = find_votes(:voter_id => args[:voter].id, :vote_scope => args[:vote_scope], :voter_type => args[:voter].class.name)
|
114
117
|
|
115
118
|
return true if _votes_.size == 0
|
116
119
|
_votes_.each(&:destroy)
|
@@ -119,12 +122,12 @@ module ActsAsVotable
|
|
119
122
|
return true
|
120
123
|
end
|
121
124
|
|
122
|
-
def vote_up voter
|
123
|
-
self.vote :voter => voter, :vote => true
|
125
|
+
def vote_up voter, options={}
|
126
|
+
self.vote :voter => voter, :vote => true, :vote_scope => options[:vote_scope]
|
124
127
|
end
|
125
128
|
|
126
|
-
def vote_down voter
|
127
|
-
self.vote :voter => voter, :vote => false
|
129
|
+
def vote_down voter, options={}
|
130
|
+
self.vote :voter => voter, :vote => false, :vote_scope => options[:vote_scope]
|
128
131
|
end
|
129
132
|
|
130
133
|
# caching
|
@@ -144,6 +147,13 @@ module ActsAsVotable
|
|
144
147
|
updates[:cached_votes_down] = count_votes_down(true)
|
145
148
|
end
|
146
149
|
|
150
|
+
if self.respond_to?(:cached_votes_score=)
|
151
|
+
updates[:cached_votes_score] = (
|
152
|
+
(updates[:cached_votes_up] || count_votes_up(true)) -
|
153
|
+
(updates[:cached_votes_down] || count_votes_down(true))
|
154
|
+
)
|
155
|
+
end
|
156
|
+
|
147
157
|
self.update_attributes(updates, :without_protection => true) if updates.size > 0
|
148
158
|
|
149
159
|
end
|
@@ -154,12 +164,12 @@ module ActsAsVotable
|
|
154
164
|
votes.where(extra_conditions)
|
155
165
|
end
|
156
166
|
|
157
|
-
def up_votes
|
158
|
-
find_votes(:vote_flag => true)
|
167
|
+
def up_votes options={}
|
168
|
+
find_votes(:vote_flag => true, :vote_scope => options[:vote_scope])
|
159
169
|
end
|
160
170
|
|
161
|
-
def down_votes
|
162
|
-
find_votes(:vote_flag => false)
|
171
|
+
def down_votes options={}
|
172
|
+
find_votes(:vote_flag => false, :vote_scope => options[:vote_scope])
|
163
173
|
end
|
164
174
|
|
165
175
|
|
data/lib/acts_as_votable/vote.rb
CHANGED
@@ -7,7 +7,9 @@ module ActsAsVotable
|
|
7
7
|
aliases = {
|
8
8
|
:vote_up_for => [:likes, :upvotes, :up_votes],
|
9
9
|
:vote_down_for => [:dislikes, :downvotes, :down_votes],
|
10
|
-
:unvote_for => [:unlike, :undislike]
|
10
|
+
:unvote_for => [:unlike, :undislike],
|
11
|
+
:voted_up_on? => [:voted_up_for?, :liked?],
|
12
|
+
:voted_down_on? => [:voted_down_for?, :disliked?]
|
11
13
|
}
|
12
14
|
|
13
15
|
base.class_eval do
|
@@ -34,12 +36,12 @@ module ActsAsVotable
|
|
34
36
|
args[:votable].vote args.merge({:voter => self})
|
35
37
|
end
|
36
38
|
|
37
|
-
def vote_up_for model=nil
|
38
|
-
vote :votable => model, :vote => true
|
39
|
+
def vote_up_for model=nil, args={}
|
40
|
+
vote :votable => model, :vote_scope => args[:vote_scope], :vote => true
|
39
41
|
end
|
40
42
|
|
41
|
-
def vote_down_for model
|
42
|
-
vote :votable => model, :vote => false
|
43
|
+
def vote_down_for model=nil, args={}
|
44
|
+
vote :votable => model, :vote_scope => args[:vote_scope], :vote => false
|
43
45
|
end
|
44
46
|
|
45
47
|
def unvote_for model
|
@@ -47,26 +49,28 @@ module ActsAsVotable
|
|
47
49
|
end
|
48
50
|
|
49
51
|
# results
|
50
|
-
def voted_on? votable
|
51
|
-
votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name
|
52
|
+
def voted_on? votable, args={}
|
53
|
+
votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name,
|
54
|
+
:vote_scope => args[:vote_scope])
|
52
55
|
votes.size > 0
|
53
56
|
end
|
54
|
-
alias :voted_for? :voted_on?
|
55
57
|
|
56
|
-
def voted_up_on? votable
|
57
|
-
votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name,
|
58
|
+
def voted_up_on? votable, args={}
|
59
|
+
votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name,
|
60
|
+
:vote_scope => args[:vote_scope], :vote_flag => true)
|
58
61
|
votes.size > 0
|
59
62
|
end
|
60
|
-
alias :voted_up_for? :voted_up_on?
|
61
63
|
|
62
|
-
def voted_down_on? votable
|
63
|
-
votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name,
|
64
|
+
def voted_down_on? votable, args={}
|
65
|
+
votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name,
|
66
|
+
:vote_scope => args[:vote_scope], :vote_flag => false)
|
64
67
|
votes.size > 0
|
65
68
|
end
|
66
69
|
alias :voted_down_for? :voted_down_on?
|
67
70
|
|
68
|
-
def voted_as_when_voting_on votable
|
69
|
-
votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name
|
71
|
+
def voted_as_when_voting_on votable, args={}
|
72
|
+
votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name,
|
73
|
+
:vote_scope => args[:vote_scope])
|
70
74
|
return nil if votes.size == 0
|
71
75
|
return votes.first.vote_flag
|
72
76
|
end
|
@@ -76,24 +80,24 @@ module ActsAsVotable
|
|
76
80
|
votes.where(extra_conditions)
|
77
81
|
end
|
78
82
|
|
79
|
-
def find_up_votes
|
80
|
-
find_votes :vote_flag => true
|
83
|
+
def find_up_votes args={}
|
84
|
+
find_votes :vote_flag => true, :vote_scope => args[:vote_scope]
|
81
85
|
end
|
82
86
|
|
83
|
-
def find_down_votes
|
84
|
-
find_votes :vote_flag => false
|
87
|
+
def find_down_votes args={}
|
88
|
+
find_votes :vote_flag => false, :vote_scope => args[:vote_scope]
|
85
89
|
end
|
86
90
|
|
87
91
|
def find_votes_for_class klass, extra_conditions = {}
|
88
92
|
find_votes extra_conditions.merge({:votable_type => klass.name})
|
89
93
|
end
|
90
94
|
|
91
|
-
def find_up_votes_for_class klass
|
92
|
-
find_votes_for_class klass, :vote_flag => true
|
95
|
+
def find_up_votes_for_class klass, args={}
|
96
|
+
find_votes_for_class klass, :vote_flag => true, :vote_scope => args[:vote_scope]
|
93
97
|
end
|
94
98
|
|
95
|
-
def find_down_votes_for_class klass
|
96
|
-
find_votes_for_class klass, :vote_flag => false
|
99
|
+
def find_down_votes_for_class klass, args={}
|
100
|
+
find_votes_for_class klass, :vote_flag => false, :vote_scope => args[:vote_scope]
|
97
101
|
end
|
98
102
|
|
99
103
|
# Including polymporphic relations for eager loading
|
@@ -6,15 +6,18 @@ class ActsAsVotableMigration < ActiveRecord::Migration
|
|
6
6
|
t.references :voter, :polymorphic => true
|
7
7
|
|
8
8
|
t.boolean :vote_flag
|
9
|
+
t.string :vote_scope
|
9
10
|
|
10
11
|
t.timestamps
|
11
12
|
end
|
12
13
|
|
13
14
|
add_index :votes, [:votable_id, :votable_type]
|
14
15
|
add_index :votes, [:voter_id, :voter_type]
|
16
|
+
add_index :votes, [:voter_id, :voter_type, :vote_scope]
|
17
|
+
add_index :votes, [:votable_id, :votable_type, :vote_scope]
|
15
18
|
end
|
16
19
|
|
17
20
|
def self.down
|
18
21
|
drop_table :votes
|
19
22
|
end
|
20
|
-
end
|
23
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,12 +9,15 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
9
9
|
t.references :voter, :polymorphic => true
|
10
10
|
|
11
11
|
t.boolean :vote_flag
|
12
|
+
t.string :vote_scope
|
12
13
|
|
13
14
|
t.timestamps
|
14
15
|
end
|
15
16
|
|
16
17
|
add_index :votes, [:votable_id, :votable_type]
|
17
18
|
add_index :votes, [:voter_id, :voter_type]
|
19
|
+
add_index :votes, [:voter_id, :voter_type, :vote_scope]
|
20
|
+
add_index :votes, [:votable_id, :votable_type, :vote_scope]
|
18
21
|
|
19
22
|
create_table :voters do |t|
|
20
23
|
t.string :name
|
@@ -45,6 +48,7 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
45
48
|
create_table :votable_caches do |t|
|
46
49
|
t.string :name
|
47
50
|
t.integer :cached_votes_total
|
51
|
+
t.integer :cached_votes_score
|
48
52
|
t.integer :cached_votes_up
|
49
53
|
t.integer :cached_votes_down
|
50
54
|
end
|
data/spec/votable_spec.rb
CHANGED
@@ -44,6 +44,23 @@ describe ActsAsVotable::Votable do
|
|
44
44
|
@votable.votes.size.should == 1
|
45
45
|
end
|
46
46
|
|
47
|
+
it "should have one scoped vote when voting under an scope" do
|
48
|
+
@votable.vote :voter => @voter, :vote => 'yes', :vote_scope => 'rank'
|
49
|
+
@votable.find_votes(:vote_scope => 'rank').size.should == 1
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should have one vote when voted on twice using scope by the same person" do
|
53
|
+
@votable.vote :voter => @voter, :vote => 'yes', :vote_scope => 'rank'
|
54
|
+
@votable.vote :voter => @voter, :vote => 'no', :vote_scope => 'rank'
|
55
|
+
@votable.find_votes(:vote_scope => 'rank').size.should == 1
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should have two votes when voting on two different scopes by the same person" do
|
59
|
+
@votable.vote :voter => @voter, :vote => 'yes', :vote_scope => 'weekly_rank'
|
60
|
+
@votable.vote :voter => @voter, :vote => 'no', :vote_scope => 'monthly_rank'
|
61
|
+
@votable.votes.size.should == 2
|
62
|
+
end
|
63
|
+
|
47
64
|
it "should be callable with vote_up" do
|
48
65
|
@votable.vote_up @voter
|
49
66
|
@votable.up_votes.first.voter.should == @voter
|
@@ -172,6 +189,30 @@ describe ActsAsVotable::Votable do
|
|
172
189
|
@votable_cache.cached_votes_total.should == 0
|
173
190
|
end
|
174
191
|
|
192
|
+
it "should update cached score votes if there is a score column" do
|
193
|
+
@votable_cache.cached_votes_score = 50
|
194
|
+
@votable_cache.vote :voter => @voter
|
195
|
+
@votable_cache.cached_votes_score.should == 1
|
196
|
+
@votable_cache.vote :voter => @voter2, :vote => 'false'
|
197
|
+
@votable_cache.cached_votes_score.should == 0
|
198
|
+
@votable_cache.vote :voter => @voter, :vote => 'false'
|
199
|
+
@votable_cache.cached_votes_score.should == -2
|
200
|
+
end
|
201
|
+
|
202
|
+
it "should update cached score votes when a vote up is removed" do
|
203
|
+
@votable_cache.vote :voter => @voter, :vote => 'true'
|
204
|
+
@votable_cache.cached_votes_score.should == 1
|
205
|
+
@votable_cache.unvote :voter => @voter
|
206
|
+
@votable_cache.cached_votes_score.should == 0
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should update cached score votes when a vote down is removed" do
|
210
|
+
@votable_cache.vote :voter => @voter, :vote => 'false'
|
211
|
+
@votable_cache.cached_votes_score.should == -1
|
212
|
+
@votable_cache.unvote :voter => @voter
|
213
|
+
@votable_cache.cached_votes_score.should == 0
|
214
|
+
end
|
215
|
+
|
175
216
|
it "should update cached up votes if there is an up vote column" do
|
176
217
|
@votable_cache.cached_votes_up = 50
|
177
218
|
@votable_cache.vote :voter => @voter
|
data/spec/voter_spec.rb
CHANGED
@@ -41,20 +41,45 @@ describe ActsAsVotable::Voter do
|
|
41
41
|
@voter.voted_on?(@votable).should be false
|
42
42
|
end
|
43
43
|
|
44
|
+
it "should be voted on after a voter has voted under scope" do
|
45
|
+
@votable.vote :voter => @voter, :vote_scope => 'rank'
|
46
|
+
@voter.voted_on?(@votable, :vote_scope => 'rank').should be true
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should not be voted on other scope after a voter has voted under one scope" do
|
50
|
+
@votable.vote :voter => @voter, :vote_scope => 'rank'
|
51
|
+
@voter.voted_on?(@votable).should be false
|
52
|
+
end
|
53
|
+
|
44
54
|
it "should be voted as true when a voter has voted true" do
|
45
55
|
@votable.vote :voter => @voter
|
46
56
|
@voter.voted_as_when_voted_for(@votable).should be true
|
47
57
|
end
|
48
58
|
|
59
|
+
it "should be voted as true when a voter has voted true under scope" do
|
60
|
+
@votable.vote :voter => @voter, :vote_scope => 'rank'
|
61
|
+
@voter.voted_as_when_voted_for(@votable, :vote_scope => 'rank').should be true
|
62
|
+
end
|
63
|
+
|
49
64
|
it "should be voted as false when a voter has voted false" do
|
50
65
|
@votable.vote :voter => @voter, :vote => false
|
51
66
|
@voter.voted_as_when_voted_for(@votable).should be false
|
52
67
|
end
|
53
68
|
|
69
|
+
it "should be voted as false when a voter has voted false under scope" do
|
70
|
+
@votable.vote :voter => @voter, :vote => false, :vote_scope => 'rank'
|
71
|
+
@voter.voted_as_when_voted_for(@votable, :vote_scope => 'rank').should be false
|
72
|
+
end
|
73
|
+
|
54
74
|
it "should be voted as nil when a voter has never voted" do
|
55
75
|
@voter.voted_as_when_voting_on(@votable).should be nil
|
56
76
|
end
|
57
77
|
|
78
|
+
it "should be voted as nil when a voter has never voted under the scope" do
|
79
|
+
@votable.vote :voter => @voter, :vote => false, :vote_scope => 'rank'
|
80
|
+
@voter.voted_as_when_voting_on(@votable).should be nil
|
81
|
+
end
|
82
|
+
|
58
83
|
it "should return true if voter has voted true" do
|
59
84
|
@votable.vote :voter => @voter
|
60
85
|
@voter.voted_up_on?(@votable).should be true
|
@@ -153,12 +178,26 @@ describe ActsAsVotable::Voter do
|
|
153
178
|
@voter.find_voted_items.size.should == 1
|
154
179
|
end
|
155
180
|
|
181
|
+
it 'returns objects that a user has upvoted for, using scope' do
|
182
|
+
@votable.vote :voter => @voter, :vote_scope => 'rank'
|
183
|
+
@votable2.vote :voter => @voter2, :vote_scope => 'rank'
|
184
|
+
@voter.find_voted_items(:vote_scope => 'rank').should include @votable
|
185
|
+
@voter.find_voted_items(:vote_scope => 'rank').size.should == 1
|
186
|
+
end
|
187
|
+
|
156
188
|
it 'returns objects that a user has downvoted for' do
|
157
189
|
@votable.vote_down @voter
|
158
190
|
@votable2.vote_down @voter2
|
159
191
|
@voter.find_voted_items.should include @votable
|
160
192
|
@voter.find_voted_items.size.should == 1
|
161
193
|
end
|
194
|
+
|
195
|
+
it 'returns objects that a user has downvoted for, using scope' do
|
196
|
+
@votable.vote_down @voter, :vote_scope => 'rank'
|
197
|
+
@votable2.vote_down @voter2, :vote_scope => 'rank'
|
198
|
+
@voter.find_voted_items(:vote_scope => 'rank').should include @votable
|
199
|
+
@voter.find_voted_items(:vote_scope => 'rank').size.should == 1
|
200
|
+
end
|
162
201
|
end
|
163
202
|
|
164
203
|
describe '#find_up_voted_items' do
|
@@ -169,10 +208,22 @@ describe ActsAsVotable::Voter do
|
|
169
208
|
@voter.find_up_voted_items.size.should == 1
|
170
209
|
end
|
171
210
|
|
211
|
+
it 'returns objects that a user has upvoted for, using scope' do
|
212
|
+
@votable.vote :voter => @voter, :vote_scope => 'rank'
|
213
|
+
@votable2.vote :voter => @voter2, :vote_scope => 'rank'
|
214
|
+
@voter.find_up_voted_items(:vote_scope => 'rank').should include @votable
|
215
|
+
@voter.find_up_voted_items(:vote_scope => 'rank').size.should == 1
|
216
|
+
end
|
217
|
+
|
172
218
|
it 'does not return objects that a user has downvoted for' do
|
173
219
|
@votable.vote_down @voter
|
174
220
|
@voter.find_up_voted_items.size.should == 0
|
175
221
|
end
|
222
|
+
|
223
|
+
it 'does not return objects that a user has downvoted for, using scope' do
|
224
|
+
@votable.vote_down @voter, :vote_scope => 'rank'
|
225
|
+
@voter.find_up_voted_items(:vote_scope => 'rank').size.should == 0
|
226
|
+
end
|
176
227
|
end
|
177
228
|
|
178
229
|
describe '#find_down_voted_items' do
|
@@ -181,13 +232,26 @@ describe ActsAsVotable::Voter do
|
|
181
232
|
@voter.find_down_voted_items.size.should == 0
|
182
233
|
end
|
183
234
|
|
235
|
+
it 'does not return objects that a user has upvoted for, using scope' do
|
236
|
+
@votable.vote :voter => @voter, :vote_scope => 'rank'
|
237
|
+
@voter.find_down_voted_items(:vote_scope => 'rank').size.should == 0
|
238
|
+
end
|
239
|
+
|
184
240
|
it 'returns objects that a user has downvoted for' do
|
185
241
|
@votable.vote_down @voter
|
186
242
|
@votable2.vote_down @voter2
|
187
243
|
@voter.find_down_voted_items.should include @votable
|
188
244
|
@voter.find_down_voted_items.size.should == 1
|
189
245
|
end
|
190
|
-
|
246
|
+
|
247
|
+
it 'returns objects that a user has downvoted for, using scope' do
|
248
|
+
@votable.vote_down @voter, :vote_scope => 'rank'
|
249
|
+
@votable2.vote_down @voter2, :vote_scope => 'rank'
|
250
|
+
@voter.find_down_voted_items(:vote_scope => 'rank').should include @votable
|
251
|
+
@voter.find_down_voted_items(:vote_scope => 'rank').size.should == 1
|
252
|
+
end
|
253
|
+
|
254
|
+
end
|
191
255
|
|
192
256
|
describe '#get_voted' do
|
193
257
|
subject { @voter.get_voted(@votable.class) }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_votable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -100,7 +100,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
100
100
|
version: '0'
|
101
101
|
segments:
|
102
102
|
- 0
|
103
|
-
hash:
|
103
|
+
hash: 3405338433430010114
|
104
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
109
|
version: '0'
|
110
110
|
segments:
|
111
111
|
- 0
|
112
|
-
hash:
|
112
|
+
hash: 3405338433430010114
|
113
113
|
requirements: []
|
114
114
|
rubyforge_project: acts_as_votable
|
115
115
|
rubygems_version: 1.8.24
|