rs_voteable_mongo 1.2.0 → 1.3.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.
- 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
|