json_api_client 1.10.0 → 1.11.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: 8dc5a38f2bde33b9912837c82fa1fe5c9ef41c80
4
- data.tar.gz: e8a926c76a1198ec9cf720fae46335e12f2c54fc
3
+ metadata.gz: 6fd62267b74acfe53f89ff0c7ef23db0b69fd294
4
+ data.tar.gz: 2139b42adda0d08e98de593576ae8701b35e40df
5
5
  SHA512:
6
- metadata.gz: 5d346d1b746c28b381e77a5842403808377f924feacce7d57f5f8d7ce9df4e9ccff8312a39e2313c0babc31965860e0af3c1b66648df60923af35cd2148467ad
7
- data.tar.gz: 1951d5ea9ff1879cebd7f1c1fbafd25f752e2adbbdfd2f636231b23e4d16e8c282def341a5a368f282f64308c596388dc1a2eb58676bec90f3677254100aa006
6
+ metadata.gz: bc06232298c783d5639df475dad7cdca160df99feb32c57dbba9dbd60132b29f057f8307397fe11053f2559bfe4fb3a3aa3826c3a3b343c76784884d2a87fc2d
7
+ data.tar.gz: 8bfe1faeb6d342fd9a9269efae3d2cb2ba13ad8615018c1546c0f45ac135e21a23d86dc02e6821135b32b672058087df018b0ddda9b0e654e31e0e62645584b8
data/README.md CHANGED
@@ -52,14 +52,14 @@ u.update_attributes(
52
52
  c: "d"
53
53
  )
54
54
 
55
- u.persisted?
55
+ u.persisted?
56
56
  # => true
57
57
 
58
58
  u.destroy
59
59
 
60
- u.destroyed?
60
+ u.destroyed?
61
61
  # => true
62
- u.persisted?
62
+ u.persisted?
63
63
  # => false
64
64
 
65
65
  u = MyApi::Person.create(
@@ -164,7 +164,7 @@ module MyApi
164
164
  class Account < JsonApiClient::Resource
165
165
  belongs_to :user
166
166
  end
167
-
167
+
168
168
  class Customer < JsonApiClient::Resource
169
169
  belongs_to :user, shallow_path: true
170
170
  end
@@ -476,7 +476,7 @@ end
476
476
 
477
477
  ##### Custom status handler
478
478
 
479
- You can change handling of response status using `connection_options`. For example you can override 400 status handling.
479
+ You can change handling of response status using `connection_options`. For example you can override 400 status handling.
480
480
  By default it raises `JsonApiClient::Errors::ClientError` but you can skip exception if you want to process errors from the server.
481
481
  You need to provide a `proc` which should call `throw(:handled)` default handler for this status should be skipped.
482
482
  ```ruby
@@ -636,6 +636,37 @@ end
636
636
 
637
637
  ```
638
638
 
639
+ ### Safe singular resource fetching
640
+
641
+ That is a bit curios, but `json_api_client` returns an array from `.find` method, always.
642
+ The history of this fact was discussed [here](https://github.com/JsonApiClient/json_api_client/issues/75)
643
+
644
+ So, when we searching for a single resource by primary key, we typically write the things like
645
+
646
+ ```ruby
647
+ admin = User.find(id).first
648
+ ```
649
+
650
+ The next thing which we need to notice - `json_api_client` will just interpolate the incoming `.find` param to the end of API URL, just like that:
651
+
652
+ > http://somehost/api/v1/users/{id}
653
+
654
+ What will happen if we pass the blank id (nil or empty string) to the `.find` method then?.. Yeah, `json_api_client` will try to call the INDEX API endpoint instead of SHOW one:
655
+
656
+ > http://somehost/api/v1/users/
657
+
658
+ Lets sum all together - in case if `id` comes blank (from CGI for instance), we can silently receive the `admin` variable equal to some existing resource, with all the consequences.
659
+
660
+ Even worse, `admin` variable can equal to *random* resource, depends on ordering applied by INDEX endpoint.
661
+
662
+ If you prefer to get `JsonApiClient::Errors::NotFound` raised, please define in your base Resource class:
663
+
664
+ ```ruby
665
+ class Resource < JsonApiClient::Resource
666
+ self.raise_on_blank_find_param = true
667
+ end
668
+ ```
669
+
639
670
  ## Contributing
640
671
 
641
672
  Contributions are welcome! Please fork this repo and send a pull request. Your pull request should have:
@@ -86,11 +86,15 @@ module JsonApiClient
86
86
  end
87
87
 
88
88
  def to_a
89
- @to_a ||= find
89
+ @to_a ||= _fetch
90
90
  end
91
91
  alias all to_a
92
92
 
93
93
  def find(args = {})
94
+ if klass.raise_on_blank_find_param && args.blank?
95
+ raise Errors::NotFound, 'blank .find param'
96
+ end
97
+
94
98
  case args
95
99
  when Hash
96
100
  scope = where(args)
@@ -98,13 +102,19 @@ module JsonApiClient
98
102
  scope = _new_scope( primary_key: args )
99
103
  end
100
104
 
101
- klass.requestor.get(scope.params)
105
+ scope._fetch
102
106
  end
103
107
 
104
108
  def method_missing(method_name, *args, &block)
105
109
  to_a.send(method_name, *args, &block)
106
110
  end
107
111
 
112
+ protected
113
+
114
+ def _fetch
115
+ klass.requestor.get(params)
116
+ end
117
+
108
118
  private
109
119
 
110
120
  def _new_scope( opts = {} )
@@ -36,6 +36,7 @@ module JsonApiClient
36
36
  :keep_request_params,
37
37
  :search_included_in_result_set,
38
38
  :custom_type_to_class,
39
+ :raise_on_blank_find_param,
39
40
  instance_accessor: false
40
41
  class_attribute :add_defaults_to_changes,
41
42
  instance_writer: false
@@ -54,6 +55,7 @@ module JsonApiClient
54
55
  self.add_defaults_to_changes = false
55
56
  self.search_included_in_result_set = false
56
57
  self.custom_type_to_class = {}
58
+ self.raise_on_blank_find_param = false
57
59
 
58
60
  #:underscored_key, :camelized_key, :dasherized_key, or custom
59
61
  self.json_key_format = :underscored_key
@@ -1,3 +1,3 @@
1
1
  module JsonApiClient
2
- VERSION = "1.10.0"
2
+ VERSION = "1.11.0"
3
3
  end
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.10.0
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Ching
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-20 00:00:00.000000000 Z
11
+ date: 2019-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport