voteable_mongoid 0.5.0 → 0.6.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/CHANGELOG.rdoc ADDED
@@ -0,0 +1,19 @@
1
+ == 0.6.0
2
+ * Minimize vote data store (using short field names votes.u, votes.d, votes.c ...)
3
+ * Add Voter#up_votees, Voter#down_votees
4
+ * Remove index and scope from statistic module. User have to add indexes and scopes manually (see https://github.com/vinova/simple_qa/blob/master/app/models/question.rb)
5
+ * Bug fixes
6
+
7
+ == 0.5.0
8
+ * Rename vote_point to voteable
9
+
10
+ == 0.4.5
11
+ * Can use rake db:mongoid:voteable:remake_stats in Rails apps
12
+ * Use mongoid 2.0.0
13
+
14
+ == 0.4.4
15
+ * Add up_votes_count, down_votes_count
16
+ * Re-generate vote statistic data (counters and point)
17
+
18
+ == 0.4.3
19
+ * Wrap vote data in voteable namespace (voteable.up_voters_id, voteable.down_voters_ids, voteable.votes_count ...)
@@ -1,3 +1,3 @@
1
1
  module VoteableMongoid
2
- VERSION = '0.5.0'
2
+ VERSION = '0.6.0'
3
3
  end
@@ -3,36 +3,24 @@ module Mongoid
3
3
  module Stats
4
4
  extend ActiveSupport::Concern
5
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
6
  # Get the number of up votes
19
7
  def up_votes_count
20
- voteable.try(:[], 'up_votes_count') || 0
8
+ votes.try(:[], 'uc') || 0
21
9
  end
22
10
 
23
11
  # Get the number of down votes
24
12
  def down_votes_count
25
- voteable.try(:[], 'down_votes_count') || 0
13
+ votes.try(:[], 'dc') || 0
26
14
  end
27
15
 
28
16
  # Get the number of votes
29
17
  def votes_count
30
- voteable.try(:[], 'votes_count') || 0
18
+ votes.try(:[], 'c') || 0
31
19
  end
32
20
 
33
21
  # Get the votes point
34
22
  def votes_point
35
- voteable.try(:[], 'votes_point') || 0
23
+ votes.try(:[], 'p') || 0
36
24
  end
37
25
 
38
26
  # Re-generate vote counters and vote points
@@ -42,11 +30,11 @@ module Mongoid
42
30
  end
43
31
 
44
32
  def self.remake_stats(log)
45
- Mongoid::Voteable::VOTEABLE.each do |class_name, value_point|
33
+ VOTEABLE.each do |class_name, value_point|
46
34
  klass = class_name.constantize
47
35
  klass_value_point = value_point[class_name]
48
36
  puts "Generating stats for #{class_name}" if log
49
- klass.voteable_data_only.each{ |doc|
37
+ klass.all.each{ |doc|
50
38
  doc.remake_stats(klass_value_point)
51
39
  }
52
40
  end
@@ -55,12 +43,14 @@ module Mongoid
55
43
  def remake_stats(value_point)
56
44
  up_count = up_voter_ids.length
57
45
  down_count = down_voter_ids.length
58
-
46
+
47
+ # puts self, votes.inspect # DEBUG
48
+
59
49
  update_attributes(
60
- 'voteable.up_votes_count' => up_count,
61
- 'voteable.down_votes_count' => down_count,
62
- 'voteable.votes_count' => up_count + down_count,
63
- 'voteable.votes_point' => value_point[:up]*up_count + value_point[:down]*down_count
50
+ UP_VOTES_COUNT => up_count,
51
+ DOWN_VOTES_COUNT => down_count,
52
+ VOTES_COUNT => up_count + down_count,
53
+ VOTES_POINT => value_point[:up]*up_count + value_point[:down]*down_count
64
54
  )
65
55
  end
66
56
 
@@ -73,7 +63,7 @@ module Mongoid
73
63
  parent_class = parent_class_name.constantize
74
64
  foreign_key = relation_metadata.foreign_key
75
65
  puts "Updating stats for #{class_name} > #{parent_class_name}" if log
76
- klass.voteable_data_only.each{ |doc|
66
+ klass.all.each{ |doc|
77
67
  doc.update_parent_stats(parent_class, foreign_key, parent_value_point)
78
68
  }
79
69
  end
@@ -90,17 +80,19 @@ module Mongoid
90
80
  return if up_count == 0 && down_count == 0
91
81
 
92
82
  inc_options = {
93
- 'voteable.votes_point' => value_point[:up]*up_count + value_point[:down]*down_count
83
+ VOTES_POINT => value_point[:up]*up_count + value_point[:down]*down_count
94
84
  }
95
-
85
+
96
86
  unless value_point[:update_counters] == false
97
87
  inc_options.merge!(
98
- 'voteable.votes_count' => up_count + down_count,
99
- 'voteable.up_votes_count' => up_count,
100
- 'voteable.down_votes_count' => down_count
88
+ VOTES_COUNT => up_count + down_count,
89
+ UP_VOTES_COUNT => up_count,
90
+ DOWN_VOTES_COUNT => down_count
101
91
  )
102
92
  end
103
93
 
94
+ # puts parent_id, inc_options.inspect # DEBUG
95
+
104
96
  parent_class.collection.update(
105
97
  { :_id => parent_id },
106
98
  { '$inc' => inc_options }
@@ -0,0 +1,21 @@
1
+ module Mongoid
2
+ module Voteable
3
+ UP_VOTER_IDS = 'votes.u'
4
+ DOWN_VOTER_IDS = 'votes.d'
5
+ UP_VOTES_COUNT = 'votes.uc'
6
+ DOWN_VOTES_COUNT = 'votes.dc'
7
+ VOTES_COUNT = 'votes.c'
8
+ VOTES_POINT = 'votes.p'
9
+
10
+ class Votes
11
+ include Mongoid::Document
12
+
13
+ field :u, :type => Array
14
+ field :d, :type => Array
15
+ field :uc, :type => Integer, :default => 0
16
+ field :dc, :type => Integer, :default => 0
17
+ field :c, :type => Integer, :default => 0
18
+ field :p, :type => Integer, :default => 0
19
+ end
20
+ end
21
+ end
@@ -7,13 +7,10 @@ module Mongoid
7
7
  VOTEABLE = {}
8
8
 
9
9
  included do
10
+ include Mongoid::Document
10
11
  include Mongoid::Voteable::Stats
12
+ field :votes, :type => Mongoid::Voteable::Votes
11
13
 
12
- def self.voteable_data_only
13
- foreign_keys = relations.values.map{ |meta| meta.try(:foreign_key) }.compact
14
- only(foreign_keys + %w[voteable])
15
- end
16
-
17
14
  # Set vote point for each up (down) vote on an object of this class
18
15
  #
19
16
  # @param [Hash] options a hash containings:
@@ -54,16 +51,16 @@ module Mongoid
54
51
 
55
52
  if options[:revote]
56
53
  if value == :up
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'
54
+ positive_voter_ids = UP_VOTER_IDS
55
+ negative_voter_ids = DOWN_VOTER_IDS
56
+ positive_votes_count = UP_VOTES_COUNT
57
+ negative_votes_count = DOWN_VOTES_COUNT
61
58
  point_delta = value_point[:up] - value_point[:down]
62
59
  else
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'
60
+ positive_voter_ids = DOWN_VOTER_IDS
61
+ negative_voter_ids = UP_VOTER_IDS
62
+ positive_votes_count = DOWN_VOTES_COUNT
63
+ negative_votes_count = UP_VOTES_COUNT
67
64
  point_delta = -value_point[:up] + value_point[:down]
68
65
  end
69
66
 
@@ -79,7 +76,7 @@ module Mongoid
79
76
  '$inc' => {
80
77
  positive_votes_count => +1,
81
78
  negative_votes_count => -1,
82
- 'voteable.votes_point' => point_delta
79
+ VOTES_POINT => point_delta
83
80
  }
84
81
  }, {
85
82
  :safe => true
@@ -87,13 +84,13 @@ module Mongoid
87
84
 
88
85
  elsif options[:unvote]
89
86
  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'
87
+ positive_voter_ids = UP_VOTER_IDS
88
+ negative_voter_ids = DOWN_VOTER_IDS
89
+ positive_votes_count = UP_VOTES_COUNT
93
90
  else
94
- positive_voter_ids = 'voteable.down_voter_ids'
95
- negative_voter_ids = 'voteable.up_voter_ids'
96
- positive_votes_count = 'voteable.down_votes_count'
91
+ positive_voter_ids = DOWN_VOTER_IDS
92
+ negative_voter_ids = UP_VOTER_IDS
93
+ positive_votes_count = DOWN_VOTES_COUNT
97
94
  end
98
95
 
99
96
  # Check if voter_id did a vote with value for votee_id
@@ -107,8 +104,8 @@ module Mongoid
107
104
  '$pull' => { positive_voter_ids => voter_id },
108
105
  '$inc' => {
109
106
  positive_votes_count => -1,
110
- 'voteable.votes_count' => -1,
111
- 'voteable.votes_point' => -value_point[value]
107
+ VOTES_COUNT => -1,
108
+ VOTES_POINT => -value_point[value]
112
109
  }
113
110
  }, {
114
111
  :safe => true
@@ -116,25 +113,25 @@ module Mongoid
116
113
 
117
114
  else # new vote
118
115
  if value.to_sym == :up
119
- positive_voter_ids = 'voteable.up_voter_ids'
120
- positive_votes_count = 'voteable.up_votes_count'
116
+ positive_voter_ids = UP_VOTER_IDS
117
+ positive_votes_count = UP_VOTES_COUNT
121
118
  else
122
- positive_voter_ids = 'voteable.down_voter_ids'
123
- positive_votes_count = 'voteable.down_votes_count'
119
+ positive_voter_ids = DOWN_VOTER_IDS
120
+ positive_votes_count = DOWN_VOTES_COUNT
124
121
  end
125
122
 
126
123
  update_result = collection.update({
127
124
  # Validate voter_id did not vote for votee_id yet
128
125
  :_id => votee_id,
129
- 'voteable.up_voter_ids' => { '$ne' => voter_id },
130
- 'voteable.down_voter_ids' => { '$ne' => voter_id }
126
+ UP_VOTER_IDS => { '$ne' => voter_id },
127
+ DOWN_VOTER_IDS => { '$ne' => voter_id }
131
128
  }, {
132
129
  # then update
133
130
  '$push' => { positive_voter_ids => voter_id },
134
131
  '$inc' => {
135
- 'voteable.votes_count' => +1,
132
+ VOTES_COUNT => +1,
136
133
  positive_votes_count => +1,
137
- 'voteable.votes_point' => value_point[value] }
134
+ VOTES_POINT => value_point[value] }
138
135
  }, {
139
136
  :safe => true
140
137
  })
@@ -149,7 +146,7 @@ module Mongoid
149
146
  VOTEABLE[klass].each do |class_name, value_point|
150
147
  # For other class in VOTEABLE options, if is parent of current class
151
148
  next unless relation_metadata = relations[class_name.underscore]
152
- next unless votee ||= options[:votee] || voteable_data_only.where(:id => options[:votee_id]).first
149
+ next unless votee ||= options[:votee] || find(options[:votee_id])
153
150
  # If can find current votee foreign_key value for that class
154
151
  next unless foreign_key_value = votee.read_attribute(relation_metadata.foreign_key)
155
152
 
@@ -157,36 +154,36 @@ module Mongoid
157
154
 
158
155
  if options[:revote]
159
156
  if value == :up
160
- inc_options['voteable.votes_point'] = value_point[:up] - value_point[:down]
157
+ inc_options[VOTES_POINT] = value_point[:up] - value_point[:down]
161
158
  unless value_point[:update_counters] == false
162
- inc_options['voteable.up_votes_count'] = +1
163
- inc_options['voteable.down_votes_count'] = -1
159
+ inc_options[UP_VOTES_COUNT] = +1
160
+ inc_options[DOWN_VOTES_COUNT] = -1
164
161
  end
165
162
  else
166
- inc_options['voteable.votes_point'] = -value_point[:up] + value_point[:down]
163
+ inc_options[VOTES_POINT] = -value_point[:up] + value_point[:down]
167
164
  unless value_point[:update_counters] == false
168
- inc_options['voteable.up_votes_count'] = -1
169
- inc_options['voteable.down_votes_count'] = +1
165
+ inc_options[UP_VOTES_COUNT] = -1
166
+ inc_options[DOWN_VOTES_COUNT] = +1
170
167
  end
171
168
  end
172
169
  elsif options[:unvote]
173
- inc_options['voteable.votes_point'] = -value_point[value]
170
+ inc_options[VOTES_POINT] = -value_point[value]
174
171
  unless value_point[:update_counters] == false
175
- inc_options['voteable.votes_count'] = -1
172
+ inc_options[VOTES_COUNT] = -1
176
173
  if value == :up
177
- inc_options['voteable.up_votes_count'] = -1
174
+ inc_options[UP_VOTES_COUNT] = -1
178
175
  else
179
- inc_options['voteable.down_votes_count'] = -1
176
+ inc_options[DOWN_VOTES_COUNT] = -1
180
177
  end
181
178
  end
182
179
  else # new vote
183
- inc_options['voteable.votes_point'] = value_point[value]
180
+ inc_options[VOTES_POINT] = value_point[value]
184
181
  unless value_point[:update_counters] == false
185
- inc_options['voteable.votes_count'] = 1
182
+ inc_options[VOTES_COUNT] = 1
186
183
  if value == :up
187
- inc_options['voteable.up_votes_count'] = 1
184
+ inc_options[UP_VOTES_COUNT] = 1
188
185
  else
189
- inc_options['voteable.down_votes_count'] = 1
186
+ inc_options[DOWN_VOTES_COUNT] = 1
190
187
  end
191
188
  end
192
189
  end
@@ -231,17 +228,12 @@ module Mongoid
231
228
 
232
229
  # Array of up voter ids
233
230
  def up_voter_ids
234
- voteable.try(:[], 'up_voter_ids') || []
231
+ votes.try(:[], 'u') || []
235
232
  end
236
233
 
237
234
  # Array of down voter ids
238
235
  def down_voter_ids
239
- voteable.try(:[], 'down_voter_ids') || []
236
+ votes.try(:[], 'd') || []
240
237
  end
241
-
242
- def voteable
243
- read_attribute('voteable')
244
- end
245
-
246
238
  end
247
239
  end
@@ -4,10 +4,26 @@ module Mongoid
4
4
 
5
5
  # Get list of voted votees
6
6
  #
7
- # @param [Class] klass the votee class, e.g. `Post` or `Comment`
7
+ # @param [Class] klass the voteable class, e.g. `Post` or `Comment`
8
8
  # @return [Array, nil] an array of voteable objects voted by this voter
9
9
  def votees(klass)
10
- klass.any_of({ "voteable.up_voter_ids" => _id }, { "voteable.down_voter_ids" => _id })
10
+ klass.any_of({ Voteable::UP_VOTER_IDS => _id }, { Voteable::DOWN_VOTER_IDS => _id })
11
+ end
12
+
13
+ # Get list of up voted votees
14
+ #
15
+ # @param [Class] klass the voteable class, e.g. `Post` or `Comment`
16
+ # @return [Array, nil] an array of voteable objects up voted by this voter
17
+ def up_votees(klass)
18
+ klass.any_of(Voteable::UP_VOTER_IDS => _id)
19
+ end
20
+
21
+ # Get list of down voted votees
22
+ #
23
+ # @param [Class] klass the voteable class, e.g. `Post` or `Comment`
24
+ # @return [Array, nil] an array of voteable objects down voted by this voter
25
+ def down_votees(klass)
26
+ klass.any_of(Voteable::DOWN_VOTER_IDS => _id)
11
27
  end
12
28
 
13
29
  # Check to see if this voter voted on the votee or not
@@ -40,7 +56,7 @@ module Mongoid
40
56
  votee = unless options.is_a?(Hash)
41
57
  options
42
58
  else
43
- options[:votee] || options[:votee_type].classify.constantize.only(:up_vote_ids, :down_vote_ids).where(
59
+ options[:votee] || options[:votee_type].classify.constantize.only(:votes).where(
44
60
  :_id => options[:votee_id]
45
61
  ).first
46
62
  end
@@ -1,4 +1,6 @@
1
+ require 'mongoid'
1
2
  require 'voteable_mongoid/voteable/stats'
3
+ require 'voteable_mongoid/voteable/votes'
2
4
  require 'voteable_mongoid/voteable'
3
5
  require 'voteable_mongoid/voter'
4
6
 
data/spec/spec_helper.rb CHANGED
@@ -20,6 +20,7 @@ Mongoid.configure do |config|
20
20
  name = "voteable_mongoid_test"
21
21
  host = "localhost"
22
22
  config.master = Mongo::Connection.new.db(name)
23
+ config.embedded_object_id = false
23
24
  end
24
25
 
25
26
 
@@ -60,7 +60,6 @@ describe Mongoid::Voteable do
60
60
  context 'user1 vote up post1 the first time' do
61
61
  before :all do
62
62
  Post.vote(:votee_id => @post1.id, :voter_id => @user1.id, :value => :up)
63
- Mongoid::Voteable::Stats.remake
64
63
  @post1.reload
65
64
  end
66
65
 
@@ -93,7 +92,6 @@ describe Mongoid::Voteable do
93
92
  context 'user2 vote down post1 the first time' do
94
93
  before :all do
95
94
  Post.vote(:votee_id => @post1.id, :voter_id => @user2.id, :value => :down)
96
- Mongoid::Voteable::Stats.remake
97
95
  @post1.reload
98
96
  end
99
97
 
@@ -135,7 +133,6 @@ describe Mongoid::Voteable do
135
133
  context 'user1 vote down post2 the first time' do
136
134
  before :all do
137
135
  Post.vote(:votee_id => @post2.id, :voter_id => @user1.id, :value => :down)
138
- Mongoid::Voteable::Stats.remake
139
136
  @post2.reload
140
137
  end
141
138
 
@@ -176,7 +173,6 @@ describe Mongoid::Voteable do
176
173
  context 'user1 vote up post2 comment the first time' do
177
174
  before :all do
178
175
  @comment.vote(:voter_id => @user1.id, :value => :up)
179
- Mongoid::Voteable::Stats.remake
180
176
  @comment.reload
181
177
  @post2.reload
182
178
  end
@@ -198,7 +194,6 @@ describe Mongoid::Voteable do
198
194
  context 'user1 revote post2 comment from up to down' do
199
195
  before :all do
200
196
  @user1.vote(:votee => @comment, :value => :down)
201
- Mongoid::Voteable::Stats.remake
202
197
  @comment.reload
203
198
  @post2.reload
204
199
  end
@@ -263,14 +258,7 @@ describe Mongoid::Voteable do
263
258
  @post2.down_votes_count.should == 1
264
259
  @post2.votes_count.should == 2
265
260
  @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
271
- Post.most_voted.first.should == @post2
272
- Post.best_voted.first.should == @post2
273
- end
261
+ end
274
262
  end
275
263
 
276
264
  context "user1 unvote on comment" do
@@ -282,15 +270,15 @@ describe Mongoid::Voteable do
282
270
  end
283
271
 
284
272
  it "" do
285
- @post2.up_votes_count.should == 1
286
- @post2.down_votes_count.should == 0
287
- @post2.votes_count.should == 1
288
- @post2.votes_point.should == 1
289
-
290
273
  @comment.up_votes_count.should == 0
291
274
  @comment.down_votes_count.should == 0
292
275
  @comment.votes_count.should == 0
293
276
  @comment.votes_point.should == 0
277
+
278
+ @post2.up_votes_count.should == 1
279
+ @post2.down_votes_count.should == 0
280
+ @post2.votes_count.should == 1
281
+ @post2.votes_point.should == 1
294
282
  end
295
283
  end
296
284
 
@@ -14,10 +14,14 @@ describe Mongoid::Voter do
14
14
  context "just created" do
15
15
  it '' do
16
16
  @user1.votees(Post).should be_empty
17
+ @user1.up_votees(Post).should be_empty
18
+ @user1.down_votees(Post).should be_empty
17
19
  @user1.voted?(@post1).should be_false
18
20
  @user1.voted?(@post2).should be_false
19
21
 
20
22
  @user2.votees(Post).should be_empty
23
+ @user2.up_votees(Post).should be_empty
24
+ @user2.down_votees(Post).should be_empty
21
25
  @user2.voted?(@post1).should be_false
22
26
  @user2.voted?(@post2).should be_false
23
27
  end
@@ -48,6 +52,8 @@ describe Mongoid::Voter do
48
52
  @user2.should_not be_voted(:votee_type => 'Post', :votee_id => @post1.id)
49
53
 
50
54
  @user1.votees(Post).to_a.should == [ @post1 ]
55
+ @user1.up_votees(Post).to_a.should == [ @post1 ]
56
+ @user1.down_votees(Post).to_a.should be_empty
51
57
  @user2.votees(Post).to_a.should be_empty
52
58
  end
53
59
 
@@ -77,6 +83,8 @@ describe Mongoid::Voter do
77
83
 
78
84
  @user1.votees(Post).to_a.should == [ @post1 ]
79
85
  @user2.votees(Post).to_a.should == [ @post1 ]
86
+ @user2.up_votees(Post).to_a.should be_empty
87
+ @user2.down_votees(Post).to_a.should == [ @post1 ]
80
88
  end
81
89
  end
82
90
 
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: 11
4
+ hash: 7
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 5
8
+ - 6
9
9
  - 0
10
- version: 0.5.0
10
+ version: 0.6.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alex Nguyen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-30 00:00:00 +08:00
18
+ date: 2011-03-31 00:00:00 +08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -88,38 +88,18 @@ extra_rdoc_files: []
88
88
  files:
89
89
  - .gitignore
90
90
  - .watchr
91
+ - CHANGELOG.rdoc
91
92
  - Gemfile
92
93
  - README.rdoc
93
94
  - Rakefile
94
95
  - TODO
95
- - doc/Mongoid.html
96
- - doc/Mongoid/Voteable.html
97
- - doc/Mongoid/Voteable/Stats.html
98
- - doc/Mongoid/Voter.html
99
- - doc/Rails.html
100
- - doc/Rails/VoteableMongoid.html
101
- - doc/Rails/VoteableMongoid/Railtie.html
102
- - doc/VoteableMongoid.html
103
- - doc/_index.html
104
- - doc/class_list.html
105
- - doc/css/common.css
106
- - doc/css/full_list.css
107
- - doc/css/style.css
108
- - doc/file.README.html
109
- - doc/file_list.html
110
- - doc/frames.html
111
- - doc/index.html
112
- - doc/js/app.js
113
- - doc/js/full_list.js
114
- - doc/js/jquery.js
115
- - doc/method_list.html
116
- - doc/top-level-namespace.html
117
96
  - lib/voteable_mongoid.rb
118
97
  - lib/voteable_mongoid/railtie.rb
119
98
  - lib/voteable_mongoid/railties/database.rake
120
99
  - lib/voteable_mongoid/version.rb
121
100
  - lib/voteable_mongoid/voteable.rb
122
101
  - lib/voteable_mongoid/voteable/stats.rb
102
+ - lib/voteable_mongoid/voteable/votes.rb
123
103
  - lib/voteable_mongoid/voter.rb
124
104
  - spec/.rspec
125
105
  - spec/models/comment.rb