flexirest 1.5.7 → 1.5.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8fff6bddbbfc146aed6bdf17b6cf1e209147828a
4
- data.tar.gz: cc6acc2caf6b830ec87453d59d7f0aa7a2aecfbd
3
+ metadata.gz: 4a4a35ab648cec73d9c6681c296fce8059d39a44
4
+ data.tar.gz: b5f0ab3f9487c346565cd093993636c10e6f13f8
5
5
  SHA512:
6
- metadata.gz: 518b298ccea323da131c0d576cce46769f4fb7a98d2e1e4e6a3ec5826f1ef4c5c1804b93ac492c25050c310e680a2919dd3116af11794f9d29fd856a04f9959e
7
- data.tar.gz: 05bf183436c1ce77024cebc855229c21d174ee2175472ab8c56ec964c19bef6ebe392f4f2e82dd379f2bcbc3425f4dda6acc9764c8b0bef9dbf109066319088c
6
+ metadata.gz: 597d1639f2408ae3b5e05676d55ca8ef77a3e5082f62c9b0f11576537cd4314acd5d5cf21456620ede4da36fb8d64fe01040347ebf5e71f115af2909a88437bd
7
+ data.tar.gz: 6ae9f6fecd5e11adaa70608ce88e717d32aeab7c9d4730912de3f1d1694dd476999e854e657f783a39b877cd926d4ee7f9a51e2b87165c79dc45a2023a531621
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.5.8
4
+
5
+ Feature:
6
+
7
+ - Allow retrying after a failure in an `after_request` callback
8
+
3
9
  ## 1.5.7
4
10
 
5
11
  Bugfix:
data/README.md CHANGED
@@ -566,6 +566,26 @@ end
566
566
 
567
567
  **Note:** since v1.3.21 the empty response trick above isn't necessary, empty responses for 204 are accepted normally (the method returns `true`), but this is here to show an example of an `after_request` callback adjusting the body. The `cache_all_people` example shows how to cache a response even if the server doesn't send the correct headers.
568
568
 
569
+ If you want to trap an error in an `after_request` callback and retry the request, this can be done - but retries will only happen once for each request (so we'd recommend checking all conditions in a single `after_request` and then retrying after fixing them all). You achieve this by returning `:retry` from the callback.
570
+
571
+ ```ruby
572
+ class Person < Flexirest::Base
573
+ get :all, "/people"
574
+
575
+ after_request :fix_invalid_request
576
+
577
+ private
578
+
579
+ def fix_invalid_request(name, response)
580
+ if response.status == 401
581
+ # Do something to fix the state of caches/variables used in the
582
+ # before_request, etc
583
+ return :retry
584
+ end
585
+ end
586
+ end
587
+ ```
588
+
569
589
  ### Lazy Loading
570
590
 
571
591
  Flexirest supports lazy loading (delaying the actual API call until the response is actually used, so that views can be cached without still causing API calls).
@@ -27,13 +27,16 @@ module Flexirest
27
27
  callbacks.each do |callback|
28
28
  if callback.is_a? Symbol
29
29
  if self.respond_to?(callback)
30
- self.send(callback, name, param)
30
+ result = self.send(callback, name, param)
31
31
  else
32
32
  instance = self.new
33
- instance.send(callback, name, param)
33
+ result = instance.send(callback, name, param)
34
34
  end
35
35
  else
36
- callback.call(name, param)
36
+ result = callback.call(name, param)
37
+ end
38
+ if result == :retry
39
+ return :retry
37
40
  end
38
41
  end
39
42
  end
@@ -8,7 +8,7 @@ module Flexirest
8
8
  class Request
9
9
  include AttributeParsing
10
10
  include JsonAPIProxy
11
- attr_accessor :post_params, :get_params, :url, :path, :headers, :method, :object, :body, :forced_url, :original_url
11
+ attr_accessor :post_params, :get_params, :url, :path, :headers, :method, :object, :body, :forced_url, :original_url, :retrying
12
12
 
13
13
  def initialize(method, object, params = {})
14
14
  @method = method
@@ -211,9 +211,16 @@ module Flexirest
211
211
  @object.record_response(self.url, response_env)
212
212
  end
213
213
  if object_is_class?
214
- @object.send(:_callback_request, :after, @method[:name], response_env)
214
+ callback_result = @object.send(:_callback_request, :after, @method[:name], response_env)
215
215
  else
216
- @object.class.send(:_callback_request, :after, @method[:name], response_env)
216
+ callback_result = @object.class.send(:_callback_request, :after, @method[:name], response_env)
217
+ end
218
+
219
+ if callback_result == :retry
220
+ if self.retrying != true
221
+ self.retrying = true
222
+ return call()
223
+ end
217
224
  end
218
225
 
219
226
  result = handle_response(response_env, cached)
@@ -1,3 +1,3 @@
1
1
  module Flexirest
2
- VERSION = "1.5.7"
2
+ VERSION = "1.5.8"
3
3
  end
@@ -71,6 +71,30 @@ describe Flexirest::Request do
71
71
  end)
72
72
  end
73
73
 
74
+ class RetryingExampleClient < Flexirest::Base
75
+ base_url "http://www.example.com"
76
+
77
+ after_request :handle_retries
78
+
79
+ def self.incr_retries
80
+ @retries ||= 0
81
+ @retries += 1
82
+ end
83
+
84
+ def self.retries
85
+ @retries
86
+ end
87
+
88
+ def handle_retries(name, response)
89
+ if name == :do_me_twice
90
+ self.class.incr_retries
91
+ return :retry
92
+ end
93
+ end
94
+
95
+ get :do_me_twice, "/do_me_twice"
96
+ end
97
+
74
98
  class LazyLoadedExampleClient < ExampleClient
75
99
  base_url "http://www.example.com"
76
100
  lazy_load!
@@ -803,6 +827,14 @@ describe Flexirest::Request do
803
827
  expect(obj.test).to eq(1)
804
828
  end
805
829
 
830
+ it "should retry if an after_request callback returns :retry" do
831
+ stub_request(:get, "http://www.example.com/do_me_twice").
832
+ to_return(:status => 200, :body => "", :headers => {})
833
+ RetryingExampleClient.do_me_twice
834
+ expect(RetryingExampleClient.retries).to eq(2)
835
+ end
836
+
837
+
806
838
  context "Direct URL requests" do
807
839
  class SameServerExampleClient < Flexirest::Base
808
840
  URL = "http://www.example.com/some/url"
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.5.7
4
+ version: 1.5.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Jeffries
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-26 00:00:00.000000000 Z
11
+ date: 2018-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler