voteable_mongoid 0.4.0 → 0.4.1

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/README.rdoc ADDED
@@ -0,0 +1,85 @@
1
+ = Votable Mongoid
2
+
3
+ Votable Mongoid allows you to make your Mongoid::Document objects votable (up or down)
4
+
5
+ For instance, in a q&a site, a user can vote up (or down) on a post or a comment.
6
+
7
+ == Installation
8
+
9
+ === Rails 3.0.x
10
+
11
+ To install the gem, add this to your Gemfile
12
+
13
+ gem 'votable_mongoid'
14
+
15
+ After that, remember to run "bundle install"
16
+
17
+ == Usage
18
+
19
+ === Making Post and Comment votable, User being the voter
20
+
21
+ post.rb
22
+
23
+ class Post
24
+ include Mongoid::Document
25
+ include Mongoid::Voteable
26
+
27
+ # set points for each vote
28
+ vote_point self, :up => +1, :down => -1
29
+
30
+ references_many :comments
31
+ end
32
+
33
+ comment.rb
34
+
35
+ require 'post'
36
+
37
+ class Comment
38
+ include Mongoid::Document
39
+ include Mongoid::Voteable
40
+
41
+ referenced_in :post
42
+
43
+ vote_point self, :up => +1, :down => -3
44
+
45
+ # each vote on a comment can affect votes count and point of the related post as well
46
+ vote_point Post, :up => +2, :down => -1
47
+ end
48
+
49
+ user.rb
50
+
51
+ class User
52
+ include Mongoid::Document
53
+ include Mongoid::Voter
54
+ end
55
+
56
+ === Making a vote
57
+
58
+ @user.vote(@post, :up)
59
+ # is equivalent to
60
+ @post.vote(:voter_id => @user.id, :value => :up)
61
+
62
+ # this will affect @post.votes_count and @post.votes_point as well
63
+ @user.vote(@comment, :down)
64
+
65
+ === Getting votes count and points
66
+
67
+ puts @post.votes_point
68
+ puts @post.votes_count
69
+ puts @post.up_votes_count
70
+ puts @post.down_votes_count
71
+
72
+ === Getting the list of voted objects (votees) of a class
73
+
74
+ @user.votees(Post)
75
+
76
+ === Undo a vote
77
+
78
+ @user.unvote(@comment)
79
+
80
+ == Contributors
81
+
82
+ * Alex N. - Author, Maintainer
83
+ * Stefan N. - Unvoting
84
+
85
+ Copyright (c) 2010-2011 Alex Nguyen (http://alex.vinova.sg) and Vinova Pre Ltd (http://vinova.sg)
@@ -2,6 +2,8 @@ module Mongoid
2
2
  module Voteable
3
3
  extend ActiveSupport::Concern
4
4
 
5
+ # How many points should be assigned for each up or down vote.
6
+ # This array should be manipulated using Votable.vote_point method
5
7
  VOTE_POINT = {}
6
8
 
7
9
  included do
@@ -18,7 +20,7 @@ module Mongoid
18
20
  scope :most_voted, order_by(:votes_count.desc)
19
21
  scope :best_voted, order_by(:votes_point.desc)
20
22
 
21
-
23
+ # Set vote point for each up (down) vote on an object of this class
22
24
  def self.vote_point(klass = self, options = nil)
23
25
  VOTE_POINT[self.name] ||= {}
24
26
  VOTE_POINT[self.name][klass.name] ||= options
@@ -29,6 +31,13 @@ module Mongoid
29
31
  # from voting value, we can decide it should be new vote or revote with :up or :down
30
32
  # In this case, validation can be skip to maximize performance
31
33
 
34
+ # Make a vote on an object of this class
35
+ #
36
+ # @param [Hash] options a hash containings:
37
+ # - :votee_id: the votee document id
38
+ # - :voter_id: the voter document id
39
+ # - :value: :up or :down
40
+ # - :revote: change from vote up to vote down
32
41
  def self.vote(options)
33
42
  options.symbolize_keys!
34
43
 
@@ -102,7 +111,13 @@ module Mongoid
102
111
  })
103
112
  end
104
113
  end
105
-
114
+
115
+ # Cancel a vote on an object of this class
116
+ #
117
+ # @param [Hash] options a hash containings:
118
+ # - :votee_id: the votee document id
119
+ # - :voter_id: the voter document id
120
+ # - :value: voted :up or :down
106
121
  def self.unvote(options)
107
122
  options.symbolize_keys!
108
123
 
@@ -146,7 +161,11 @@ module Mongoid
146
161
  end
147
162
  end
148
163
 
149
-
164
+ # Make a vote on this votee
165
+ #
166
+ # @param [Hash] options a hash containings:
167
+ # - :voter_id: the voter document id
168
+ # - :value: vote :up or vote :down
150
169
  def vote(options)
151
170
  VOTE_POINT[self.class.name].each do |class_name, value_point|
152
171
  next unless relation_metadata = relations[class_name.underscore]
@@ -159,8 +178,12 @@ module Mongoid
159
178
 
160
179
  self.class.vote(options)
161
180
  end
162
-
163
- def unvote(options)
181
+
182
+ # Cancel a vote on this votee
183
+ #
184
+ # @param [Hash] options a hash containings:
185
+ # - :voter_id: the voter document id
186
+ def unvote(options)
164
187
  VOTE_POINT[self.class.name].each do |class_name, value_point|
165
188
  next unless relation_metadata = relations[class_name.underscore]
166
189
  next unless foreign_key = relation_metadata.foreign_key
@@ -172,6 +195,9 @@ module Mongoid
172
195
  self.class.unvote(options)
173
196
  end
174
197
 
198
+ # Get a voted value on this votee
199
+ #
200
+ # @param [String, BSON::ObjectId] x the id of the voter who made the vote
175
201
  def vote_value(x)
176
202
  voter_id = case x
177
203
  when String
@@ -186,15 +212,14 @@ module Mongoid
186
212
  return :down if down_voter_ids.try(:include?, voter_id)
187
213
  end
188
214
 
189
-
215
+ # Get the number of up votes
190
216
  def up_votes_count
191
217
  up_voter_ids.length
192
218
  end
193
219
 
194
-
220
+ # Get the number of down votes
195
221
  def down_votes_count
196
222
  down_voter_ids.length
197
223
  end
198
-
199
224
  end
200
225
  end
data/lib/mongoid/voter.rb CHANGED
@@ -2,12 +2,18 @@ module Mongoid
2
2
  module Voter
3
3
  extend ActiveSupport::Concern
4
4
 
5
-
5
+ # Get list of voted votees
6
+ #
7
+ # @param [Class] klass the votee class, e.g. `Post` or `Comment`
8
+ # @return [Array, nil] an array of votable objects voted by this voter
6
9
  def votees(klass)
7
10
  klass.any_of({ :up_voter_ids => _id }, { :down_voter_ids => _id })
8
11
  end
9
12
 
10
-
13
+ # Check to see if this voter voted on the votee or not
14
+ #
15
+ # @param [Hash, Object] options the hash containing the votee, or the votee itself
16
+ # @return [true, false] true if voted, false otherwise
11
17
  def voted?(options)
12
18
  unless options.is_a?(Hash)
13
19
  votee_class = options.class
@@ -25,11 +31,18 @@ module Mongoid
25
31
 
26
32
  votees(votee_class).where(:_id => votee_id).count == 1
27
33
  end
28
-
34
+
35
+ # Cancel the vote on a votee
36
+ #
37
+ # @param [Object] votee the votee to be unvoted
29
38
  def unvote(votee)
30
39
  votee.unvote(:voter_id => _id)
31
40
  end
32
41
 
42
+ # Get the voted value on a votee
43
+ #
44
+ # @param (see #voted?)
45
+ # @return [Symbol, nil] :up or :down or nil if not voted
33
46
  def vote_value(options)
34
47
  votee = unless options.is_a?(Hash)
35
48
  options
@@ -41,7 +54,10 @@ module Mongoid
41
54
  votee.vote_value(_id)
42
55
  end
43
56
 
44
-
57
+ # Vote on a votee
58
+ #
59
+ # @param (see #voted?)
60
+ # @param [:up, :down] vote_value vote up or vote down
45
61
  def vote(options, vote_value = nil)
46
62
  options.symbolize_keys!
47
63
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voteable_mongoid
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 13
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 0
10
- version: 0.4.0
9
+ - 1
10
+ version: 0.4.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alex Nguyen
@@ -88,121 +88,9 @@ dependencies:
88
88
  prerelease: false
89
89
  type: :development
90
90
  requirement: *id005
91
- - !ruby/object:Gem::Dependency
92
- name: bson_ext
93
- version_requirements: &id006 !ruby/object:Gem::Requirement
94
- none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- hash: 3
99
- segments:
100
- - 0
101
- version: "0"
102
- prerelease: false
103
- type: :development
104
- requirement: *id006
105
- - !ruby/object:Gem::Dependency
106
- name: rspec
107
- version_requirements: &id007 !ruby/object:Gem::Requirement
108
- none: false
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- hash: 3
113
- segments:
114
- - 0
115
- version: "0"
116
- prerelease: false
117
- type: :development
118
- requirement: *id007
119
- - !ruby/object:Gem::Dependency
120
- name: bson_ext
121
- version_requirements: &id008 !ruby/object:Gem::Requirement
122
- none: false
123
- requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- hash: 3
127
- segments:
128
- - 0
129
- version: "0"
130
- prerelease: false
131
- type: :development
132
- requirement: *id008
133
- - !ruby/object:Gem::Dependency
134
- name: rspec
135
- version_requirements: &id009 !ruby/object:Gem::Requirement
136
- none: false
137
- requirements:
138
- - - ">="
139
- - !ruby/object:Gem::Version
140
- hash: 3
141
- segments:
142
- - 0
143
- version: "0"
144
- prerelease: false
145
- type: :development
146
- requirement: *id009
147
- - !ruby/object:Gem::Dependency
148
- name: bson_ext
149
- version_requirements: &id010 !ruby/object:Gem::Requirement
150
- none: false
151
- requirements:
152
- - - ">="
153
- - !ruby/object:Gem::Version
154
- hash: 3
155
- segments:
156
- - 0
157
- version: "0"
158
- prerelease: false
159
- type: :development
160
- requirement: *id010
161
- - !ruby/object:Gem::Dependency
162
- name: rspec
163
- version_requirements: &id011 !ruby/object:Gem::Requirement
164
- none: false
165
- requirements:
166
- - - ">="
167
- - !ruby/object:Gem::Version
168
- hash: 3
169
- segments:
170
- - 0
171
- version: "0"
172
- prerelease: false
173
- type: :development
174
- requirement: *id011
175
- - !ruby/object:Gem::Dependency
176
- name: bson_ext
177
- version_requirements: &id012 !ruby/object:Gem::Requirement
178
- none: false
179
- requirements:
180
- - - ">="
181
- - !ruby/object:Gem::Version
182
- hash: 3
183
- segments:
184
- - 0
185
- version: "0"
186
- prerelease: false
187
- type: :development
188
- requirement: *id012
189
- - !ruby/object:Gem::Dependency
190
- name: rspec
191
- version_requirements: &id013 !ruby/object:Gem::Requirement
192
- none: false
193
- requirements:
194
- - - ">="
195
- - !ruby/object:Gem::Version
196
- hash: 3
197
- segments:
198
- - 0
199
- version: "0"
200
- prerelease: false
201
- type: :development
202
- requirement: *id013
203
91
  - !ruby/object:Gem::Dependency
204
92
  name: mongoid
205
- version_requirements: &id014 !ruby/object:Gem::Requirement
93
+ version_requirements: &id006 !ruby/object:Gem::Requirement
206
94
  none: false
207
95
  requirements:
208
96
  - - ~>
@@ -216,10 +104,10 @@ dependencies:
216
104
  version: 2.0.0.rc
217
105
  prerelease: false
218
106
  type: :runtime
219
- requirement: *id014
107
+ requirement: *id006
220
108
  - !ruby/object:Gem::Dependency
221
109
  name: bson_ext
222
- version_requirements: &id015 !ruby/object:Gem::Requirement
110
+ version_requirements: &id007 !ruby/object:Gem::Requirement
223
111
  none: false
224
112
  requirements:
225
113
  - - ">="
@@ -230,10 +118,10 @@ dependencies:
230
118
  version: "0"
231
119
  prerelease: false
232
120
  type: :development
233
- requirement: *id015
121
+ requirement: *id007
234
122
  - !ruby/object:Gem::Dependency
235
123
  name: rspec
236
- version_requirements: &id016 !ruby/object:Gem::Requirement
124
+ version_requirements: &id008 !ruby/object:Gem::Requirement
237
125
  none: false
238
126
  requirements:
239
127
  - - ">="
@@ -244,7 +132,7 @@ dependencies:
244
132
  version: "0"
245
133
  prerelease: false
246
134
  type: :development
247
- requirement: *id016
135
+ requirement: *id008
248
136
  description: Add Up / Down Voting for Mongoid
249
137
  email: alex@vinova.sg
250
138
  executables: []
@@ -252,11 +140,13 @@ executables: []
252
140
  extensions: []
253
141
 
254
142
  extra_rdoc_files:
143
+ - README.rdoc
255
144
  - TODO
256
145
  files:
257
146
  - lib/mongoid/voteable.rb
258
147
  - lib/mongoid/voter.rb
259
148
  - lib/voteable_mongoid.rb
149
+ - README.rdoc
260
150
  - TODO
261
151
  has_rdoc: true
262
152
  homepage: http://github.com/vinova/voteable_mongoid