api_monkey 0.0.1 → 0.0.2
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 +4 -4
- data/README.md +80 -3
- data/api_monkey.gemspec +3 -1
- data/lib/api_monkey.rb +2 -0
- data/lib/api_monkey/filter_scopes.rb +36 -1
- data/lib/api_monkey/filterable.rb +1 -0
- data/lib/api_monkey/version.rb +1 -1
- metadata +19 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea6c7219d0438e4edfc69a15a33fd27180841b19
|
4
|
+
data.tar.gz: c43568afe1cb1d6681fbe6993cb905582d2082e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 602f83bd78cb22bbfc54c9bf45b46a6b3d0545714c5732a7f9081f43625ff46e1b7597255e8f4cd3d99d27548b96f648886e2cfe69a02ef498f9b7ffb771076b
|
7
|
+
data.tar.gz: cdeb5c1fa6720b152b0f2f9c9dbb440109c32a6b95c696b4c3b63e19c8774461ffd8245f77f050cd0b0970c8f721de3105b0e6e0585c0337de0131eda595d189
|
data/README.md
CHANGED
@@ -27,24 +27,101 @@ end
|
|
27
27
|
|
28
28
|
### Filter Params
|
29
29
|
Filter params provide a clean and easy way to add request-based
|
30
|
-
filtering of your active record models
|
30
|
+
filtering of your active record models. To use filter params, ApiMonkey
|
31
|
+
expects the parameters send to rails to resolve like this:
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
# http://my.domain/products?filter[price]=200
|
35
|
+
|
36
|
+
{
|
37
|
+
filter: {
|
38
|
+
price: 200
|
39
|
+
}
|
40
|
+
}
|
41
|
+
```
|
42
|
+
This would filter our Product query to only those with `price = 200`
|
43
|
+
|
44
|
+
More complex filters can be applied using an operator shorthand that
|
45
|
+
allows for equality and comparison operators. The list of possible
|
46
|
+
operators are:
|
47
|
+
|
48
|
+
|SQL Operator|Operator Shorthand|
|
49
|
+
|---|---|
|
50
|
+
|=|eq|
|
51
|
+
|>|gt|
|
52
|
+
|<|lt|
|
53
|
+
|<=|leq|
|
54
|
+
|>=|geq|
|
55
|
+
|
56
|
+
To use these, just change the concrete value for `price` in the above
|
57
|
+
hash to it's own hash using the operators as keys:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
# http://my.domain/products?filter[price[gt]]=200
|
61
|
+
|
62
|
+
{
|
63
|
+
filter: {
|
64
|
+
price: {
|
65
|
+
'gt' => 200
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
```
|
70
|
+
|
71
|
+
Or:
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
# http://my.domain/products?filter[price[gt]]=200&filter[price[leq]]=350
|
75
|
+
|
76
|
+
{
|
77
|
+
filter: {
|
78
|
+
price: {
|
79
|
+
'gt' => 200,
|
80
|
+
'leq' => 350
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
```
|
85
|
+
|
86
|
+
To use ApiMonkey in an exisitng Rails app, you have to include the ApiMonkey module in your model like this:
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
class Product < ActiveRecord::Base
|
90
|
+
include ApiMonkey
|
91
|
+
end
|
92
|
+
```
|
93
|
+
|
94
|
+
This will create all the necessary filtering methods that will be used
|
95
|
+
in your controller. Next we want to add the filter to our controller. Use a methodology similar to
|
96
|
+
strong parameters. We recommend using a controller method like this:
|
31
97
|
|
32
98
|
```ruby
|
33
99
|
# app/controllers/products_controller.rb
|
34
100
|
|
35
101
|
class ProductsController < ApplicationController
|
36
102
|
def index
|
37
|
-
@products =
|
103
|
+
@products = if params[:filter]
|
104
|
+
Product.filter(filter_params)
|
105
|
+
else
|
106
|
+
Product.all
|
38
107
|
end
|
39
108
|
|
40
109
|
protected
|
41
110
|
|
42
111
|
def filter_params
|
43
|
-
params.
|
112
|
+
params.require(:filter).permit(Product.filter_params)
|
44
113
|
end
|
45
114
|
end
|
46
115
|
```
|
47
116
|
|
117
|
+
`Model.filter_params` is a simple hash so it supports methods like
|
118
|
+
`include` and `except` to help control the fields that can be filtered
|
119
|
+
against.
|
120
|
+
`filter` is designed so that passing either `nil` or `{}` to it will
|
121
|
+
produce an empty set (`where(nil)`). Therefore, you should ensure that
|
122
|
+
filter exists as a key in `params`. Passing `nil` to one of the
|
123
|
+
`filter_xxx` will result in a `where(xxx: nil)`.
|
124
|
+
|
48
125
|
## Development
|
49
126
|
|
50
127
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/api_monkey.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["michaelkelly322@gmail.com"]
|
11
11
|
|
12
12
|
spec.summary = "Makes building data-driven APIs in Rails a breeze"
|
13
|
-
spec.description = "Makes building data-driven APIs in Rails a breeze by providing an easy to use DSL for
|
13
|
+
spec.description = "Makes building data-driven APIs in Rails a breeze by providing an easy to use DSL for working with API resources"
|
14
14
|
spec.homepage = "https://github.com/michaelkelly322/api_monkey"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
@@ -22,4 +22,6 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "bundler", "~> 1.10"
|
23
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
24
|
spec.add_development_dependency "rspec"
|
25
|
+
|
26
|
+
spec.add_runtime_dependency 'activesupport'
|
25
27
|
end
|
data/lib/api_monkey.rb
CHANGED
@@ -2,9 +2,44 @@ module ApiMonkey::FilterScopes
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
included do
|
5
|
+
OPERANDS = {
|
6
|
+
'eq' => '=',
|
7
|
+
'gt' => '>',
|
8
|
+
'lt' => '<',
|
9
|
+
'geq' => '>=',
|
10
|
+
'leq' => '<=',
|
11
|
+
}.freeze
|
12
|
+
|
13
|
+
# Define filter methods
|
5
14
|
column_names.map do |field_name|
|
6
15
|
define_singleton_method "filter_#{field_name}" do |param|
|
7
|
-
|
16
|
+
if param.is_a? Hash
|
17
|
+
where(*process_hash_params(field_name, param))
|
18
|
+
else
|
19
|
+
where(*filter_args(field_name, param, 'eq'))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.filter_args(field, value, op)
|
25
|
+
["#{field} #{OPERANDS[op]} ?", value]
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.process_hash_params(field, param)
|
29
|
+
predicates, values = [],[]
|
30
|
+
param.keys.each do |k|
|
31
|
+
predicates << filter_args(field, param[k], k)[0]
|
32
|
+
values << filter_args(field, param[k], k)[1]
|
33
|
+
end
|
34
|
+
|
35
|
+
[predicates.join(' AND '), *values]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.filter_params
|
39
|
+
{}.tap do |h|
|
40
|
+
column_names.each do |field_name|
|
41
|
+
h[field_name.to_sym] = OPERANDS.keys.map &:to_sym
|
42
|
+
end
|
8
43
|
end
|
9
44
|
end
|
10
45
|
end
|
@@ -4,6 +4,7 @@ module ApiMonkey::Filterable
|
|
4
4
|
included do
|
5
5
|
define_singleton_method :filter do |filtering_params|
|
6
6
|
results = self.where(nil)
|
7
|
+
return results unless filtering_params
|
7
8
|
filtering_params.each do |key, value|
|
8
9
|
results = results.public_send("filter_#{key}", value) if value.present?
|
9
10
|
end
|
data/lib/api_monkey/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_monkey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Kelly
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,8 +52,22 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activesupport
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: Makes building data-driven APIs in Rails a breeze by providing an easy
|
56
|
-
to use DSL for
|
70
|
+
to use DSL for working with API resources
|
57
71
|
email:
|
58
72
|
- michaelkelly322@gmail.com
|
59
73
|
executables: []
|
@@ -96,8 +110,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
110
|
version: '0'
|
97
111
|
requirements: []
|
98
112
|
rubyforge_project:
|
99
|
-
rubygems_version: 2.4.
|
113
|
+
rubygems_version: 2.4.8
|
100
114
|
signing_key:
|
101
115
|
specification_version: 4
|
102
116
|
summary: Makes building data-driven APIs in Rails a breeze
|
103
117
|
test_files: []
|
118
|
+
has_rdoc:
|