json_api_client 1.10.0 → 1.11.0

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 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