mongoid-votable 0.0.1 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1eb71616709305c0a427619ad1cbe815707b4e5d
4
- data.tar.gz: bc95294d564dc8a6580cdcc521994541fdb7735c
3
+ metadata.gz: a34ae76962b7b600d4201a76731e1bbdbea222cd
4
+ data.tar.gz: 4c64cf417ceab57073205364e07f71d6960924ed
5
5
  SHA512:
6
- metadata.gz: 2231ad970b2338e088c26654746e44d65d7032b4ab800b3b9667fafeedf4e722d4a3fe3e2c80ca669e0b942bd9c4d015991242f37d71ad5ebd88c1a837bd4e20
7
- data.tar.gz: 8198702962e25840c5b74a84760811b0aefacb71d48b6ab6d4b05ac4a3a2db8b1108ca0346c133abc65d5c0fad9090e3d82fd824584ab00d99c6b1891fed4c4a
6
+ metadata.gz: 1af78cf0eb8cb66304e50fe9f06a4a21a4f4e19179e1c7597c4b6c2c3ef857a1e92a6adea7c4de72e895f79a237a58c6b3b0b2214320c24f14e7a2df9bc91659
7
+ data.tar.gz: 9a9c15021bf6a66a3982bb6d8ec4f7f49d6221677376e61a4f3cef6748353d5bed1d8255b7d38b1b72599fd58d663d933512af59b68af72193a2488a4a016566
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/README.md CHANGED
@@ -18,7 +18,22 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
-
21
+ ~~~ruby
22
+ class Topic
23
+ include Mongoid::Document
24
+ include Mongoid::Votable
25
+
26
+ end
27
+ ~~~
28
+
29
+ ~~~ruby
30
+ topic.vote!(1, user)
31
+ topic.vote!(-1, user)
32
+
33
+ topic.vote!(10, user)
34
+
35
+ topics = Topic.voted_by(user)
36
+ ~~~
22
37
 
23
38
  ## Contributing
24
39
 
@@ -2,7 +2,7 @@
2
2
  module Mongoid
3
3
  module Votable
4
4
  extend ActiveSupport::Concern
5
-
5
+
6
6
  included do
7
7
  field :votes_count, type: Integer, default: 0
8
8
  field :votes_average, type: Integer, default: 0
@@ -13,7 +13,7 @@ module Mongoid
13
13
  embeds_many :votes, as: :votable, class_name: "Mongoid::Vote"
14
14
 
15
15
  scope :voted_by, ->(voter) do
16
- where("votes.voter" => voter)
16
+ where("votes.voter_id" => voter.id)
17
17
  end
18
18
  end
19
19
 
@@ -53,38 +53,39 @@ module Mongoid
53
53
  end
54
54
  end
55
55
 
56
- def do_vote!(vote, value, status)
57
- case status
58
- when :created
59
- if value > 0
60
- inc(:votes_up, 1)
61
- else
62
- inc(:votes_down, 1)
63
- end
64
- inc(:votes_count, 1)
65
- when :updated
66
- #Origin is vote down, but now is vote up
67
- if vote.value - value < 0 && vote.value > 0
68
- inc(:votes_up, 1)
69
- inc(:votes_down, -1)
70
- #Origin is vote up, but now is vote down
71
- elsif vote.value - value > 0 && vote.value < 0
72
- inc(:votes_down, 1)
73
- inc(:votes_up, -1)
74
- end
75
- when :destroyed
76
- if value > 0
77
- inc(:votes_down, -1)
56
+ private
57
+ def do_vote!(vote, value, status)
58
+ case status
59
+ when :created
60
+ if value > 0
61
+ inc(:votes_up, 1)
62
+ else
63
+ inc(:votes_down, 1)
64
+ end
65
+ inc(:votes_count, 1)
66
+ when :updated
67
+ #Origin is vote down, but now is vote up
68
+ if vote.value - value < 0 && vote.value > 0
69
+ inc(:votes_up, 1)
70
+ inc(:votes_down, -1)
71
+ #Origin is vote up, but now is vote down
72
+ elsif vote.value - value > 0 && vote.value < 0
73
+ inc(:votes_down, 1)
74
+ inc(:votes_up, -1)
75
+ end
76
+ when :destroyed
77
+ if value > 0
78
+ inc(:votes_down, -1)
79
+ else
80
+ inc(:votes_up, -1)
81
+ end
82
+ inc(:votes_count, -1)
78
83
  else
79
- inc(:votes_up, -1)
80
- end
81
- inc(:votes_count, -1)
82
- else
83
- raise "Not accept status"
84
- end
85
- inc(:votes_average, value)
86
- #set(:votes_average, votes.map(&:value).reduce(0, &:+))
87
- end
84
+ raise "Not accept status"
85
+ end
86
+ inc(:votes_average, value)
87
+ #set(:votes_average, votes.map(&:value).reduce(0, &:+))
88
+ end
88
89
 
89
90
 
90
91
  module ClassMethods
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Votable
3
- VERSION = "0.0.1"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency("mongoid", [">= 3.0.0"])
22
22
  spec.add_dependency("activesupport", [">= 3.0.0"])
23
23
 
24
+ spec.add_development_dependency "factory_girl"
24
25
  spec.add_development_dependency "rspec"
25
26
  spec.add_development_dependency "bundler"
26
27
  spec.add_development_dependency "rake"
@@ -0,0 +1,6 @@
1
+ test:
2
+ sessions:
3
+ default:
4
+ database: mongoid-votable_test
5
+ hosts:
6
+ - localhost:27017
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :topic do
3
+
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :user do
3
+ name "User"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ # encoding: UTF-8
2
+ class Topic
3
+ include Mongoid::Document
4
+ include Mongoid::Votable
5
+
6
+ end
@@ -0,0 +1,4 @@
1
+ class User
2
+ include Mongoid::Document
3
+ field :name
4
+ end
@@ -0,0 +1,149 @@
1
+ require 'spec_helper'
2
+
3
+ module Mongoid
4
+ describe Votable do
5
+ it { Topic.should respond_to(:voted_by) }
6
+
7
+ let(:user) { create(:user) }
8
+ let(:user2) { create(:user) }
9
+ let(:topic) { create(:topic) }
10
+
11
+ subject { topic }
12
+
13
+ it { should respond_to(:votes, :votes_count, :votes_up, :votes_down, :votes_average) }
14
+
15
+ its(:votes_count) { should == 0 }
16
+ its(:votes_up) { should == 0 }
17
+ its(:votes_down) { should == 0 }
18
+ its(:votes_average) { should == 0 }
19
+ its(:votes) { should be_empty }
20
+
21
+ context "single user" do
22
+
23
+ context "user vote up" do
24
+ before(:each) { topic.vote!(1, user) }
25
+ its(:votes_count) { should == 1 }
26
+ its(:votes_up) { should == 1 }
27
+ its(:votes_down) { should == 0 }
28
+ its(:votes_average) { should == 1 }
29
+ its(:votes) { should_not be_empty }
30
+ end
31
+
32
+ context "user vote down" do
33
+ before(:each) { topic.vote!(-1, user) }
34
+ its(:votes_count) { should == 1 }
35
+ its(:votes_up) { should == 0 }
36
+ its(:votes_down) { should == 1 }
37
+ its(:votes_average) { should == -1 }
38
+ its(:votes) { should_not be_empty }
39
+ end
40
+
41
+ context "user vote up, then vote down with same value" do
42
+ before(:each) do
43
+ topic.vote!(3, user)
44
+ topic.vote!(-3, user)
45
+ end
46
+ its(:votes_count) { should == 0 }
47
+ its(:votes_up) { should == 0 }
48
+ its(:votes_down) { should == 0 }
49
+ its(:votes_average) { should == 0 }
50
+ its(:votes) { should be_empty }
51
+ end
52
+
53
+ context "user vote up, then vote down, (down > up)" do
54
+ before(:each) do
55
+ topic.vote!(3, user)
56
+ topic.vote!(-6, user)
57
+ end
58
+ its(:votes_count) { should == 1 }
59
+ its(:votes_up) { should == 0 }
60
+ its(:votes_down) { should == 1 }
61
+ its(:votes_average) { should == -3 }
62
+ its(:votes) { should_not be_empty }
63
+ end
64
+
65
+ context "user vote up, then vote down, (down < up)" do
66
+ before(:each) do
67
+ topic.vote!(3, user)
68
+ topic.vote!(-1, user)
69
+ end
70
+ its(:votes_count) { should == 1 }
71
+ its(:votes_up) { should == 1 }
72
+ its(:votes_down) { should == 0 }
73
+ its(:votes_average) { should == 2 }
74
+ its(:votes) { should_not be_empty }
75
+ end
76
+
77
+ end
78
+
79
+ context "multiple users" do
80
+
81
+ context "users all vote up" do
82
+ before(:each) do
83
+ topic.vote!(1, user)
84
+ topic.vote!(1, user2)
85
+ end
86
+ its(:votes_count) { should == 2 }
87
+ its(:votes_up) { should == 2 }
88
+ its(:votes_down) { should == 0 }
89
+ its(:votes_average) { should == 2 }
90
+ its(:votes) { should have(2).items }
91
+ end
92
+
93
+ context "users all vote down" do
94
+ before(:each) do
95
+ topic.vote!(-1, user)
96
+ topic.vote!(-1, user2)
97
+ end
98
+ its(:votes_count) { should == 2 }
99
+ its(:votes_up) { should == 0 }
100
+ its(:votes_down) { should == 2 }
101
+ its(:votes_average) { should == -2 }
102
+ its(:votes) { should have(2).items }
103
+ end
104
+
105
+ context "users with different votes" do
106
+ before(:each) do
107
+ topic.vote!(1, user)
108
+ topic.vote!(-1, user2)
109
+ end
110
+ its(:votes_count) { should == 2 }
111
+ its(:votes_up) { should == 1 }
112
+ its(:votes_down) { should == 1 }
113
+ its(:votes_average) { should == 0 }
114
+ its(:votes) { should have(2).items }
115
+ end
116
+
117
+ context "users with different votes" do
118
+ before(:each) do
119
+ topic.vote!(1, user)
120
+ topic.vote!(-2, user2)
121
+ end
122
+ its(:votes_count) { should == 2 }
123
+ its(:votes_up) { should == 1 }
124
+ its(:votes_down) { should == 1 }
125
+ its(:votes_average) { should == -1 }
126
+ its(:votes) { should have(2).items }
127
+ end
128
+
129
+ end
130
+
131
+ context "voted_by" do
132
+ before(:each) do
133
+ topic.vote!(1, user)
134
+ topic.vote!(1, user2)
135
+ end
136
+ subject { Topic.voted_by(user) }
137
+
138
+ it { should have(1).items }
139
+ its(:first) { should be_instance_of Topic }
140
+ end
141
+
142
+ context "voted?" do
143
+ before(:each) { topic.vote!(1, user) }
144
+ it { topic.voted?(user).should be_true }
145
+ it { topic.voted?(user2).should be_false }
146
+ end
147
+
148
+ end
149
+ end
@@ -0,0 +1,35 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ require 'mongoid'
8
+ require 'mongoid-votable'
9
+ require 'active_support'
10
+ require 'factory_girl'
11
+
12
+ FactoryGirl.find_definitions
13
+
14
+ ENV['MONGOID_ENV'] = 'test'
15
+
16
+ Mongoid.load!("#{File.dirname(__FILE__)}/config/mongoid.yml")
17
+ Mongoid.logger = nil
18
+
19
+ RSpec.configure do |config|
20
+ config.treat_symbols_as_metadata_keys_with_true_values = true
21
+ config.run_all_when_everything_filtered = true
22
+ config.filter_run :focus
23
+
24
+ config.mock_with :rspec
25
+
26
+ # Run specs in random order to surface order dependencies. If you find an
27
+ # order dependency and want to debug it, you can fix the order by providing
28
+ # the seed, which is printed after each run.
29
+ # --seed 1234
30
+ config.order = 'random'
31
+
32
+ config.include FactoryGirl::Syntax::Methods
33
+
34
+ Dir['./spec/models/*.rb'].each { |f| require f }
35
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-votable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Zhan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-16 00:00:00.000000000 Z
11
+ date: 2013-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: 3.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: factory_girl
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -88,6 +102,7 @@ extensions: []
88
102
  extra_rdoc_files: []
89
103
  files:
90
104
  - .gitignore
105
+ - .rspec
91
106
  - Gemfile
92
107
  - LICENSE.txt
93
108
  - README.md
@@ -97,6 +112,13 @@ files:
97
112
  - lib/mongoid/votable/version.rb
98
113
  - lib/mongoid/vote.rb
99
114
  - mongoid-votable.gemspec
115
+ - spec/config/mongoid.yml
116
+ - spec/factories/topics.rb
117
+ - spec/factories/users.rb
118
+ - spec/models/topic.rb
119
+ - spec/models/user.rb
120
+ - spec/mongoid/votable_spec.rb
121
+ - spec/spec_helper.rb
100
122
  homepage: ''
101
123
  licenses:
102
124
  - MIT
@@ -121,5 +143,12 @@ rubygems_version: 2.0.3
121
143
  signing_key:
122
144
  specification_version: 4
123
145
  summary: Votable for mongoid
124
- test_files: []
146
+ test_files:
147
+ - spec/config/mongoid.yml
148
+ - spec/factories/topics.rb
149
+ - spec/factories/users.rb
150
+ - spec/models/topic.rb
151
+ - spec/models/user.rb
152
+ - spec/mongoid/votable_spec.rb
153
+ - spec/spec_helper.rb
125
154
  has_rdoc: