rating 0.9.0 → 0.10.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
  SHA256:
3
- metadata.gz: 11fafaaddcc1f4568cfd1412930a42a06aa0467bfa6e68a74d1bd3214f24aa87
4
- data.tar.gz: d1dc1822b99b9a928e6bdceabcdd00bed081d08498e7189b1169ce323b3f720d
3
+ metadata.gz: bf4f916eaf8978771365715fff38db48916a423e061a4fe680cc105d48d3558b
4
+ data.tar.gz: 409e9990a8171000cbd898744f6859358f75e302f0d169287ba29c94fc293758
5
5
  SHA512:
6
- metadata.gz: 0a636e5f8b60c69b98384343ffa3ddb5023f020d07716917e2e1fe5a5292c8e2c4a28056755a01bae4978365f4b73a8f5e98fb9169f03e0b9825b44a0b6a6fd3
7
- data.tar.gz: '09713cd4fd3a48b8433a3482c791eb380231b1a2edec2016d8a909bb3f7b8abbb0020c08d3fe5b68418840f9a017459d40e65672bda38aeb6ffbea6100cc9178'
6
+ metadata.gz: 5c06d75fec9d344f0cca88d6f250d23b4d3612539f2c12d10d6db3c56b86349f9552e3036a34c065d8ccbe9b5e13f00c2ab34f70167d6d16e7ca2d3f90868351
7
+ data.tar.gz: c3788409c80bc0a8c9b17df8d40720e35f225a0e8dd5ed6c136260c821f176dd8caa87809dcc68e3b50f892d58d9863f7248c554ea8a69832b05f0cb16aa1249
@@ -1,3 +1,9 @@
1
+ ## v0.10.0
2
+
3
+ ### News
4
+
5
+ - Add option `where` to be able adds conditions on `Rating::Rate`.
6
+
1
7
  ## v0.9.0
2
8
 
3
9
  ### News
@@ -7,7 +13,7 @@
7
13
 
8
14
  ### Updates
9
15
 
10
- - Update Rails to 2.6.5;
16
+ - Update Ruby to 2.6.5;
11
17
  - Update Activerecord to the last version;
12
18
 
13
19
  ## v0.8.0
data/README.md CHANGED
@@ -138,24 +138,20 @@ author.rated? resource
138
138
 
139
139
  ### rates
140
140
 
141
- You can retrieve all rates received by some resource:
141
+ All rating received.
142
142
 
143
143
  ```ruby
144
- resource = Article.last
145
-
146
- resource.rates
144
+ Article.first.rates
147
145
  ```
148
146
 
149
147
  It will return a collection of `Rate` object.
150
148
 
151
149
  ### rated
152
150
 
153
- In the same way you can retrieve all rates that some author received:
151
+ All rating given.
154
152
 
155
153
  ```ruby
156
- author = Author.last
157
-
158
- author.rated
154
+ Author.first.rated
159
155
  ```
160
156
 
161
157
  It will return a collection of `Rate` object.
@@ -349,7 +345,7 @@ If you need to warm up a record with scope, you need to setup the `scoping` rela
349
345
 
350
346
  ```ruby
351
347
  class Resource < ApplicationRecord
352
- voting scoping: :categories
348
+ rating scoping: :categories
353
349
  end
354
350
  ```
355
351
 
@@ -410,6 +406,22 @@ author.rate resource, 3
410
406
 
411
407
  Now the `sum` will be `6` and the `total` will be `3` because all rating will be calculated into just one rating record ignoring the `scopeable` object. The rating record is always saved on the record with `scopeable` as `nil`.
412
408
 
409
+ ### where
410
+
411
+ The `where` option can be used to filter the `Rating::Rate` records used to create the final `Rating::Rating`. You can filter only approved rates, for exemplo:
412
+
413
+ ```ruby
414
+ rating where: 'approved = true'
415
+
416
+ author = User.last
417
+ resource = Article.last
418
+
419
+ author.rate resource, 1, extra_scope: { approved: false }
420
+ author.rate resource, 5, extra_scope: { approved: true }
421
+ ```
422
+
423
+ As you can see, now, only the rate with value `5` will be included on the final rating.
424
+
413
425
  ### References
414
426
 
415
427
  - [Evan Miller](http://www.evanmiller.org/ranking-items-with-star-ratings.html)
@@ -29,7 +29,10 @@ module Rating
29
29
  (CAST(#{total_count} AS DECIMAL(17, 14)) / #{distinct_count}) count_avg,
30
30
  COALESCE(AVG(value), 0) rating_avg
31
31
  FROM #{rate_table_name}
32
- WHERE resource_type = :resource_type #{scope_type_query(resource, scopeable)}
32
+ WHERE
33
+ resource_type = :resource_type
34
+ #{scope_type_query(resource, scopeable)}
35
+ #{scope_where_query(resource)}
33
36
  ).squish
34
37
 
35
38
  execute_sql [sql, values]
@@ -54,7 +57,11 @@ module Rating
54
57
  COALESCE(SUM(value), 0) rating_sum,
55
58
  COUNT(1) rating_count
56
59
  FROM #{rate_table_name}
57
- WHERE resource_type = ? AND resource_id = ? #{scope_type_and_id_query(resource, scopeable)}
60
+ WHERE
61
+ resource_type = ?
62
+ AND resource_id = ?
63
+ #{scope_type_and_id_query(resource, scopeable)}
64
+ #{scope_where_query(resource)}
58
65
  ).squish
59
66
 
60
67
  values = [sql, resource.class.base_class.name, resource.id]
@@ -104,7 +111,10 @@ module Rating
104
111
  %((
105
112
  SELECT GREATEST(#{count}, 1)
106
113
  FROM #{rate_table_name}
107
- WHERE resource_type = :resource_type #{scope_type_query(resource, scopeable)}
114
+ WHERE
115
+ resource_type = :resource_type
116
+ #{scope_type_query(resource, scopeable)}
117
+ #{scope_where_query(resource)}
108
118
  ))
109
119
  end
110
120
 
@@ -124,6 +134,16 @@ module Rating
124
134
 
125
135
  'AND scopeable_type = ? AND scopeable_id = ?'
126
136
  end
137
+
138
+ def scope_where_query(resource)
139
+ return '' if where_condition(resource).blank?
140
+
141
+ "AND #{where_condition(resource)}"
142
+ end
143
+
144
+ def where_condition(resource)
145
+ resource.rating_options[:where]
146
+ end
127
147
  end
128
148
  end
129
149
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rating
4
- VERSION = '0.9.0'
4
+ VERSION = '0.10.0'
5
5
  end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :toy do
5
+ end
6
+ end
@@ -62,30 +62,7 @@ RSpec.describe Rating::Extension, 'unscoped_rating' do
62
62
  end
63
63
  end
64
64
 
65
- context 'when is true' do
66
- let!(:resource) { create :global }
67
-
68
- it 'groups in the same line record' do
69
- author_1.rate resource, 1, scope: scope
70
- author_2.rate resource, 2, scope: scope
71
- author_1.rate resource, 5
72
-
73
- ratings = Rating::Rating.all.order('id')
74
-
75
- expect(ratings.size).to eq 1
76
-
77
- rating = ratings[0]
78
-
79
- expect(rating.average.to_s).to eq '2.6666666666666667'
80
- expect(rating.estimate.to_s).to eq '2.6666666666666667'
81
- expect(rating.resource).to eq resource
82
- expect(rating.scopeable).to eq nil
83
- expect(rating.sum).to eq 8
84
- expect(rating.total).to eq 3
85
- end
86
- end
87
-
88
- context 'when is true and have a non scopeable record first on dabase' do
65
+ context 'when is true and have a non scopeable record first on database' do
89
66
  let!(:resource) { create :global }
90
67
 
91
68
  before { ::Rating::Rating.create resource: resource, scopeable: scope }
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Rating::Extension, 'unscoped_rating' do
6
+ let!(:author_1) { create :author }
7
+ let!(:author_2) { create :author }
8
+ let!(:author_3) { create :author }
9
+ let!(:author_4) { create :author }
10
+ let!(:author_5) { create :author }
11
+ let!(:resource) { create :toy }
12
+
13
+ it 'uses rate with where condition' do
14
+ author_1.rate resource, 1
15
+ author_2.rate resource, 2
16
+ author_3.rate resource, 3
17
+ author_4.rate resource, 4
18
+ author_5.rate resource, 5
19
+
20
+ ratings = Rating::Rating.all.order('id')
21
+
22
+ expect(ratings.size).to eq 1
23
+
24
+ rating = ratings[0]
25
+
26
+ expect(rating.average.to_s).to eq '3.0'
27
+ expect(rating.estimate.to_s).to eq '3.0'
28
+ expect(rating.resource).to eq resource
29
+ expect(rating.scopeable).to eq nil
30
+ expect(rating.sum).to eq 9
31
+ expect(rating.total).to eq 3
32
+ end
33
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateToysTable < ActiveRecord::Migration[5.0]
4
+ def change
5
+ create_table :toys do |t|
6
+ end
7
+ end
8
+ end
@@ -7,6 +7,7 @@ CreateRatingTable.new.change
7
7
 
8
8
  CreateArticlesTable.new.change
9
9
  CreateAuthorsTable.new.change
10
+ CreateToysTable.new.change
10
11
 
11
12
  CreateGlobalsTable.new.change
12
13
  CreateCategoriesTable.new.change
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Toy < ::ActiveRecord::Base
4
+ rating where: 'value > 1 and value < 5'
5
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rating
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Washington Botelho
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-03 00:00:00.000000000 Z
11
+ date: 2019-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -164,6 +164,7 @@ files:
164
164
  - spec/factories/global.rb
165
165
  - spec/factories/rating/rate.rb
166
166
  - spec/factories/rating/rating.rb
167
+ - spec/factories/toy.rb
167
168
  - spec/models/extension/after_create_spec.rb
168
169
  - spec/models/extension/order_by_rating_spec.rb
169
170
  - spec/models/extension/rate_for_spec.rb
@@ -177,6 +178,7 @@ files:
177
178
  - spec/models/extension/rating_spec.rb
178
179
  - spec/models/extension/rating_warm_up_spec.rb
179
180
  - spec/models/extension/unscoped_rating_spec.rb
181
+ - spec/models/extension/where_spec.rb
180
182
  - spec/models/rate/create_spec.rb
181
183
  - spec/models/rate/rate_for_spec.rb
182
184
  - spec/models/rate_spec.rb
@@ -199,6 +201,7 @@ files:
199
201
  - spec/support/db/migrate/create_rating_table.rb
200
202
  - spec/support/db/migrate/create_review_ratings_table.rb
201
203
  - spec/support/db/migrate/create_reviews_table.rb
204
+ - spec/support/db/migrate/create_toys_table.rb
202
205
  - spec/support/factory_bot.rb
203
206
  - spec/support/migrate.rb
204
207
  - spec/support/models/article.rb
@@ -208,6 +211,7 @@ files:
208
211
  - spec/support/models/global.rb
209
212
  - spec/support/models/review.rb
210
213
  - spec/support/models/review_rating.rb
214
+ - spec/support/models/toy.rb
211
215
  - spec/support/shared_context/with_database_records.rb
212
216
  - spec/support/shoulda.rb
213
217
  homepage: https://github.com/wbotelhos/rating
@@ -249,6 +253,7 @@ test_files:
249
253
  - spec/models/extension/rating_warm_up_spec.rb
250
254
  - spec/models/extension/order_by_rating_spec.rb
251
255
  - spec/models/extension/unscoped_rating_spec.rb
256
+ - spec/models/extension/where_spec.rb
252
257
  - spec/models/extension/rate_spec.rb
253
258
  - spec/models/extension/rate_for_spec.rb
254
259
  - spec/models/extension/after_create_spec.rb
@@ -263,6 +268,7 @@ test_files:
263
268
  - spec/support/factory_bot.rb
264
269
  - spec/support/models/article.rb
265
270
  - spec/support/models/category.rb
271
+ - spec/support/models/toy.rb
266
272
  - spec/support/models/author.rb
267
273
  - spec/support/models/review.rb
268
274
  - spec/support/models/comment.rb
@@ -274,6 +280,7 @@ test_files:
274
280
  - spec/support/db/migrate/create_review_ratings_table.rb
275
281
  - spec/support/db/migrate/create_articles_table.rb
276
282
  - spec/support/db/migrate/create_rating_table.rb
283
+ - spec/support/db/migrate/create_toys_table.rb
277
284
  - spec/support/db/migrate/add_comment_on_rating_rates_table.rb
278
285
  - spec/support/db/migrate/add_extra_fields_on_rating_rates_table.rb
279
286
  - spec/support/db/migrate/create_reviews_table.rb
@@ -286,6 +293,7 @@ test_files:
286
293
  - spec/factories/category.rb
287
294
  - spec/factories/rating/rate.rb
288
295
  - spec/factories/rating/rating.rb
296
+ - spec/factories/toy.rb
289
297
  - spec/factories/author.rb
290
298
  - spec/factories/comment.rb
291
299
  - spec/factories/global.rb