rest-service-client 0.1.4 → 0.2.0

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: c37e95966924381049dab3f9deacb8ea478be2ae
4
- data.tar.gz: f8cee3614200f6a6ddad42abbcf0f7a104160b42
3
+ metadata.gz: 9ac0a3ad05b3b3b3d9e17840d32c9d8e7844a73c
4
+ data.tar.gz: ff5156657486903f275ac4ec8eb531ecc99a9866
5
5
  SHA512:
6
- metadata.gz: 711aacdeabfc911e55c603f0fbb5f42d388782ad1702ea7a7d187fd3ed1d3ab9518b75f59268c224d8ce003c7440142a56f86d9c1f97f0d4b775fea7c3f6d229
7
- data.tar.gz: 3e1f7ef761e81d6b6c411c23d8d1258c672f03d5fb0677418b90fb3b76fdc90f16e4c6ef8ade505a680fbbe8742d0d128c79b91fbfef87055e8fd0d2430ba77a
6
+ metadata.gz: 141e9f10a76baa1d2a4c8e1a14b704fcb3f354b632ef692ba6a8c0639a42dcb348edbc778f09b05a91052466285d2d83bcd5f755c188cdb458819c34967b4f62
7
+ data.tar.gz: c53e460873fefdcf7f39077fe8170d64b0290931cc747407a3ce72702a5f30839be2f885b2dd86d1efcaebb4de90d276c60eba0a8174ddbec5a3eb8e760dd3eb
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
1
  # Rest Service Client
2
+ [![Gem Version](https://badge.fury.io/rb/rest-service-client.svg)](https://badge.fury.io/rb/rest-service-client)
3
+
2
4
 
3
5
  ## Installation
4
6
 
@@ -34,7 +36,7 @@ class MyAwesomeService
34
36
 
35
37
  # Sets the default headers for every requests.
36
38
  # Will be replaced using: MyAwesomeService.new.find_photo(id: 1, headers: { 'Authorization' => 'Bearer 123456' })
37
- headers 'Authorization' => 'OAuth 1111|111'
39
+ headers Authorization: 'OAuth 1111|111'
38
40
 
39
41
  # Sets the default params for every requests.
40
42
  # Will be replaced using: MyAwesomeService.new.find_photo(id: 20)
@@ -92,7 +94,7 @@ p service.photo(id: 10)['id']
92
94
  class SimpleService
93
95
  include RestServiceClient
94
96
  host 'https://jsonplaceholder.typicode.com'
95
- get :photo, '/photos/:id', { id: 1 }
97
+ get :photo, '/photos/:id', params: { id: 1 }
96
98
  end
97
99
 
98
100
  service = SimpleService.new
@@ -104,8 +106,7 @@ p service.photo(id: 2)['id'] # 2
104
106
  class SimpleService
105
107
  include RestServiceClient
106
108
  host 'https://jsonplaceholder.typicode.com'
107
-
108
- get :first_photo, '/photos/1', {}, { Authentication: 'my-token' }
109
+ get :first_photo, '/photos/1', headers: { Authentication: 'my-token' }
109
110
  end
110
111
 
111
112
  service = SimpleService.new
@@ -189,8 +190,12 @@ class SimpleService
189
190
  include RestServiceClient
190
191
  debug true
191
192
  host 'https://jsonplaceholder.typicode.com'
192
- headers key1: 'value1', 'key2': 'value2'
193
- get :photo, '/photos/1'
193
+ headers key1: 'value1', 'key2' => 'value2'
194
+ get :photo,
195
+ '/photos/:id',
196
+ params: { id: 1 },
197
+ headers: { key3: 'value3' },
198
+ payload: { data: { type: 'get_photo_by_id' }}
194
199
  end
195
200
 
196
201
  service = SimpleService.new
@@ -199,8 +204,8 @@ service.photo
199
204
  ______
200
205
  |
201
206
  | SimpleService is processing GET request to https://jsonplaceholder.typicode.com/photos/1
202
- | Headers: {:key1=>"value1", :key2=>"value2"}
203
- | Payload: {}
207
+ | Headers: {:key1=>"value1", "key2"=>"value2", :key3=>"value3"}
208
+ | Payload: {:data=>{:type=>"get_photo_by_id"}}
204
209
  |
205
210
  | SimpleService is processing the response on GET request to https://jsonplaceholder.typicode.com/photos/1
206
211
  | Status: 200
@@ -215,7 +220,84 @@ service.photo
215
220
  =end
216
221
 
217
222
  ```
223
+ ## Serializer
224
+
225
+ By the default RestServiceClient uses JSON serializer and returns the arrays and hashes
226
+ with key as string
227
+
228
+ You can use custom serializer.
229
+ For do this, create a serializer class with `self.deserialize` method which
230
+ gets the one argument with response body and returns whatever you want.
231
+
232
+ And you need to add your serializer to your service using:
233
+ `serializer MyAwesomSerializer`
234
+
235
+ ### Example
236
+ ```ruby
237
+ class Photo
238
+ attr_accessor :id, :title, :album_id
239
+ end
240
+
241
+ class PhotoSerializer
242
+ class Object::String
243
+ def underscore
244
+ gsub(/::/, '/')
245
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
246
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
247
+ .tr('-', '_')
248
+ .downcase
249
+ end
250
+ end
251
+
252
+ def self.deserialize(json)
253
+ data = JSON.parse(json)
254
+
255
+ return build_photo(data) if data.is_a? Hash
256
+ return data.map { |p| build_photo(p) } if data.is_a? Array
257
+ end
258
+
259
+ def self.build_photo(data)
260
+ object = Photo.new
261
+ data.each_with_object(object) do |(k, v), o|
262
+ setter = "#{k.underscore}=".to_sym
263
+ o.send(setter, v) if o.respond_to?(setter)
264
+ end
265
+ object
266
+ end
267
+ end
268
+
269
+ class Post
270
+ attr_accessor :id, :title, :user_id
271
+ end
272
+
273
+ class PostSerializer
274
+ def self.deserialize(json)
275
+ data = JSON.parse(json)
276
+ object = Post.new
277
+ object.id = data['id']
278
+ object.title = data['title']
279
+ object.user_id = data['userId']
280
+ object
281
+ end
282
+ end
283
+
284
+
285
+ class MyService
286
+ include RestServiceClient
287
+ host 'https://jsonplaceholder.typicode.com'
288
+ serializer PhotoSerializer
289
+ get :photos, '/photos'
290
+ get :find_photo, '/photos/:id'
291
+ get :find_post, '/posts/:id', serializer: PostSerializer
292
+ end
293
+
294
+ service = MyService.new
295
+
296
+ p service.find_photo(id: 1).album_id # 1
297
+ p service.photos.find { |p| p.id == 3 }.id # 1
298
+ p service.find_post(id: 1).user_id # 1
218
299
 
300
+ ```
219
301
 
220
302
  ## Development
221
303
 
@@ -1,5 +1,5 @@
1
1
  module RestServiceClient
2
- VERSION = '0.1.4'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
 
4
4
  def self.version
5
5
  VERSION
@@ -64,33 +64,39 @@ module RestServiceClient
64
64
  define_method :get_debug, &-> { flag }
65
65
  end
66
66
 
67
- def get(method_name, path = '', default_params = {}, default_headers = {}, default_payload = {})
68
- add_method :get, method_name, path, default_params, default_headers, default_payload
67
+ def get(method_name, path = '', options = {})
68
+ add_method :get, method_name, path, options
69
69
  end
70
70
 
71
- def post(method_name, path = '', default_params = {}, default_headers = {}, default_payload = {})
72
- add_method :post, method_name, path, default_params, default_headers, default_payload
71
+ def post(method_name, path = '', options = {})
72
+ add_method :post, method_name, path, options
73
73
  end
74
74
 
75
- def put(method_name, path = '', default_params = {}, default_headers = {}, default_payload = {})
76
- add_method :put, method_name, path, default_params, default_headers, default_payload
75
+ def put(method_name, path = '', options = {})
76
+ add_method :put, method_name, path, options
77
77
  end
78
78
 
79
- def patch(method_name, path = '', default_params = {}, default_headers = {}, default_payload = {})
80
- add_method :patch, method_name, path, default_params, default_headers, default_payload
79
+ def patch(method_name, path = '', options = {})
80
+ add_method :patch, method_name, path, options
81
81
  end
82
82
 
83
- def delete(method_name, path = '', default_params = {}, default_headers = {}, default_payload = {})
84
- add_method :delete, method_name, path, default_params, default_headers, default_payload
83
+ def delete(method_name, path = '', options = {})
84
+ add_method :delete, method_name, path, options
85
85
  end
86
86
 
87
87
  private
88
88
 
89
- def add_method(http_method, method_name, path, default_params, default_headers, default_payload)
89
+ # default_params, default_headers, default_payload, serializer
90
+ def add_method(http_method, method_name, path, options)
90
91
  define_method method_name do |headers: {}, payload: {}, parameters: {}, **params|
91
- params = @default_params.merge(default_params.merge(params.merge(parameters)))
92
- headers = @default_headers.merge(default_headers.merge(headers))
93
- payload = default_payload.merge payload
92
+ options_params = options.fetch(:params, {})
93
+ options_headers = options.fetch(:headers, {})
94
+ options_payload = options.fetch(:payload, {})
95
+ serializer = options.fetch(:serializer, @serializer)
96
+
97
+ params = @default_params.merge(options_params.merge(params.merge(parameters)))
98
+ headers = @default_headers.merge(options_headers.merge(headers))
99
+ payload = options_payload.merge payload
94
100
 
95
101
  uri = path.clone
96
102
 
@@ -120,7 +126,7 @@ module RestServiceClient
120
126
  puts
121
127
  end
122
128
 
123
- @serializer.deserialize(response.body)
129
+ serializer.deserialize(response.body)
124
130
  end
125
131
  end
126
132
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest-service-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Bespalov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-18 00:00:00.000000000 Z
11
+ date: 2017-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler