make_voteable 0.0.2 → 0.1.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/.gitignore +0 -1
- data/README.rdoc +9 -1
- data/Rakefile +2 -0
- data/lib/make_voteable/exceptions.rb +8 -12
- data/lib/make_voteable/version.rb +1 -1
- data/lib/make_voteable/voteable.rb +4 -0
- data/lib/make_voteable/voter.rb +23 -19
- data/make_voteable.gemspec +6 -5
- data/spec/generators/make_voteable_generator_spec.rb +28 -0
- data/spec/lib/make_voteable_spec.rb +28 -0
- data/spec/spec_helper.rb +2 -6
- metadata +21 -47
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -26,7 +26,7 @@ also add +up_votes+ and +down_votes+ columns to the voter (e.g. User) and voteab
|
|
26
26
|
|
27
27
|
migrate the database
|
28
28
|
|
29
|
-
|
29
|
+
rake db:migrate
|
30
30
|
|
31
31
|
== Usage
|
32
32
|
|
@@ -90,6 +90,14 @@ migrate the database
|
|
90
90
|
# Returns true if the question was down voted by the user, false otherwise
|
91
91
|
user.down_voted?(question)
|
92
92
|
|
93
|
+
# Access votings through voter
|
94
|
+
voting = user.votings.first
|
95
|
+
voting.up_vote? # true if up vote, false if down vote
|
96
|
+
|
97
|
+
# Access votings through voteable
|
98
|
+
voting = question.votings.first
|
99
|
+
voting.up_vote? # true if up vote, false if down vote
|
100
|
+
|
93
101
|
== Testing
|
94
102
|
|
95
103
|
MakeVoteable uses RSpec for testing and has a rake task for executing the provided specs
|
data/Rakefile
CHANGED
@@ -4,29 +4,25 @@ module MakeVoteable
|
|
4
4
|
attr_reader :up_vote
|
5
5
|
|
6
6
|
def initialize(up_vote)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def message
|
11
|
-
if @up_vote
|
12
|
-
vote = "up voted"
|
7
|
+
vote = if up_vote
|
8
|
+
"up voted"
|
13
9
|
else
|
14
|
-
|
10
|
+
"down voted"
|
15
11
|
end
|
16
12
|
|
17
|
-
"The voteable was already #{vote} by the voter."
|
13
|
+
super "The voteable was already #{vote} by the voter."
|
18
14
|
end
|
19
15
|
end
|
20
16
|
|
21
17
|
class NotVotedError < StandardError
|
22
|
-
def
|
23
|
-
"The voteable was not voted by the voter."
|
18
|
+
def initialize
|
19
|
+
super "The voteable was not voted by the voter."
|
24
20
|
end
|
25
21
|
end
|
26
22
|
|
27
23
|
class InvalidVoteableError < StandardError
|
28
|
-
def
|
29
|
-
"Invalid voteable."
|
24
|
+
def initialize
|
25
|
+
super "Invalid voteable."
|
30
26
|
end
|
31
27
|
end
|
32
28
|
end
|
data/lib/make_voteable/voter.rb
CHANGED
@@ -2,6 +2,10 @@ module MakeVoteable
|
|
2
2
|
module Voter
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
+
included do
|
6
|
+
has_many :votings, :class_name => "MakeVoteable::Voting", :as => :voter
|
7
|
+
end
|
8
|
+
|
5
9
|
module ClassMethods
|
6
10
|
def voter?
|
7
11
|
true
|
@@ -18,21 +22,21 @@ module MakeVoteable
|
|
18
22
|
|
19
23
|
if voting
|
20
24
|
if voting.up_vote
|
21
|
-
raise
|
25
|
+
raise Exceptions::AlreadyVotedError.new(true)
|
22
26
|
else
|
23
27
|
voting.up_vote = true
|
24
28
|
voteable.down_votes -= 1
|
25
|
-
self.down_votes -= 1 if
|
29
|
+
self.down_votes -= 1 if has_attribute?(:down_votes)
|
26
30
|
end
|
27
31
|
else
|
28
32
|
voting = Voting.create(:voteable => voteable, :voter => self, :up_vote => true)
|
29
33
|
end
|
30
34
|
|
31
35
|
voteable.up_votes += 1
|
32
|
-
self.up_votes += 1 if
|
36
|
+
self.up_votes += 1 if has_attribute?(:up_votes)
|
33
37
|
|
34
|
-
|
35
|
-
|
38
|
+
Voting.transaction do
|
39
|
+
save
|
36
40
|
voteable.save
|
37
41
|
voting.save
|
38
42
|
end
|
@@ -43,7 +47,7 @@ module MakeVoteable
|
|
43
47
|
def up_vote!(voteable)
|
44
48
|
begin
|
45
49
|
up_vote(voteable)
|
46
|
-
rescue
|
50
|
+
rescue Exceptions::AlreadyVotedError
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
@@ -57,21 +61,21 @@ module MakeVoteable
|
|
57
61
|
|
58
62
|
if voting
|
59
63
|
unless voting.up_vote
|
60
|
-
raise
|
64
|
+
raise Exceptions::AlreadyVotedError.new(false)
|
61
65
|
else
|
62
66
|
voting.up_vote = false
|
63
67
|
voteable.up_votes -= 1
|
64
|
-
self.up_votes -= 1 if
|
68
|
+
self.up_votes -= 1 if has_attribute?(:up_votes)
|
65
69
|
end
|
66
70
|
else
|
67
71
|
voting = Voting.create(:voteable => voteable, :voter => self, :up_vote => false)
|
68
72
|
end
|
69
73
|
|
70
74
|
voteable.down_votes += 1
|
71
|
-
self.down_votes += 1 if
|
75
|
+
self.down_votes += 1 if has_attribute?(:down_votes)
|
72
76
|
|
73
|
-
|
74
|
-
|
77
|
+
Voting.transaction do
|
78
|
+
save
|
75
79
|
voteable.save
|
76
80
|
voting.save
|
77
81
|
end
|
@@ -82,7 +86,7 @@ module MakeVoteable
|
|
82
86
|
def down_vote!(voteable)
|
83
87
|
begin
|
84
88
|
down_vote(voteable)
|
85
|
-
rescue
|
89
|
+
rescue Exceptions::AlreadyVotedError
|
86
90
|
end
|
87
91
|
end
|
88
92
|
|
@@ -93,18 +97,18 @@ module MakeVoteable
|
|
93
97
|
|
94
98
|
voting = fetch_voting(voteable)
|
95
99
|
|
96
|
-
raise
|
100
|
+
raise Exceptions::NotVotedError unless voting
|
97
101
|
|
98
102
|
if voting.up_vote
|
99
103
|
voteable.up_votes -= 1
|
100
|
-
self.up_votes -= 1 if
|
104
|
+
self.up_votes -= 1 if has_attribute?(:up_votes)
|
101
105
|
else
|
102
106
|
voteable.down_votes -= 1
|
103
|
-
self.down_votes -= 1 if
|
107
|
+
self.down_votes -= 1 if has_attribute?(:down_votes)
|
104
108
|
end
|
105
109
|
|
106
|
-
|
107
|
-
|
110
|
+
Voting.transaction do
|
111
|
+
save
|
108
112
|
voteable.save
|
109
113
|
voting.destroy
|
110
114
|
end
|
@@ -115,7 +119,7 @@ module MakeVoteable
|
|
115
119
|
def unvote!(voteable)
|
116
120
|
begin
|
117
121
|
unvote(voteable)
|
118
|
-
rescue
|
122
|
+
rescue Exceptions::NotVotedError
|
119
123
|
end
|
120
124
|
end
|
121
125
|
|
@@ -153,7 +157,7 @@ module MakeVoteable
|
|
153
157
|
end
|
154
158
|
|
155
159
|
def check_voteable(voteable)
|
156
|
-
raise
|
160
|
+
raise Exceptions::InvalidVoteableError unless voteable.class.voteable?
|
157
161
|
end
|
158
162
|
end
|
159
163
|
end
|
data/make_voteable.gemspec
CHANGED
@@ -14,11 +14,12 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.required_rubygems_version = ">= 1.3.6"
|
15
15
|
s.rubyforge_project = "make_voteable"
|
16
16
|
|
17
|
-
s.add_dependency "activerecord", "
|
18
|
-
s.add_development_dependency "bundler", "
|
19
|
-
s.add_development_dependency "rspec", "
|
20
|
-
s.add_development_dependency "database_cleaner", "0.
|
21
|
-
s.add_development_dependency "sqlite3-ruby", "
|
17
|
+
s.add_dependency "activerecord", "~> 3.0.0"
|
18
|
+
s.add_development_dependency "bundler", "~> 1.0.0"
|
19
|
+
s.add_development_dependency "rspec", "~> 2.5.0"
|
20
|
+
s.add_development_dependency "database_cleaner", "0.6.7.RC"
|
21
|
+
s.add_development_dependency "sqlite3-ruby", "~> 1.3.0"
|
22
|
+
s.add_development_dependency "generator_spec", "~> 0.8.2"
|
22
23
|
|
23
24
|
s.files = `git ls-files`.split("\n")
|
24
25
|
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'action_controller'
|
3
|
+
require 'generator_spec/test_case'
|
4
|
+
require 'generators/make_voteable/make_voteable_generator'
|
5
|
+
|
6
|
+
describe MakeVoteableGenerator do
|
7
|
+
include GeneratorSpec::TestCase
|
8
|
+
destination File.expand_path("/tmp", __FILE__)
|
9
|
+
tests MakeVoteableGenerator
|
10
|
+
|
11
|
+
before do
|
12
|
+
prepare_destination
|
13
|
+
run_generator
|
14
|
+
end
|
15
|
+
|
16
|
+
specify do
|
17
|
+
destination_root.should have_structure {
|
18
|
+
directory "db" do
|
19
|
+
directory "migrate" do
|
20
|
+
migration "create_make_voteable_tables" do
|
21
|
+
contains "class CreateMakeVoteableTables"
|
22
|
+
contains "create_table :votings"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
@@ -25,6 +25,34 @@ describe "Make Voteable" do
|
|
25
25
|
@voteable.votes.should == 0
|
26
26
|
end
|
27
27
|
|
28
|
+
it "voteable should have up vote votings" do
|
29
|
+
@voteable.votings.length.should == 0
|
30
|
+
@voter.up_vote(@voteable)
|
31
|
+
@voteable.votings.reload.length.should == 1
|
32
|
+
@voteable.votings[0].up_vote?.should be_true
|
33
|
+
end
|
34
|
+
|
35
|
+
it "voter should have up vote votings" do
|
36
|
+
@voter.votings.length.should == 0
|
37
|
+
@voter.up_vote(@voteable)
|
38
|
+
@voter.votings.reload.length.should == 1
|
39
|
+
@voter.votings[0].up_vote?.should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
it "voteable should have down vote votings" do
|
43
|
+
@voteable.votings.length.should == 0
|
44
|
+
@voter.down_vote(@voteable)
|
45
|
+
@voteable.votings.reload.length.should == 1
|
46
|
+
@voteable.votings[0].up_vote?.should be_false
|
47
|
+
end
|
48
|
+
|
49
|
+
it "voter should have down vote votings" do
|
50
|
+
@voter.votings.length.should == 0
|
51
|
+
@voter.down_vote(@voteable)
|
52
|
+
@voter.votings.reload.length.should == 1
|
53
|
+
@voter.votings[0].up_vote?.should be_false
|
54
|
+
end
|
55
|
+
|
28
56
|
describe "up vote" do
|
29
57
|
it "should increase up votes of voteable by one" do
|
30
58
|
@voteable.up_votes.should == 0
|
data/spec/spec_helper.rb
CHANGED
@@ -27,12 +27,8 @@ RSpec.configure do |config|
|
|
27
27
|
config.mock_with :rspec
|
28
28
|
|
29
29
|
config.before(:suite) do
|
30
|
-
DatabaseCleaner.strategy = :
|
31
|
-
DatabaseCleaner.
|
32
|
-
end
|
33
|
-
|
34
|
-
config.before(:each) do
|
35
|
-
DatabaseCleaner.start
|
30
|
+
DatabaseCleaner.strategy = :truncation
|
31
|
+
DatabaseCleaner.clean
|
36
32
|
end
|
37
33
|
|
38
34
|
config.after(:each) do
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: make_voteable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 27
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 2
|
10
|
-
version: 0.0.2
|
5
|
+
version: 0.1.0
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Kai Schlamp
|
@@ -15,7 +10,7 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date: 2011-
|
13
|
+
date: 2011-06-16 00:00:00 +02:00
|
19
14
|
default_executable:
|
20
15
|
dependencies:
|
21
16
|
- !ruby/object:Gem::Dependency
|
@@ -24,13 +19,8 @@ dependencies:
|
|
24
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
20
|
none: false
|
26
21
|
requirements:
|
27
|
-
- -
|
22
|
+
- - ~>
|
28
23
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 7
|
30
|
-
segments:
|
31
|
-
- 3
|
32
|
-
- 0
|
33
|
-
- 0
|
34
24
|
version: 3.0.0
|
35
25
|
type: :runtime
|
36
26
|
version_requirements: *id001
|
@@ -40,13 +30,8 @@ dependencies:
|
|
40
30
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
31
|
none: false
|
42
32
|
requirements:
|
43
|
-
- -
|
33
|
+
- - ~>
|
44
34
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 23
|
46
|
-
segments:
|
47
|
-
- 1
|
48
|
-
- 0
|
49
|
-
- 0
|
50
35
|
version: 1.0.0
|
51
36
|
type: :development
|
52
37
|
version_requirements: *id002
|
@@ -56,14 +41,9 @@ dependencies:
|
|
56
41
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
42
|
none: false
|
58
43
|
requirements:
|
59
|
-
- -
|
44
|
+
- - ~>
|
60
45
|
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
segments:
|
63
|
-
- 2
|
64
|
-
- 0
|
65
|
-
- 0
|
66
|
-
version: 2.0.0
|
46
|
+
version: 2.5.0
|
67
47
|
type: :development
|
68
48
|
version_requirements: *id003
|
69
49
|
- !ruby/object:Gem::Dependency
|
@@ -74,12 +54,7 @@ dependencies:
|
|
74
54
|
requirements:
|
75
55
|
- - "="
|
76
56
|
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
segments:
|
79
|
-
- 0
|
80
|
-
- 5
|
81
|
-
- 2
|
82
|
-
version: 0.5.2
|
57
|
+
version: 0.6.7.RC
|
83
58
|
type: :development
|
84
59
|
version_requirements: *id004
|
85
60
|
- !ruby/object:Gem::Dependency
|
@@ -88,16 +63,22 @@ dependencies:
|
|
88
63
|
requirement: &id005 !ruby/object:Gem::Requirement
|
89
64
|
none: false
|
90
65
|
requirements:
|
91
|
-
- -
|
66
|
+
- - ~>
|
92
67
|
- !ruby/object:Gem::Version
|
93
|
-
hash: 27
|
94
|
-
segments:
|
95
|
-
- 1
|
96
|
-
- 3
|
97
|
-
- 0
|
98
68
|
version: 1.3.0
|
99
69
|
type: :development
|
100
70
|
version_requirements: *id005
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: generator_spec
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ~>
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 0.8.2
|
80
|
+
type: :development
|
81
|
+
version_requirements: *id006
|
101
82
|
description: A user-centric voting extension for Rails 3 applications.
|
102
83
|
email:
|
103
84
|
- schlamp@gmx.de
|
@@ -124,6 +105,7 @@ files:
|
|
124
105
|
- make_voteable.gemspec
|
125
106
|
- spec/database.yml
|
126
107
|
- spec/database.yml.sample
|
108
|
+
- spec/generators/make_voteable_generator_spec.rb
|
127
109
|
- spec/lib/make_voteable_spec.rb
|
128
110
|
- spec/models.rb
|
129
111
|
- spec/schema.rb
|
@@ -142,25 +124,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
142
124
|
requirements:
|
143
125
|
- - ">="
|
144
126
|
- !ruby/object:Gem::Version
|
145
|
-
hash: 3
|
146
|
-
segments:
|
147
|
-
- 0
|
148
127
|
version: "0"
|
149
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
129
|
none: false
|
151
130
|
requirements:
|
152
131
|
- - ">="
|
153
132
|
- !ruby/object:Gem::Version
|
154
|
-
hash: 23
|
155
|
-
segments:
|
156
|
-
- 1
|
157
|
-
- 3
|
158
|
-
- 6
|
159
133
|
version: 1.3.6
|
160
134
|
requirements: []
|
161
135
|
|
162
136
|
rubyforge_project: make_voteable
|
163
|
-
rubygems_version: 1.
|
137
|
+
rubygems_version: 1.6.2
|
164
138
|
signing_key:
|
165
139
|
specification_version: 3
|
166
140
|
summary: Rails 3 voting extension
|