flexirest 1.7.9 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/docs/body-types.md +10 -0
- data/lib/flexirest/active_model_form_support.rb +23 -0
- data/lib/flexirest/request.rb +4 -0
- data/lib/flexirest/version.rb +1 -1
- data/spec/lib/request_spec.rb +34 -18
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0646b0d77ed69a83a024542226cd74833092523296edd7c6b48e6524a376c67c
|
4
|
+
data.tar.gz: d645d44a87ff5fabf8a7b9d6306f48bd6b899a7f6c966ded3d37a7456e091edd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96a26d232291398f3bc7b13927ecd80175cdf3eea0293fd3d52c317ab55257e8269362ab4b5db0ac87d0f63621777518b6ad3758385bdda84a1782546e892dc3
|
7
|
+
data.tar.gz: c3ee959ee87e8f325d8ff16f1e1a4e2d2746dc6765e159193194fd85aa414ac3c8b5b8491a32d261bca0c982d9feb6c2caafcfa0398b591b9eae5cb2e68c2ef8
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.8.0
|
4
|
+
|
5
|
+
Features:
|
6
|
+
|
7
|
+
- For the weird situations where the remote API expects some weird formatted input, you can now specify a `request_body_type` of plain and pass in to the call `body` (and optionally `content_type`) to pass it untouched to the API. The [docs](docs/body-types.md) have been updated.
|
8
|
+
|
3
9
|
## 1.7.9
|
4
10
|
|
5
11
|
Features:
|
data/docs/body-types.md
CHANGED
@@ -27,6 +27,16 @@ class Person < Flexirest::Base
|
|
27
27
|
end
|
28
28
|
```
|
29
29
|
|
30
|
+
If your API expects some weird formatting on the requests, but you still want to use Flexirest for caching, response parsing, other models, etc you can pass `:plain` as the request body type either at the class level or method mapping level, and this will be passed through to the API. By default `plain` requests are sent with the `Content-Type: text/plain` header, but you can override this with `:content_type` when calling the mapped method.
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
class Person < Flexirest::Base
|
34
|
+
put :save, '/person/:id/logs', request_body_type: :plain
|
35
|
+
end
|
36
|
+
|
37
|
+
Person.save(id: 1, body: '["Something here"]',
|
38
|
+
content_type: "application/json")
|
39
|
+
```
|
30
40
|
|
31
41
|
-----
|
32
42
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Flexirest::ActiveModelFormSupport
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
include ActiveModel::AttributeAssignment
|
4
|
+
include ActiveModel::Validations
|
5
|
+
include ActiveModel::Conversion
|
6
|
+
|
7
|
+
included do
|
8
|
+
extend ActiveModel::Naming
|
9
|
+
extend ActiveModel::Translation
|
10
|
+
end
|
11
|
+
|
12
|
+
def persisted?
|
13
|
+
!dirty?
|
14
|
+
end
|
15
|
+
|
16
|
+
def new_record?
|
17
|
+
id.blank?
|
18
|
+
end
|
19
|
+
|
20
|
+
def errors
|
21
|
+
ActiveSupport::HashWithIndifferentAccess.new([]).merge(self[:errors] || {})
|
22
|
+
end
|
23
|
+
end
|
data/lib/flexirest/request.rb
CHANGED
@@ -430,6 +430,10 @@ module Flexirest
|
|
430
430
|
end
|
431
431
|
end
|
432
432
|
headers["Content-Type"] ||= "application/json; charset=utf-8"
|
433
|
+
elsif request_body_type == :plain && @post_params[:body].present?
|
434
|
+
@body = @post_params[:body]
|
435
|
+
headers["Content-Type"] ||= "text/plain"
|
436
|
+
headers["Content-Type"] = @post_params[:content_type] if @post_params[:content_type].present?
|
433
437
|
end
|
434
438
|
end
|
435
439
|
|
data/lib/flexirest/version.rb
CHANGED
data/spec/lib/request_spec.rb
CHANGED
@@ -27,11 +27,11 @@ describe Flexirest::Request do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
get :all, "/", :
|
31
|
-
get :flat, "/", :
|
30
|
+
get :all, "/", has_many: {expenses: ExampleOtherClient}
|
31
|
+
get :flat, "/", params_encoder: :flat
|
32
32
|
get :array, "/johnny", array: [:likes, :dislikes]
|
33
|
-
get :babies, "/babies", :
|
34
|
-
get :single_association, "/single", :
|
33
|
+
get :babies, "/babies", has_many: {children: ExampleOtherClient}
|
34
|
+
get :single_association, "/single", has_one: {single: ExampleSingleClient}, has_many: {children: ExampleOtherClient}
|
35
35
|
get :headers, "/headers"
|
36
36
|
get :cancel_callback, "/cancel-callback"
|
37
37
|
put :headers_default, "/headers_default"
|
@@ -54,12 +54,12 @@ describe Flexirest::Request do
|
|
54
54
|
get :requires, "/requires", requires:[:name, :age]
|
55
55
|
patch :only_changed_1, "/changed1", only_changed: true
|
56
56
|
patch :only_changed_2, "/changed2", only_changed: [:debug1, :debug2]
|
57
|
-
patch :only_changed_3, "/changed3", only_changed: { :
|
57
|
+
patch :only_changed_3, "/changed3", only_changed: { debug1: false, debug2: true }
|
58
58
|
end
|
59
59
|
|
60
60
|
class ExampleLoadBalancedClient < Flexirest::Base
|
61
61
|
base_url ["http://api1.example.com", "http://api2.example.com"]
|
62
|
-
get :all, "/", :
|
62
|
+
get :all, "/", has_many: {expenses: ExampleOtherClient}
|
63
63
|
end
|
64
64
|
|
65
65
|
class AuthenticatedExampleClient < Flexirest::Base
|
@@ -135,7 +135,7 @@ describe Flexirest::Request do
|
|
135
135
|
base_url "http://www.example.com"
|
136
136
|
lazy_load!
|
137
137
|
get :fake, "/fake", fake:"{\"result\":true, \"list\":[1,2,3,{\"test\":true}], \"child\":{\"grandchild\":{\"test\":true}}}"
|
138
|
-
get :lazy_test, "/does-not-matter", fake:"{\"people\":[\"http://www.example.com/some/url\"]}", :
|
138
|
+
get :lazy_test, "/does-not-matter", fake:"{\"people\":[\"http://www.example.com/some/url\"]}", lazy: [:people]
|
139
139
|
end
|
140
140
|
|
141
141
|
class VerboseExampleClient < ExampleClient
|
@@ -169,9 +169,9 @@ describe Flexirest::Request do
|
|
169
169
|
{
|
170
170
|
"response": {
|
171
171
|
"data": {
|
172
|
-
"object": {
|
172
|
+
"object": {
|
173
173
|
"title": "Example Multi Level Feed"
|
174
|
-
}
|
174
|
+
}
|
175
175
|
}
|
176
176
|
}
|
177
177
|
}
|
@@ -340,12 +340,12 @@ describe Flexirest::Request do
|
|
340
340
|
|
341
341
|
it "should pass through 'array type' get parameters" do
|
342
342
|
expect_any_instance_of(Flexirest::Connection).to receive(:get).with("/?include%5B%5D=your&include%5B%5D=friends", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
|
343
|
-
ExampleClient.all :
|
343
|
+
ExampleClient.all include: [:your,:friends]
|
344
344
|
end
|
345
345
|
|
346
346
|
it "should pass through 'array type' get parameters using the same parameter name if a flat param_encoder is chosen" do
|
347
347
|
expect_any_instance_of(Flexirest::Connection).to receive(:get).with("/?include=your&include=friends", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
|
348
|
-
ExampleClient.flat :
|
348
|
+
ExampleClient.flat include: [:your,:friends]
|
349
349
|
end
|
350
350
|
|
351
351
|
it "should encode the body in a form-encoded format by default" do
|
@@ -359,12 +359,28 @@ describe Flexirest::Request do
|
|
359
359
|
ExampleClient.update id:1234, debug:true, test:'foo'
|
360
360
|
end
|
361
361
|
|
362
|
-
it "should encode the body in a JSON format if specified" do
|
362
|
+
it "should encode the body wrapped in a root element in a JSON format if specified" do
|
363
363
|
expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", %q({"example":{"debug":true,"test":"foo"}}), an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
|
364
364
|
ExampleClient.request_body_type :json
|
365
365
|
ExampleClient.wrapped id:1234, debug:true, test:'foo'
|
366
366
|
end
|
367
367
|
|
368
|
+
it "should pass the body untouched if plain format is specified on the class" do
|
369
|
+
header_expectation = {headers: {"Accept"=>"application/hal+json, application/json;q=0.5", "Content-Type"=>"text/plain"}, api_auth: {api_auth_access_id: "id123", api_auth_secret_key: "secret123", api_auth_options: {}}}
|
370
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", "debug:true|test:'foo'", header_expectation).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
|
371
|
+
ExampleClient.request_body_type :plain
|
372
|
+
ExampleClient.update id:1234, body: "debug:true|test:'foo'"
|
373
|
+
end
|
374
|
+
|
375
|
+
it "should use the content type specified if plain format is specified on the class" do
|
376
|
+
header_expectation = {headers: {"Accept"=>"application/hal+json, application/json;q=0.5", "Content-Type"=>"application/flexirest"}, api_auth: {api_auth_access_id: "id123", api_auth_secret_key: "secret123", api_auth_options: {}}}
|
377
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:put).
|
378
|
+
with("/put/1234", "debug:true|test:'foo'", header_expectation).
|
379
|
+
and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
|
380
|
+
ExampleClient.request_body_type :plain
|
381
|
+
ExampleClient.update id:1234, body: "debug:true|test:'foo'", content_type: "application/flexirest"
|
382
|
+
end
|
383
|
+
|
368
384
|
it "should wrap elements if specified, in form-encoded format" do
|
369
385
|
expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", %q(example%5Bdebug%5D=true&example%5Btest%5D=foo), an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"result\":true}", response_headers:{})))
|
370
386
|
ExampleClient.wrapped id:1234, debug:true, test:'foo'
|
@@ -897,7 +913,7 @@ describe Flexirest::Request do
|
|
897
913
|
end
|
898
914
|
|
899
915
|
it "should raise an exception if you try to pass in an unsupport method" do
|
900
|
-
method = {:
|
916
|
+
method = {method: :wiggle, url:"/"}
|
901
917
|
class RequestFakeObject < Flexirest::Base
|
902
918
|
base_url "http://www.example.com/"
|
903
919
|
|
@@ -944,7 +960,7 @@ describe Flexirest::Request do
|
|
944
960
|
|
945
961
|
it "should retry if an after_request callback returns :retry" do
|
946
962
|
stub_request(:get, "http://www.example.com/do_me_twice").
|
947
|
-
to_return(:
|
963
|
+
to_return(status: 200, body: "", headers: {})
|
948
964
|
RetryingExampleClient.reset_retries
|
949
965
|
RetryingExampleClient.do_me_twice
|
950
966
|
expect(RetryingExampleClient.retries).to eq(2)
|
@@ -952,9 +968,9 @@ describe Flexirest::Request do
|
|
952
968
|
|
953
969
|
it "should allow a second call and then retry if an after_request callback returns :retry" do
|
954
970
|
stub_request(:get, "http://www.example.com/first_call").
|
955
|
-
to_return(:
|
971
|
+
to_return(status: 200, body: "", headers: {})
|
956
972
|
stub_request(:get, "http://www.example.com/second_call").
|
957
|
-
to_return(:
|
973
|
+
to_return(status: 200, body: "", headers: {})
|
958
974
|
RetryingExampleClient.reset_retries
|
959
975
|
RetryingExampleClient.first_call
|
960
976
|
expect(RetryingExampleClient.retries).to eq(2)
|
@@ -1023,7 +1039,7 @@ describe Flexirest::Request do
|
|
1023
1039
|
end
|
1024
1040
|
|
1025
1041
|
it "should recognise a HAL response" do
|
1026
|
-
method = {:
|
1042
|
+
method = {method: :get, url:"/"}
|
1027
1043
|
class RequestFakeObject
|
1028
1044
|
def base_url
|
1029
1045
|
"http://www.example.com/"
|
@@ -1137,7 +1153,7 @@ describe Flexirest::Request do
|
|
1137
1153
|
it "should ignore a specified root element" do
|
1138
1154
|
expect(IgnoredRootExampleClient.root.title).to eq("Example Feed")
|
1139
1155
|
end
|
1140
|
-
|
1156
|
+
|
1141
1157
|
it "should ignore a specified multi-level root element" do
|
1142
1158
|
expect(IgnoredMultiLevelRootExampleClient.multi_level_root.title).to eq("Example Multi Level Feed")
|
1143
1159
|
end
|
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.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Jeffries
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -275,6 +275,7 @@ files:
|
|
275
275
|
- docs/xml-responses.md
|
276
276
|
- flexirest.gemspec
|
277
277
|
- lib/flexirest.rb
|
278
|
+
- lib/flexirest/active_model_form_support.rb
|
278
279
|
- lib/flexirest/associations.rb
|
279
280
|
- lib/flexirest/attribute_parsing.rb
|
280
281
|
- lib/flexirest/base.rb
|