flexirest 1.10.2 → 1.10.3

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
  SHA256:
3
- metadata.gz: 8001a7a20f2054fd34a7f09ae350253da96eba3dc4ff8b390e5b07509f1f09ea
4
- data.tar.gz: 8f96916235d0f45fa9aa1c3ff5f37502f81c5d2f2a1c5db079d72e63d0de923c
3
+ metadata.gz: 53b34d9600101b9d80a61559054a3599242a7739b12845df02bde410c5858d94
4
+ data.tar.gz: e7398bcc97a8a0f89fb3380110e126e482d5fc1e14a973dd9e34208f28634814
5
5
  SHA512:
6
- metadata.gz: ad2e6dad01ee45f4d0b0540b53e8c6f20329d94cae6364f59d281ede3c45955959d3ecb70762249911cf05cc637840ba7e88a1c2fac49ff329ad3de680f643b3
7
- data.tar.gz: de207d3cb3ac7bb243137925217efc0067d7c80950bac1a6a02450f251da0380470866e448ffd5c876e6009ed07b2cf0573ad82ce0782ad07cfb53c839a8e70d
6
+ metadata.gz: 32014dfe143032f040ae140cdcf562f05832f74d0b05e692b8f866d4636363b6f7ffcbe0a4de0e7a895c8b1722aef0f6736f34c130916dc5c02869caa198434a
7
+ data.tar.gz: a7f3cb00fd3451c4f06ef32bf6e148f90d4046c1cce7526a8bfe6c247e2d65dcd68a0d924f85683ef052929432ddf341768578a7591b37db8b7729ed96053c80
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.10.3
4
+
5
+ Enhancement:
6
+
7
+ - Ignore/wrap root functionality available for all routes, rather than just route specifically (thanks to Sampat Badhe for the PR)
8
+
3
9
  ## 1.10.2
4
10
 
5
11
  Bugfix:
@@ -1,6 +1,6 @@
1
1
  # *Flexirest:* Filtering result lists
2
2
 
3
- If the API returns a JSON list of items, this is retured to you as a `Flexirest::ResultIterator` object. A `ResultIterator` sorts simple filtering of the list using a `where` method based on values matching a specified criteria (or matching using regular expressions):
3
+ If the API returns a JSON list of items, this is returned to you as a `Flexirest::ResultIterator` object. A `ResultIterator` sorts simple filtering of the list using a `where` method based on values matching a specified criteria (or matching using regular expressions):
4
4
 
5
5
  ```ruby
6
6
  class Article < Flexirest::Base
@@ -40,7 +40,7 @@ Article.all.first_name == "Billy"
40
40
  This example does two things:
41
41
 
42
42
  1. It rewrites the incoming URL for any requests matching "_/all_" to "/all_people"
43
- 2. It uses the `translate` method to move the "fname" attribute from the response body to be called "first_name". The translate method must return the new object at the end (either the existing object alterered, or a new object to replace it with)
43
+ 2. It uses the `translate` method to move the "fname" attribute from the response body to be called "first_name". The translate method must return the new object at the end (either the existing object altered, or a new object to replace it with)
44
44
 
45
45
  As the comment shows, you can use `url value` to set the request URL to a particular value, or you can call `gsub!` on the url to replace parts of it using more complicated regular expressions.
46
46
 
@@ -12,7 +12,7 @@ people = Person._request('http://api.example.com/v1/people') # Defaults to get w
12
12
  Person._request('http://api.example.com/v1/people', :post, {id:1234,name:"John"}) # Post with parameters
13
13
  ```
14
14
 
15
- When you need to specify custom headers (for example for authentication) you can do this with a fourth option to the `_request` method. If you are using the default paramaters you'll need to specify them. For example:
15
+ When you need to specify custom headers (for example for authentication) you can do this with a fourth option to the `_request` method. If you are using the default parameters you'll need to specify them. For example:
16
16
 
17
17
  ```ruby
18
18
  Person._request("http://api.example.com/v1/people", :get, {}, {headers:{"X-Something": "foo/bar"}})
@@ -2,13 +2,32 @@
2
2
 
3
3
  If your response comes back with a root node and you'd like to ignore it, you can define the mapping as:
4
4
 
5
+ ```ruby
6
+ Flexirest::Base.ignore_root = "data"
7
+ ```
8
+
9
+ Any `ignore_root` setting in specific class overrides this declared default.
10
+
5
11
  ```ruby
6
12
  class Feed < Flexirest::Base
7
- post :list, "/feed", ignore_root: "feed"
13
+ ignore_root: "feed"
14
+
15
+ post :list, "/feed"
16
+ end
17
+ ```
18
+
19
+ And any `ignore_root` setting in specific request overrides the both default and class specific setting.
20
+
21
+
22
+ ```ruby
23
+ class Feed < Flexirest::Base
24
+ ignore_root: 'feed'
25
+
26
+ post :list, "/feed", ignore_root: "result"
8
27
  end
9
28
  ```
10
29
 
11
- This also works if you'd want to remove a tree of root nodes:
30
+ You can also assign an array to `ignore_root` if you'd want to remove a tree of root nodes.
12
31
 
13
32
  ```ruby
14
33
  class Feed < Flexirest::Base
@@ -26,16 +45,32 @@ Alternatively if you want to wrap your JSON request body in a root element, e.g.
26
45
  }
27
46
  ```
28
47
 
29
- You can do it like this:
48
+ You can do it using `wrap_root`:
49
+
50
+ ```ruby
51
+ Flexirest::Base.wrap_root = "data"
52
+ ```
53
+
54
+ Any `wrap_root` setting in specific class overrides this declared default.
30
55
 
31
56
  ```ruby
32
57
  class Feed < Flexirest::Base
33
- post :list, "/feed", wrap_root: "feed"
34
- end
58
+ wrap_root: "feed"
35
59
 
36
- Feed.list(id: 1)
60
+ post :list, "/feed"
61
+ end
37
62
  ```
38
63
 
64
+ And any `wrap_root` setting in specific request overrides the both default and class specific setting.
65
+
66
+
67
+ ```ruby
68
+ class Feed < Flexirest::Base
69
+ wrap_root: 'feed'
70
+
71
+ post :list, "/feed", wrap_root: "data"
72
+ end
73
+ ```
39
74
 
40
75
  -----
41
76
 
@@ -39,7 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency "api-auth", ">= 1.3.1", "< 2.4"
40
40
  spec.add_development_dependency 'typhoeus'
41
41
  spec.add_development_dependency 'activemodel'
42
- spec.add_development_dependency 'rest-client', ">= 1.8.0"
42
+ spec.add_development_dependency 'rest-client'
43
43
 
44
44
  spec.add_runtime_dependency "mime-types"
45
45
  spec.add_runtime_dependency "multi_json"
@@ -13,6 +13,32 @@ module Flexirest
13
13
  @api_auth_access_id = nil
14
14
  @api_auth_secret_key = nil
15
15
  @api_auth_options = {}
16
+ @ignore_root = nil
17
+ @wrap_root = nil
18
+
19
+ def ignore_root(value=nil)
20
+ if value.nil?
21
+ value = if @ignore_root.nil? && superclass.respond_to?(:ignore_root)
22
+ superclass.ignore_root
23
+ else
24
+ @ignore_root
25
+ end
26
+ else
27
+ @ignore_root = value
28
+ end
29
+ end
30
+
31
+ def wrap_root(value=nil)
32
+ if value.nil?
33
+ value = if @wrap_root.nil? && superclass.respond_to?(:wrap_root)
34
+ superclass.wrap_root
35
+ else
36
+ @wrap_root
37
+ end
38
+ else
39
+ @wrap_root = value
40
+ end
41
+ end
16
42
 
17
43
  def base_url(value = nil)
18
44
  @base_url ||= nil
@@ -136,6 +136,30 @@ module Flexirest
136
136
  end
137
137
  end
138
138
 
139
+ def ignore_root
140
+ if @method[:options][:ignore_root]
141
+ @method[:options][:ignore_root]
142
+ elsif @object.nil?
143
+ nil
144
+ elsif object_is_class?
145
+ @object.ignore_root
146
+ else
147
+ @object.class.ignore_root
148
+ end
149
+ end
150
+
151
+ def wrap_root
152
+ if @method[:options][:wrap_root]
153
+ @method[:options][:wrap_root]
154
+ elsif @object.nil?
155
+ nil
156
+ elsif object_is_class?
157
+ @object.wrap_root
158
+ else
159
+ @object.class.wrap_root
160
+ end
161
+ end
162
+
139
163
  def verbose?
140
164
  if object_is_class?
141
165
  @object.verbose
@@ -438,8 +462,8 @@ module Flexirest
438
462
  @post_params
439
463
  else
440
464
  p = (params || @post_params || {})
441
- if @method[:options][:wrap_root].present?
442
- p = {@method[:options][:wrap_root] => p}
465
+ if wrap_root.present?
466
+ p = {wrap_root => p}
443
467
  end
444
468
  p.to_query
445
469
  end
@@ -452,8 +476,8 @@ module Flexirest
452
476
  @post_params
453
477
  else
454
478
  p = (params || @post_params || {})
455
- if @method[:options][:wrap_root].present?
456
- p = {@method[:options][:wrap_root] => p}
479
+ if wrap_root.present?
480
+ p = {wrap_root => p}
457
481
  end
458
482
  data, mp_headers = Flexirest::Multipart::Post.prepare_query(p)
459
483
  mp_headers.each do |k,v|
@@ -467,8 +491,8 @@ module Flexirest
467
491
  elsif @post_params.is_a?(String)
468
492
  @post_params
469
493
  else
470
- if @method[:options][:wrap_root].present?
471
- {@method[:options][:wrap_root] => (params || @post_params || {})}.to_json
494
+ if wrap_root.present?
495
+ {wrap_root => (params || @post_params || {})}.to_json
472
496
  else
473
497
  (params || @post_params || {}).to_json
474
498
  end
@@ -601,7 +625,7 @@ module Flexirest
601
625
  else
602
626
  Flexirest::Logger.debug " \033[1;4;32m#{Flexirest.name}\033[0m #{@instrumentation_name} - Response received #{@response.body.size} bytes"
603
627
  end
604
- result = generate_new_object(ignore_root: @method[:options][:ignore_root], ignore_xml_root: @method[:options][:ignore_xml_root])
628
+ result = generate_new_object(ignore_root: ignore_root, ignore_xml_root: @method[:options][:ignore_xml_root])
605
629
  # TODO: Cleanup when ignore_xml_root is removed
606
630
  else
607
631
  raise ResponseParseException.new(status:status, body:@response.body, headers: @response.headers)
@@ -814,15 +838,15 @@ module Flexirest
814
838
  body = JsonAPIProxy::Response.parse(body, @object)
815
839
  end
816
840
 
817
- if options[:ignore_root]
818
- [options[:ignore_root]].flatten.each do |key|
841
+ if ignore_root
842
+ [ignore_root].flatten.each do |key|
819
843
  body = body[key.to_s]
820
844
  end
821
845
  end
822
846
  elsif is_xml_response?
823
847
  body = @response.body.blank? ? {} : Crack::XML.parse(@response.body)
824
- if options[:ignore_root]
825
- [options[:ignore_root]].flatten.each do |key|
848
+ if ignore_root
849
+ [ignore_root].flatten.each do |key|
826
850
  body = body[key.to_s]
827
851
  end
828
852
  elsif options[:ignore_xml_root]
@@ -1,3 +1,3 @@
1
1
  module Flexirest
2
- VERSION = "1.10.2"
2
+ VERSION = "1.10.3"
3
3
  end
@@ -199,6 +199,89 @@ describe Flexirest::Request do
199
199
  }
200
200
  end
201
201
 
202
+ class LocalIgnoredRootExampleClient < ExampleClient
203
+ ignore_root "feed"
204
+
205
+ get :root, "/root", fake: %Q{
206
+ {
207
+ "feed": {
208
+ "title": "Example Feed"
209
+ }
210
+ }
211
+ }
212
+ end
213
+
214
+ class LocalIgnoredMultiLevelRootExampleClient < ExampleClient
215
+ ignore_root [:response, "data", "object"]
216
+
217
+ get :multi_level_root, "/multi-level-root", fake: %Q{
218
+ {
219
+ "response": {
220
+ "data": {
221
+ "object": {
222
+ "title": "Example Multi Level Feed"
223
+ }
224
+ }
225
+ }
226
+ }
227
+ }
228
+ end
229
+
230
+ class BaseIgnoredRootExampleClient < Flexirest::Base
231
+ base_url "http://www.example.com"
232
+ ignore_root "feed"
233
+ end
234
+
235
+ class GlobalIgnoredRootExampleClient < BaseIgnoredRootExampleClient
236
+ get :root, "/root", fake: %Q{
237
+ {
238
+ "feed": {
239
+ "title": "Example Feed"
240
+ }
241
+ }
242
+ }
243
+ end
244
+
245
+ class OverrideGlobalIgnoredRootForFileExampleClient < BaseIgnoredRootExampleClient
246
+ ignore_root "data"
247
+
248
+ get :root, "/root", fake: %Q{
249
+ {
250
+ "data": {
251
+ "title": "Example Feed"
252
+ }
253
+ }
254
+ }
255
+ end
256
+
257
+ class OverrideGlobalIgnoredRootForRequestExampleClient < BaseIgnoredRootExampleClient
258
+ get :root, "/root", ignore_root: "data", fake: %Q{
259
+ {
260
+ "data": {
261
+ "title": "Example Feed"
262
+ }
263
+ }
264
+ }
265
+ end
266
+
267
+ class BaseWrappedRootExampleClient < Flexirest::Base
268
+ base_url "http://www.example.com"
269
+ wrap_root "base_data"
270
+ end
271
+
272
+ class GlobalWrappedRootExampleClient < BaseWrappedRootExampleClient
273
+ put :wrapped, "/put/:id"
274
+ end
275
+
276
+ class OverrideGlobalWrappedRootForFileExampleClient < BaseWrappedRootExampleClient
277
+ wrap_root "class_specific_data"
278
+ put :wrapped, "/put/:id"
279
+ end
280
+
281
+ class OverrideGlobalWrappedRootForRequestExampleClient < BaseWrappedRootExampleClient
282
+ put :wrapped, "/put/:id", wrap_root: "request_specific_data"
283
+ end
284
+
202
285
  class WhitelistedDateClient < Flexirest::Base
203
286
  base_url "http://www.example.com"
204
287
  put :conversion, "/put/:id"
@@ -1355,6 +1438,62 @@ describe Flexirest::Request do
1355
1438
  expect(IgnoredMultiLevelRootExampleClient.multi_level_root.title).to eq("Example Multi Level Feed")
1356
1439
  end
1357
1440
 
1441
+ it "should ignore a specified root element" do
1442
+ expect(LocalIgnoredRootExampleClient.root.title).to eq("Example Feed")
1443
+ end
1444
+
1445
+ it "should ignore a specified multi-level root element" do
1446
+ expect(LocalIgnoredMultiLevelRootExampleClient.multi_level_root.title).to eq("Example Multi Level Feed")
1447
+ end
1448
+
1449
+ it "should ignore a specified root element" do
1450
+ expect(GlobalIgnoredRootExampleClient.root.title).to eq("Example Feed")
1451
+ end
1452
+
1453
+ it "should ignore a specified root element" do
1454
+ expect(OverrideGlobalIgnoredRootForFileExampleClient.root.title).to eq("Example Feed")
1455
+ end
1456
+
1457
+ it "should ignore a specified root element" do
1458
+ expect(OverrideGlobalIgnoredRootForRequestExampleClient.root.title).to eq("Example Feed")
1459
+ end
1460
+
1461
+ it "should wrap elements if specified, in form-encoded format" do
1462
+ expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", %q(base_data%5Bdebug%5D=true&base_data%5Btest%5D=foo), an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
1463
+ GlobalWrappedRootExampleClient.request_body_type :form_encoded
1464
+ GlobalWrappedRootExampleClient.wrapped id:1234, debug:true, test:'foo'
1465
+ end
1466
+
1467
+ it "should wrap elements if specified, in form-encoded format" do
1468
+ expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", %q(class_specific_data%5Bdebug%5D=true&class_specific_data%5Btest%5D=foo), an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
1469
+ OverrideGlobalWrappedRootForFileExampleClient.request_body_type :form_encoded
1470
+ OverrideGlobalWrappedRootForFileExampleClient.wrapped id:1234, debug:true, test:'foo'
1471
+ end
1472
+
1473
+ it "should wrap elements if specified, in form-encoded format" do
1474
+ expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", %q(request_specific_data%5Bdebug%5D=true&request_specific_data%5Btest%5D=foo), an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
1475
+ OverrideGlobalWrappedRootForRequestExampleClient.request_body_type :form_encoded
1476
+ OverrideGlobalWrappedRootForRequestExampleClient.wrapped id:1234, debug:true, test:'foo'
1477
+ end
1478
+
1479
+ it "should encode the body wrapped in a root element in a JSON format if specified" do
1480
+ expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", %q({"base_data":{"debug":true,"test":"foo"}}), an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
1481
+ GlobalWrappedRootExampleClient.request_body_type :json
1482
+ GlobalWrappedRootExampleClient.wrapped id:1234, debug:true, test:'foo'
1483
+ end
1484
+
1485
+ it "should encode the body wrapped in a root element in a JSON format if specified" do
1486
+ expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", %q({"class_specific_data":{"debug":true,"test":"foo"}}), an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
1487
+ OverrideGlobalWrappedRootForFileExampleClient.request_body_type :json
1488
+ OverrideGlobalWrappedRootForFileExampleClient.wrapped id:1234, debug:true, test:'foo'
1489
+ end
1490
+
1491
+ it "should encode the body wrapped in a root element in a JSON format if specified" do
1492
+ expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", %q({"request_specific_data":{"debug":true,"test":"foo"}}), an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
1493
+ OverrideGlobalWrappedRootForRequestExampleClient.request_body_type :json
1494
+ OverrideGlobalWrappedRootForRequestExampleClient.wrapped id:1234, debug:true, test:'foo'
1495
+ end
1496
+
1358
1497
  context "Parameter preparation" do
1359
1498
  method = {url: "http://www.example.com", method: :get}
1360
1499
  object = nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flexirest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.2
4
+ version: 1.10.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Jeffries
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-26 00:00:00.000000000 Z
11
+ date: 2021-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -176,14 +176,14 @@ dependencies:
176
176
  requirements:
177
177
  - - ">="
178
178
  - !ruby/object:Gem::Version
179
- version: 1.8.0
179
+ version: '0'
180
180
  type: :development
181
181
  prerelease: false
182
182
  version_requirements: !ruby/object:Gem::Requirement
183
183
  requirements:
184
184
  - - ">="
185
185
  - !ruby/object:Gem::Version
186
- version: 1.8.0
186
+ version: '0'
187
187
  - !ruby/object:Gem::Dependency
188
188
  name: mime-types
189
189
  requirement: !ruby/object:Gem::Requirement