rating 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.
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