flexirest 1.7.9 → 1.8.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 +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
|