rs_voteable_mongo 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/voteable_mongo/tasks.rb +14 -14
- data/lib/voteable_mongo/version.rb +1 -1
- data/lib/voteable_mongo/voteable.rb +12 -12
- data/lib/voteable_mongo/voter.rb +5 -5
- data/lib/voteable_mongo/voting.rb +14 -14
- data/voteable_mongo.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 735a5cd7ebb0ea483dcbd406c8d1c4e93ec02bd9c3cf56545d4e6ca4f3ec796d
|
4
|
+
data.tar.gz: a1a5552b51a6cd4128155fc51ae6876a50d0c0dda461733ad59526815be47b6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b03e807e2f97c91d4d9d14a8031297db0d9763af5944ce68b0dcd788574d2c00bb85c10f06a5364912b6c197c915384986c23fb71da80a93a9674d58435c33b
|
7
|
+
data.tar.gz: 99405d9523cc59f0cee8e83f6bd6f4f25c5f6bfd30bcd4ed3cf8b797357e7e6ea39331ab415adbab21b515c239b50d78df6922de5e007b3f2014a001d6599f71
|
data/lib/voteable_mongo/tasks.rb
CHANGED
@@ -2,7 +2,7 @@ module Mongo
|
|
2
2
|
module Voteable
|
3
3
|
module Tasks
|
4
4
|
|
5
|
-
# Set counters and point to 0 for uninitialized voteable objects
|
5
|
+
# Set counters and point to 0 for uninitialized voteable objects
|
6
6
|
# in order sort and query
|
7
7
|
def self.init_stats(log = false)
|
8
8
|
VOTEABLE.each do |class_name, voteable|
|
@@ -12,7 +12,7 @@ module Mongo
|
|
12
12
|
klass.where(votes: nil).set(votes: DEFAULT_VOTES)
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
# Re-generate vote counters and vote points
|
17
17
|
def self.remake_stats(log = false)
|
18
18
|
remake_stats_for_all_voteable_classes(log)
|
@@ -31,7 +31,7 @@ module Mongo
|
|
31
31
|
|
32
32
|
def self.migrate_old_votes_for(klass, voteable)
|
33
33
|
klass.all.each do |doc|
|
34
|
-
# Version 0.6.x use very short field names (u, d, uc, dc, c, p) to minimize
|
34
|
+
# Version 0.6.x use very short field names (u, d, uc, dc, c, p) to minimize
|
35
35
|
# votes storage but it's not human friendly
|
36
36
|
# Version >= 0.7.0 use readable field names (up, down, up_count, down_count,
|
37
37
|
# count, point)
|
@@ -67,8 +67,8 @@ module Mongo
|
|
67
67
|
)
|
68
68
|
end
|
69
69
|
end
|
70
|
-
|
71
|
-
|
70
|
+
|
71
|
+
|
72
72
|
def self.remake_stats_for_all_voteable_classes(log)
|
73
73
|
VOTEABLE.each do |class_name, voteable|
|
74
74
|
klass = class_name.constantize
|
@@ -80,7 +80,7 @@ module Mongo
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
|
83
|
+
|
84
84
|
def self.remake_stats_for(doc, voteable)
|
85
85
|
up_count = doc.up_voter_ids.length
|
86
86
|
down_count = doc.down_voter_ids.length
|
@@ -113,20 +113,20 @@ module Mongo
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
end
|
116
|
-
|
117
|
-
|
116
|
+
|
117
|
+
|
118
118
|
def self.update_parent_stats_for(doc, parent_class, foreign_key, voteable)
|
119
119
|
parent_id = doc.read_attribute(foreign_key.to_sym)
|
120
120
|
if parent_id
|
121
121
|
up_count = doc.up_voter_ids.length
|
122
122
|
down_count = doc.down_voter_ids.length
|
123
|
-
|
123
|
+
|
124
124
|
return if up_count == 0 && down_count == 0
|
125
125
|
|
126
126
|
inc_options = {
|
127
127
|
'votes.point' => voteable[:up].to_i*up_count + voteable[:down].to_i*down_count
|
128
128
|
}
|
129
|
-
|
129
|
+
|
130
130
|
unless voteable[:update_counters] == false
|
131
131
|
inc_options.merge!(
|
132
132
|
'votes.count' => up_count + down_count,
|
@@ -136,17 +136,17 @@ module Mongo
|
|
136
136
|
end
|
137
137
|
|
138
138
|
parent_ids = parent_id.is_a?(Array) ? parent_id : [ parent_id ]
|
139
|
-
|
139
|
+
|
140
140
|
parent_class.collection.find({'_id' => {'$in' => parent_ids}}).update_many({ '$inc' => inc_options })
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
-
private_class_method :migrate_old_votes_for,
|
144
|
+
private_class_method :migrate_old_votes_for,
|
145
145
|
:remake_stats_for,
|
146
146
|
:remake_stats_for_all_voteable_classes,
|
147
147
|
:update_parent_stats,
|
148
|
-
:update_parent_stats_for
|
149
|
-
|
148
|
+
:update_parent_stats_for
|
149
|
+
|
150
150
|
end
|
151
151
|
end
|
152
152
|
end
|
@@ -17,7 +17,7 @@ module Mongo
|
|
17
17
|
included do
|
18
18
|
include Mongo::Voteable::Voting
|
19
19
|
include Mongo::Voteable::Integrations::Mongoid
|
20
|
-
|
20
|
+
|
21
21
|
scope :voted_by, lambda { |voter|
|
22
22
|
voter_id = Helpers.get_mongo_id(voter)
|
23
23
|
where('$or' => [{ 'votes.up' => voter_id }, { 'votes.down' => voter_id }])
|
@@ -40,9 +40,9 @@ module Mongo
|
|
40
40
|
|
41
41
|
module ClassMethods
|
42
42
|
# Set vote point for each up (down) vote on an object of this class
|
43
|
-
#
|
43
|
+
#
|
44
44
|
# @param [Hash] options a hash containings:
|
45
|
-
#
|
45
|
+
#
|
46
46
|
# voteable self, :up => +1, :down => -3
|
47
47
|
# voteable Post, :up => +2, :down => -1, :update_counters => false # skip counter update
|
48
48
|
def voteable(klass = self, options = nil)
|
@@ -56,37 +56,37 @@ module Mongo
|
|
56
56
|
VOTEABLE[name][name][:update_parents] ||= true
|
57
57
|
end
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
# Check if voter_id do a vote on votee_id
|
61
61
|
#
|
62
62
|
# @param [Hash] options a hash containings:
|
63
63
|
# - :votee_id: the votee document id
|
64
64
|
# - :voter_id: the voter document id
|
65
|
-
#
|
65
|
+
#
|
66
66
|
# @return [true, false]
|
67
67
|
def voted?(options)
|
68
68
|
validate_and_normalize_vote_options(options)
|
69
69
|
up_voted?(options) || down_voted?(options)
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
# Check if voter_id do an up vote on votee_id
|
73
73
|
#
|
74
74
|
# @param [Hash] options a hash containings:
|
75
75
|
# - :votee_id: the votee document id
|
76
76
|
# - :voter_id: the voter document id
|
77
|
-
#
|
77
|
+
#
|
78
78
|
# @return [true, false]
|
79
79
|
def up_voted?(options)
|
80
80
|
validate_and_normalize_vote_options(options)
|
81
81
|
up_voted_by(options[:voter_id]).where(:_id => options[:votee_id]).count == 1
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
# Check if voter_id do a down vote on votee_id
|
85
85
|
#
|
86
86
|
# @param [Hash] options a hash containings:
|
87
87
|
# - :votee_id: the votee document id
|
88
88
|
# - :voter_id: the voter document id
|
89
|
-
#
|
89
|
+
#
|
90
90
|
# @return [true, false]
|
91
91
|
def down_voted?(options)
|
92
92
|
validate_and_normalize_vote_options(options)
|
@@ -110,7 +110,7 @@ module Mongo
|
|
110
110
|
create_indexes
|
111
111
|
end
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
# Make a vote on this votee
|
115
115
|
#
|
116
116
|
# @param [Hash] options a hash containings:
|
@@ -131,7 +131,7 @@ module Mongo
|
|
131
131
|
|
132
132
|
self.class.vote(options)
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
# Get a voted value on this votee
|
136
136
|
#
|
137
137
|
# @param voter is object or the id of the voter who made the vote
|
@@ -140,7 +140,7 @@ module Mongo
|
|
140
140
|
return :up if up_voter_ids.include?(voter_id)
|
141
141
|
return :down if down_voter_ids.include?(voter_id)
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
def voted_by?(voter)
|
145
145
|
!!vote_value(voter)
|
146
146
|
end
|
data/lib/voteable_mongo/voter.rb
CHANGED
@@ -26,7 +26,7 @@ module Mongo
|
|
26
26
|
votee_id = options[:votee_id]
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
votee_class.voted?(:voter_id => id, :votee_id => votee_id)
|
31
31
|
end
|
32
32
|
|
@@ -42,7 +42,7 @@ module Mongo
|
|
42
42
|
end
|
43
43
|
votee.vote_value(_id)
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# Cancel the vote on a votee
|
47
47
|
#
|
48
48
|
# @param [Object] votee the votee to be unvoted
|
@@ -73,19 +73,19 @@ module Mongo
|
|
73
73
|
else
|
74
74
|
votee_class = options[:votee_class]
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
if options[:value].nil?
|
78
78
|
options[:unvote] = true
|
79
79
|
options[:value] = vote_value(options)
|
80
80
|
else
|
81
81
|
options[:revote] = options.has_key?(:revote) ? !options[:revote].blank? : voted?(options)
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
options[:voter] = self
|
85
85
|
options[:voter_id] = id
|
86
86
|
|
87
87
|
(votee || votee_class).vote(options)
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
end
|
91
91
|
end
|
@@ -2,7 +2,7 @@ module Mongo
|
|
2
2
|
module Voteable
|
3
3
|
module Voting
|
4
4
|
extend ActiveSupport::Concern
|
5
|
-
|
5
|
+
|
6
6
|
module ClassMethods
|
7
7
|
# Make a vote on an object of this class
|
8
8
|
#
|
@@ -12,12 +12,12 @@ module Mongo
|
|
12
12
|
# - :value: :up or :down
|
13
13
|
# - :revote: if true change vote vote from :up to :down and vise versa
|
14
14
|
# - :unvote: if true undo the voting
|
15
|
-
#
|
15
|
+
#
|
16
16
|
# @return [votee, false]
|
17
17
|
def vote(options)
|
18
18
|
validate_and_normalize_vote_options(options)
|
19
19
|
options[:voteable] = VOTEABLE[name][name]
|
20
|
-
|
20
|
+
|
21
21
|
if options[:voteable]
|
22
22
|
query, update = if options[:revote]
|
23
23
|
revote_query_and_update(options)
|
@@ -32,7 +32,7 @@ module Mongo
|
|
32
32
|
doc = where(query).find_one_and_update(update, {return_document: :after})
|
33
33
|
rescue Moped::Errors::OperationFailure
|
34
34
|
doc = nil
|
35
|
-
end
|
35
|
+
end
|
36
36
|
|
37
37
|
if doc
|
38
38
|
update_parent_votes(doc, options) if options[:voteable][:update_parents]
|
@@ -45,7 +45,7 @@ module Mongo
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
|
48
|
+
|
49
49
|
private
|
50
50
|
def validate_and_normalize_vote_options(options)
|
51
51
|
options.symbolize_keys!
|
@@ -53,7 +53,7 @@ module Mongo
|
|
53
53
|
options[:voter_id] = Helpers.try_to_convert_string_to_object_id(options[:voter_id])
|
54
54
|
options[:value] &&= options[:value].to_sym
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def new_vote_query_and_update(options)
|
58
58
|
if options[:value] == :up
|
59
59
|
positive_voter_ids = 'votes.up'
|
@@ -79,7 +79,7 @@ module Mongo
|
|
79
79
|
}
|
80
80
|
end
|
81
81
|
|
82
|
-
|
82
|
+
|
83
83
|
def revote_query_and_update(options)
|
84
84
|
if options[:value] == :up
|
85
85
|
positive_voter_ids = 'votes.up'
|
@@ -113,7 +113,7 @@ module Mongo
|
|
113
113
|
}
|
114
114
|
}
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
|
118
118
|
def unvote_query_and_update(options)
|
119
119
|
if options[:value] == :up
|
@@ -129,7 +129,7 @@ module Mongo
|
|
129
129
|
return {
|
130
130
|
:_id => options[:votee_id],
|
131
131
|
# Validate if voter_id did a vote with value for votee_id
|
132
|
-
# Can skip $ne validation since creating a new vote
|
132
|
+
# Can skip $ne validation since creating a new vote
|
133
133
|
# already warranty that a voter can vote one only
|
134
134
|
# negative_voter_ids => { '$ne' => options[:voter_id] },
|
135
135
|
positive_voter_ids => options[:voter_id]
|
@@ -143,13 +143,13 @@ module Mongo
|
|
143
143
|
}
|
144
144
|
}
|
145
145
|
end
|
146
|
-
|
146
|
+
|
147
147
|
|
148
148
|
def update_parent_votes(doc, options)
|
149
149
|
VOTEABLE[name].each do |class_name, voteable|
|
150
|
-
|
150
|
+
|
151
151
|
if metadata = voteable_relation(class_name)
|
152
|
-
|
152
|
+
|
153
153
|
if (parent_id = doc[voteable_foreign_key(metadata)]).present?
|
154
154
|
parent_ids = parent_id.is_a?(Array) ? parent_id : [ parent_id ]
|
155
155
|
class_name.constantize.collection.find({'_id' => {'$in' => parent_ids}}).update_many(
|
@@ -160,7 +160,7 @@ module Mongo
|
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
163
|
-
|
163
|
+
|
164
164
|
def parent_inc_options(voteable, options)
|
165
165
|
inc_options = {}
|
166
166
|
|
@@ -205,7 +205,7 @@ module Mongo
|
|
205
205
|
inc_options
|
206
206
|
end
|
207
207
|
end
|
208
|
-
|
208
|
+
|
209
209
|
end
|
210
210
|
end
|
211
211
|
end
|
data/voteable_mongo.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ['lib']
|
20
20
|
|
21
|
-
s.add_dependency "mongoid", '~>
|
21
|
+
s.add_dependency "mongoid", '~> 7.0'
|
22
22
|
s.add_development_dependency 'rspec', '~> 2.14.1'
|
23
23
|
s.add_development_dependency "bundler"
|
24
24
|
s.add_development_dependency "rake", '< 11.0'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rs_voteable_mongo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- RocketScience
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-11-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mongoid
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '7.0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '7.0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rspec
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
126
|
version: '0'
|
127
127
|
requirements: []
|
128
128
|
rubyforge_project:
|
129
|
-
rubygems_version: 2.
|
129
|
+
rubygems_version: 2.7.7
|
130
130
|
signing_key:
|
131
131
|
specification_version: 4
|
132
132
|
summary: Add up / down voting ability to Mongoid documents
|