acts_as_votable 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,3 +2,4 @@ pkg/*
2
2
  *.gem
3
3
  .bundle
4
4
  nbproject/*
5
+ bin
data/Gemfile CHANGED
File without changes
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- acts_as_votable (0.0.5)
4
+ acts_as_votable (0.1.0)
5
5
  rails (>= 3.0.0)
6
6
 
7
7
  GEM
@@ -74,6 +74,7 @@ GEM
74
74
  rspec-expectations (2.3.0)
75
75
  diff-lcs (~> 1.1.2)
76
76
  rspec-mocks (2.3.0)
77
+ sqlite3 (1.3.3)
77
78
  thor (0.14.6)
78
79
  treetop (1.4.9)
79
80
  polyglot (>= 0.3.1)
@@ -84,5 +85,5 @@ PLATFORMS
84
85
 
85
86
  DEPENDENCIES
86
87
  acts_as_votable!
87
- rails (>= 3.0.0)
88
88
  rspec
89
+ sqlite3
data/README.markdown CHANGED
@@ -1,16 +1,3 @@
1
- ### Major Updates
2
-
3
- Version 0.1.0 introduces new and refactored function calls that improve the
4
- natural language syntax of this gem. Certain calls that were compatible with
5
- version 0.0.5 will now be broken. Remember to specify a the version in your
6
- Gemfile to prevent functionality breakdowns between versions.
7
-
8
- In version 0.1.0 functions like ``@post.votes`` return an array of all of the vote
9
- records for @post. In order to count the number of votes simply use
10
- ``@post.votes.size`` now.
11
-
12
- - - -
13
-
14
1
  # Acts As Votable (aka Acts As Likeable)
15
2
 
16
3
  Acts As Votable is a Ruby Gem specifically written for Rails/ActiveRecord models.
@@ -19,7 +6,7 @@ The main goals of this gem are:
19
6
  - Allow any model to be voted on, like/dislike, upvote/downvote, etc.
20
7
  - Allow any model to vote. In other words, votes do not have to come from a user,
21
8
  they can come from any model (such as a Group or Team).
22
- - Provide an easy to write natural language syntax.
9
+ - Provide an easy to write/read syntax.
23
10
 
24
11
  ## Installation
25
12
 
@@ -110,7 +97,7 @@ You can have your voters ``acts_as_voter`` to provide some reserve functionality
110
97
 
111
98
  @article.votes.size # => 1
112
99
  @article.likes.size # => 1
113
- @article.downvotes.size # => 0
100
+ @article.dislikes.size # => 0
114
101
 
115
102
  To check if a voter has voted on a model, you can use ``voted_for?``. You can
116
103
  check how the voter voted by using ``voted_as_when_voted_for``.
@@ -133,13 +120,13 @@ Voters can only vote once per model. In this example the 2nd vote does not coun
133
120
  because @user has already voted for @shoe.
134
121
 
135
122
  @user.likes @shoe
136
- @user.upvotes @shoe
123
+ @user.likes @shoe
137
124
 
138
125
  @shoe.votes # => 1
139
126
  @shoe.likes # => 1
140
127
 
141
128
  To check if a vote counted, or registered, use vote_registered? on your model
142
- directly after voting. For example:
129
+ after voting. For example:
143
130
 
144
131
  @hat.liked_by @user
145
132
  @hat.vote_registered? # => true
@@ -181,20 +168,18 @@ to speed up @post we would use the following migration:
181
168
 
182
169
  All tests follow the RSpec format and are located in the spec directory
183
170
 
184
- ## Thanks
185
-
186
- A huge thank you to Michael Bleigh and his Acts-As-Taggable-On gem. I learned
187
- how to write gems by following his source code.
188
-
189
171
  ## TODO
190
172
 
173
+ - Pass in a block of options when creating acts_as. Allow for things
174
+ like disabling the aliasing
175
+
191
176
  - Smarter language syntax. Example: ``@user.likes`` will return all of the votables
192
177
  that the user likes, while ``@user.likes @model`` will cast a vote for @model by
193
178
  @user.
194
179
 
195
180
  - Need to test a model that is votable as well as a voter
196
181
 
197
- - The aliased functions are referred to by using the terms 'up/down' amd/or
198
- 'true/false'. Need to come up with guidelines for naming these function.
182
+ - The aliased methods are referred to by using the terms 'up/down' and/or
183
+ 'true/false'. Need to come up with guidelines for naming these methods.
199
184
 
200
185
  - Create more aliases. Specifically for counting votes and finding votes.
data/Rakefile CHANGED
File without changes
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
 
23
23
 
24
24
  s.add_development_dependency "rspec"
25
+ s.add_development_dependency "sqlite3"
25
26
 
26
27
  s.add_dependency "rails", '>=3.0.0'
27
28
 
@@ -3,19 +3,14 @@ require 'active_support/inflector'
3
3
 
4
4
  $LOAD_PATH.unshift(File.dirname(__FILE__))
5
5
 
6
- require 'acts_as_votable/init/init'
7
- require 'acts_as_votable/init/votable'
8
- require 'acts_as_votable/init/voter'
9
- require 'acts_as_votable/votable'
10
- require 'acts_as_votable/voter'
11
- require 'acts_as_votable/alias'
12
-
13
6
  module ActsAsVotable
14
7
 
15
8
  if defined?(ActiveRecord::Base)
9
+ require 'acts_as_votable/extenders/votable'
10
+ require 'acts_as_votable/extenders/voter'
16
11
  require 'acts_as_votable/vote'
17
- ActiveRecord::Base.extend ActsAsVotable::Init::Votable
18
- ActiveRecord::Base.extend ActsAsVotable::Init::Voter
12
+ ActiveRecord::Base.extend ActsAsVotable::Extenders::Votable
13
+ ActiveRecord::Base.extend ActsAsVotable::Extenders::Voter
19
14
  end
20
15
 
21
16
  end
@@ -0,0 +1,25 @@
1
+ module ActsAsVotable
2
+ module Extenders
3
+
4
+ module Votable
5
+
6
+ def votable?
7
+ false
8
+ end
9
+
10
+ def acts_as_votable
11
+ require 'acts_as_votable/votable'
12
+ include ActsAsVotable::Votable
13
+
14
+ class_eval do
15
+ def self.votable?
16
+ true
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ module ActsAsVotable
2
+ module Extenders
3
+
4
+ module Voter
5
+
6
+ def voter?
7
+ false
8
+ end
9
+
10
+ def acts_as_voter(*args)
11
+ require 'acts_as_votable/voter'
12
+ include ActsAsVotable::Voter
13
+
14
+ class_eval do
15
+ def self.voter?
16
+ true
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ module ActsAsVotable::Helpers
2
+
3
+ # this helper provides methods that help find what words are
4
+ # up votes and what words are down votes
5
+ #
6
+ # It can be called
7
+ #
8
+ # votable_object.votable_words.that_mean_true
9
+ #
10
+ module Words
11
+
12
+ def votable_words
13
+ VotableWords
14
+ end
15
+
16
+ end
17
+
18
+ class VotableWords
19
+
20
+ def self.that_mean_true
21
+ ['up', 'upvote', 'like', 'liked', 'positive', 'yes', 'good', 'true', 1, true]
22
+ end
23
+
24
+ def self.that_mean_false
25
+ ['down', 'downvote', 'dislike', 'disliked', 'negative', 'no', 'bad', 'false', 0, false]
26
+ end
27
+
28
+ # check is word is a true or bad vote
29
+ # if the word is unknown, then it counts it as a true/good
30
+ # vote. this exists to allow all voting to be good by default
31
+ def self.meaning_of word
32
+ !that_mean_false.include?(word)
33
+ end
34
+
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module ActsAsVotable
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,147 +1,181 @@
1
+ require 'acts_as_votable/helpers/words'
2
+
1
3
  module ActsAsVotable
2
4
  module Votable
3
5
 
4
- def self.included(base)
5
- base.send :include, ActsAsVotable::Votable::InstanceMethods
6
- # base.extend ActsAsVotable::Votable::ClassMethods
7
- end
6
+ include Helpers::Words
8
7
 
8
+ def self.included base
9
+
10
+ # allow the user to define these himself
11
+ aliases = {
9
12
 
10
- module ClassMethods
11
- end
13
+ :vote_up => [
14
+ :up_by, :upvote_by, :like_by, :liked_by, :vote_by,
15
+ :up_from, :upvote_from, :like_from, :liked_from, :vote_from
16
+ ],
12
17
 
13
- module InstanceMethods
18
+ :vote_down => [
19
+ :down_by, :downvote_by, :dislike_by, :disliked_by,
20
+ :down_from, :downvote_by, :dislike_by, :disliked_by
21
+ ],
14
22
 
15
- attr_accessor :vote_registered
23
+ :up_votes => [
24
+ :true_votes, :ups, :upvotes, :likes, :positives, :for_votes,
25
+ ],
16
26
 
17
- def vote_registered?
18
- return self.vote_registered
19
- end
27
+ :down_votes => [
28
+ :false_votes, :downs, :downvotes, :dislikes, :negatives
29
+ ]
20
30
 
21
- def default_conditions
22
- {
23
- :votable_id => self.id,
24
- :votable_type => self.class.name
25
- }
26
- end
31
+ }
27
32
 
28
- # voting
29
- def vote args = {}
33
+ base.class_eval do
30
34
 
31
- options = ActsAsVotable::Vote.default_voting_args.merge(args)
32
- self.vote_registered = false
35
+ belongs_to :votable, :polymorphic => true
33
36
 
34
- if options[:voter].nil?
35
- return false
37
+ aliases.each do |method, links|
38
+ links.each do |new_method|
39
+ alias_method(new_method, method)
40
+ end
36
41
  end
37
42
 
38
- # find the vote
39
- votes = find_votes({
40
- :voter_id => options[:voter].id,
41
- :voter_type => options[:voter].class.name
42
- })
43
-
44
- if votes.count == 0
45
- # this voter has never voted
46
- vote = ActsAsVotable::Vote.new(
47
- :votable => self,
48
- :voter => options[:voter]
49
- )
50
- else
51
- # this voter is potentially changing his vote
52
- vote = votes.first
53
- end
43
+ end
44
+ end
45
+
46
+ attr_accessor :vote_registered
54
47
 
55
- last_update = vote.updated_at
48
+ def vote_registered?
49
+ return self.vote_registered
50
+ end
56
51
 
57
- vote.vote_flag = ActsAsVotable::Vote.word_is_a_vote_for(options[:vote])
52
+ def default_conditions
53
+ {
54
+ :votable_id => self.id,
55
+ :votable_type => self.class.name
56
+ }
57
+ end
58
58
 
59
- if vote.save
60
- self.vote_registered = true if last_update != vote.updated_at
61
- update_cached_votes
62
- return true
63
- else
64
- self.vote_registered = false
65
- return false
66
- end
59
+ # voting
60
+ def vote args = {}
67
61
 
68
-
69
- end
62
+ options = {
63
+ :vote => true,
64
+ }.merge(args)
65
+
66
+ self.vote_registered = false
70
67
 
71
- def vote_up voter
72
- self.vote :voter => voter, :vote => true
68
+ if options[:voter].nil?
69
+ return false
73
70
  end
74
71
 
75
- def vote_down voter
76
- self.vote :voter => voter, :vote => false
72
+ # find the vote
73
+ votes = find_votes({
74
+ :voter_id => options[:voter].id,
75
+ :voter_type => options[:voter].class.name
76
+ })
77
+
78
+ if votes.count == 0
79
+ # this voter has never voted
80
+ vote = ActsAsVotable::Vote.new(
81
+ :votable => self,
82
+ :voter => options[:voter]
83
+ )
84
+ # redefine type if this object has a type. this is to deal
85
+ # with sti classes
86
+ vote.votable_type = type if respond_to?(:type) && !type.blank?
87
+ else
88
+ # this voter is potentially changing his vote
89
+ vote = votes.first
77
90
  end
78
91
 
79
- # caching
80
- def update_cached_votes
92
+ last_update = vote.updated_at
81
93
 
82
- updates = {}
94
+ vote.vote_flag = votable_words.meaning_of(options[:vote])
83
95
 
84
- if self.respond_to?(:cached_votes_total=)
85
- updates[:cached_votes_total] = count_votes_total(true)
86
- end
96
+ if vote.save
97
+ self.vote_registered = true if last_update != vote.updated_at
98
+ update_cached_votes
99
+ return true
100
+ else
101
+ self.vote_registered = false
102
+ return false
103
+ end
87
104
 
88
- if self.respond_to?(:cached_votes_up=)
89
- updates[:cached_votes_up] = count_votes_up(true)
90
- end
105
+ end
91
106
 
92
- if self.respond_to?(:cached_votes_down=)
93
- updates[:cached_votes_down] = count_votes_down(true)
94
- end
107
+ def vote_up voter
108
+ self.vote :voter => voter, :vote => true
109
+ end
95
110
 
96
- self.update_attributes(updates) if updates.size > 0
111
+ def vote_down voter
112
+ self.vote :voter => voter, :vote => false
113
+ end
97
114
 
98
- end
115
+ # caching
116
+ def update_cached_votes
99
117
 
118
+ updates = {}
100
119
 
101
- # results
102
- def find_votes extra_conditions = {}
103
- ActsAsVotable::Vote.find(:all, :conditions => default_conditions.merge(extra_conditions))
120
+ if self.respond_to?(:cached_votes_total=)
121
+ updates[:cached_votes_total] = count_votes_total(true)
104
122
  end
105
- alias :votes :find_votes
106
123
 
107
- def up_votes
108
- find_votes(:vote_flag => true)
124
+ if self.respond_to?(:cached_votes_up=)
125
+ updates[:cached_votes_up] = count_votes_up(true)
109
126
  end
110
127
 
111
- def down_votes
112
- find_votes(:vote_flag => false)
128
+ if self.respond_to?(:cached_votes_down=)
129
+ updates[:cached_votes_down] = count_votes_down(true)
113
130
  end
114
131
 
132
+ self.update_attributes(updates) if updates.size > 0
115
133
 
116
- # counting
117
- def count_votes_total skip_cache = false
118
- if !skip_cache && self.respond_to?(:cached_votes_total)
119
- return self.send(:cached_votes_total)
120
- end
121
- find_votes.size
122
- end
134
+ end
123
135
 
124
- def count_votes_up skip_cache = false
125
- if !skip_cache && self.respond_to?(:cached_votes_up)
126
- return self.send(:cached_votes_up)
127
- end
128
- up_votes.size
136
+
137
+ # results
138
+ def find_votes extra_conditions = {}
139
+ ActsAsVotable::Vote.find(:all, :conditions => default_conditions.merge(extra_conditions))
140
+ end
141
+ alias :votes :find_votes
142
+
143
+ def up_votes
144
+ find_votes(:vote_flag => true)
145
+ end
146
+
147
+ def down_votes
148
+ find_votes(:vote_flag => false)
149
+ end
150
+
151
+
152
+ # counting
153
+ def count_votes_total skip_cache = false
154
+ if !skip_cache && self.respond_to?(:cached_votes_total)
155
+ return self.send(:cached_votes_total)
129
156
  end
157
+ find_votes.size
158
+ end
130
159
 
131
- def count_votes_down skip_cache = false
132
- if !skip_cache && self.respond_to?(:cached_votes_down)
133
- return self.send(:cached_votes_down)
134
- end
135
- down_votes.size
160
+ def count_votes_up skip_cache = false
161
+ if !skip_cache && self.respond_to?(:cached_votes_up)
162
+ return self.send(:cached_votes_up)
136
163
  end
164
+ up_votes.size
165
+ end
137
166
 
138
- # voters
139
- def voted_on_by? voter
140
- votes = find_votes :voter_id => voter.id, :voter_type => voter.class.name
141
- votes.size > 0
167
+ def count_votes_down skip_cache = false
168
+ if !skip_cache && self.respond_to?(:cached_votes_down)
169
+ return self.send(:cached_votes_down)
142
170
  end
171
+ down_votes.size
172
+ end
143
173
 
174
+ # voters
175
+ def voted_on_by? voter
176
+ votes = find_votes :voter_id => voter.id, :voter_type => voter.class.name
177
+ votes.size > 0
144
178
  end
145
179
 
146
180
  end
147
- end
181
+ end
@@ -1,6 +1,10 @@
1
+ require 'acts_as_votable/helpers/words'
2
+
1
3
  module ActsAsVotable
2
4
  class Vote < ::ActiveRecord::Base
3
5
 
6
+ include Helpers::Words
7
+
4
8
  attr_accessible :votable_id, :votable_type,
5
9
  :voter_id, :voter_type,
6
10
  :votable, :voter,
@@ -12,28 +16,6 @@ module ActsAsVotable
12
16
  validates_presence_of :votable_id
13
17
  validates_presence_of :voter_id
14
18
 
15
- def self.true_votes
16
- ['up', 'upvote', 'like', 'liked', 'positive', 'yes', 'good', 'true', 1, true]
17
- end
18
-
19
- def self.false_votes
20
- ['down', 'downvote', 'dislike', 'disliked', 'negative', 'no', 'bad', 'false', 0, false]
21
- end
22
-
23
- ##
24
- # check is word is a true or bad vote
25
- # if the word is unknown, then it counts it as a true/good
26
- # vote. this exists to allow all voting to be good by default
27
- def self.word_is_a_vote_for word
28
- !false_votes.include? word
29
- end
30
-
31
- def self.default_voting_args
32
- {
33
- :vote => true,
34
- }
35
- end
36
-
37
19
  end
38
20
 
39
21
  end
@@ -2,76 +2,86 @@ module ActsAsVotable
2
2
  module Voter
3
3
 
4
4
  def self.included(base)
5
- base.send :include, ActsAsVotable::Voter::InstanceMethods
6
- end
7
5
 
6
+ # allow user to define these
7
+ aliases = {
8
+ :vote_up_for => [:likes, :upvotes, :up_votes],
9
+ :vote_down_for => [:dislikes, :downvotes, :down_votes]
10
+ }
8
11
 
9
- module ClassMethods
10
- end
12
+ base.class_eval do
11
13
 
12
- module InstanceMethods
14
+ belongs_to :voter, :polymorphic => true
13
15
 
14
- def default_conditions
15
- {
16
- :voter_id => self.id,
17
- :voter_type => self.class.name
18
- }
19
- end
16
+ aliases.each do |method, links|
17
+ links.each do |new_method|
18
+ alias_method(new_method, method)
19
+ end
20
+ end
20
21
 
21
- # voting
22
- def vote args
23
- args[:votable].vote args.merge({:voter => self})
24
22
  end
25
23
 
26
- def vote_up_for model
27
- vote :votable => model, :vote => true
28
- end
24
+ end
29
25
 
30
- def vote_down_for model
31
- vote :votable => model, :vote => false
32
- end
26
+ def default_conditions
27
+ {
28
+ :voter_id => self.id,
29
+ :voter_type => self.class.name
30
+ }
31
+ end
33
32
 
34
- # results
35
- def voted_on? votable
36
- votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name)
37
- votes.size > 0
38
- end
39
- alias :voted_for? :voted_on?
33
+ # voting
34
+ def vote args
35
+ args[:votable].vote args.merge({:voter => self})
36
+ end
40
37
 
41
- def voted_as_when_voting_on votable
42
- votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name)
43
- return nil if votes.size == 0
44
- return votes.first.vote_flag
45
- end
46
- alias :voted_as_when_voting_for :voted_as_when_voting_on
38
+ def vote_up_for model
39
+ vote :votable => model, :vote => true
40
+ end
47
41
 
48
-
49
- def find_votes extra_conditions = {}
50
- ActsAsVotable::Vote.find(:all, :conditions => default_conditions.merge(extra_conditions))
51
- end
52
- alias :votes :find_votes
42
+ def vote_down_for model
43
+ vote :votable => model, :vote => false
44
+ end
53
45
 
54
- def find_up_votes
55
- find_votes :vote_flag => true
56
- end
46
+ # results
47
+ def voted_on? votable
48
+ votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name)
49
+ votes.size > 0
50
+ end
51
+ alias :voted_for? :voted_on?
57
52
 
58
- def find_down_votes
59
- find_votes :vote_flag => false
60
- end
53
+ def voted_as_when_voting_on votable
54
+ votes = find_votes(:votable_id => votable.id, :votable_type => votable.class.name)
55
+ return nil if votes.size == 0
56
+ return votes.first.vote_flag
57
+ end
58
+ alias :voted_as_when_voting_for :voted_as_when_voting_on
61
59
 
62
- def find_votes_for_class klass, extra_conditions = {}
63
- find_votes extra_conditions.merge({:votable_type => klass.name})
64
- end
60
+ def find_votes extra_conditions = {}
61
+ ActsAsVotable::Vote.find(:all, :conditions => default_conditions.merge(extra_conditions))
62
+ end
63
+ alias :votes :find_votes
65
64
 
66
- def find_up_votes_for_class klass
67
- find_votes_for_class klass, :vote_flag => true
68
- end
65
+ def find_up_votes
66
+ find_votes :vote_flag => true
67
+ end
69
68
 
70
- def find_down_votes_for_class klass
71
- find_votes_for_class klass, :vote_flag => false
72
- end
69
+ def find_down_votes
70
+ find_votes :vote_flag => false
71
+ end
72
+
73
+ def find_votes_for_class klass, extra_conditions = {}
74
+ find_votes extra_conditions.merge({:votable_type => klass.name})
75
+ end
76
+
77
+ def find_up_votes_for_class klass
78
+ find_votes_for_class klass, :vote_flag => true
79
+ end
73
80
 
81
+ def find_down_votes_for_class klass
82
+ find_votes_for_class klass, :vote_flag => false
74
83
  end
75
84
 
85
+
76
86
  end
77
- end
87
+ end
data/spec/spec_helper.rb CHANGED
@@ -28,6 +28,16 @@ ActiveRecord::Schema.define(:version => 1) do
28
28
  t.string :name
29
29
  end
30
30
 
31
+ create_table :sti_votables do |t|
32
+ t.string :name
33
+ t.string :type
34
+ end
35
+
36
+ create_table :sti_not_votables do |t|
37
+ t.string :name
38
+ t.string :type
39
+ end
40
+
31
41
  create_table :not_votables do |t|
32
42
  t.string :name
33
43
  end
@@ -55,6 +65,21 @@ class Votable < ActiveRecord::Base
55
65
  validates_presence_of :name
56
66
  end
57
67
 
68
+ class StiVotable < ActiveRecord::Base
69
+ acts_as_votable
70
+ end
71
+
72
+ class ChildOfStiVotable < StiVotable
73
+ end
74
+
75
+ class StiNotVotable < ActiveRecord::Base
76
+ validates_presence_of :name
77
+ end
78
+
79
+ class VotableChildOfStiNotVotable < StiNotVotable
80
+ acts_as_votable
81
+ end
82
+
58
83
  class NotVotable < ActiveRecord::Base
59
84
  end
60
85
 
@@ -75,4 +100,4 @@ def clean_database
75
100
  models.each do |model|
76
101
  ActiveRecord::Base.connection.execute "DELETE FROM #{model.table_name}"
77
102
  end
78
- end
103
+ end
data/spec/votable_spec.rb CHANGED
@@ -111,8 +111,6 @@ describe ActsAsVotable::Votable do
111
111
  votable2.vote_registered?.should be false
112
112
  end
113
113
 
114
-
115
-
116
114
  describe "with cached votes" do
117
115
 
118
116
  before(:each) do
@@ -170,7 +168,34 @@ describe ActsAsVotable::Votable do
170
168
 
171
169
  end
172
170
 
171
+ describe "sti models" do
172
+
173
+ before(:each) do
174
+ clean_database
175
+ @voter = Voter.create(:name => 'i can vote!')
176
+ end
177
+
178
+ it "should be able to vote on a votable child of a non votable sti model" do
179
+ votable = VotableChildOfStiNotVotable.create(:name => 'sti child')
180
+
181
+ votable.vote :voter => @voter, :vote => 'yes'
182
+ votable.votes.size.should == 1
183
+ end
184
+
185
+ it "should not be able to vote on a parent non votable" do
186
+ StiNotVotable.should_not be_votable
187
+ end
188
+
189
+ it "should be able to vote on a child when its parent is votable" do
190
+ votable = ChildOfStiVotable.create(:name => 'sti child')
191
+
192
+ votable.vote :voter => @voter, :vote => 'yes'
193
+ votable.votes.size.should == 1
194
+ end
195
+
196
+ end
197
+
173
198
  end
174
199
 
175
200
 
176
- end
201
+ end
data/spec/voter_spec.rb CHANGED
File without changes
@@ -0,0 +1,30 @@
1
+ require 'acts_as_votable'
2
+ require 'spec_helper'
3
+
4
+ describe ActsAsVotable::Helpers::Words do
5
+
6
+ before :each do
7
+ @vote = ActsAsVotable::Vote.new
8
+ end
9
+
10
+ it "should know that like is a true vote" do
11
+ @vote.votable_words.that_mean_true.should include "like"
12
+ end
13
+
14
+ it "should know that bad is a false vote" do
15
+ @vote.votable_words.that_mean_false.should include "bad"
16
+ end
17
+
18
+ it "should be a vote for true when word is good" do
19
+ @vote.votable_words.meaning_of('good').should be true
20
+ end
21
+
22
+ it "should be a vote for false when word is down" do
23
+ @vote.votable_words.meaning_of('down').should be false
24
+ end
25
+
26
+ it "should be a vote for true when the word is unknown" do
27
+ @vote.votable_words.meaning_of('lsdhklkadhfs').should be true
28
+ end
29
+
30
+ end
metadata CHANGED
@@ -1,60 +1,56 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: acts_as_votable
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 0
9
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Ryan
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-02-09 00:00:00 -05:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2011-10-08 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: rspec
16
+ requirement: &2950990 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
22
23
  prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
+ version_requirements: *2950990
25
+ - !ruby/object:Gem::Dependency
26
+ name: sqlite3
27
+ requirement: &2950780 !ruby/object:Gem::Requirement
24
28
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
31
33
  type: :development
32
- version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
34
- name: rails
35
34
  prerelease: false
36
- requirement: &id002 !ruby/object:Gem::Requirement
35
+ version_requirements: *2950780
36
+ - !ruby/object:Gem::Dependency
37
+ name: rails
38
+ requirement: &2950530 !ruby/object:Gem::Requirement
37
39
  none: false
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 3
43
- - 0
44
- - 0
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
45
43
  version: 3.0.0
46
44
  type: :runtime
47
- version_requirements: *id002
45
+ prerelease: false
46
+ version_requirements: *2950530
48
47
  description: Rails gem to allowing records to be votable
49
- email:
48
+ email:
50
49
  - ryanto
51
50
  executables: []
52
-
53
51
  extensions: []
54
-
55
52
  extra_rdoc_files: []
56
-
57
- files:
53
+ files:
58
54
  - .gitignore
59
55
  - Gemfile
60
56
  - Gemfile.lock
@@ -62,56 +58,45 @@ files:
62
58
  - Rakefile
63
59
  - acts_as_votable.gemspec
64
60
  - lib/acts_as_votable.rb
65
- - lib/acts_as_votable/alias.rb
66
- - lib/acts_as_votable/init/init.rb
67
- - lib/acts_as_votable/init/votable.rb
68
- - lib/acts_as_votable/init/voter.rb
61
+ - lib/acts_as_votable/extenders/votable.rb
62
+ - lib/acts_as_votable/extenders/voter.rb
63
+ - lib/acts_as_votable/helpers/words.rb
69
64
  - lib/acts_as_votable/version.rb
70
65
  - lib/acts_as_votable/votable.rb
71
66
  - lib/acts_as_votable/vote.rb
72
67
  - lib/acts_as_votable/voter.rb
73
68
  - lib/generators/acts_as_votable/migration/migration_generator.rb
74
69
  - lib/generators/acts_as_votable/migration/templates/active_record/migration.rb
75
- - spec/alias_spec.rb
76
70
  - spec/spec_helper.rb
77
71
  - spec/votable_spec.rb
78
- - spec/vote_spec.rb
79
72
  - spec/voter_spec.rb
80
- has_rdoc: true
73
+ - spec/words_spec.rb
81
74
  homepage: http://rubygems.org/gems/acts_as_votable
82
75
  licenses: []
83
-
84
76
  post_install_message:
85
77
  rdoc_options: []
86
-
87
- require_paths:
78
+ require_paths:
88
79
  - lib
89
- required_ruby_version: !ruby/object:Gem::Requirement
80
+ required_ruby_version: !ruby/object:Gem::Requirement
90
81
  none: false
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- segments:
95
- - 0
96
- version: "0"
97
- required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
87
  none: false
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- segments:
103
- - 0
104
- version: "0"
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
105
92
  requirements: []
106
-
107
93
  rubyforge_project: acts_as_votable
108
- rubygems_version: 1.3.7
94
+ rubygems_version: 1.8.11
109
95
  signing_key:
110
96
  specification_version: 3
111
97
  summary: Rails gem to allowing records to be votable
112
- test_files:
113
- - spec/alias_spec.rb
98
+ test_files:
114
99
  - spec/spec_helper.rb
115
100
  - spec/votable_spec.rb
116
- - spec/vote_spec.rb
117
101
  - spec/voter_spec.rb
102
+ - spec/words_spec.rb
@@ -1,14 +0,0 @@
1
- module ActsAsVotable::Alias
2
-
3
- def self.words_to_alias object, words, call_function
4
- words.each do |word|
5
- if word.is_a?(String)
6
- function = word.to_sym
7
- if !object.respond_to?(function)
8
- object.send(:alias_method, function, call_function)
9
- end
10
- end
11
- end
12
- end
13
-
14
- end
@@ -1,5 +0,0 @@
1
- module ActsAsVotable
2
- module Init
3
-
4
- end
5
- end
@@ -1,39 +0,0 @@
1
- module ActsAsVotable::Init
2
-
3
- module Votable
4
-
5
- def votable?
6
- false
7
- end
8
-
9
- def acts_as_votable(*args)
10
-
11
- class_eval do
12
- belongs_to :votable, :polymorphic => true
13
-
14
- def self.votable?
15
- true
16
- end
17
-
18
- include ActsAsVotable::Votable
19
-
20
- end
21
-
22
- # aliasing
23
-
24
- # voting
25
- ActsAsVotable::Alias::words_to_alias self, %w(up_by upvote_by like_by liked_by vote_by), :vote_up
26
- ActsAsVotable::Alias::words_to_alias self, %w(up_from upvote_from like_from liked_from vote_from), :vote_up
27
- ActsAsVotable::Alias::words_to_alias self, %w(down_by downvote_by dislike_by disliked_by), :vote_down
28
- ActsAsVotable::Alias::words_to_alias self, %w(down_from downvote_from dislike_from disliked_from), :vote_down
29
-
30
- # finding
31
- ActsAsVotable::Alias::words_to_alias self, %w(true_votes ups upvotes likes positives), :up_votes
32
- ActsAsVotable::Alias::words_to_alias self, %w(false_votes downs downvotes dislikes negatives), :down_votes
33
-
34
- end
35
-
36
-
37
- end
38
-
39
- end
@@ -1,30 +0,0 @@
1
- module ActsAsVotable::Init
2
-
3
- # voter
4
- module Voter
5
-
6
- def voter?
7
- false
8
- end
9
-
10
- def acts_as_voter(*args)
11
-
12
- class_eval do
13
- belongs_to :voter, :polymorphic => true
14
-
15
- def self.voter?
16
- true
17
- end
18
-
19
- include ActsAsVotable::Voter
20
-
21
- ActsAsVotable::Alias::words_to_alias self, %w(likes upvotes up_votes), :vote_up_for
22
- ActsAsVotable::Alias::words_to_alias self, %w(dislikes downvotes down_votes), :vote_down_for
23
-
24
- end
25
-
26
- end
27
-
28
- end
29
-
30
- end
data/spec/alias_spec.rb DELETED
@@ -1,64 +0,0 @@
1
- require 'acts_as_votable'
2
- require 'spec_helper'
3
-
4
- describe ActsAsVotable::Alias do
5
-
6
- before(:each) do
7
- clean_database
8
- end
9
-
10
- describe "votable models" do
11
-
12
- before(:each) do
13
- clean_database
14
- @votable = Votable.new(:name => 'votable with aliases')
15
- @votable.save
16
-
17
- @voter = Voter.new(:name => 'a voter')
18
- @voter.save
19
- end
20
-
21
- it "should alias a bunch of functions" do
22
-
23
- # voting
24
- @votable.respond_to?(:disliked_by).should be true
25
- @votable.respond_to?(:up_from).should be true
26
-
27
- # results
28
- @votable.respond_to?(:upvotes).should be true
29
- @votable.respond_to?(:ups).should be true
30
- @votable.respond_to?(:dislikes).should be true
31
-
32
- end
33
-
34
- it "should add callable functions" do
35
- @votable.vote :voter => @voter
36
- @votable.likes.size.should == 1
37
- end
38
- end
39
-
40
- describe "voter models" do
41
-
42
- before(:each) do
43
- clean_database
44
- @votable = Votable.new(:name => 'a votable')
45
- @votable.save
46
-
47
- @voter = Voter.new(:name => 'a voter with aliases')
48
- @voter.save
49
- end
50
-
51
- it "should alias a bunch of functions" do
52
- @voter.respond_to?(:upvotes).should be true
53
- @voter.respond_to?(:dislikes).should be true
54
- end
55
-
56
- it "should add callable functions" do
57
- @voter.likes @votable
58
- @votable.likes.size.should == 1
59
- end
60
- end
61
-
62
-
63
-
64
- end
data/spec/vote_spec.rb DELETED
@@ -1,34 +0,0 @@
1
- require 'acts_as_votable'
2
- require 'spec_helper'
3
-
4
- describe ActsAsVotable::Vote do
5
-
6
- it "should know that like is a true vote" do
7
- ActsAsVotable::Vote.true_votes.should include "like"
8
- end
9
-
10
- it "should know that bad is a false vote" do
11
- ActsAsVotable::Vote.false_votes.should include "bad"
12
- end
13
-
14
- it "should be a vote for true when word is good" do
15
- ActsAsVotable::Vote.word_is_a_vote_for('good').should be true
16
- end
17
-
18
- it "should be a vote for false when word is down" do
19
- ActsAsVotable::Vote.word_is_a_vote_for('down').should be false
20
- end
21
-
22
- it "should be a vote for true when the word is unknown" do
23
- ActsAsVotable::Vote.word_is_a_vote_for('lsdhklkadhfs').should be true
24
- end
25
-
26
- it "should have vote=>true in the default voting args" do
27
- ActsAsVotable::Vote.default_voting_args[:vote].should be true
28
- end
29
-
30
-
31
-
32
-
33
-
34
- end