paraphrase 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +7 -2
- data/Appraisals +6 -0
- data/CHANGELOG.md +6 -0
- data/README.md +48 -28
- data/gemfiles/3.0.gemfile.lock +13 -4
- data/gemfiles/3.1.gemfile.lock +13 -4
- data/gemfiles/3.2.gemfile.lock +13 -4
- data/gemfiles/4.0.gemfile.lock +13 -4
- data/gemfiles/4.1.gemfile +9 -0
- data/gemfiles/4.1.gemfile.lock +95 -0
- data/lib/paraphrase/params.rb +34 -0
- data/lib/paraphrase/query.rb +26 -26
- data/lib/paraphrase/scope.rb +8 -8
- data/lib/paraphrase/version.rb +1 -1
- data/paraphrase.gemspec +6 -8
- data/spec/paraphrase/query_spec.rb +7 -15
- data/spec/spec_helper.rb +7 -0
- metadata +30 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54d269a79cf5f4ab55d4afe39c4f9e0c4dd6841f
|
4
|
+
data.tar.gz: e95b97c71c317d9e6f534bb7dcfb10037cde2bfe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f69b9ef6eb394171092763aa92144d0f044e0f7668c374a4d609da84d0a2e163d39fa2679771fa9a32894150a8a478002d531acd6f3ff139c521742fa5494b75
|
7
|
+
data.tar.gz: 93221d4cd686cd4f7a84d958df0608264a4869045ce891239e4dc47d7330c68c2712faf6a049fde322cd3f79fd938e709caf0bea14a96e45822a395ca6d35ce4
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
rvm:
|
2
2
|
- 1.9.3
|
3
3
|
- 2.0.0
|
4
|
-
- 2.1.
|
4
|
+
- 2.1.1
|
5
5
|
- jruby-19mode
|
6
6
|
gemfile:
|
7
7
|
- gemfiles/3.0.gemfile
|
8
8
|
- gemfiles/3.1.gemfile
|
9
9
|
- gemfiles/3.2.gemfile
|
10
10
|
- gemfiles/4.0.gemfile
|
11
|
-
|
11
|
+
- gemfiles/4.1.gemfile
|
12
|
+
install: 'travis_retry bundle install -j 4'
|
12
13
|
script: 'bundle exec rake'
|
14
|
+
env:
|
15
|
+
global:
|
16
|
+
# Code Climate coverage reporting
|
17
|
+
- secure: "VylP1haJogwCq04GRrM3hVfNT4YJiZ4RJoklOQLgqPMRalOCzVPOIRoTz3qpVbdQHf3l18VhVDrDbu2W2qfBKJq7/anIuYYgPd0uRAGliZD4h5B2PgQDqvPeTEftj/g3IYDh6PvZCuhgnxMdldmSnxd9WAjAnkLtjoiLgE6elCE="
|
data/Appraisals
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 0.9.0
|
2
|
+
|
3
|
+
* Define methods to process query params on a subclass of `Paraphrase::Params`
|
4
|
+
that also handles filtering blank query params.
|
5
|
+
* `Query.keys` and `Query#keys` expose the keys that have been mapped.
|
6
|
+
|
1
7
|
## 0.8.0 / 2-5-2014
|
2
8
|
|
3
9
|
* Remove `ActiveSupport::Notifications`
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# paraphrase
|
2
2
|
|
3
3
|
[![Code Climate](https://codeclimate.com/github/ecbypi/paraphrase.png)](https://codeclimate.com/github/ecbypi/paraphrase)
|
4
|
+
[![Build Status](https://travis-ci.org/ecbypi/paraphrase.png?branch=master)](https://travis-ci.org/ecbypi/paraphrase)
|
4
5
|
|
5
6
|
Paraphrase provides a way to map query params to model scopes and
|
6
7
|
only apply scopes when the mapped query params are present.
|
@@ -29,10 +30,6 @@ be applied to which scopes.
|
|
29
30
|
class PostQuery < Paraphrase::Query
|
30
31
|
map :author, to: :by_user
|
31
32
|
map :start_date, :end_date, to: :published_within
|
32
|
-
|
33
|
-
def start_date
|
34
|
-
Time.zone.parse(params[:start_date])
|
35
|
-
end
|
36
33
|
end
|
37
34
|
```
|
38
35
|
|
@@ -49,16 +46,16 @@ class AdminPostQuery < Paraphrase::Query
|
|
49
46
|
end
|
50
47
|
```
|
51
48
|
|
52
|
-
|
53
|
-
|
54
|
-
whose inputs are supplied. If a query param for a scope is missing or empty,
|
55
|
-
the scope is skipped.
|
49
|
+
To build the query, call `.paraphrase` on your model. Only scopes whose keys are all
|
50
|
+
provided will be applied.
|
56
51
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
52
|
+
```ruby
|
53
|
+
# Based on the example `PostQuery` above, this will only apply `Post.by_user`
|
54
|
+
# and skip `Post.published_within` since `:end_date` is missing.
|
55
|
+
Post.paraphrase(author: 'Jim')
|
56
|
+
```
|
57
|
+
|
58
|
+
All unregistered keys are filered out of the params that are passed to `.paraphrase`.
|
62
59
|
|
63
60
|
```ruby
|
64
61
|
class PostsController < ApplicationController
|
@@ -72,6 +69,30 @@ class PostsController < ApplicationController
|
|
72
69
|
end
|
73
70
|
```
|
74
71
|
|
72
|
+
`Paraphrase::Query` will recursively determine if the value of the query
|
73
|
+
param is empty. If the value is an array containing empty strings, the empty
|
74
|
+
strings will be removed before being passed to the scope. If the array is empty
|
75
|
+
after removing empty strings, the scope will not be called since an empty array
|
76
|
+
is considered a blank value.
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
class UserQuery < Paraphrase::Query
|
80
|
+
map :names, to: :with_name
|
81
|
+
end
|
82
|
+
|
83
|
+
class User < ActiveRecord::Base
|
84
|
+
def self.with_name(names)
|
85
|
+
where(name: names)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
User.paraphrase(names: ['', 'Jim']).to_sql
|
90
|
+
# => SELECT "users".* FROM "users" WHERE "users"."name" IN ['Jim']
|
91
|
+
|
92
|
+
User.paraphrase(names: ['', '']).to_sql
|
93
|
+
# => SELECT "users".* FROM "users"
|
94
|
+
```
|
95
|
+
|
75
96
|
You can chain queries on an `ActiveRecord::Relation`. This avoids adding scopes
|
76
97
|
that replicate the functionality of an association like
|
77
98
|
`Post.for_user(user_id)` or allow you to build a default scope.
|
@@ -100,8 +121,7 @@ end
|
|
100
121
|
|
101
122
|
### Query Class DSL
|
102
123
|
|
103
|
-
Scopes are mapped to param keys using
|
104
|
-
`Paraphrase::Query`. You can specify one or more keys.
|
124
|
+
Scopes are mapped to param keys using `map`. You can specify one or more keys.
|
105
125
|
|
106
126
|
```ruby
|
107
127
|
class PostQuery < Paraphrase::Query
|
@@ -121,7 +141,7 @@ end
|
|
121
141
|
```
|
122
142
|
|
123
143
|
If multiple query params are mapped to a scope, but only a subset are required,
|
124
|
-
use the `:whitelist` option to allow them to be
|
144
|
+
use the `:whitelist` option to allow them to be blank. The `:whitelist`
|
125
145
|
option can be set to `true`, an individual key or an array of keys.
|
126
146
|
|
127
147
|
```ruby
|
@@ -151,12 +171,11 @@ Post.paraphrase(first_name: 'John', last_name: 'Smith').to_sql
|
|
151
171
|
|
152
172
|
### Boolean Scopes
|
153
173
|
|
154
|
-
|
155
|
-
|
174
|
+
For scopes that filter records based on a boolean column, it doesn't make to
|
175
|
+
force the scope to take an argument.
|
156
176
|
|
157
|
-
|
158
|
-
will
|
159
|
-
valid.
|
177
|
+
If the mapped query params are present and a scope takes no arguments,
|
178
|
+
`paraphrase` will not attempt to pass those values to the query.
|
160
179
|
|
161
180
|
```ruby
|
162
181
|
class PostQuery < Paraphrase::Query
|
@@ -178,8 +197,7 @@ Post.paraphrase(published: '1').to_sql
|
|
178
197
|
### Pre-processing Query Params
|
179
198
|
|
180
199
|
By default, for each query param specified that maps to a model scope, a method
|
181
|
-
is defined on the query class that fetches the value for that key.
|
182
|
-
internally to determine if model scopes need to be applied. To pre-process a
|
200
|
+
is defined on the query class that fetches the value for that key. To pre-process a
|
183
201
|
query param, such as an ISO formatted date, override the method in the query
|
184
202
|
class.
|
185
203
|
|
@@ -187,12 +205,14 @@ class.
|
|
187
205
|
class PostQuery < Paraphrase::Query
|
188
206
|
map :start_date, :end_date, to: :published_within
|
189
207
|
|
190
|
-
|
191
|
-
|
192
|
-
|
208
|
+
class Params < Paraphrase::Params
|
209
|
+
def start_date
|
210
|
+
@start_date ||= Time.zone.parse(params[:start_date]) rescue nil
|
211
|
+
end
|
193
212
|
|
194
|
-
|
195
|
-
|
213
|
+
def end_date
|
214
|
+
@start_date ||= Time.zone.parse(params[:end_date]) rescue nil
|
215
|
+
end
|
196
216
|
end
|
197
217
|
end
|
198
218
|
|
data/gemfiles/3.0.gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/edd_d/Work/paraphrase
|
3
3
|
specs:
|
4
|
-
paraphrase (0.
|
5
|
-
activemodel (>= 3.0, < 4.
|
6
|
-
activerecord (>= 3.0, < 4.
|
7
|
-
activesupport (>= 3.0, < 4.
|
4
|
+
paraphrase (0.9.0)
|
5
|
+
activemodel (>= 3.0, < 4.2)
|
6
|
+
activerecord (>= 3.0, < 4.2)
|
7
|
+
activesupport (>= 3.0, < 4.2)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
@@ -35,8 +35,11 @@ GEM
|
|
35
35
|
rake
|
36
36
|
arel (3.0.3)
|
37
37
|
builder (3.0.4)
|
38
|
+
codeclimate-test-reporter (0.3.0)
|
39
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
38
40
|
coderay (1.1.0)
|
39
41
|
diff-lcs (1.2.5)
|
42
|
+
docile (1.1.3)
|
40
43
|
erubis (2.7.0)
|
41
44
|
hike (1.2.3)
|
42
45
|
i18n (0.6.9)
|
@@ -62,6 +65,11 @@ GEM
|
|
62
65
|
rspec-expectations (2.14.4)
|
63
66
|
diff-lcs (>= 1.1.3, < 2.0)
|
64
67
|
rspec-mocks (2.14.4)
|
68
|
+
simplecov (0.8.2)
|
69
|
+
docile (~> 1.1.0)
|
70
|
+
multi_json
|
71
|
+
simplecov-html (~> 0.8.0)
|
72
|
+
simplecov-html (0.8.0)
|
65
73
|
slop (3.4.7)
|
66
74
|
sprockets (2.2.2)
|
67
75
|
hike (~> 1.2)
|
@@ -82,6 +90,7 @@ DEPENDENCIES
|
|
82
90
|
activesupport (~> 3.0)
|
83
91
|
appraisal (~> 0.4)
|
84
92
|
bundler (~> 1.0)
|
93
|
+
codeclimate-test-reporter (~> 0.3)
|
85
94
|
paraphrase!
|
86
95
|
pry (~> 0.9)
|
87
96
|
rake (~> 0.9.2)
|
data/gemfiles/3.1.gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/edd_d/Work/paraphrase
|
3
3
|
specs:
|
4
|
-
paraphrase (0.
|
5
|
-
activemodel (>= 3.0, < 4.
|
6
|
-
activerecord (>= 3.0, < 4.
|
7
|
-
activesupport (>= 3.0, < 4.
|
4
|
+
paraphrase (0.9.0)
|
5
|
+
activemodel (>= 3.0, < 4.2)
|
6
|
+
activerecord (>= 3.0, < 4.2)
|
7
|
+
activesupport (>= 3.0, < 4.2)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
@@ -35,8 +35,11 @@ GEM
|
|
35
35
|
rake
|
36
36
|
arel (3.0.3)
|
37
37
|
builder (3.0.4)
|
38
|
+
codeclimate-test-reporter (0.3.0)
|
39
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
38
40
|
coderay (1.1.0)
|
39
41
|
diff-lcs (1.2.5)
|
42
|
+
docile (1.1.3)
|
40
43
|
erubis (2.7.0)
|
41
44
|
hike (1.2.3)
|
42
45
|
i18n (0.6.9)
|
@@ -62,6 +65,11 @@ GEM
|
|
62
65
|
rspec-expectations (2.14.4)
|
63
66
|
diff-lcs (>= 1.1.3, < 2.0)
|
64
67
|
rspec-mocks (2.14.4)
|
68
|
+
simplecov (0.8.2)
|
69
|
+
docile (~> 1.1.0)
|
70
|
+
multi_json
|
71
|
+
simplecov-html (~> 0.8.0)
|
72
|
+
simplecov-html (0.8.0)
|
65
73
|
slop (3.4.7)
|
66
74
|
sprockets (2.2.2)
|
67
75
|
hike (~> 1.2)
|
@@ -82,6 +90,7 @@ DEPENDENCIES
|
|
82
90
|
activesupport (~> 3.1)
|
83
91
|
appraisal (~> 0.4)
|
84
92
|
bundler (~> 1.0)
|
93
|
+
codeclimate-test-reporter (~> 0.3)
|
85
94
|
paraphrase!
|
86
95
|
pry (~> 0.9)
|
87
96
|
rake (~> 0.9.2)
|
data/gemfiles/3.2.gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/edd_d/Work/paraphrase
|
3
3
|
specs:
|
4
|
-
paraphrase (0.
|
5
|
-
activemodel (>= 3.0, < 4.
|
6
|
-
activerecord (>= 3.0, < 4.
|
7
|
-
activesupport (>= 3.0, < 4.
|
4
|
+
paraphrase (0.9.0)
|
5
|
+
activemodel (>= 3.0, < 4.2)
|
6
|
+
activerecord (>= 3.0, < 4.2)
|
7
|
+
activesupport (>= 3.0, < 4.2)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
@@ -35,8 +35,11 @@ GEM
|
|
35
35
|
rake
|
36
36
|
arel (3.0.3)
|
37
37
|
builder (3.0.4)
|
38
|
+
codeclimate-test-reporter (0.3.0)
|
39
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
38
40
|
coderay (1.1.0)
|
39
41
|
diff-lcs (1.2.5)
|
42
|
+
docile (1.1.3)
|
40
43
|
erubis (2.7.0)
|
41
44
|
hike (1.2.3)
|
42
45
|
i18n (0.6.9)
|
@@ -62,6 +65,11 @@ GEM
|
|
62
65
|
rspec-expectations (2.14.4)
|
63
66
|
diff-lcs (>= 1.1.3, < 2.0)
|
64
67
|
rspec-mocks (2.14.4)
|
68
|
+
simplecov (0.8.2)
|
69
|
+
docile (~> 1.1.0)
|
70
|
+
multi_json
|
71
|
+
simplecov-html (~> 0.8.0)
|
72
|
+
simplecov-html (0.8.0)
|
65
73
|
slop (3.4.7)
|
66
74
|
sprockets (2.2.2)
|
67
75
|
hike (~> 1.2)
|
@@ -82,6 +90,7 @@ DEPENDENCIES
|
|
82
90
|
activesupport (~> 3.2)
|
83
91
|
appraisal (~> 0.4)
|
84
92
|
bundler (~> 1.0)
|
93
|
+
codeclimate-test-reporter (~> 0.3)
|
85
94
|
paraphrase!
|
86
95
|
pry (~> 0.9)
|
87
96
|
rake (~> 0.9.2)
|
data/gemfiles/4.0.gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/edd_d/Work/paraphrase
|
3
3
|
specs:
|
4
|
-
paraphrase (0.
|
5
|
-
activemodel (>= 3.0, < 4.
|
6
|
-
activerecord (>= 3.0, < 4.
|
7
|
-
activesupport (>= 3.0, < 4.
|
4
|
+
paraphrase (0.9.0)
|
5
|
+
activemodel (>= 3.0, < 4.2)
|
6
|
+
activerecord (>= 3.0, < 4.2)
|
7
|
+
activesupport (>= 3.0, < 4.2)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
@@ -36,8 +36,11 @@ GEM
|
|
36
36
|
arel (4.0.1)
|
37
37
|
atomic (1.1.14)
|
38
38
|
builder (3.1.4)
|
39
|
+
codeclimate-test-reporter (0.3.0)
|
40
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
39
41
|
coderay (1.1.0)
|
40
42
|
diff-lcs (1.2.5)
|
43
|
+
docile (1.1.3)
|
41
44
|
erubis (2.7.0)
|
42
45
|
i18n (0.6.9)
|
43
46
|
method_source (0.8.2)
|
@@ -60,6 +63,11 @@ GEM
|
|
60
63
|
rspec-expectations (2.14.4)
|
61
64
|
diff-lcs (>= 1.1.3, < 2.0)
|
62
65
|
rspec-mocks (2.14.4)
|
66
|
+
simplecov (0.8.2)
|
67
|
+
docile (~> 1.1.0)
|
68
|
+
multi_json
|
69
|
+
simplecov-html (~> 0.8.0)
|
70
|
+
simplecov-html (0.8.0)
|
63
71
|
slop (3.4.7)
|
64
72
|
sqlite3 (1.3.8)
|
65
73
|
thread_safe (0.1.3)
|
@@ -76,6 +84,7 @@ DEPENDENCIES
|
|
76
84
|
activesupport (~> 4.0)
|
77
85
|
appraisal (~> 0.4)
|
78
86
|
bundler (~> 1.0)
|
87
|
+
codeclimate-test-reporter (~> 0.3)
|
79
88
|
paraphrase!
|
80
89
|
pry (~> 0.9)
|
81
90
|
rake (~> 0.9.2)
|
@@ -0,0 +1,95 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../
|
3
|
+
specs:
|
4
|
+
paraphrase (0.9.0)
|
5
|
+
activemodel (>= 3.0, < 4.2)
|
6
|
+
activerecord (>= 3.0, < 4.2)
|
7
|
+
activesupport (>= 3.0, < 4.2)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
actionpack (4.1.0)
|
13
|
+
actionview (= 4.1.0)
|
14
|
+
activesupport (= 4.1.0)
|
15
|
+
rack (~> 1.5.2)
|
16
|
+
rack-test (~> 0.6.2)
|
17
|
+
actionview (4.1.0)
|
18
|
+
activesupport (= 4.1.0)
|
19
|
+
builder (~> 3.1)
|
20
|
+
erubis (~> 2.7.0)
|
21
|
+
activemodel (4.1.0)
|
22
|
+
activesupport (= 4.1.0)
|
23
|
+
builder (~> 3.1)
|
24
|
+
activerecord (4.1.0)
|
25
|
+
activemodel (= 4.1.0)
|
26
|
+
activesupport (= 4.1.0)
|
27
|
+
arel (~> 5.0.0)
|
28
|
+
activesupport (4.1.0)
|
29
|
+
i18n (~> 0.6, >= 0.6.9)
|
30
|
+
json (~> 1.7, >= 1.7.7)
|
31
|
+
minitest (~> 5.1)
|
32
|
+
thread_safe (~> 0.1)
|
33
|
+
tzinfo (~> 1.1)
|
34
|
+
appraisal (0.5.2)
|
35
|
+
bundler
|
36
|
+
rake
|
37
|
+
arel (5.0.1.20140414130214)
|
38
|
+
builder (3.2.2)
|
39
|
+
codeclimate-test-reporter (0.3.0)
|
40
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
41
|
+
coderay (1.1.0)
|
42
|
+
diff-lcs (1.2.5)
|
43
|
+
docile (1.1.3)
|
44
|
+
erubis (2.7.0)
|
45
|
+
i18n (0.6.9)
|
46
|
+
json (1.8.1)
|
47
|
+
method_source (0.8.2)
|
48
|
+
minitest (5.3.3)
|
49
|
+
multi_json (1.9.3)
|
50
|
+
pry (0.9.12.6)
|
51
|
+
coderay (~> 1.0)
|
52
|
+
method_source (~> 0.8)
|
53
|
+
slop (~> 3.4)
|
54
|
+
rack (1.5.2)
|
55
|
+
rack-test (0.6.2)
|
56
|
+
rack (>= 1.0)
|
57
|
+
rake (0.9.6)
|
58
|
+
redcarpet (2.1.1)
|
59
|
+
rspec (2.14.1)
|
60
|
+
rspec-core (~> 2.14.0)
|
61
|
+
rspec-expectations (~> 2.14.0)
|
62
|
+
rspec-mocks (~> 2.14.0)
|
63
|
+
rspec-core (2.14.8)
|
64
|
+
rspec-expectations (2.14.5)
|
65
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
66
|
+
rspec-mocks (2.14.6)
|
67
|
+
simplecov (0.8.2)
|
68
|
+
docile (~> 1.1.0)
|
69
|
+
multi_json
|
70
|
+
simplecov-html (~> 0.8.0)
|
71
|
+
simplecov-html (0.8.0)
|
72
|
+
slop (3.5.0)
|
73
|
+
sqlite3 (1.3.8)
|
74
|
+
thread_safe (0.3.3)
|
75
|
+
tzinfo (1.1.0)
|
76
|
+
thread_safe (~> 0.1)
|
77
|
+
yard (0.8.7.3)
|
78
|
+
|
79
|
+
PLATFORMS
|
80
|
+
ruby
|
81
|
+
|
82
|
+
DEPENDENCIES
|
83
|
+
actionpack (~> 4.1)
|
84
|
+
activerecord (~> 4.1)
|
85
|
+
activesupport (~> 4.1)
|
86
|
+
appraisal (~> 0.4)
|
87
|
+
bundler (~> 1.0)
|
88
|
+
codeclimate-test-reporter (~> 0.3)
|
89
|
+
paraphrase!
|
90
|
+
pry (~> 0.9)
|
91
|
+
rake (~> 0.9.2)
|
92
|
+
redcarpet (~> 2.1.1)
|
93
|
+
rspec (~> 2.14)
|
94
|
+
sqlite3 (~> 1.3.6)
|
95
|
+
yard (~> 0.7)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Paraphrase
|
2
|
+
class Params
|
3
|
+
attr_reader :params, :result
|
4
|
+
|
5
|
+
def initialize(params, keys)
|
6
|
+
@params = params.with_indifferent_access.slice(*keys)
|
7
|
+
|
8
|
+
@result = @params.inject(HashWithIndifferentAccess.new) do |result, (key, value)|
|
9
|
+
value = respond_to?(key) ? send(key) : scrub(@params[key])
|
10
|
+
|
11
|
+
if value.present?
|
12
|
+
result[key] = value
|
13
|
+
end
|
14
|
+
|
15
|
+
result
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def scrub(value)
|
22
|
+
case value
|
23
|
+
when Array
|
24
|
+
value.delete_if { |v| scrub(v).blank? }
|
25
|
+
when Hash
|
26
|
+
value.delete_if { |k, v| scrub(v).blank? }
|
27
|
+
when String
|
28
|
+
value.strip
|
29
|
+
else
|
30
|
+
value
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/paraphrase/query.rb
CHANGED
@@ -5,6 +5,7 @@ require 'active_support/core_ext/string/inflections'
|
|
5
5
|
require 'active_support/core_ext/array/extract_options'
|
6
6
|
require 'active_support/hash_with_indifferent_access'
|
7
7
|
require 'paraphrase/active_model'
|
8
|
+
require 'paraphrase/params'
|
8
9
|
|
9
10
|
module Paraphrase
|
10
11
|
class Query
|
@@ -14,7 +15,7 @@ module Paraphrase
|
|
14
15
|
class_attribute :scopes, :_source, instance_writer: false
|
15
16
|
|
16
17
|
# @!attribute [r] params
|
17
|
-
# @return [HashWithIndifferentAccess]
|
18
|
+
# @return [HashWithIndifferentAccess] filtered parameters based on keys defined in scopes
|
18
19
|
#
|
19
20
|
# @!attribute [r] result
|
20
21
|
# @return [ActiveRecord::Relation]
|
@@ -33,6 +34,20 @@ module Paraphrase
|
|
33
34
|
self._source = name.to_s
|
34
35
|
end
|
35
36
|
|
37
|
+
# Keys being mapped to scopes
|
38
|
+
#
|
39
|
+
# @return [Array<Symbol>]
|
40
|
+
def self.keys
|
41
|
+
scopes.flat_map(&:keys)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns the class for processing and filtering query params.
|
45
|
+
def self.param_processor
|
46
|
+
self::Params
|
47
|
+
rescue NameError
|
48
|
+
Paraphrase::Params
|
49
|
+
end
|
50
|
+
|
36
51
|
# Add a {Scope} instance to {Query#scopes}. Defines a reader for each key
|
37
52
|
# to read from {Query#params}.
|
38
53
|
#
|
@@ -48,7 +63,7 @@ module Paraphrase
|
|
48
63
|
scopes << Scope.new(keys, options)
|
49
64
|
|
50
65
|
keys.each do |key|
|
51
|
-
define_method(key) { params[key] }
|
66
|
+
define_method(key) { params[key] }
|
52
67
|
end
|
53
68
|
end
|
54
69
|
|
@@ -58,18 +73,13 @@ module Paraphrase
|
|
58
73
|
# @param [Hash] params query parameters
|
59
74
|
# @param [ActiveRecord::Relation] relation object to apply methods to
|
60
75
|
def initialize(params = {}, relation = source)
|
61
|
-
|
62
|
-
|
63
|
-
@params = params.with_indifferent_access.slice(*keys)
|
64
|
-
scrub_params!
|
76
|
+
@params = process_params(params)
|
65
77
|
|
66
|
-
@result = scopes.inject(relation) do |
|
67
|
-
scope.chain(
|
78
|
+
@result = scopes.inject(relation) do |result, scope|
|
79
|
+
scope.chain(@params, result)
|
68
80
|
end
|
69
81
|
end
|
70
82
|
|
71
|
-
alias :[] :send
|
72
|
-
|
73
83
|
# Return an `ActiveRecord::Relation` corresponding to the source class
|
74
84
|
# determined from the `_source` class attribute or the name of the query
|
75
85
|
# class.
|
@@ -82,25 +92,15 @@ module Paraphrase
|
|
82
92
|
end
|
83
93
|
end
|
84
94
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
params.delete_if { |key, value| scrub(value) }
|
95
|
+
# @see Query.keys
|
96
|
+
def keys
|
97
|
+
self.class.keys
|
89
98
|
end
|
90
99
|
|
91
|
-
|
92
|
-
value = case value
|
93
|
-
when Array
|
94
|
-
value.delete_if { |v| scrub(v) }
|
95
|
-
when Hash
|
96
|
-
value.delete_if { |k, v| scrub(v) }
|
97
|
-
when String
|
98
|
-
value.strip
|
99
|
-
else
|
100
|
-
value
|
101
|
-
end
|
100
|
+
private
|
102
101
|
|
103
|
-
|
102
|
+
def process_params(params)
|
103
|
+
self.class.param_processor.new(params, keys).result
|
104
104
|
end
|
105
105
|
end
|
106
106
|
end
|
data/lib/paraphrase/scope.rb
CHANGED
@@ -13,11 +13,11 @@ module Paraphrase
|
|
13
13
|
# @return [Array<Symbol>] keys required for query
|
14
14
|
attr_reader :keys, :name, :required_keys
|
15
15
|
|
16
|
-
# @param [Symbol]
|
16
|
+
# @param [Symbol] keys query params to be mapped to the scope
|
17
17
|
# @param [Hash] options options to configure {Scope Scope} instance
|
18
|
-
# @option options [Symbol, Array<Symbol>] :to
|
19
|
-
# @option options [true, Symbol, Array<Symbol>] :
|
20
|
-
# subset of param keys as
|
18
|
+
# @option options [Symbol, Array<Symbol>] :to scope to map query params to
|
19
|
+
# @option options [true, Symbol, Array<Symbol>] :whitelist lists all or a
|
20
|
+
# subset of param keys as optional
|
21
21
|
def initialize(keys, options)
|
22
22
|
@keys = keys
|
23
23
|
@name = options[:to]
|
@@ -34,18 +34,18 @@ module Paraphrase
|
|
34
34
|
# values are missing. Detects if the scope takes no arguments to determine
|
35
35
|
# if values should be passed to the scope.
|
36
36
|
#
|
37
|
-
# @param [
|
37
|
+
# @param [Hash] params filtered params from the query
|
38
38
|
# @param [ActiveRecord::Relation] relation scope chain
|
39
39
|
# @return [ActiveRecord::Relation]
|
40
|
-
def chain(
|
41
|
-
if required_keys.all? { |key|
|
40
|
+
def chain(params, relation)
|
41
|
+
if required_keys.all? { |key| params[key] }
|
42
42
|
klass = relation.respond_to?(:klass) ? relation.klass : relation
|
43
43
|
arity = klass.method(name).arity
|
44
44
|
|
45
45
|
if arity == 0
|
46
46
|
relation.send(name)
|
47
47
|
else
|
48
|
-
values = keys.map { |key|
|
48
|
+
values = keys.map { |key| params[key] }
|
49
49
|
relation.send(name, *values)
|
50
50
|
end
|
51
51
|
else
|
data/lib/paraphrase/version.rb
CHANGED
data/paraphrase.gemspec
CHANGED
@@ -24,26 +24,24 @@ Gem::Specification.new do |gem|
|
|
24
24
|
|
25
25
|
gem.required_ruby_version = '>= 1.9.3'
|
26
26
|
|
27
|
-
gem.add_dependency 'activerecord', '>= 3.0', '< 4.
|
28
|
-
gem.add_dependency 'activesupport', '>= 3.0', '< 4.
|
29
|
-
gem.add_dependency 'activemodel', '>= 3.0', '< 4.
|
27
|
+
gem.add_dependency 'activerecord', '>= 3.0', '< 4.2'
|
28
|
+
gem.add_dependency 'activesupport', '>= 3.0', '< 4.2'
|
29
|
+
gem.add_dependency 'activemodel', '>= 3.0', '< 4.2'
|
30
30
|
|
31
|
-
gem.add_development_dependency 'actionpack', '>= 3.0', '< 4.
|
31
|
+
gem.add_development_dependency 'actionpack', '>= 3.0', '< 4.2'
|
32
32
|
gem.add_development_dependency 'bundler', '~> 1.0'
|
33
33
|
gem.add_development_dependency 'yard', '~> 0.7'
|
34
34
|
gem.add_development_dependency 'rspec', '~> 2.14'
|
35
35
|
gem.add_development_dependency 'rake', '~> 0.9.2'
|
36
36
|
gem.add_development_dependency 'appraisal', '~> 0.4'
|
37
37
|
gem.add_development_dependency 'pry', '~> 0.9'
|
38
|
-
|
39
|
-
if RUBY_PLATFORM != 'java'
|
40
|
-
gem.add_development_dependency 'redcarpet', '~> 2.1.1'
|
41
|
-
end
|
38
|
+
gem.add_development_dependency 'codeclimate-test-reporter', '~> 0.3'
|
42
39
|
|
43
40
|
if RUBY_PLATFORM == 'java'
|
44
41
|
gem.add_development_dependency 'activerecord-jdbcsqlite3-adapter'
|
45
42
|
gem.add_development_dependency 'jdbc-sqlite3'
|
46
43
|
else
|
47
44
|
gem.add_development_dependency 'sqlite3', '~> 1.3.6'
|
45
|
+
gem.add_development_dependency 'redcarpet', '~> 2.1.1'
|
48
46
|
end
|
49
47
|
end
|
@@ -9,12 +9,14 @@ module Paraphrase
|
|
9
9
|
map :authors, to: :by_users
|
10
10
|
map :start_date, :end_date, to: :published_between
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
class Params < Paraphrase::Params
|
13
|
+
def start_date
|
14
|
+
@start_date ||= Time.parse(params[:start_date]) rescue nil
|
15
|
+
end
|
15
16
|
|
16
|
-
|
17
|
-
|
17
|
+
def end_date
|
18
|
+
@end_date ||= Time.parse(params[:end_date]) rescue nil
|
19
|
+
end
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
@@ -55,16 +57,6 @@ module Paraphrase
|
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
58
|
-
describe '#[]' do
|
59
|
-
it 'retreives values from #params or uses custom reader if defined' do
|
60
|
-
query = PostQuery.new(title: 'Morning Joe', start_date: '2010-10-30', end_date: 'foo')
|
61
|
-
|
62
|
-
expect(query[:title]).to eq 'Morning Joe'
|
63
|
-
expect(query[:start_date]).to eq Time.local(2010, 10, 30)
|
64
|
-
expect(query[:end_date]).to be_nil
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
60
|
describe "#params" do
|
69
61
|
it "filters out params not specified in scopes" do
|
70
62
|
query = PostQuery.new(nickname: 'bill', title: 'william')
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
|
+
require 'codeclimate-test-reporter'
|
2
|
+
CodeClimate::TestReporter.start
|
3
|
+
|
1
4
|
require 'rspec'
|
2
5
|
require 'pry'
|
3
6
|
require 'paraphrase'
|
4
7
|
require 'active_record'
|
5
8
|
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.order = 'random'
|
11
|
+
end
|
12
|
+
|
6
13
|
I18n.enforce_available_locales = false
|
7
14
|
|
8
15
|
ActiveRecord::Base.establish_connection(
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paraphrase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo Gutierrez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '3.0'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '4.
|
22
|
+
version: '4.2'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '3.0'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '4.
|
32
|
+
version: '4.2'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: activesupport
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
version: '3.0'
|
40
40
|
- - "<"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '4.
|
42
|
+
version: '4.2'
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -49,7 +49,7 @@ dependencies:
|
|
49
49
|
version: '3.0'
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: '4.
|
52
|
+
version: '4.2'
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: activemodel
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,7 +59,7 @@ dependencies:
|
|
59
59
|
version: '3.0'
|
60
60
|
- - "<"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '4.
|
62
|
+
version: '4.2'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -69,7 +69,7 @@ dependencies:
|
|
69
69
|
version: '3.0'
|
70
70
|
- - "<"
|
71
71
|
- !ruby/object:Gem::Version
|
72
|
-
version: '4.
|
72
|
+
version: '4.2'
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
74
|
name: actionpack
|
75
75
|
requirement: !ruby/object:Gem::Requirement
|
@@ -79,7 +79,7 @@ dependencies:
|
|
79
79
|
version: '3.0'
|
80
80
|
- - "<"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '4.
|
82
|
+
version: '4.2'
|
83
83
|
type: :development
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -89,7 +89,7 @@ dependencies:
|
|
89
89
|
version: '3.0'
|
90
90
|
- - "<"
|
91
91
|
- !ruby/object:Gem::Version
|
92
|
-
version: '4.
|
92
|
+
version: '4.2'
|
93
93
|
- !ruby/object:Gem::Dependency
|
94
94
|
name: bundler
|
95
95
|
requirement: !ruby/object:Gem::Requirement
|
@@ -175,19 +175,19 @@ dependencies:
|
|
175
175
|
- !ruby/object:Gem::Version
|
176
176
|
version: '0.9'
|
177
177
|
- !ruby/object:Gem::Dependency
|
178
|
-
name:
|
178
|
+
name: codeclimate-test-reporter
|
179
179
|
requirement: !ruby/object:Gem::Requirement
|
180
180
|
requirements:
|
181
181
|
- - "~>"
|
182
182
|
- !ruby/object:Gem::Version
|
183
|
-
version:
|
183
|
+
version: '0.3'
|
184
184
|
type: :development
|
185
185
|
prerelease: false
|
186
186
|
version_requirements: !ruby/object:Gem::Requirement
|
187
187
|
requirements:
|
188
188
|
- - "~>"
|
189
189
|
- !ruby/object:Gem::Version
|
190
|
-
version:
|
190
|
+
version: '0.3'
|
191
191
|
- !ruby/object:Gem::Dependency
|
192
192
|
name: sqlite3
|
193
193
|
requirement: !ruby/object:Gem::Requirement
|
@@ -202,6 +202,20 @@ dependencies:
|
|
202
202
|
- - "~>"
|
203
203
|
- !ruby/object:Gem::Version
|
204
204
|
version: 1.3.6
|
205
|
+
- !ruby/object:Gem::Dependency
|
206
|
+
name: redcarpet
|
207
|
+
requirement: !ruby/object:Gem::Requirement
|
208
|
+
requirements:
|
209
|
+
- - "~>"
|
210
|
+
- !ruby/object:Gem::Version
|
211
|
+
version: 2.1.1
|
212
|
+
type: :development
|
213
|
+
prerelease: false
|
214
|
+
version_requirements: !ruby/object:Gem::Requirement
|
215
|
+
requirements:
|
216
|
+
- - "~>"
|
217
|
+
- !ruby/object:Gem::Version
|
218
|
+
version: 2.1.1
|
205
219
|
description: "\n Map query params to model scopes, pairing
|
206
220
|
one or\n more keys to a scope. Parameters can be required,
|
207
221
|
or\n whitelisted providing fine tuned control over how\n
|
@@ -229,9 +243,12 @@ files:
|
|
229
243
|
- gemfiles/3.2.gemfile.lock
|
230
244
|
- gemfiles/4.0.gemfile
|
231
245
|
- gemfiles/4.0.gemfile.lock
|
246
|
+
- gemfiles/4.1.gemfile
|
247
|
+
- gemfiles/4.1.gemfile.lock
|
232
248
|
- lib/paraphrase.rb
|
233
249
|
- lib/paraphrase/active_model.rb
|
234
250
|
- lib/paraphrase/errors.rb
|
251
|
+
- lib/paraphrase/params.rb
|
235
252
|
- lib/paraphrase/query.rb
|
236
253
|
- lib/paraphrase/rails.rb
|
237
254
|
- lib/paraphrase/scope.rb
|