usefull_scopes 0.1.0 → 0.2.1

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/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ repo_token: hHSEHjAw28Kly9dKy4u9dHPyDwIIWEKGI
data/.gitignore CHANGED
@@ -2,3 +2,5 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ .DS_Store
6
+ coverage
data/Gemfile CHANGED
@@ -2,3 +2,13 @@ source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in usefull_scopes.gemspec
4
4
  gemspec
5
+
6
+ gem 'rake'
7
+ gem 'sqlite3'
8
+ gem 'minitest'
9
+ gem 'tconsole'
10
+ gem 'turn'
11
+ gem 'activerecord'
12
+ gem 'factory_girl'
13
+ gem 'simplecov'
14
+ gem 'coveralls', require: false
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
1
  # UsefullScopes
2
+ [![Build Status](https://travis-ci.org/kaize/usefull_scopes.png?branch=master)](https://travis-ci.org/kaize/usefull_scopes)
3
+ [![Coverage
4
+ status](https://coveralls.io/repos/kaize/usefull_scopes/badge.png?branch=master)](https://coveralls.io/r/kaize/usefull_scopes)
2
5
 
3
6
  This gem provides additional scopes for your ActiveRecord models.
4
7
 
@@ -70,14 +73,6 @@ These are the scopes created for each model's attribute.
70
73
  <td>ilike_by_attribute</td>
71
74
  <td>Сase insensitive implementation of `like_by_attribute`</td>
72
75
  </tr>
73
- <tr>
74
- <td>with_attribute</td>
75
- <td>Returns records, where attribute's value is equal to a given value.<br/><b>Note: this scope is deprecated and will be removed in the following versions. Please, use `with` scope instead.</b></td>
76
- </tr>
77
- <tr>
78
- <td>without_attribute</td>
79
- <td>Returns records, where attribute's value is `NULL`.<br/><b>Note: this scope is deprecated and will be removed in the following versions. Please, use `without` scope instead.</b></td>
80
- </tr>
81
76
  </table>
82
77
 
83
78
  ### Example
data/Rakefile CHANGED
@@ -1 +1,11 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << "test"
7
+ t.test_files = FileList['test/lib/*_test.rb']
8
+ t.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -4,16 +4,17 @@ module UsefullScopes
4
4
 
5
5
  included do
6
6
  scope :random, order("RANDOM()")
7
- scope :exclude, lambda {|collection_or_object|
7
+
8
+ scope :exclude, ->(collection_or_object) {
8
9
  collection = Array(collection_or_object)
9
10
  values = collection.map do |id_or_object|
10
- id_or_object.is_a?(ActiveRecord::Base) ? id_or_object.id : id_or_object
11
+ find_object_value_or_value(id_or_object)
11
12
  end
12
13
  return scoped unless values.any?
13
- where("#{quoted_table_name}.id not in (?)", values)
14
+ where(arel_table[:id].not_in(values))
14
15
  }
15
16
 
16
- scope :with, lambda {|attrs_hash|
17
+ scope :with, ->(attrs_hash) {
17
18
  case attrs_hash
18
19
  when Hash
19
20
  where(attrs_hash)
@@ -22,35 +23,141 @@ module UsefullScopes
22
23
  end
23
24
  }
24
25
 
25
- scope :without, lambda {|*attrs|
26
+ scope :without, ->(*attrs) {
26
27
  attrs_hash = attrs.extract_options!
27
28
  query_params = []
28
29
 
29
30
  attrs.each do |attr_name|
30
- query_params << "#{quoted_table_name}.#{attr_name} IS NULL"
31
+ query_params << arel_table[attr_name].eq(nil)
31
32
  end
32
33
 
33
34
  attrs_hash.each do |attr_name, attr_value|
34
- query_params << "#{quoted_table_name}.#{attr_name} NOT IN (:#{attr_name})"
35
+ query_params << arel_table[attr_name].not_in(attr_value)
35
36
  end
36
37
 
37
38
  return scoped if query_params.blank?
38
- where query_params.join(" AND "), attrs_hash
39
+
40
+ where arel_table.create_and query_params
41
+ }
42
+
43
+ scope :desc_by, ->(attrs) {
44
+ order(collect_order_query_rules(attrs, :desc))
45
+ }
46
+
47
+ scope :asc_by, ->(attrs) {
48
+ order(collect_order_query_rules(attrs, :asc))
49
+ }
50
+
51
+ scope :more_than, ->(attrs) {
52
+ where_and(attrs, :gt)
53
+ }
54
+
55
+ scope :less_than, ->(attrs) {
56
+ where_and(attrs, :lt)
57
+ }
58
+
59
+ scope :more_or_equal, ->(attrs) {
60
+ where_and(attrs, :gteq)
39
61
  }
40
62
 
63
+ scope :less_or_equal, ->(attrs) {
64
+ where_and(attrs, :lteq)
65
+ }
66
+
67
+ def self.collect_order_query_rules(array, rule)
68
+ query_params = []
69
+
70
+ attrs =
71
+ case array
72
+ when Array
73
+ array
74
+ when Symbol
75
+ [array]
76
+ else
77
+ raise TypeError, "Symbol or Array of symbols is expected"
78
+ end
79
+
80
+ attrs.each do |attr_name, attr_value|
81
+ query_params << arel_table[attr_name].send(rule)
82
+ end
83
+
84
+ raise ArgumentError, "Empty Array" if query_params.blank?
85
+
86
+ query_params
87
+ end
88
+
89
+ def self.collect_query_rules(hash_or_object, rule, field = :id)
90
+ query_params = []
91
+
92
+ attrs =
93
+ case hash_or_object
94
+ when ActiveRecord::Base
95
+ { field => hash_or_object.send(field) }
96
+ when Hash
97
+ hash_or_object
98
+ when Array
99
+
100
+ else
101
+ raise TypeError, "Hash or AR object is expected"
102
+ end
103
+
104
+ attrs.each do |attr_name, attr_value|
105
+ attr_value = attr_value.send(attr_name) if attr_value.is_a? ActiveRecord::Base
106
+ query_params << arel_table[attr_name].send(rule, attr_value)
107
+ end
108
+
109
+ raise ArgumentError, "Empty Hash" if query_params.blank?
110
+
111
+ query_params
112
+ end
113
+
41
114
  attribute_names.each do |a|
42
- scope "by_#{a}", order("#{quoted_table_name}.#{a} DESC")
43
- scope "asc_by_#{a}", order("#{quoted_table_name}.#{a} ASC")
115
+ a = a.to_sym
44
116
 
45
- scope "like_by_#{a}", lambda {|term|
117
+ scope "by_#{a}", order(arel_table[a].desc)
118
+
119
+ scope "asc_by_#{a}", order(arel_table[a].asc)
120
+
121
+ scope "like_by_#{a}", ->(term) {
46
122
  quoted_term = connection.quote(term + '%')
47
123
  where("lower(#{quoted_table_name}.#{a}) like #{quoted_term}")
48
124
  }
49
- scope "ilike_by_#{a}", lambda {|term|
50
- quoted_term = connection.quote(term + '%')
51
- where("#{quoted_table_name}.#{a} ilike #{quoted_term}")
125
+
126
+ scope "ilike_by_#{a}", ->(term) {
127
+ quoted_term = term + '%'
128
+ where(arel_table[a].matches(quoted_term))
129
+ }
130
+
131
+ scope "#{a}_more", ->(value_or_object) {
132
+ value = find_object_value_or_value(value_or_object, a)
133
+ where(arel_table[a].gt(value))
134
+ }
135
+
136
+ scope "#{a}_less", ->(value_or_object) {
137
+ value = find_object_value_or_value(value_or_object, a)
138
+ where(arel_table[a].lt(value))
139
+ }
140
+
141
+ scope "#{a}_more_or_equal", ->(value_or_object) {
142
+ value = find_object_value_or_value(value_or_object, a)
143
+ where(arel_table[a].gteq(value))
144
+ }
145
+
146
+ scope "#{a}_less_or_equal", ->(value_or_object) {
147
+ value = find_object_value_or_value(value_or_object, a)
148
+ where(arel_table[a].lteq(value))
52
149
  }
53
150
  end
151
+
152
+ def self.find_object_value_or_value(value_or_object, field = :id)
153
+ value_or_object.is_a?(ActiveRecord::Base) ? value_or_object.send(field) : value_or_object
154
+ end
155
+
156
+ def self.where_and(attrs, rule)
157
+ query_params = collect_query_rules(attrs, rule)
158
+ where arel_table.create_and query_params
159
+ end
160
+
54
161
  end
55
162
  end
56
163
 
@@ -1,3 +1,3 @@
1
1
  module UsefullScopes
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :model do
3
+ field_1
4
+ field_2
5
+ field_3
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ FactoryGirl.define do
2
+ sequence :field_1 do |n|
3
+ n
4
+ end
5
+
6
+ sequence :field_2 do |n|
7
+ "string-#{n}"
8
+ end
9
+
10
+ sequence :field_3 do
11
+ rand(3) % 2 == 0 ? true : false
12
+ end
13
+ end
@@ -0,0 +1,652 @@
1
+ require 'test_helper'
2
+
3
+ module UsefullScopes
4
+ class ScopesTest < TestCase
5
+ def setup
6
+ 3.times { create :model }
7
+ @model = Model.first
8
+ end
9
+
10
+ def test_random_order_condition
11
+ random_request = Model.random
12
+
13
+ request_arel = random_request.arel
14
+ order = request_arel.order
15
+ order_conditions = order.orders
16
+
17
+ assert_includes order_conditions, "RANDOM()"
18
+ end
19
+
20
+ def test_random_sql
21
+ random_request = Model.random
22
+
23
+ assert_equal "SELECT \"models\".* FROM \"models\" ORDER BY RANDOM()", random_request.to_sql
24
+ end
25
+
26
+ def test_exclude_result
27
+ @models = Model.exclude(@model)
28
+
29
+ models_count = Model.count - 1
30
+
31
+ assert_equal models_count, @models.count
32
+ end
33
+
34
+ def test_exclude_conditions
35
+ @models = Model.exclude(@model)
36
+
37
+ request_arel = @models.arel
38
+ condition = request_arel.where_clauses
39
+ assert_equal 1, condition.count
40
+ assert condition.first.match "NOT IN"
41
+ end
42
+
43
+ def test_with_result
44
+ @models = Model.with({field_1: @model.field_1})
45
+
46
+ assert @models
47
+
48
+ assert_includes @models, @model
49
+ end
50
+
51
+ def test_with_conditions
52
+ @models = Model.with({field_1: @model.field_1})
53
+
54
+ ctx = @models.arel.as_json["ctx"]
55
+ where_conditions = ctx.wheres
56
+
57
+ assert where_conditions.any?
58
+
59
+ where_conditions.each do |condition|
60
+ condition.children.each do |condition_part|
61
+ assert_kind_of Arel::Nodes::Equality, condition_part
62
+ end
63
+ end
64
+ end
65
+
66
+ def test_with_incorrect_params
67
+ begin
68
+ @models = Model.with("field_1 = #{@model.field_1}")
69
+ rescue Exception => e
70
+ assert_equal "Hash is expected", e.message
71
+ end
72
+ end
73
+
74
+ def test_without_result
75
+ @models = Model.without({field_1: @model.field_1})
76
+
77
+ assert @models
78
+
79
+ refute @models.include?(@model)
80
+ end
81
+
82
+ def test_without_conditions
83
+ @models = Model.without({field_1: @model.field_1})
84
+
85
+ ctx = @models.arel.as_json["ctx"]
86
+ where_conditions = ctx.wheres
87
+
88
+ assert where_conditions.any?
89
+
90
+ where_conditions.each do |condition|
91
+ assert_kind_of Arel::Nodes::Grouping, condition
92
+ condition.expr.children.each do |condition_part|
93
+ assert_kind_of Arel::Nodes::NotIn, condition_part
94
+
95
+ assert_kind_of Arel::Attributes::Attribute, condition_part.left
96
+
97
+ assert_equal :field_1, condition_part.left.name
98
+ assert_equal 1, condition_part.right
99
+ end
100
+ end
101
+ end
102
+
103
+ def test_without_incorrect_params
104
+ begin
105
+ @models = Model.without("field_1 = #{@model.field_1}")
106
+ rescue Exception => e
107
+ assert_equal "Hash is expected", e.message
108
+ end
109
+ end
110
+
111
+ def test_like_by_result
112
+
113
+ assert_respond_to Model, :like_by_field_2
114
+
115
+ @models = Model.like_by_field_2(@model.field_2[0..3])
116
+
117
+ assert @models.any?
118
+ assert_includes @models, @model
119
+ end
120
+
121
+ def test_like_by_condition
122
+
123
+ @models = Model.like_by_field_2(@model.field_2[0..3])
124
+
125
+ ctx = @models.arel.as_json["ctx"]
126
+ where_conditions = ctx.wheres
127
+
128
+ assert where_conditions.any?
129
+
130
+ where_conditions.each do |condition|
131
+ assert_kind_of Arel::Nodes::Grouping, condition
132
+ assert condition.expr.match "like"
133
+ end
134
+ end
135
+
136
+ def test_ilike_by_result
137
+ assert_respond_to Model, :ilike_by_field_2
138
+
139
+ # SQLite error %(
140
+ #@models = Model.ilike_by_field_2(@model.field_2[0..3])
141
+
142
+ #assert @models.any?
143
+ #assert_includes @models, @model
144
+ end
145
+
146
+ def test_ilike_by_condition
147
+ @models = Model.ilike_by_field_2(@model.field_2[0..3])
148
+
149
+ ctx = @models.arel.as_json["ctx"]
150
+ where_conditions = ctx.wheres
151
+
152
+ assert where_conditions.any?
153
+
154
+ where_conditions.each do |condition|
155
+ assert_kind_of Arel::Nodes::Grouping, condition
156
+ assert_kind_of Arel::Nodes::Matches, condition.expr
157
+
158
+ assert_kind_of Arel::Attributes::Attribute, condition.expr.left
159
+ assert_equal :field_2, condition.expr.left.name
160
+ assert_equal "stri%", condition.expr.right
161
+ end
162
+ end
163
+
164
+ def test_desc_by_result
165
+ assert_respond_to Model, :desc_by
166
+
167
+ @models = Model.desc_by(:field_1)
168
+
169
+ assert @models.any?
170
+ end
171
+
172
+ def test_desc_by_condition_array_attrs
173
+ attrs = [:field_1, :field_2]
174
+
175
+ @models = Model.desc_by(attrs)
176
+
177
+ arel = @models.arel
178
+ orders_conditions = arel.orders
179
+
180
+ assert orders_conditions.any?
181
+
182
+ orders_conditions.each_with_index do |condition, index|
183
+ assert_kind_of Arel::Nodes::Descending, condition
184
+ assert_kind_of Arel::Attributes::Attribute, condition.expr
185
+
186
+ assert_equal attrs[index], condition.expr.name
187
+ end
188
+ end
189
+
190
+ def test_desc_by_condition
191
+ @models = Model.desc_by(:field_1)
192
+
193
+ arel = @models.arel
194
+ orders_conditions = arel.orders
195
+
196
+ assert orders_conditions.any?
197
+
198
+ orders_conditions.each do |condition|
199
+ assert_kind_of Arel::Nodes::Descending, condition
200
+ assert_kind_of Arel::Attributes::Attribute, condition.expr
201
+
202
+ assert_equal :field_1, condition.expr.name
203
+ end
204
+ end
205
+
206
+ def test_desc_by_incorrect_params
207
+ begin
208
+ @models = Model.desc_by("field_1")
209
+ rescue Exception => e
210
+ assert_equal "Symbol or Array of symbols is expected", e.message
211
+ end
212
+ end
213
+
214
+ def test_asc_by_result
215
+ assert_respond_to Model, :asc_by
216
+
217
+ @models = Model.asc_by(:field_1)
218
+
219
+ assert @models.any?
220
+ end
221
+
222
+ def test_asc_by_condition_array_attrs
223
+ attrs = [:field_1, :field_2]
224
+
225
+ @models = Model.asc_by(attrs)
226
+
227
+ arel = @models.arel
228
+ orders_conditions = arel.orders
229
+
230
+ assert orders_conditions.any?
231
+
232
+ orders_conditions.each_with_index do |condition, index|
233
+ assert_kind_of Arel::Nodes::Ascending, condition
234
+ assert_kind_of Arel::Attributes::Attribute, condition.expr
235
+
236
+ assert_equal attrs[index], condition.expr.name
237
+ end
238
+ end
239
+
240
+ def test_asc_by_condition
241
+ @models = Model.asc_by(:field_1)
242
+
243
+ arel = @models.arel
244
+ orders_conditions = arel.orders
245
+
246
+ assert orders_conditions.any?
247
+
248
+ orders_conditions.each do |condition|
249
+ assert_kind_of Arel::Nodes::Ascending, condition
250
+ assert_kind_of Arel::Attributes::Attribute, condition.expr
251
+
252
+ assert_equal :field_1, condition.expr.name
253
+ end
254
+ end
255
+
256
+ def test_asc_by_incorrect_params
257
+ begin
258
+ @models = Model.asc_by("field_1")
259
+ rescue Exception => e
260
+ assert_equal "Symbol or Array of symbols is expected", e.message
261
+ end
262
+ end
263
+
264
+ def test_field_more_than_value_by_result
265
+ @model_less = create :model
266
+ @model_more = create :model, field_1: @model_less.field_1 + 1
267
+
268
+ @models = Model.field_1_more(@model_less.field_1)
269
+
270
+ assert @models.any?
271
+ assert @models.include?(@model_more)
272
+ refute @models.include?(@model_less)
273
+ end
274
+
275
+ def test_field_more_than_object_by_result
276
+ @model_less = create :model
277
+ @model_more = create :model, field_1: @model_less.field_1 + 1
278
+
279
+ @models = Model.field_1_more(@model_less)
280
+
281
+ assert @models.any?
282
+ assert @models.include?(@model_more)
283
+ refute @models.include?(@model_less)
284
+ end
285
+
286
+ def test_field_more_by_condition
287
+ @models = Model.field_1_more(@model.field_1)
288
+
289
+ ctx = @models.arel.as_json["ctx"]
290
+ where_conditions = ctx.wheres
291
+
292
+ assert where_conditions.any?
293
+
294
+ where_conditions.each do |condition|
295
+ assert_kind_of Arel::Nodes::Grouping, condition
296
+ assert_kind_of Arel::Nodes::GreaterThan, condition.expr
297
+ assert_equal @model.field_1, condition.expr.right
298
+ end
299
+ end
300
+
301
+ def test_field_less_than_value_by_result
302
+ @model_less = create :model
303
+ @model_more = create :model, field_1: @model_less.field_1 + 1
304
+
305
+ @models = Model.field_1_less(@model_more.field_1)
306
+
307
+ assert @models.any?
308
+ assert @models.include?(@model_less)
309
+ refute @models.include?(@model_more)
310
+ end
311
+
312
+ def test_field_less_than_object_by_result
313
+ @model_less = create :model
314
+ @model_more = create :model, field_1: @model_less.field_1 + 1
315
+
316
+ @models = Model.field_1_less(@model_more)
317
+
318
+ assert @models.any?
319
+ assert @models.include?(@model_less)
320
+ refute @models.include?(@model_more)
321
+ end
322
+
323
+ def test_field_less_by_condition
324
+ @models = Model.field_1_less(@model.field_1)
325
+
326
+ ctx = @models.arel.as_json["ctx"]
327
+ where_conditions = ctx.wheres
328
+
329
+ assert where_conditions.any?
330
+
331
+ where_conditions.each do |condition|
332
+ assert_kind_of Arel::Nodes::Grouping, condition
333
+ assert_kind_of Arel::Nodes::LessThan, condition.expr
334
+ assert_equal @model.field_1, condition.expr.right
335
+ end
336
+ end
337
+
338
+ def test_field_more_or_equal_than_value_by_result
339
+ @model_less = create :model
340
+ @model_more = create :model, field_1: @model_less.field_1 + 1
341
+
342
+ @models = Model.field_1_more_or_equal(@model_more.field_1)
343
+
344
+ assert @models.any?
345
+ assert @models.include?(@model_more)
346
+ refute @models.include?(@model_less)
347
+ end
348
+
349
+ def test_field_more_or_equal_than_object_by_result
350
+ @model_less = create :model
351
+ @model_more = create :model, field_1: @model_less.field_1 + 1
352
+
353
+ @models = Model.field_1_more_or_equal(@model_more)
354
+
355
+ assert @models.any?
356
+ assert @models.include?(@model_more)
357
+ refute @models.include?(@model_less)
358
+ end
359
+
360
+ def test_field_more_or_equal_by_condition
361
+ @models = Model.field_1_more_or_equal(@model.field_1)
362
+
363
+ ctx = @models.arel.as_json["ctx"]
364
+ where_conditions = ctx.wheres
365
+
366
+ assert where_conditions.any?
367
+
368
+ where_conditions.each do |condition|
369
+ assert_kind_of Arel::Nodes::Grouping, condition
370
+ assert_kind_of Arel::Nodes::GreaterThanOrEqual, condition.expr
371
+ assert_equal @model.field_1, condition.expr.right
372
+ end
373
+ end
374
+
375
+ def test_field_less_or_equal_than_value_by_result
376
+ @model_less = create :model
377
+ @model_more = create :model, field_1: @model_less.field_1 + 1
378
+
379
+ @models = Model.field_1_less_or_equal(@model_less.field_1)
380
+
381
+ assert @models.any?
382
+ assert @models.include?(@model_less)
383
+ refute @models.include?(@model_more)
384
+ end
385
+
386
+ def test_field_less_or_equal_than_object_by_result
387
+ @model_less = create :model
388
+ @model_more = create :model, field_1: @model_less.field_1 + 1
389
+
390
+ @models = Model.field_1_less_or_equal(@model_less)
391
+
392
+ assert @models.any?
393
+ assert @models.include?(@model_less)
394
+ refute @models.include?(@model_more)
395
+ end
396
+ def test_field_less_or_equal_by_condition
397
+ @models = Model.field_1_less_or_equal(@model.field_1)
398
+
399
+ ctx = @models.arel.as_json["ctx"]
400
+ where_conditions = ctx.wheres
401
+
402
+ assert where_conditions.any?
403
+
404
+ where_conditions.each do |condition|
405
+ assert_kind_of Arel::Nodes::Grouping, condition
406
+ assert_kind_of Arel::Nodes::LessThanOrEqual, condition.expr
407
+ assert_equal @model.field_1, condition.expr.right
408
+ end
409
+ end
410
+
411
+ def test_more_than_result
412
+ @model = Model.last
413
+
414
+ @models = Model.more_than({field_1: 1})
415
+
416
+ assert @models.any?
417
+ assert @models.include?(@model)
418
+ end
419
+
420
+ def test_more_than_condition_value
421
+ @models = Model.more_than({field_1: 1})
422
+
423
+ ctx = @models.arel.as_json["ctx"]
424
+ where_conditions = ctx.wheres
425
+
426
+ assert where_conditions.any?
427
+
428
+ where_conditions.each do |condition|
429
+ assert_kind_of Arel::Nodes::Grouping, condition
430
+ condition.expr.children.each do |condition_part|
431
+ assert_kind_of Arel::Nodes::GreaterThan, condition_part
432
+
433
+ assert_kind_of Arel::Attributes::Attribute, condition_part.left
434
+
435
+ assert_equal :field_1, condition_part.left.name
436
+ assert_equal 1, condition_part.right
437
+ end
438
+ end
439
+ end
440
+
441
+ def test_more_than_condition_ar_object
442
+ @models = Model.more_than(@model)
443
+
444
+ ctx = @models.arel.as_json["ctx"]
445
+ where_conditions = ctx.wheres
446
+
447
+ assert where_conditions.any?
448
+
449
+ where_conditions.each do |condition|
450
+ assert_kind_of Arel::Nodes::Grouping, condition
451
+ condition.expr.children.each do |condition_part|
452
+ assert_kind_of Arel::Nodes::GreaterThan, condition_part
453
+
454
+ assert_kind_of Arel::Attributes::Attribute, condition_part.left
455
+
456
+ assert_equal :id, condition_part.left.name
457
+ assert_equal 1, condition_part.right
458
+ end
459
+ end
460
+ end
461
+
462
+ def test_more_than_incorrect_params
463
+ begin
464
+ @models = Model.more_than("field_1")
465
+ rescue Exception => e
466
+ assert_equal "Hash or AR object is expected", e.message
467
+ end
468
+ end
469
+
470
+ def test_less_than_result
471
+ @model_first = Model.first
472
+ @model_last = Model.last
473
+
474
+ @models = Model.less_than({field_1: @model_last.field_1})
475
+
476
+ assert @models.any?
477
+ assert @models.include?(@model_first)
478
+ end
479
+
480
+ def test_less_than_condition_value
481
+ @models = Model.less_than({field_1: 1})
482
+
483
+ ctx = @models.arel.as_json["ctx"]
484
+ where_conditions = ctx.wheres
485
+
486
+ assert where_conditions.any?
487
+
488
+ where_conditions.each do |condition|
489
+ assert_kind_of Arel::Nodes::Grouping, condition
490
+ condition.expr.children.each do |condition_part|
491
+ assert_kind_of Arel::Nodes::LessThan, condition_part
492
+
493
+ assert_kind_of Arel::Attributes::Attribute, condition_part.left
494
+
495
+ assert_equal :field_1, condition_part.left.name
496
+ assert_equal 1, condition_part.right
497
+ end
498
+ end
499
+ end
500
+
501
+ def test_less_than_condition_ar_object
502
+ @models = Model.less_than(@model)
503
+
504
+ ctx = @models.arel.as_json["ctx"]
505
+ where_conditions = ctx.wheres
506
+
507
+ assert where_conditions.any?
508
+
509
+ where_conditions.each do |condition|
510
+ assert_kind_of Arel::Nodes::Grouping, condition
511
+ condition.expr.children.each do |condition_part|
512
+ assert_kind_of Arel::Nodes::LessThan, condition_part
513
+
514
+ assert_kind_of Arel::Attributes::Attribute, condition_part.left
515
+
516
+ assert_equal :id, condition_part.left.name
517
+ assert_equal 1, condition_part.right
518
+ end
519
+ end
520
+ end
521
+
522
+ def test_less_than_incorrect_params
523
+ begin
524
+ @models = Model.less_than("field_1")
525
+ rescue Exception => e
526
+ assert_equal "Hash or AR object is expected", e.message
527
+ end
528
+ end
529
+
530
+ def test_more_or_equal_result
531
+ @model_first = Model.first
532
+ @model_last = Model.last
533
+
534
+ @models = Model.more_or_equal({field_1: @model_last.field_1})
535
+
536
+ assert @models.any?
537
+ assert @models.include?(@model_last)
538
+ assert_equal @models.count, 1
539
+ end
540
+
541
+ def test_more_or_equal_condition_value
542
+ @models = Model.more_or_equal({field_1: 1})
543
+
544
+ ctx = @models.arel.as_json["ctx"]
545
+ where_conditions = ctx.wheres
546
+
547
+ assert where_conditions.any?
548
+
549
+ where_conditions.each do |condition|
550
+ assert_kind_of Arel::Nodes::Grouping, condition
551
+ condition.expr.children.each do |condition_part|
552
+ assert_kind_of Arel::Nodes::GreaterThanOrEqual, condition_part
553
+
554
+ assert_kind_of Arel::Attributes::Attribute, condition_part.left
555
+
556
+ assert_equal :field_1, condition_part.left.name
557
+ assert_equal 1, condition_part.right
558
+ end
559
+ end
560
+ end
561
+
562
+ def test_more_or_equal_condition_ar_object
563
+ @models = Model.more_or_equal(@model)
564
+
565
+ ctx = @models.arel.as_json["ctx"]
566
+ where_conditions = ctx.wheres
567
+
568
+ assert where_conditions.any?
569
+
570
+ where_conditions.each do |condition|
571
+ assert_kind_of Arel::Nodes::Grouping, condition
572
+ condition.expr.children.each do |condition_part|
573
+ assert_kind_of Arel::Nodes::GreaterThanOrEqual, condition_part
574
+
575
+ assert_kind_of Arel::Attributes::Attribute, condition_part.left
576
+
577
+ assert_equal :id, condition_part.left.name
578
+ assert_equal 1, condition_part.right
579
+ end
580
+ end
581
+ end
582
+
583
+ def test_more_or_equal_incorrect_params
584
+ begin
585
+ @models = Model.more_or_equal("field_1")
586
+ rescue Exception => e
587
+ assert_equal "Hash or AR object is expected", e.message
588
+ end
589
+ end
590
+
591
+ def test_less_or_equal_result
592
+ @model_first = Model.first
593
+ @model_last = Model.last
594
+
595
+ @models = Model.less_or_equal({field_1: @model_first.field_1})
596
+
597
+ assert @models.any?
598
+ assert @models.include?(@model_first)
599
+ assert_equal @models.count, 1
600
+ end
601
+
602
+ def test_less_or_equal_condition_value
603
+ @models = Model.less_or_equal({field_1: 1})
604
+
605
+ ctx = @models.arel.as_json["ctx"]
606
+ where_conditions = ctx.wheres
607
+
608
+ assert where_conditions.any?
609
+
610
+ where_conditions.each do |condition|
611
+ assert_kind_of Arel::Nodes::Grouping, condition
612
+ condition.expr.children.each do |condition_part|
613
+ assert_kind_of Arel::Nodes::LessThanOrEqual, condition_part
614
+
615
+ assert_kind_of Arel::Attributes::Attribute, condition_part.left
616
+
617
+ assert_equal :field_1, condition_part.left.name
618
+ assert_equal 1, condition_part.right
619
+ end
620
+ end
621
+ end
622
+
623
+ def test_less_or_equal_condition_ar_object
624
+ @models = Model.less_or_equal(@model)
625
+
626
+ ctx = @models.arel.as_json["ctx"]
627
+ where_conditions = ctx.wheres
628
+
629
+ assert where_conditions.any?
630
+
631
+ where_conditions.each do |condition|
632
+ assert_kind_of Arel::Nodes::Grouping, condition
633
+ condition.expr.children.each do |condition_part|
634
+ assert_kind_of Arel::Nodes::LessThanOrEqual, condition_part
635
+
636
+ assert_kind_of Arel::Attributes::Attribute, condition_part.left
637
+
638
+ assert_equal :id, condition_part.left.name
639
+ assert_equal 1, condition_part.right
640
+ end
641
+ end
642
+ end
643
+
644
+ def test_less_or_equal_incorrect_params
645
+ begin
646
+ @models = Model.less_or_equal("field_1")
647
+ rescue Exception => e
648
+ assert_equal "Hash or AR object is expected", e.message
649
+ end
650
+ end
651
+ end
652
+ end
@@ -0,0 +1,37 @@
1
+ require 'bundler/setup'
2
+ require 'active_record'
3
+ require 'simplecov'
4
+ require 'coveralls'
5
+ Coveralls.wear!
6
+
7
+ ENV["COVERAGE"] = "true"
8
+ SimpleCov.start if ENV["COVERAGE"]
9
+
10
+ Bundler.require
11
+
12
+ MiniTest::Unit.autorun
13
+
14
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
15
+
16
+ ActiveRecord::Migration.create_table :models do |t|
17
+ t.integer :field_1
18
+ t.string :field_2
19
+ t.boolean :field_3
20
+ t.text :field_4
21
+ t.timestamps
22
+ end
23
+
24
+ class Model < ActiveRecord::Base
25
+ include UsefullScopes
26
+ end
27
+
28
+ class TestCase < MiniTest::Unit::TestCase
29
+ def load_fixture(filename)
30
+ File.read(File.dirname(__FILE__) + "/fixtures/#{filename}")
31
+ end
32
+
33
+ require 'factory_girl'
34
+ FactoryGirl.reload
35
+
36
+ include FactoryGirl::Syntax::Methods
37
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: usefull_scopes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-21 00:00:00.000000000 Z
12
+ date: 2013-02-11 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: This gem provides additional scopes for your Active:Record models within
15
15
  Ruby on Rails framework.
@@ -19,6 +19,7 @@ executables: []
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
+ - .coveralls.yml
22
23
  - .gitignore
23
24
  - Gemfile
24
25
  - LICENSE
@@ -26,6 +27,10 @@ files:
26
27
  - Rakefile
27
28
  - lib/usefull_scopes.rb
28
29
  - lib/usefull_scopes/version.rb
30
+ - test/factories/models.rb
31
+ - test/factories/sequences.rb
32
+ - test/lib/usefull_scopes_test.rb
33
+ - test/test_helper.rb
29
34
  - usefull_scopes.gemspec
30
35
  homepage: http://github.com/kaize/usefull_scopes
31
36
  licenses: []
@@ -51,5 +56,8 @@ rubygems_version: 1.8.24
51
56
  signing_key:
52
57
  specification_version: 3
53
58
  summary: Additional scopes for Active:Record models.
54
- test_files: []
55
- has_rdoc:
59
+ test_files:
60
+ - test/factories/models.rb
61
+ - test/factories/sequences.rb
62
+ - test/lib/usefull_scopes_test.rb
63
+ - test/test_helper.rb