thumbs_up 0.6.4 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2eb255a6f08815057ab4a1896ed3e9d854c1c9c1
4
- data.tar.gz: 8dc62bc7e179b16b6e2e307493f2a84b35445738
3
+ metadata.gz: 11003465d42393c944f234e11e53ad2d772e4089
4
+ data.tar.gz: 6ad0d8e91290c87792123ea3337c714fc5f5ee16
5
5
  SHA512:
6
- metadata.gz: 708c9cf6c4b659a8d56d5cd56dafd785d6e05bfd0c9d85e177abe94b832f9e85cf7278482ae6149e52234f3ff085be80a27845975800a395e480e81839dbf7cb
7
- data.tar.gz: 31d121f34fa8dd291fec0f33a7411842bb548f773f28d01434c5b07efd869a60b0d325acb848f743f0d0361eafd10df574ea3ea529e263c92152ebca7a7e3a6d
6
+ metadata.gz: fd79c8576b6e65baf65ac5da1921700ac5a07740a43b325f239c90dc4adc11f83480a48f1d3b49def1ff78983722d14609f3df219afa0f9fdd3ff25ce141cce1
7
+ data.tar.gz: 7029585f3bbe640e98469557c0bfd5088f7f379d8e403ca73428ddf7d3dc6accb66952a287fa41a88bf4db87002bdfd8814e6bff2499f23f89ac3ac6ffbaba50
data/Gemfile CHANGED
@@ -1,2 +1,2 @@
1
- source :rubygems
1
+ source 'http://rubygems.org'
2
2
  gemspec
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ThumbsUp
2
2
  =======
3
3
 
4
- [![Build Status](https://secure.travis-ci.org/bouchard/thumbs_up.png)](http://travis-ci.org/bouchard/thumbs_up)
4
+ [![Build Status](https://secure.travis-ci.org/bouchard/thumbs_up.png)](http://travis-ci.org/bouchard/thumbs_up) [![Code Climate](https://codeclimate.com/github/bouchard/thumbs_up.png)](https://codeclimate.com/github/bouchard/thumbs_up)
5
5
 
6
6
  **Note: Version 0.5.x is a breaking change for #plusminus_tally and #tally, with > 50% speedups.**
7
7
 
@@ -71,7 +71,7 @@ Usage
71
71
  voter.vote_exclusively_for(voteable) # Removes any previous votes by that particular voter, and votes for.
72
72
  voter.vote_exclusively_against(voteable) # Removes any previous votes by that particular voter, and votes against.
73
73
 
74
- vote.unvote_for(voteable) # Clears all votes for that user
74
+ voter.unvote_for(voteable) # Clears all votes for that user
75
75
 
76
76
  ### Querying votes
77
77
 
@@ -88,6 +88,22 @@ Did the first user vote for or against the Car with id = 2?
88
88
  u.voted_for?(Car.find(2)) #=> true
89
89
  u.voted_against?(Car.find(2)) #=> false
90
90
 
91
+ Or check directly!
92
+
93
+ u = User.first
94
+ u.vote_for(Car.find(2))
95
+ u.voted_how?(Car.find(2)) #=> true, if voted_for
96
+
97
+ u.vote_against(Car.find(3))
98
+ u.voted_how?(Car.find(3)) #=> false, if voted_against
99
+
100
+ u.vote_for(Car.find(4))
101
+ u.voted_how?(Car.find(4)) #=> nil, if didn't vote for it
102
+
103
+ in case you use `--unique-voting false` (documented below):
104
+
105
+ u.voted_how?(Car.find(2)) #=> [false, true, true, false]
106
+
91
107
  #### Tallying Votes
92
108
 
93
109
  You can easily retrieve voteable object collections based on the properties of their votes:
data/lib/acts_as_voter.rb CHANGED
@@ -88,7 +88,10 @@ module ThumbsUp #:nodoc:
88
88
  self.unvote_for(voteable)
89
89
  end
90
90
  direction = (options[:direction].to_sym == :up)
91
- Vote.create!(:vote => direction, :voteable => voteable, :voter => self)
91
+ # create! does not return the created object
92
+ v = Vote.new(:vote => direction, :voteable => voteable, :voter => self)
93
+ v.save!
94
+ v
92
95
  end
93
96
 
94
97
  def unvote_for(voteable)
@@ -113,6 +116,22 @@ module ThumbsUp #:nodoc:
113
116
  ).count
114
117
  end
115
118
 
119
+ def voted_how?(voteable)
120
+ votes = Vote.where(
121
+ :voter_id => self.id,
122
+ :voter_type => self.class.base_class.name,
123
+ :voteable_id => voteable.id,
124
+ :voteable_type => voteable.class.base_class.name
125
+ ).map(&:vote) #in case votes is premitted to be duplicated
126
+ if votes.count == 1
127
+ votes.first
128
+ elsif votes.count == 0
129
+ nil
130
+ else
131
+ votes
132
+ end
133
+ end
134
+
116
135
  end
117
136
  end
118
137
  end
@@ -3,12 +3,12 @@ class Vote < ActiveRecord::Base
3
3
  scope :for_voter, lambda { |*args| where(["voter_id = ? AND voter_type = ?", args.first.id, args.first.class.base_class.name]) }
4
4
  scope :for_voteable, lambda { |*args| where(["voteable_id = ? AND voteable_type = ?", args.first.id, args.first.class.base_class.name]) }
5
5
  scope :recent, lambda { |*args| where(["created_at > ?", (args.first || 2.weeks.ago)]) }
6
- scope :descending, order("created_at DESC")
6
+ scope :descending, lambda { order("created_at DESC") }
7
7
 
8
8
  belongs_to :voteable, :polymorphic => true
9
9
  belongs_to :voter, :polymorphic => true
10
10
 
11
- attr_accessible :vote, :voter, :voteable
11
+ attr_accessible :vote, :voter, :voteable if ActiveRecord::VERSION::MAJOR < 4
12
12
 
13
13
  <% if options[:unique_voting] == true %>
14
14
  # Comment out the line below to allow multiple votes per user.
data/lib/thumbs_up.rb CHANGED
@@ -25,7 +25,7 @@ module ThumbsUp
25
25
  end
26
26
 
27
27
  # The configuration object.
28
- # @see I18::Airbrake.configure
28
+ # @see ThumbsUp::Configuration
29
29
  def configuration
30
30
  @configuration ||= Configuration.new
31
31
  end
@@ -1,3 +1,3 @@
1
1
  module ThumbsUp
2
- VERSION = '0.6.4'
2
+ VERSION = '0.6.5'
3
3
  end
data/test/test_helper.rb CHANGED
@@ -98,12 +98,12 @@ class Vote < ActiveRecord::Base
98
98
  scope :for_voter, lambda { |*args| where(["voter_id = ? AND voter_type = ?", args.first.id, args.first.class.name]) }
99
99
  scope :for_voteable, lambda { |*args| where(["voteable_id = ? AND voteable_type = ?", args.first.id, args.first.class.name]) }
100
100
  scope :recent, lambda { |*args| where(["created_at > ?", (args.first || 2.weeks.ago)]) }
101
- scope :descending, order("created_at DESC")
101
+ scope :descending, lambda { order("created_at DESC") }
102
102
 
103
103
  belongs_to :voteable, :polymorphic => true
104
104
  belongs_to :voter, :polymorphic => true
105
105
 
106
- attr_accessible :vote, :voter, :voteable
106
+ attr_accessible :vote, :voter, :voteable if ActiveRecord::VERSION::MAJOR < 4
107
107
 
108
108
  # Comment out the line below to allow multiple votes per user.
109
109
  validates_uniqueness_of :voteable_id, :scope => [:voteable_type, :voter_type, :voter_id]
@@ -11,6 +11,7 @@ class TestThumbsUp < Test::Unit::TestCase
11
11
  user_for = User.create(:name => 'david')
12
12
  user_against = User.create(:name => 'brady')
13
13
  item = Item.create(:name => 'XBOX', :description => 'XBOX console')
14
+ item2= Item.create(:name => 'PS3', :description => 'Playstation 3')
14
15
 
15
16
  assert_not_nil user_for.vote_for(item)
16
17
  assert_raises(ActiveRecord::RecordInvalid) do
@@ -24,6 +25,7 @@ class TestThumbsUp < Test::Unit::TestCase
24
25
  assert_equal 0, user_for.vote_count(:down)
25
26
  assert_equal true, user_for.voted_which_way?(item, :up)
26
27
  assert_equal false, user_for.voted_which_way?(item, :down)
28
+ assert_equal true, user_for.voted_how?(item)
27
29
  assert_equal 1, user_for.votes.where(:voteable_type => 'Item').count
28
30
  assert_equal 0, user_for.votes.where(:voteable_type => 'AnotherItem').count
29
31
  assert_raises(ArgumentError) do
@@ -36,6 +38,7 @@ class TestThumbsUp < Test::Unit::TestCase
36
38
  end
37
39
  assert_equal false, user_against.voted_for?(item)
38
40
  assert_equal true, user_against.voted_against?(item)
41
+ assert_equal false, user_against.voted_how?(item)
39
42
  assert_equal true, user_against.voted_on?(item)
40
43
  assert_equal 1, user_against.vote_count
41
44
  assert_equal 0, user_against.vote_count(:up)
@@ -61,6 +64,18 @@ class TestThumbsUp < Test::Unit::TestCase
61
64
  assert_raises(ArgumentError) do
62
65
  user_for.vote(item, {:direction => :foo})
63
66
  end
67
+
68
+ vote = user_against.vote(item, :exclusive => true, :direction => :down)
69
+ assert_equal true, user_against.voted_against?(item)
70
+ # Make sure the vote record was returned by the :vote method
71
+ assert_equal true, vote.is_a?(Vote)
72
+
73
+ vote = user_for.vote(item, :exclusive => true, :direction => :up)
74
+ assert_equal true, user_for.voted_for?(item)
75
+ # Make sure the vote record was returned by the :vote method
76
+ assert_equal true, vote.is_a?(Vote)
77
+
78
+ assert_nil user_for.voted_how?(item2)
64
79
  end
65
80
 
66
81
  def test_acts_as_voteable_instance_methods
@@ -125,7 +140,9 @@ class TestThumbsUp < Test::Unit::TestCase
125
140
 
126
141
  def test_tally_empty
127
142
  item = Item.create(:name => 'XBOX', :description => 'XBOX console')
128
- assert_equal 0, Item.tally.having('vote_count > 0').length
143
+ # COUNT(#{Vote.table_name}.id) is equivalent to aliased column `vote_count` - Postgres
144
+ # requires the non-aliased name in a HAVING clause.
145
+ assert_equal 0, Item.tally.having("COUNT(#{Vote.table_name}.id) > 0").length
129
146
  end
130
147
 
131
148
  def test_tally_has_id
@@ -135,7 +152,7 @@ class TestThumbsUp < Test::Unit::TestCase
135
152
 
136
153
  user.vote_for(item2)
137
154
 
138
- assert_not_nil Item.tally.all.first.id
155
+ assert_not_nil Item.tally.first.id
139
156
  end
140
157
 
141
158
  def test_tally_starts_at
@@ -187,10 +204,6 @@ class TestThumbsUp < Test::Unit::TestCase
187
204
  Item.tally.except(:order).any?
188
205
  end
189
206
 
190
- def test_tally_empty
191
- Item.tally.except(:order).empty?
192
- end
193
-
194
207
  def test_plusminus_tally_not_empty_without_conditions
195
208
  item = Item.create(:name => 'XBOX', :description => 'XBOX console')
196
209
  assert_equal 1, Item.plusminus_tally.length
@@ -198,7 +211,9 @@ class TestThumbsUp < Test::Unit::TestCase
198
211
 
199
212
  def test_plusminus_tally_empty
200
213
  item = Item.create(:name => 'XBOX', :description => 'XBOX console')
201
- assert_equal 0, Item.plusminus_tally.having('vote_count > 0').length
214
+ # COUNT(#{Vote.table_name}.id) is equivalent to aliased column `vote_count` - Postgres
215
+ # requires the non-aliased name in a HAVING clause.
216
+ assert_equal 0, Item.plusminus_tally.having("COUNT(#{Vote.table_name}.id) > 0").length
202
217
  end
203
218
 
204
219
  def test_plusminus_tally_starts_at
@@ -250,11 +265,11 @@ class TestThumbsUp < Test::Unit::TestCase
250
265
  assert_not_nil user.vote_for(item)
251
266
 
252
267
  if ActiveRecord::Base.connection.adapter_name == 'MySQL'
253
- assert (Item.plusminus_tally.having('vote_count > 0').include? item)
254
- assert (not Item.plusminus_tally.having('vote_count > 0').include? item_not_included)
268
+ assert(Item.plusminus_tally.having('vote_count > 0').include?(item))
269
+ assert(!Item.plusminus_tally.having('vote_count > 0').include?(item_not_included))
255
270
  else
256
- assert (Item.plusminus_tally.having('COUNT(votes.id) > 0').include? item)
257
- assert (not Item.plusminus_tally.having('COUNT(votes.id) > 0').include? item_not_included)
271
+ assert(Item.plusminus_tally.having('COUNT(votes.id) > 0').include?(item))
272
+ assert(!Item.plusminus_tally.having('COUNT(votes.id) > 0').include?(item_not_included))
258
273
  end
259
274
  end
260
275
 
@@ -375,10 +390,6 @@ class TestThumbsUp < Test::Unit::TestCase
375
390
  Item.plusminus_tally.except(:order).any?
376
391
  end
377
392
 
378
- def test_plusminus_tally_empty
379
- Item.plusminus_tally.except(:order).empty?
380
- end
381
-
382
393
  def test_karma
383
394
  users = (0..1).map{ |u| User.create(:name => "User #{u}") }
384
395
  items = (0..1).map{ |u| users[0].items.create(:name => "Item #{u}", :description => "Item #{u}") }
@@ -396,8 +407,8 @@ class TestThumbsUp < Test::Unit::TestCase
396
407
  user.vote_for(item)
397
408
  user.vote_for(another_item)
398
409
 
399
- assert_equal 1, Item.plusminus_tally.sum(&:plusminus_tally).to_i
400
- assert_equal 1, OtherItem.plusminus_tally.sum(&:plusminus_tally).to_i
410
+ assert_equal 1, Item.plusminus_tally.to_a.sum(&:plusminus_tally).to_i
411
+ assert_equal 1, OtherItem.plusminus_tally.to_a.sum(&:plusminus_tally).to_i
401
412
  end
402
413
 
403
414
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thumbs_up
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brady Bouchard
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2013-02-15 00:00:00.000000000 Z
16
+ date: 2013-07-05 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: activerecord
@@ -154,7 +154,8 @@ files:
154
154
  - README.md
155
155
  - Rakefile
156
156
  homepage: http://github.com/bouchard/thumbs_up
157
- licenses: []
157
+ licenses:
158
+ - MIT
158
159
  metadata: {}
159
160
  post_install_message:
160
161
  rdoc_options: []
@@ -172,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
172
173
  version: '0'
173
174
  requirements: []
174
175
  rubyforge_project:
175
- rubygems_version: 2.0.0.rc.2
176
+ rubygems_version: 2.0.2
176
177
  signing_key:
177
178
  specification_version: 4
178
179
  summary: Voting for ActiveRecord with multiple vote sources and karma calculation.