scopie 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec17cfb9b778cf068fc1905662711130a5f6546a
4
- data.tar.gz: 1174d72fcb851d8230d067850edb28291c110c0b
3
+ metadata.gz: a712c48ae4d6541f9de46f7161944622035f5dca
4
+ data.tar.gz: a3ab1963d878729f75219ee9f8a48891c208abba
5
5
  SHA512:
6
- metadata.gz: 12163b288818fc99ebf0d8eecd9b4dce713d30b48f45dd5ca9886c5528123d5a462204ef292fbb8074180a7081bf28df00993dcaadd99230def4a667e887dd12
7
- data.tar.gz: 1a69b907b51c68978b7a9a3223f4e9dbce973ddaea07d1bf542dee48007a68fd815c2cb80f52be59e14d44afe081fb1ec09e14a7b258a613ff97a414e5da5139
6
+ metadata.gz: 13f994ef566f8d582a1e28f1213a25463b0aed03ec3c0131fc97760bed5897768835e7eb1fa5e12f4feb4966f0e799ddbb655f74658e205914f2466191cfc296
7
+ data.tar.gz: 0e37d4f423664bceb1d44c9f3e2db4906fd4f591040ae8814662289364a08787f369eca26e4d4572e236725fc3c6d9bcb5552cb08ad8f28f76403db442138375
data/README.md CHANGED
@@ -1,36 +1,72 @@
1
1
  ## Scopie
2
+
3
+ [![Code Climate](https://codeclimate.com/github/beorc/scopie/badges/gpa.svg)](https://codeclimate.com/github/beorc/scopie)
4
+
2
5
  Minimal mapping of incoming parameters to named scopes in your resources through OO design
3
6
 
4
7
  Scopie allows you to map incoming controller parameters to named scopes in your resources.
5
8
 
6
- Scopie is the yet another implementation of [has_scope](http://github.com/plataformatec/has_scope). The key differences is dedicated class where
7
- the scopes are defined. Also, it doesn't depend from ActiveSupport or ActionPack. Please have, a look at [scopie_rails](http://github.com/beorc/scopie_rails)
8
- if you are using Ruby on Rails framework.
9
- To override default mapping behavior you don't need to pass a block - just define a method with the same name as scope.
10
- You can DRY your custom scopes mapping logic by using helper methods defined in scopie class and use the same scopie class in multiple controllers.
9
+ It is similar to [has_scope](http://github.com/plataformatec/has_scope).
10
+
11
+ The key differences are:
12
+
13
+ * Dedicated class where the scopes are defined, so that your controller will be skinny.
14
+ * It doesn't depend from ActiveSupport or ActionPack. Please have, a look at [scopie_rails](http://github.com/beorc/scopie_rails) if you are using Ruby on Rails framework.
15
+ * To override default mapping behavior you don't need to pass a block - just define a method with the same name as scope.
16
+ * You can DRY your custom scopes mapping logic by using helper methods defined in scopie class and use the same scopie class in multiple controllers.
11
17
 
12
18
  Imagine the following model called graduations:
13
19
 
14
20
  ```ruby
15
21
  class Graduation < ActiveRecord::Base
16
- scope :featured, -> { where(:featured => true) }
17
- scope :by_degree, -> degree { where(:degree => degree) }
18
- scope :by_period, -> started_at, ended_at { where("started_at = ? AND ended_at = ?", started_at, ended_at) }
22
+
23
+ scope :featured, -> { where(featured: true) }
24
+ scope :by_degree, -> (degree) { where(degree: degree) }
25
+ scope :by_period, -> (started_at, ended_at) { where('started_at = ? AND ended_at = ?', started_at, ended_at) }
26
+
27
+ scope :created_at_greater_than, ->(date) { where('entities.created_at >= ?', date.beginning_of_day) }
28
+ scope :created_at_less_than, ->(date) { where('entities.created_at <= ?', date.end_of_day) }
29
+ scope :updated_at_greater_than, ->(date) { where('entities.updated_at >= ?', date.beginning_of_day) }
30
+ scope :updated_at_less_than, ->(date) { where('entities.updated_at <= ?', date.end_of_day) }
31
+
19
32
  end
20
33
  ```
21
34
 
22
35
  You can use those named scopes as filters by declaring them on your scopie:
23
36
 
24
37
  ```ruby
25
- class Scopies::GraduationsScopie < Scopie::Base
38
+ class GraduationsScopie < Scopie::Base
39
+
26
40
  has_scope :featured, type: :boolean
27
41
  has_scope :by_degree, :by_period
42
+
43
+ has_scope :created_at_greater_than, in: :created_at, as: :start_at
44
+ has_scope :created_at_less_than, in: :created_at, as: :end_at
45
+
28
46
  has_scope :page, default: 1
29
47
  has_scope :per, default: 30
30
48
 
31
49
  def by_period(scope, value, _hash)
32
- scope.by_period(value[:started_at], value[:ended_at])
50
+ started_at = value[:started_at]
51
+ ended_at = value[:ended_at]
52
+
53
+ started_at && ended_at && scope.by_period(started_at, ended_at)
33
54
  end
55
+
56
+ def created_at_greater_than(scope, value, _hash)
57
+ scope.created_at_greater_than(parse_date(value))
58
+ end
59
+
60
+ def created_at_less_than(scope, value, _hash)
61
+ scope.created_at_less_than(parse_date(value))
62
+ end
63
+
64
+ private
65
+
66
+ def parse_date(value)
67
+ Date.parse(value)
68
+ end
69
+
34
70
  end
35
71
  ```
36
72
 
@@ -38,9 +74,11 @@ Now, if you want to apply them to an specific resource, you just need to call `a
38
74
 
39
75
  ```ruby
40
76
  class GraduationsController < ApplicationController
77
+
41
78
  def index
42
79
  @graduations = Scopie.apply_scopes(Graduation, method: :index, scopie: Scopies::GraduationsScopie.new).all
43
80
  end
81
+
44
82
  end
45
83
  ```
46
84
 
@@ -56,6 +94,9 @@ Then for each request:
56
94
  /graduations?by_period[started_at]=20100701&by_period[ended_at]=20101013
57
95
  #=> brings graduations in the given period
58
96
 
97
+ /graduations?created_at[start_at]=2016-06-01&created_at[end_at]=2016-06-02
98
+ #=> brings graduations created in the given period
99
+
59
100
  /graduations?featured=true&by_degree=phd
60
101
  #=> brings featured graduations with phd degree
61
102
  ```
@@ -72,7 +113,7 @@ gem 'scopie'
72
113
 
73
114
  Scopie supports several options:
74
115
 
75
- * `:type` - Checks the type of the parameter sent.
116
+ * `:type` - Coerces the type of the parameter sent. Available options: boolean, integer, date.
76
117
 
77
118
  * `:only` - In which actions the scope is applied.
78
119
 
data/lib/scopie/base.rb CHANGED
@@ -30,9 +30,10 @@ class Scopie::Base
30
30
 
31
31
  def current_scopes(hash, method = nil)
32
32
  scopes = scopes_configuration.map do |scope_name, options|
33
- next unless scope_applicable?(scope_name, options, hash, method)
34
33
  value = scope_value(scope_name, options, hash)
35
- [scope_name, value]
34
+ next unless scope_applicable?(value, options, method)
35
+
36
+ [scope_name, coerce_value_type(value, options[:type])]
36
37
  end
37
38
 
38
39
  scopes.compact!
@@ -43,10 +44,10 @@ class Scopie::Base
43
44
 
44
45
  def apply_scope(scope_name, target, value, hash)
45
46
  result = if respond_to?(scope_name)
46
- public_send(scope_name, target, value, hash)
47
- else
48
- target.public_send(scope_name, value)
49
- end
47
+ public_send(scope_name, target, value, hash)
48
+ else
49
+ target.public_send(scope_name, value)
50
+ end
50
51
 
51
52
  result || target
52
53
  end
@@ -61,7 +62,7 @@ class Scopie::Base
61
62
  key_name = key_name(scope_name, options)
62
63
  reduced_hash = reduced_hash(hash, options)
63
64
 
64
- return coerce_value_type(reduced_hash[key_name], options[:type]) if reduced_hash.key?(key_name)
65
+ return reduced_hash[key_name] if reduced_hash.key?(key_name)
65
66
  options[:default]
66
67
  end
67
68
 
@@ -74,10 +75,17 @@ class Scopie::Base
74
75
  TRUE_VALUES.include? value
75
76
  end
76
77
 
77
- def scope_applicable?(scope_name, options, hash, method)
78
+ def coerce_to_integer(value)
79
+ Integer(value)
80
+ end
81
+
82
+ def coerce_to_date(value)
83
+ Date.parse(value)
84
+ end
85
+
86
+ def scope_applicable?(value, options, method)
78
87
  return false unless method_applicable?(method, options)
79
88
 
80
- value = scope_value(scope_name, options, hash)
81
89
  is_value_present = value.respond_to?(:empty?) ? !value.empty? : !!value
82
90
 
83
91
  is_value_present || !!options[:allow_blank]
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Scopie
3
- VERSION = '0.6.2'
3
+ VERSION = '0.7.0'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scopie
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yury Kotov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-24 00:00:00.000000000 Z
11
+ date: 2016-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec