rating 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/LICENSE +21 -0
  4. data/README.md +180 -0
  5. data/lib/generators/rating/install_generator.rb +15 -0
  6. data/lib/generators/rating/templates/db/migrate/create_rating_tables.rb +31 -0
  7. data/lib/rating.rb +10 -0
  8. data/lib/rating/models/rating/extension.rb +46 -0
  9. data/lib/rating/models/rating/rate.rb +41 -0
  10. data/lib/rating/models/rating/rating.rb +96 -0
  11. data/lib/rating/version.rb +5 -0
  12. data/spec/factories/article.rb +7 -0
  13. data/spec/factories/rating/rate.rb +10 -0
  14. data/spec/factories/rating/rating.rb +12 -0
  15. data/spec/factories/user.rb +7 -0
  16. data/spec/models/extension/after_create_spec.rb +19 -0
  17. data/spec/models/extension/order_by_rating_spec.rb +121 -0
  18. data/spec/models/extension/rate_for_spec.rb +14 -0
  19. data/spec/models/extension/rate_spec.rb +14 -0
  20. data/spec/models/extension/rated_question_spec.rb +20 -0
  21. data/spec/models/extension/rated_spec.rb +38 -0
  22. data/spec/models/extension/rates_spec.rb +38 -0
  23. data/spec/models/extension/rating_spec.rb +38 -0
  24. data/spec/models/rate/create_spec.rb +64 -0
  25. data/spec/models/rate/rate_for_spec.rb +20 -0
  26. data/spec/models/rate_spec.rb +26 -0
  27. data/spec/models/rating/averager_data_spec.rb +29 -0
  28. data/spec/models/rating/data_spec.rb +37 -0
  29. data/spec/models/rating/update_rating_spec.rb +28 -0
  30. data/spec/models/rating/values_data_spec.rb +33 -0
  31. data/spec/models/rating_spec.rb +17 -0
  32. data/spec/rails_helper.rb +11 -0
  33. data/spec/support/common.rb +22 -0
  34. data/spec/support/database_cleaner.rb +19 -0
  35. data/spec/support/db/migrate/create_articles_table.rb +9 -0
  36. data/spec/support/db/migrate/create_users_table.rb +9 -0
  37. data/spec/support/factory_bot.rb +9 -0
  38. data/spec/support/html_matchers.rb +7 -0
  39. data/spec/support/migrate.rb +7 -0
  40. data/spec/support/models/article.rb +5 -0
  41. data/spec/support/models/user.rb +5 -0
  42. data/spec/support/shoulda.rb +10 -0
  43. metadata +247 -0
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Rating::Rate do
6
+ let!(:object) { build :rating_rate }
7
+
8
+ it { expect(object).to be_valid }
9
+
10
+ it { is_expected.to belong_to :author }
11
+ it { is_expected.to belong_to :resource }
12
+
13
+ it { is_expected.to validate_presence_of :author }
14
+ it { is_expected.to validate_presence_of :resource }
15
+ it { is_expected.to validate_presence_of :value }
16
+
17
+ specify do
18
+ is_expected.to validate_numericality_of(:value).is_less_than_or_equal_to(100).is_less_than_or_equal_to 100
19
+ end
20
+
21
+ specify do
22
+ expect(object).to validate_uniqueness_of(:author_id)
23
+ .scoped_to(%i[author_type resource_id resource_type])
24
+ .case_insensitive
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Rating::Rating, ':averager_data' do
6
+ subject { described_class.averager_data article_1 }
7
+
8
+ let!(:user_1) { create :user }
9
+ let!(:user_2) { create :user }
10
+
11
+ let!(:article_1) { create :article }
12
+ let!(:article_2) { create :article }
13
+ let!(:article_3) { create :article }
14
+
15
+ before do
16
+ create :rating_rate, author: user_1, resource: article_1, value: 100
17
+ create :rating_rate, author: user_1, resource: article_2, value: 11
18
+ create :rating_rate, author: user_1, resource: article_3, value: 10
19
+ create :rating_rate, author: user_2, resource: article_1, value: 1
20
+ end
21
+
22
+ it 'returns the values average of given resource type' do
23
+ expect(subject.as_json['rating_avg']).to eq 30.5
24
+ end
25
+
26
+ it 'returns the average of number of records for the given resource type' do
27
+ expect(subject.as_json['count_avg']).to eq 1.3333333333333333
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Rating::Rating, ':data' do
6
+ subject { described_class.data article_1 }
7
+
8
+ let!(:user_1) { create :user }
9
+ let!(:user_2) { create :user }
10
+
11
+ let!(:article_1) { create :article }
12
+ let!(:article_2) { create :article }
13
+ let!(:article_3) { create :article }
14
+
15
+ before do
16
+ create :rating_rate, author: user_1, resource: article_1, value: 100
17
+ create :rating_rate, author: user_1, resource: article_2, value: 11
18
+ create :rating_rate, author: user_1, resource: article_3, value: 10
19
+ create :rating_rate, author: user_2, resource: article_1, value: 1
20
+ end
21
+
22
+ it 'returns the average of value for a resource' do
23
+ expect(subject[:average]).to eq 50.5
24
+ end
25
+
26
+ it 'returns the sum of values for a resource' do
27
+ expect(subject[:sum]).to eq 101
28
+ end
29
+
30
+ it 'returns the count of votes for a resource' do
31
+ expect(subject[:total]).to eq 2
32
+ end
33
+
34
+ it 'returns the estimate for a resource' do
35
+ expect(subject[:estimate]).to eq 42.50000000000001
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Rating::Rating, ':update_rating' do
6
+ let!(:user_1) { create :user }
7
+ let!(:user_2) { create :user }
8
+
9
+ let!(:article_1) { create :article }
10
+ let!(:article_2) { create :article }
11
+ let!(:article_3) { create :article }
12
+
13
+ before do
14
+ create :rating_rate, author: user_1, resource: article_1, value: 100
15
+ create :rating_rate, author: user_1, resource: article_2, value: 11
16
+ create :rating_rate, author: user_1, resource: article_3, value: 10
17
+ create :rating_rate, author: user_2, resource: article_1, value: 1
18
+ end
19
+
20
+ it 'updates the rating data of the given resource' do
21
+ record = described_class.find_by(resource: article_1)
22
+
23
+ expect(record.average).to eq 50.50000000000001
24
+ expect(record.estimate).to eq 42.50000000000001
25
+ expect(record.sum).to eq 101
26
+ expect(record.total).to eq 2
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Rating::Rating, ':values_data' do
6
+ subject { described_class.values_data article_1 }
7
+
8
+ let!(:user_1) { create :user }
9
+ let!(:user_2) { create :user }
10
+
11
+ let!(:article_1) { create :article }
12
+ let!(:article_2) { create :article }
13
+ let!(:article_3) { create :article }
14
+
15
+ before do
16
+ create :rating_rate, author: user_1, resource: article_1, value: 100
17
+ create :rating_rate, author: user_1, resource: article_2, value: 11
18
+ create :rating_rate, author: user_1, resource: article_3, value: 10
19
+ create :rating_rate, author: user_2, resource: article_1, value: 4
20
+ end
21
+
22
+ it 'returns the average of value for a resource' do
23
+ expect(subject.as_json['rating_avg']).to eq 52.0
24
+ end
25
+
26
+ it 'returns the sum of values for a resource' do
27
+ expect(subject.as_json['rating_sum']).to eq 104
28
+ end
29
+
30
+ it 'returns the count of votes for a resource' do
31
+ expect(subject.as_json['rating_count']).to eq 2
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Rating::Rating do
6
+ let!(:object) { build :rating_rating }
7
+
8
+ it { expect(object).to be_valid }
9
+
10
+ it { is_expected.to belong_to :resource }
11
+
12
+ it { is_expected.to validate_presence_of :average }
13
+ it { is_expected.to validate_presence_of :estimate }
14
+ it { is_expected.to validate_presence_of :resource }
15
+ it { is_expected.to validate_presence_of :sum }
16
+ it { is_expected.to validate_presence_of :total }
17
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ ENV['RAILS_ENV'] ||= 'test'
4
+
5
+ require 'active_record/railtie'
6
+ require 'pry-byebug'
7
+ require 'rating'
8
+
9
+ ActiveRecord::Base.establish_connection adapter: :sqlite3, database: ':memory:'
10
+
11
+ Dir[File.expand_path('support/**/*.rb', __dir__)].each { |file| require file }
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec/rails'
4
+
5
+ RSpec.configure do |config|
6
+ config.filter_run_when_matching :focus
7
+
8
+ config.disable_monkey_patching!
9
+ config.infer_spec_type_from_file_location!
10
+
11
+ config.expect_with :rspec do |expectations|
12
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
13
+ end
14
+
15
+ config.mock_with :rspec do |mocks|
16
+ mocks.verify_partial_doubles = true
17
+ end
18
+
19
+ config.infer_base_class_for_anonymous_controllers = false
20
+ config.order = :random
21
+ config.profile_examples = true
22
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'database_cleaner'
4
+
5
+ RSpec.configure do |config|
6
+ config.before :suite do
7
+ DatabaseCleaner.strategy = :transaction
8
+
9
+ DatabaseCleaner.clean_with :truncation
10
+ end
11
+
12
+ config.before { DatabaseCleaner.start }
13
+
14
+ config.around do |spec|
15
+ DatabaseCleaner.cleaning do
16
+ spec.run
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateArticlesTable < ActiveRecord::Migration[5.0]
4
+ def change
5
+ create_table :articles do |t|
6
+ t.string :name, null: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateUsersTable < ActiveRecord::Migration[5.0]
4
+ def change
5
+ create_table :users do |t|
6
+ t.string :name, null: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'factory_bot'
4
+
5
+ Dir[File.expand_path('../factories/**/*.rb', __dir__)].each { |file| require file }
6
+
7
+ RSpec.configure do |config|
8
+ config.include FactoryBot::Syntax::Methods
9
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec-html-matchers'
4
+
5
+ RSpec.configure do |config|
6
+ config.include RSpecHtmlMatchers
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../lib/generators/rating/templates/db/migrate/create_rating_tables.rb', __dir__)
4
+
5
+ CreateRatingTables.new.change
6
+ CreateUsersTable.new.change
7
+ CreateArticlesTable.new.change
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Article < ::ActiveRecord::Base
4
+ rating
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class User < ::ActiveRecord::Base
4
+ rating
5
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'shoulda-matchers'
4
+
5
+ Shoulda::Matchers.configure do |config|
6
+ config.integrate do |with|
7
+ with.library :rails
8
+ with.test_framework :rspec
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,247 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rating
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Washington Botelho
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '4.2'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6'
33
+ - !ruby/object:Gem::Dependency
34
+ name: database_cleaner
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: factory_bot_rails
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: pry-byebug
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec-html-matchers
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec-rails
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rubocop-rspec
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: shoulda-matchers
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: sqlite3
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ description: A true Bayesian rating system with cache enabled.
146
+ email: wbotelhos@gmail.com
147
+ executables: []
148
+ extensions: []
149
+ extra_rdoc_files: []
150
+ files:
151
+ - CHANGELOG.md
152
+ - LICENSE
153
+ - README.md
154
+ - lib/generators/rating/install_generator.rb
155
+ - lib/generators/rating/templates/db/migrate/create_rating_tables.rb
156
+ - lib/rating.rb
157
+ - lib/rating/models/rating/extension.rb
158
+ - lib/rating/models/rating/rate.rb
159
+ - lib/rating/models/rating/rating.rb
160
+ - lib/rating/version.rb
161
+ - spec/factories/article.rb
162
+ - spec/factories/rating/rate.rb
163
+ - spec/factories/rating/rating.rb
164
+ - spec/factories/user.rb
165
+ - spec/models/extension/after_create_spec.rb
166
+ - spec/models/extension/order_by_rating_spec.rb
167
+ - spec/models/extension/rate_for_spec.rb
168
+ - spec/models/extension/rate_spec.rb
169
+ - spec/models/extension/rated_question_spec.rb
170
+ - spec/models/extension/rated_spec.rb
171
+ - spec/models/extension/rates_spec.rb
172
+ - spec/models/extension/rating_spec.rb
173
+ - spec/models/rate/create_spec.rb
174
+ - spec/models/rate/rate_for_spec.rb
175
+ - spec/models/rate_spec.rb
176
+ - spec/models/rating/averager_data_spec.rb
177
+ - spec/models/rating/data_spec.rb
178
+ - spec/models/rating/update_rating_spec.rb
179
+ - spec/models/rating/values_data_spec.rb
180
+ - spec/models/rating_spec.rb
181
+ - spec/rails_helper.rb
182
+ - spec/support/common.rb
183
+ - spec/support/database_cleaner.rb
184
+ - spec/support/db/migrate/create_articles_table.rb
185
+ - spec/support/db/migrate/create_users_table.rb
186
+ - spec/support/factory_bot.rb
187
+ - spec/support/html_matchers.rb
188
+ - spec/support/migrate.rb
189
+ - spec/support/models/article.rb
190
+ - spec/support/models/user.rb
191
+ - spec/support/shoulda.rb
192
+ homepage: https://github.com/wbotelhos/rating
193
+ licenses:
194
+ - MIT
195
+ metadata: {}
196
+ post_install_message:
197
+ rdoc_options: []
198
+ require_paths:
199
+ - lib
200
+ required_ruby_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ required_rubygems_version: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ requirements: []
211
+ rubyforge_project:
212
+ rubygems_version: 2.6.14
213
+ signing_key:
214
+ specification_version: 4
215
+ summary: A true Bayesian rating system with cache enabled.
216
+ test_files:
217
+ - spec/factories/article.rb
218
+ - spec/factories/rating/rate.rb
219
+ - spec/factories/rating/rating.rb
220
+ - spec/factories/user.rb
221
+ - spec/models/extension/after_create_spec.rb
222
+ - spec/models/extension/order_by_rating_spec.rb
223
+ - spec/models/extension/rate_for_spec.rb
224
+ - spec/models/extension/rate_spec.rb
225
+ - spec/models/extension/rated_question_spec.rb
226
+ - spec/models/extension/rated_spec.rb
227
+ - spec/models/extension/rates_spec.rb
228
+ - spec/models/extension/rating_spec.rb
229
+ - spec/models/rate/create_spec.rb
230
+ - spec/models/rate/rate_for_spec.rb
231
+ - spec/models/rate_spec.rb
232
+ - spec/models/rating/averager_data_spec.rb
233
+ - spec/models/rating/data_spec.rb
234
+ - spec/models/rating/update_rating_spec.rb
235
+ - spec/models/rating/values_data_spec.rb
236
+ - spec/models/rating_spec.rb
237
+ - spec/rails_helper.rb
238
+ - spec/support/common.rb
239
+ - spec/support/database_cleaner.rb
240
+ - spec/support/db/migrate/create_articles_table.rb
241
+ - spec/support/db/migrate/create_users_table.rb
242
+ - spec/support/factory_bot.rb
243
+ - spec/support/html_matchers.rb
244
+ - spec/support/migrate.rb
245
+ - spec/support/models/article.rb
246
+ - spec/support/models/user.rb
247
+ - spec/support/shoulda.rb