wrappi 0.2.6 → 0.2.7

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
  SHA256:
3
- metadata.gz: 61be13fabeb0542feedb58078fe1308cf42286994dcafa91a7fccdf0de08200c
4
- data.tar.gz: e0e8fe4b69ad694edc0ec1a0c2bb3f3a512f0415c8ceab94c7ed82065b721b37
3
+ metadata.gz: 5ebe424766ef9fa2db743cf82b52ff134c17ad752dc431477d6265f052e9e26c
4
+ data.tar.gz: 2fd7b9bc1ed174b20c016214de557c216163834f542f13f4d90ffd53183c5734
5
5
  SHA512:
6
- metadata.gz: 44cf1ab2fb72aadbddc0a191c1fccb6d3dee981189f28b08722947ae6295969dd05711f090524519ef832af938eec569d358649a1859a294e286fa1922096f27
7
- data.tar.gz: 70ad84300904ab70b2758f306e925462f439b23d743b82fe2fc085dedaef06a2081541abb0c3aca8f0f7a19145fe818808c99257ae0b9d391d4f127ce31bad98
6
+ metadata.gz: 2cae0bd674b5596b4901a38a7e4135c51efbbb7f0489b85841243d3b1179ceec170d3141e3b44a26c73e55cd79691fa99a69771c980a0d15d641239952be41f5
7
+ data.tar.gz: c7f06f0f12e49ad69a4f9ca737b55fdcf8df3dc83dbaf3453f6db02f2fa87d9711e0da6dc3d482118c26c7b62c183cbe937b4bd7a4d9b8d9fbfe1ef74e46406c
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  Making APIs fun again!
7
7
 
8
8
  Wrappi is a Framework to create API clients. The intention is to bring the best practices and standardize how API clients behave.
9
- It allows to create API clients in a declarative way improving readability and unifying the behavior. It abstracts complex operations like caching, retries background requests and error handling.
9
+ It allows to create API clients in a declarative way improving readability and unifying the behavior. It abstracts complex operations like caching, retries, background requests and error handling.
10
10
 
11
11
  Enjoy!
12
12
 
@@ -60,23 +60,29 @@ user.status_code # => 200
60
60
  user.body # => {"login"=>"arturictus", "id"=>1930175, ...}
61
61
  ```
62
62
 
63
- ### #success?
63
+ #### #success?
64
64
 
65
65
  The next behaviours are using `#success?` method. You can override by redefining your own success?
66
66
 
67
67
  The current `#success?` is defined like this:
68
68
 
69
- _wrappi/response.rb_
69
+ _wrappi/endpoint.rb_
70
70
  ```ruby
71
- def success?
72
- @success ||= request.code < 300 && request.code >= 200
71
+ def self.success?(request)
72
+ request.code < 300 && request.code >= 200
73
73
  end
74
74
  ```
75
75
 
76
76
  Overrride your own in Endpoint
77
77
  ```ruby
78
- def success?
79
- response.status == 201
78
+ class User < Wrappi::Endpoint
79
+ client Client
80
+ verb :get
81
+ path "users/:username"
82
+
83
+ def self.success?(request)
84
+ request.status == 200
85
+ end
80
86
  end
81
87
  ```
82
88
 
@@ -174,7 +180,7 @@ Github::User.new(username: 'arturictus').async(create: true, set: { wait: 10.min
174
180
  ```
175
181
 
176
182
  #### Cache
177
- You can enable cache per endpoint.
183
+ You can enable cache per endpoint. It depends on `::success?` method to determine if it will be cached or nor.
178
184
 
179
185
  Set the cache Handler in your client.
180
186
  It must behave like `Rails.cache` and respond to:
@@ -237,8 +243,8 @@ This will retry if status code is not `200`
237
243
  client Client
238
244
  verb :get
239
245
  path "users/:username"
240
- retry_if do |response, endpoint|
241
- endpoint.status_code != 200
246
+ retry_if do |response|
247
+ response.code != 200
242
248
  end
243
249
  end
244
250
  ```
@@ -653,7 +659,42 @@ user = GithubCLI.user(username: 'arturictus')
653
659
  user.success?
654
660
  ```
655
661
 
656
- ### In your project
662
+ #### Customization in you parent project
663
+
664
+ Once you created a gem Wrappi allows to parent projects to customize endpoints without having to change the gem's code.
665
+
666
+ example customizing `GithubCLI::User`
667
+
668
+ ```ruby
669
+ GithubCLI::User.setup do
670
+ cache true
671
+ async_callback do |opts|
672
+ if success?
673
+ # do something
674
+ end
675
+ end
676
+ end
677
+ ```
678
+
679
+ Example customizing all the Endpoints, adding loging to all the requests and changing client depending of enviroment:
680
+
681
+ ```ruby
682
+ GithubCLI::Endpoint.setup do
683
+ client do
684
+ if ENV['production']
685
+ GithubCLI::Client
686
+ else
687
+ GithubCLI::MyStagingClient
688
+ end
689
+ end
690
+
691
+ around_request do |request, endpoint|
692
+ endpoint.logger.info("making a request to #{endpoint.url} with params: #{endpoint.consummated_params}")
693
+ request.call # IMPORTANT
694
+ endpoint.logger.info("response status is: #{request.status_code}")
695
+ end
696
+ end
697
+ ```
657
698
 
658
699
  ## The HTTP clients war
659
700
 
@@ -20,12 +20,8 @@ module Wrappi
20
20
  }
21
21
  )
22
22
 
23
- attr_reader :input_params, :options
24
- def initialize(input_params = {}, options = {})
25
- @input_params = input_params
26
- @options = options
27
- end
28
-
23
+ ############## ClassMethods ################
24
+ # ============ API class metnods ================
29
25
  def self.call(*args)
30
26
  new(*args).call
31
27
  end
@@ -38,6 +34,50 @@ module Wrappi
38
34
  new(*args).body
39
35
  end
40
36
 
37
+ def self.setup(&block)
38
+ instance_exec(&block)
39
+ end
40
+
41
+ # ============= Configs =================
42
+ def self.async_callback(&block)
43
+ @async_callback = block
44
+ end
45
+
46
+ def self.around_request(&block)
47
+ @around_request = block
48
+ end
49
+
50
+ def self.retry_if(&block)
51
+ @retry_if = block
52
+ end
53
+
54
+ def self.cache_options(&block)
55
+ @cache_options = block
56
+ end
57
+
58
+ # ============= Inheritance =================
59
+ def self.inherited(subclass)
60
+ super(subclass)
61
+ subclass.instance_variable_set(:@async_callback, @async_callback)
62
+ subclass.instance_variable_set(:@around_request, @around_request)
63
+ subclass.instance_variable_set(:@retry_if, @retry_if)
64
+ subclass.instance_variable_set(:@cache_options, @cache_options)
65
+ end
66
+
67
+ # ============== success behaviour ===================
68
+ # overridable
69
+ def self.success?(request)
70
+ request.code >= 200 && request.code < 300
71
+ end
72
+ #######################################################
73
+
74
+ attr_reader :input_params, :options
75
+ def initialize(input_params = {}, options = {})
76
+ @input_params = input_params
77
+ @options = options
78
+ end
79
+
80
+
41
81
  def on_success(&block)
42
82
  block.call(self) if success?
43
83
  self
@@ -88,23 +128,6 @@ module Wrappi
88
128
  end.to_s
89
129
  end
90
130
 
91
-
92
- def self.async_callback(&block)
93
- @async_callback = block
94
- end
95
-
96
- def self.around_request(&block)
97
- @around_request = block
98
- end
99
-
100
- def self.retry_if(&block)
101
- @retry_if = block
102
- end
103
-
104
- def self.cache_options(&block)
105
- @cache_options = block
106
- end
107
-
108
131
  def perform_async_callback(async_options = {})
109
132
  instance_exec(async_options, &async_callback)
110
133
  end
@@ -114,6 +137,7 @@ module Wrappi
114
137
  @cache_key ||= "[#{verb.to_s.upcase}]##{url}#{params_cache_key}"
115
138
  end
116
139
 
140
+
117
141
  def around_request
118
142
  self.class.instance_variable_get(:@around_request)
119
143
  end
@@ -121,6 +145,7 @@ module Wrappi
121
145
  def retry_if
122
146
  self.class.instance_variable_get(:@retry_if)
123
147
  end
148
+
124
149
  def cache_options
125
150
  self.class.instance_variable_get(:@cache_options)
126
151
  end
@@ -131,7 +156,6 @@ module Wrappi
131
156
  self.class.instance_variable_get(:@async_callback) || proc {}
132
157
  end
133
158
 
134
-
135
159
  def logger
136
160
  client.logger
137
161
  end
@@ -39,7 +39,7 @@ module Wrappi
39
39
  end
40
40
 
41
41
  def make_request
42
- res = Response.new { Request.new(endpoint).call }
42
+ res = Response.new(endpoint.class) { Request.new(endpoint).call }
43
43
  around_request.call(res, endpoint)
44
44
  res.called? ? res : UncalledRequest.new
45
45
  end
@@ -4,8 +4,9 @@ module Wrappi
4
4
  # https://github.com/httprb/http/wiki/Response-Handling
5
5
  class Response
6
6
 
7
- attr_reader :block
8
- def initialize(&block)
7
+ attr_reader :block, :endpoint_klass
8
+ def initialize(endpoint_klass, &block)
9
+ @endpoint_klass = endpoint_klass
9
10
  @block = block
10
11
  end
11
12
 
@@ -24,7 +25,7 @@ module Wrappi
24
25
  end
25
26
 
26
27
  def success?
27
- @success ||= request.code < 300 && request.code >= 200
28
+ @success ||= endpoint_klass.success?(request)
28
29
  end
29
30
 
30
31
  def error?
@@ -1,3 +1,3 @@
1
1
  module Wrappi
2
- VERSION = "0.2.6"
2
+ VERSION = "0.2.7"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wrappi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artur Pañach
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-25 00:00:00.000000000 Z
11
+ date: 2019-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler