json_api_client 1.0.0.beta2 → 1.0.0.beta3
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 +36 -5
- data/lib/json_api_client/helpers/queryable.rb +1 -1
- data/lib/json_api_client/helpers/requestable.rb +0 -4
- data/lib/json_api_client/query/builder.rb +24 -3
- data/lib/json_api_client/query/requestor.rb +1 -10
- data/lib/json_api_client/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1af573eac7e606a57e398c563b46b41ed2f4aea0
|
4
|
+
data.tar.gz: 0c6b27e6af8fd78b449a253226c1a37e9c83c81b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5cefa69d519d148e9298e36a0bba1e11605a59b841e34d9eb5c213ed7e56eecfe6e6a86914584b84777e513d707c6b4cebd597b701406cdfc9d33a89454e19e3
|
7
|
+
data.tar.gz: 7ee4e4c5e432f24f232349ce0ee4565fdec370c00de50b5ba1f27291dee3bc9aa9095608a9ad48e6ea0b35b971128248dbfa94dd3b5bc9526f0a386092d9163d
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
This gem is meant to help you build an API client for interacting with REST APIs as laid out by [http://jsonapi.org](http://jsonapi.org). It attempts to give you a query building framework that is easy to understand (it is similar to ActiveRecord scopes).
|
4
4
|
|
5
|
-
*Note: master is currently tracking the 1.0.0
|
5
|
+
*Note: master is currently tracking the 1.0.0 specification. If you're looking for the older code, see [0.x branch](https://github.com/chingor13/json_api_client/tree/0.x)*
|
6
6
|
|
7
7
|
*Note: This is still a work in progress.*
|
8
8
|
|
@@ -31,7 +31,7 @@ end
|
|
31
31
|
|
32
32
|
By convention, we figure guess the resource route from the class name. In the above example, `Article`'s path is "http://example.com/articles" and `Person`'s path would be "http://example.com/people".
|
33
33
|
|
34
|
-
Some example usage:
|
34
|
+
Some basic example usage:
|
35
35
|
|
36
36
|
```
|
37
37
|
MyApi::Article.all
|
@@ -60,6 +60,8 @@ All class level finders/creators should return a `JsonApiClient::ResultSet` whic
|
|
60
60
|
|
61
61
|
## Handling Validation Errors
|
62
62
|
|
63
|
+
[See specification](http://jsonapi.org/format/#errors)
|
64
|
+
|
63
65
|
Out of the box, `json_api_client` handles server side validation only.
|
64
66
|
|
65
67
|
```
|
@@ -69,9 +71,19 @@ User.create(name: "Bob", email_address: "invalid email")
|
|
69
71
|
user = User.new(name: "Bob", email_address: "invalid email")
|
70
72
|
user.save
|
71
73
|
=> false
|
74
|
+
|
75
|
+
# returns an error collector which is array-like
|
72
76
|
user.errors
|
73
77
|
=> ["Email address is invalid"]
|
74
78
|
|
79
|
+
# get all error titles
|
80
|
+
user.errors.full_messages
|
81
|
+
=> ["Email address is invalid"]
|
82
|
+
|
83
|
+
# get errors for a specific parameter
|
84
|
+
user.errors[:email_address]
|
85
|
+
=> ["Email address is invalid"]
|
86
|
+
|
75
87
|
user = User.find(1)
|
76
88
|
user.update_attributes(email_address: "invalid email")
|
77
89
|
=> false
|
@@ -81,6 +93,8 @@ user.email_address
|
|
81
93
|
=> "invalid email"
|
82
94
|
```
|
83
95
|
|
96
|
+
For now we are assuming that error sources are all parameters.
|
97
|
+
|
84
98
|
If you want to add client side validation, I suggest creating a form model class that uses ActiveModel's validations.
|
85
99
|
|
86
100
|
## Meta information
|
@@ -204,10 +218,10 @@ article.created_at
|
|
204
218
|
[See specification](http://jsonapi.org/format/#fetching-sorting)
|
205
219
|
|
206
220
|
```
|
207
|
-
# makes request to /people?sort
|
221
|
+
# makes request to /people?sort=age
|
208
222
|
youngest = Person.sort(:age).all
|
209
223
|
|
210
|
-
# also makes request to /people?sort
|
224
|
+
# also makes request to /people?sort=age
|
211
225
|
youngest = Person.sort(age: :asc).all
|
212
226
|
|
213
227
|
# makes request to /people?sort=-age
|
@@ -228,7 +242,7 @@ articles = Article.page(2).per(30).to_a
|
|
228
242
|
articles = Article.paginate(page: 2, per_page: 30).to_a
|
229
243
|
```
|
230
244
|
|
231
|
-
*Note: The mapping of pagination parameters is done by the `query_builder` which is [customizable](#
|
245
|
+
*Note: The mapping of pagination parameters is done by the `query_builder` which is [customizable](#custom-paginator).*
|
232
246
|
|
233
247
|
### Browsing
|
234
248
|
|
@@ -299,6 +313,23 @@ Also, we consider `nil` to be an acceptable value and will not cast the value.
|
|
299
313
|
|
300
314
|
## Customizing
|
301
315
|
|
316
|
+
### Paths
|
317
|
+
|
318
|
+
You can customize this path by changing your resource's `table_name`:
|
319
|
+
|
320
|
+
```
|
321
|
+
module MyApi
|
322
|
+
class SomeResource < Base
|
323
|
+
def self.table_name
|
324
|
+
"foobar"
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
# requests http://example.com/foobar
|
330
|
+
MyApi::SomeResource.all
|
331
|
+
```
|
332
|
+
|
302
333
|
### Connections
|
303
334
|
|
304
335
|
You can configure your API client to use a custom connection that implementes the `run` instance method. It should return data that your parser can handle. The default connection class wraps Faraday and lets you add middleware.
|
@@ -6,7 +6,7 @@ module JsonApiClient
|
|
6
6
|
included do
|
7
7
|
class << self
|
8
8
|
extend Forwardable
|
9
|
-
def_delegators :new_scope, :where, :order, :includes, :select, :all, :paginate, :page, :first
|
9
|
+
def_delegators :new_scope, :where, :order, :includes, :select, :all, :paginate, :page, :first, :find
|
10
10
|
end
|
11
11
|
class_attribute :connection_class, :connection_object, :connection_options, :query_builder
|
12
12
|
self.connection_class = Connection
|
@@ -6,6 +6,7 @@ module JsonApiClient
|
|
6
6
|
|
7
7
|
def initialize(klass)
|
8
8
|
@klass = klass
|
9
|
+
@primary_key = nil
|
9
10
|
@pagination_params = {}
|
10
11
|
@filters = {}
|
11
12
|
@includes = []
|
@@ -64,19 +65,39 @@ module JsonApiClient
|
|
64
65
|
.merge(includes_params)
|
65
66
|
.merge(order_params)
|
66
67
|
.merge(select_params)
|
68
|
+
.merge(primary_key_params)
|
67
69
|
end
|
68
70
|
|
69
71
|
def to_a
|
70
|
-
@to_a ||=
|
72
|
+
@to_a ||= find
|
71
73
|
end
|
72
74
|
alias all to_a
|
73
75
|
|
76
|
+
def find(args = {})
|
77
|
+
case args
|
78
|
+
when Hash
|
79
|
+
where(args)
|
80
|
+
else
|
81
|
+
@primary_key = args
|
82
|
+
end
|
83
|
+
|
84
|
+
klass.requestor.get(params)
|
85
|
+
end
|
86
|
+
|
74
87
|
def method_missing(method_name, *args, &block)
|
75
88
|
to_a.send(method_name, *args, &block)
|
76
89
|
end
|
77
90
|
|
78
91
|
private
|
79
92
|
|
93
|
+
def primary_key_params
|
94
|
+
return {} unless @primary_key
|
95
|
+
|
96
|
+
@primary_key.is_a?(Array) ?
|
97
|
+
{klass.primary_key.to_s.pluralize.to_sym => @primary_key.join(",")} :
|
98
|
+
{klass.primary_key => @primary_key}
|
99
|
+
end
|
100
|
+
|
80
101
|
def pagination_params
|
81
102
|
@pagination_params.empty? ? {} : {page: @pagination_params}
|
82
103
|
end
|
@@ -121,11 +142,11 @@ module JsonApiClient
|
|
121
142
|
case arg
|
122
143
|
when Hash
|
123
144
|
arg.map do |k, v|
|
124
|
-
operator = (v == :desc ? "-" : "
|
145
|
+
operator = (v == :desc ? "-" : "")
|
125
146
|
"#{operator}#{k}"
|
126
147
|
end
|
127
148
|
else
|
128
|
-
"
|
149
|
+
"#{arg}"
|
129
150
|
end
|
130
151
|
end.flatten
|
131
152
|
end
|
@@ -20,16 +20,7 @@ module JsonApiClient
|
|
20
20
|
})
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
params = case args
|
25
|
-
when Hash
|
26
|
-
args
|
27
|
-
when Array
|
28
|
-
{klass.primary_key.to_s.pluralize.to_sym => args.join(",")}
|
29
|
-
else
|
30
|
-
{klass.primary_key => args}
|
31
|
-
end
|
32
|
-
|
23
|
+
def get(params = {})
|
33
24
|
path = resource_path(params)
|
34
25
|
params.delete(klass.primary_key)
|
35
26
|
request(:get, path, params)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_api_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Ching
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|