flexirest 1.9.14 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +30 -0
- data/docs/faking-calls.md +11 -0
- data/flexirest.gemspec +2 -9
- data/lib/flexirest/base_without_validation.rb +2 -1
- data/lib/flexirest/caching.rb +4 -1
- data/lib/flexirest/request.rb +25 -2
- data/lib/flexirest/result_iterator.rb +6 -2
- data/lib/flexirest/version.rb +1 -1
- data/spec/lib/base_without_validation_spec.rb +14 -0
- data/spec/lib/caching_spec.rb +12 -0
- data/spec/lib/request_spec.rb +13 -3
- data/spec/spec_helper.rb +2 -2
- metadata +23 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f713d7d9f8f37de42e54bd20623b4477b9893b6cd40f0d2d5e8c5a06079a821
|
4
|
+
data.tar.gz: b5fc1fe7bffbe57a6adf9443aab86d91313fddd90b2fcc2ef35f50f2b41ec942
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eedfb75a0ecacbb1114d62fad201cf5e478242dd74126b87b29f1081e9c56b4194b600c6d729ac8afa70a7dd4ee8d66a03057974a2e52ee76f575e848027bfca
|
7
|
+
data.tar.gz: 955f229836e2e6fbc6273b1505294619ab0a614af05e79d0e5113b956959dbf22bb76ed23b2a169a9dafe207b6ab48b3559f7adeb84f22e3fcff01fbc223b28f
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,35 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.10.0
|
4
|
+
|
5
|
+
Enhancement:
|
6
|
+
|
7
|
+
- Add specific exceptions for the most common 5xx server-side errors
|
8
|
+
|
9
|
+
## 1.9.18
|
10
|
+
|
11
|
+
Security:
|
12
|
+
|
13
|
+
- Upgrade rest-client development dependency to a CVE-fixed version.
|
14
|
+
|
15
|
+
## 1.9.17
|
16
|
+
|
17
|
+
Feature:
|
18
|
+
|
19
|
+
- Methods can be specified as a symbol for generating fake data (thanks to Niall Duggan for the feature request).
|
20
|
+
|
21
|
+
## 1.9.16
|
22
|
+
|
23
|
+
Bugfix:
|
24
|
+
|
25
|
+
- Cached responses were always returning as `dirty?`/`changed?` (thanks to AKRathore for the bug report).
|
26
|
+
|
27
|
+
## 1.9.15
|
28
|
+
|
29
|
+
Bugfix:
|
30
|
+
|
31
|
+
- Fix not marking unchanged attributes as dirty (thanks to Khairi Adnan for the bug report).
|
32
|
+
|
3
33
|
## 1.9.14
|
4
34
|
|
5
35
|
Bugfix:
|
data/docs/faking-calls.md
CHANGED
@@ -16,6 +16,17 @@ class Person < Flexirest::Base
|
|
16
16
|
end
|
17
17
|
```
|
18
18
|
|
19
|
+
Alternatively, you can specify a symbol as the `fake` parameter, and Flexirest will call that method to get a string JSON as if it was the request body:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
class Person < Flexirest::Base
|
23
|
+
get :all, '/people', fake: :get_data
|
24
|
+
|
25
|
+
def get_data
|
26
|
+
{result: true}.to_json
|
27
|
+
end
|
28
|
+
end
|
29
|
+
```
|
19
30
|
|
20
31
|
-----
|
21
32
|
|
data/flexirest.gemspec
CHANGED
@@ -36,9 +36,10 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_development_dependency "simplecov"
|
37
37
|
spec.add_development_dependency "simplecov-rcov"
|
38
38
|
spec.add_development_dependency 'coveralls'
|
39
|
-
spec.add_development_dependency "api-auth", ">= 1.3.1"
|
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
43
|
|
43
44
|
spec.add_runtime_dependency "mime-types"
|
44
45
|
spec.add_runtime_dependency "multi_json"
|
@@ -52,12 +53,4 @@ Gem::Specification.new do |spec|
|
|
52
53
|
else
|
53
54
|
spec.add_runtime_dependency "activesupport", "< 5.0.0"
|
54
55
|
end
|
55
|
-
# JSON is an implicit dependency of something, but JSON v2+ requires Ruby 2+
|
56
|
-
# Same with "tins" which is a dependency of coveralls
|
57
|
-
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.0.0')
|
58
|
-
spec.add_runtime_dependency "json", "< 2.0.0"
|
59
|
-
spec.add_runtime_dependency "tins", "~> 1.6.0"
|
60
|
-
spec.add_runtime_dependency "term-ansicolor", "~> 1.3.2"
|
61
|
-
spec.add_runtime_dependency "public_suffix", "~> 1.4.6"
|
62
|
-
end
|
63
56
|
end
|
@@ -41,6 +41,7 @@ module Flexirest
|
|
41
41
|
def _copy_from(result)
|
42
42
|
@attributes = result._attributes
|
43
43
|
@_status = result._status
|
44
|
+
_clean!
|
44
45
|
end
|
45
46
|
|
46
47
|
def dirty?
|
@@ -189,7 +190,7 @@ module Flexirest
|
|
189
190
|
old_value = @dirty_attributes[key.to_sym]
|
190
191
|
old_value = @attributes[key.to_sym] unless old_value
|
191
192
|
old_value = old_value[0] if old_value and old_value.is_a? Array
|
192
|
-
@dirty_attributes[key.to_sym] = [old_value, value]
|
193
|
+
@dirty_attributes[key.to_sym] = [old_value, value] if old_value != value
|
193
194
|
@attributes[key.to_sym] = value
|
194
195
|
end
|
195
196
|
|
data/lib/flexirest/caching.rb
CHANGED
@@ -110,9 +110,12 @@ module Flexirest
|
|
110
110
|
if @result.is_a?(Array)
|
111
111
|
ri = ResultIterator.new(self)
|
112
112
|
ri.items = @result.map{|i| @class_name.constantize.new(i)}
|
113
|
+
ri._clean!
|
113
114
|
ri
|
114
115
|
else
|
115
|
-
@class_name.constantize.new(@result)
|
116
|
+
obj = @class_name.constantize.new(@result)
|
117
|
+
obj._clean!
|
118
|
+
obj
|
116
119
|
end
|
117
120
|
end
|
118
121
|
end
|
data/lib/flexirest/request.rb
CHANGED
@@ -191,9 +191,18 @@ module Flexirest
|
|
191
191
|
@body = nil
|
192
192
|
prepare_params
|
193
193
|
prepare_url
|
194
|
-
|
194
|
+
fake = @method[:options][:fake]
|
195
|
+
if fake.present?
|
195
196
|
if fake.respond_to?(:call)
|
196
197
|
fake = fake.call(self)
|
198
|
+
elsif @object.respond_to?(fake)
|
199
|
+
fake = @object.send(fake)
|
200
|
+
elsif @object.class.respond_to?(fake)
|
201
|
+
fake = @object.class.send(fake)
|
202
|
+
elsif @object.new.respond_to?(fake)
|
203
|
+
fake = @object.new.send(fake)
|
204
|
+
elsif @object.class.new.respond_to?(fake)
|
205
|
+
fake = @object.class.new.send(fake)
|
197
206
|
end
|
198
207
|
Flexirest::Logger.debug " \033[1;4;32m#{Flexirest.name}\033[0m #{@instrumentation_name} - Faked response found"
|
199
208
|
content_type = @method[:options][:fake_content_type] || "application/json"
|
@@ -621,6 +630,16 @@ module Flexirest
|
|
621
630
|
raise HTTPConflictClientException.new(status:status, result:error_response, raw_response: @response.body, url:@url, method: http_method)
|
622
631
|
elsif status == 429
|
623
632
|
raise HTTPTooManyRequestsClientException.new(status:status, result:error_response, raw_response: @response.body, url:@url, method: http_method)
|
633
|
+
elsif status == 500
|
634
|
+
raise HTTPInternalServerException.new(status:status, result:error_response, raw_response: @response.body, url:@url, method: http_method)
|
635
|
+
elsif status == 501
|
636
|
+
raise HTTPNotImplementedServerException.new(status:status, result:error_response, raw_response: @response.body, url:@url, method: http_method)
|
637
|
+
elsif status == 502
|
638
|
+
raise HTTPBadGatewayServerException.new(status:status, result:error_response, raw_response: @response.body, url:@url, method: http_method)
|
639
|
+
elsif status == 503
|
640
|
+
raise HTTPServiceUnavailableServerException.new(status:status, result:error_response, raw_response: @response.body, url:@url, method: http_method)
|
641
|
+
elsif status == 504
|
642
|
+
raise HTTPGatewayTimeoutServerException.new(status:status, result:error_response, raw_response: @response.body, url:@url, method: http_method)
|
624
643
|
elsif (400..499).include? status
|
625
644
|
raise HTTPClientException.new(status:status, result:error_response, raw_response: @response.body, url:@url, method: http_method)
|
626
645
|
elsif (500..599).include? status
|
@@ -892,5 +911,9 @@ module Flexirest
|
|
892
911
|
class HTTPNotFoundClientException < HTTPClientException ; end
|
893
912
|
class HTTPTooManyRequestsClientException < HTTPClientException ; end
|
894
913
|
class HTTPServerException < HTTPException ; end
|
895
|
-
|
914
|
+
class HTTPInternalServerException < HTTPServerException ; end
|
915
|
+
class HTTPNotImplementedServerException < HTTPServerException ; end
|
916
|
+
class HTTPBadGatewayServerException < HTTPServerException ; end
|
917
|
+
class HTTPServiceUnavailableServerException < HTTPServerException ; end
|
918
|
+
class HTTPGatewayTimeoutServerException < HTTPServerException ; end
|
896
919
|
end
|
@@ -15,6 +15,10 @@ module Flexirest
|
|
15
15
|
@items << item
|
16
16
|
end
|
17
17
|
|
18
|
+
def _clean!
|
19
|
+
@items.map(&:_clean!)
|
20
|
+
end
|
21
|
+
|
18
22
|
def size
|
19
23
|
@items.size
|
20
24
|
end
|
@@ -62,8 +66,8 @@ module Flexirest
|
|
62
66
|
self
|
63
67
|
end
|
64
68
|
|
65
|
-
def delete_if
|
66
|
-
@items = @items.delete_if &
|
69
|
+
def delete_if(&block)
|
70
|
+
@items = @items.delete_if &block
|
67
71
|
self
|
68
72
|
end
|
69
73
|
|
data/lib/flexirest/version.rb
CHANGED
@@ -126,6 +126,13 @@ describe Flexirest::BaseWithoutValidation do
|
|
126
126
|
expect(client).to be_dirty
|
127
127
|
end
|
128
128
|
|
129
|
+
it "should not mark attributes that don't change as dirty" do
|
130
|
+
client = EmptyExample.new(test: "Foo")
|
131
|
+
client._clean!
|
132
|
+
client.test = client.test
|
133
|
+
expect(client).to_not be_dirty
|
134
|
+
end
|
135
|
+
|
129
136
|
it "should store attribute set using []= array notation and mark them as dirty" do
|
130
137
|
client = EmptyExample.new()
|
131
138
|
client["test"] = "Something"
|
@@ -171,6 +178,13 @@ describe Flexirest::BaseWithoutValidation do
|
|
171
178
|
expect(client).to be_dirty
|
172
179
|
end
|
173
180
|
|
181
|
+
it "should not mark a freshly retrieved object as changed" do
|
182
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:get).with('/find/1', anything).and_return(::FaradayResponseMock.new(OpenStruct.new(status:200, response_headers:{}, body:"{\"first_name\":\"Billy\"}")))
|
183
|
+
client = AlteringClientExample.find(id: 1)
|
184
|
+
expect(client).to_not be_changed
|
185
|
+
expect(client.changes).to eq({})
|
186
|
+
end
|
187
|
+
|
174
188
|
it 'should respond_to? attributes defined in the response' do
|
175
189
|
client = EmptyExample.new(hello: "World")
|
176
190
|
expect(client.respond_to?(:hello)).to be_truthy
|
data/spec/lib/caching_spec.rb
CHANGED
@@ -184,6 +184,18 @@ describe Flexirest::Caching do
|
|
184
184
|
expect(ret.first_name).to eq("Johnny")
|
185
185
|
end
|
186
186
|
|
187
|
+
it "cache read objects shouldn't be marked as changed" do
|
188
|
+
cached_response = Flexirest::CachedResponse.new(
|
189
|
+
status:200,
|
190
|
+
result:@cached_object,
|
191
|
+
expires:Time.now + 30)
|
192
|
+
expect_any_instance_of(CachingExampleCacheStore5).to receive(:read).once.with("Person:/").and_return(Marshal.dump(cached_response))
|
193
|
+
expect_any_instance_of(Flexirest::Connection).not_to receive(:get)
|
194
|
+
ret = Person.all
|
195
|
+
expect(ret).to_not be_changed
|
196
|
+
expect(ret.changes).to eq({})
|
197
|
+
end
|
198
|
+
|
187
199
|
it "should read from the cache store and restore to the same object" do
|
188
200
|
cached_response = Flexirest::CachedResponse.new(
|
189
201
|
status:200,
|
data/spec/lib/request_spec.rb
CHANGED
@@ -55,6 +55,7 @@ describe Flexirest::Request do
|
|
55
55
|
get :hal, "/hal", fake:"{\"_links\":{\"child\": {\"href\": \"/child/1\"}, \"other\": {\"href\": \"/other/1\"}, \"cars\":[{\"href\": \"/car/1\", \"name\":\"car1\"}, {\"href\": \"/car/2\", \"name\":\"car2\"}, {\"href\": \"/car/not-embed\", \"name\":\"car_not_embed\"} ], \"lazy\": {\"href\": \"/lazy/load\"}, \"invalid\": [{\"href\": \"/invalid/1\"}]}, \"_embedded\":{\"other\":{\"name\":\"Jane\"},\"child\":{\"name\":\"Billy\"}, \"cars\":[{\"_links\": {\"self\": {\"href\": \"/car/1\"} }, \"make\": \"Bugatti\", \"model\": \"Veyron\"}, {\"_links\": {\"self\": {\"href\": \"/car/2\"} }, \"make\": \"Ferrari\", \"model\": \"F458 Italia\"} ], \"invalid\": [{\"present\":true, \"_links\": {} } ] } }", has_many:{other:ExampleOtherClient}
|
56
56
|
get :fake_object, "/fake", fake:"{\"result\":true, \"list\":[1,2,3,{\"test\":true}], \"child\":{\"grandchild\":{\"test\":true}}}"
|
57
57
|
get :fake_proc_object, "/fake", fake:->(request) { "{\"result\":#{request.get_params[:id]}}" }
|
58
|
+
get :fake_method, "/fake", fake: :generate_fake_data
|
58
59
|
get :fake_array, "/fake", fake:"[1,2,3,{\"test\":true},null]"
|
59
60
|
get :fake_proc_array, "/fake", fake:->(request) { "[{\"result\":#{request.get_params[:id]}},null]" }
|
60
61
|
get :defaults, "/defaults", defaults:{overwrite:"no", persist:"yes"}
|
@@ -62,6 +63,10 @@ describe Flexirest::Request do
|
|
62
63
|
patch :only_changed_1, "/changed1", only_changed: true
|
63
64
|
patch :only_changed_2, "/changed2", only_changed: [:debug1, :debug2]
|
64
65
|
patch :only_changed_3, "/changed3", only_changed: { debug1: false, debug2: true }
|
66
|
+
|
67
|
+
def generate_fake_data
|
68
|
+
"{\"result\":true, \"list\":[1,2,3,{\"test\":true}], \"child\":{\"grandchild\":{\"test\":true}}}"
|
69
|
+
end
|
65
70
|
end
|
66
71
|
|
67
72
|
class ExampleLoadBalancedClient < Flexirest::Base
|
@@ -576,6 +581,11 @@ describe Flexirest::Request do
|
|
576
581
|
expect(object.result).to eq(1234)
|
577
582
|
end
|
578
583
|
|
584
|
+
it "should parse JSON object from a fake response generated by method defined as a symbol" do
|
585
|
+
object = ExampleClient.fake_method id:1234
|
586
|
+
expect(object.result).to eq(true)
|
587
|
+
end
|
588
|
+
|
579
589
|
it "should parse JSON array and return a nice result iterator for faked responses" do
|
580
590
|
object = ExampleClient.fake_array debug:true
|
581
591
|
expect(object).to be_instance_of(Flexirest::ResultIterator)
|
@@ -995,7 +1005,7 @@ describe Flexirest::Request do
|
|
995
1005
|
rescue Flexirest::HTTPServerException => e
|
996
1006
|
e
|
997
1007
|
end
|
998
|
-
expect(e).to be_instance_of(Flexirest::
|
1008
|
+
expect(e).to be_instance_of(Flexirest::HTTPInternalServerException)
|
999
1009
|
expect(e.status).to eq(500)
|
1000
1010
|
expect(e.result.first_name).to eq("John")
|
1001
1011
|
end
|
@@ -1011,7 +1021,7 @@ describe Flexirest::Request do
|
|
1011
1021
|
rescue Flexirest::HTTPServerException => e
|
1012
1022
|
e
|
1013
1023
|
end
|
1014
|
-
expect(e.message).to eq(%q{The POST to '/create' returned a 500 status, which raised a Flexirest::
|
1024
|
+
expect(e.message).to eq(%q{The POST to '/create' returned a 500 status, which raised a Flexirest::HTTPInternalServerException with a body of: \{"first_name":"John", "id":1234\}})
|
1015
1025
|
end
|
1016
1026
|
|
1017
1027
|
it "should raise a parse exception for invalid JSON returns" do
|
@@ -1026,7 +1036,7 @@ describe Flexirest::Request do
|
|
1026
1036
|
rescue => e
|
1027
1037
|
e
|
1028
1038
|
end
|
1029
|
-
expect(e).to be_instance_of(Flexirest::
|
1039
|
+
expect(e).to be_instance_of(Flexirest::HTTPInternalServerException)
|
1030
1040
|
expect(e.status).to eq(500)
|
1031
1041
|
expect(e.result).to eq(error_content)
|
1032
1042
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -66,12 +66,12 @@ class FaradayResponseMock < ::Flexirest::FaradayResponseProxy
|
|
66
66
|
@finished = false
|
67
67
|
end
|
68
68
|
|
69
|
-
def on_complete
|
69
|
+
def on_complete(&block)
|
70
70
|
if @auto_resolve
|
71
71
|
@finished = true
|
72
72
|
yield(@response)
|
73
73
|
else
|
74
|
-
@callback =
|
74
|
+
@callback = block
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
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.10.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: 2020-
|
11
|
+
date: 2020-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -129,6 +129,9 @@ dependencies:
|
|
129
129
|
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: 1.3.1
|
132
|
+
- - "<"
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '2.4'
|
132
135
|
type: :development
|
133
136
|
prerelease: false
|
134
137
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -136,6 +139,9 @@ dependencies:
|
|
136
139
|
- - ">="
|
137
140
|
- !ruby/object:Gem::Version
|
138
141
|
version: 1.3.1
|
142
|
+
- - "<"
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '2.4'
|
139
145
|
- !ruby/object:Gem::Dependency
|
140
146
|
name: typhoeus
|
141
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,6 +170,20 @@ dependencies:
|
|
164
170
|
- - ">="
|
165
171
|
- !ruby/object:Gem::Version
|
166
172
|
version: '0'
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: rest-client
|
175
|
+
requirement: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: 1.8.0
|
180
|
+
type: :development
|
181
|
+
prerelease: false
|
182
|
+
version_requirements: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: 1.8.0
|
167
187
|
- !ruby/object:Gem::Dependency
|
168
188
|
name: mime-types
|
169
189
|
requirement: !ruby/object:Gem::Requirement
|
@@ -364,7 +384,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
364
384
|
- !ruby/object:Gem::Version
|
365
385
|
version: '0'
|
366
386
|
requirements: []
|
367
|
-
rubygems_version: 3.
|
387
|
+
rubygems_version: 3.1.2
|
368
388
|
signing_key:
|
369
389
|
specification_version: 4
|
370
390
|
summary: This gem is for accessing REST services in a flexible way. ActiveResource
|