network-client 1.0.8 → 1.0.9

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: 2948c33239606721a0bab258f94eb7ef32c42441
4
- data.tar.gz: 897d29f3df3617533a1279843b7a113865c337a1
3
+ metadata.gz: 64ff58738532ca1e75915fdf62d59dbffe8fb3b3
4
+ data.tar.gz: bf9d4e529a0d104ff1e72dc7a02da3a9c23a5bd2
5
5
  SHA512:
6
- metadata.gz: 7a646e593e940cf06c3b96e232238dc574f7baf75ba4c6f1a668d25c2d169626ab91211ba086eb615cabac64ee9934fb89cd17f2ee93c9bf133dbb12a4d2a5a6
7
- data.tar.gz: 89d53050f65e8a84e7fad544b09bf50677e6218c4dc3288b12fca5a0ad60342ec3792ba230578ec01545902572f56347868c38f3546562b48d911b989f605bc1
6
+ metadata.gz: a525076e0a9b9d6a9a2f9252af12a2e32fa7598b6fb8c0999d94b1ba6b65aeab37780157f3d42495cc4c3b005a6d9f13fb39460c9cdcfc15705222fb4fb6273c
7
+ data.tar.gz: e90d925d53cf26b219c0ea15c75fed6e71b46bcb8bf05b447a1b09759c166ed141d819af8ae55adfe7fad23257155433310f62a1f151da6ada5adae470788f83
data/.gitignore CHANGED
@@ -53,3 +53,6 @@ build-iPhoneSimulator/
53
53
  .rvmrc
54
54
 
55
55
  # End of https://www.gitignore.io/api/ruby
56
+
57
+ # Ignore publish script due to credentials
58
+ .publish
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- network-client (1.0.7)
4
+ network-client (1.0.9)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -16,6 +16,7 @@ GEM
16
16
  concurrent-ruby (1.0.5)
17
17
  diff-lcs (1.3)
18
18
  docile (1.1.5)
19
+ dotenv (2.2.1)
19
20
  factory_girl (4.8.0)
20
21
  activesupport (>= 3.0.0)
21
22
  i18n (0.8.1)
@@ -50,6 +51,7 @@ PLATFORMS
50
51
  DEPENDENCIES
51
52
  bundler (~> 1.14)
52
53
  codeclimate-test-reporter (~> 1.0)
54
+ dotenv (~> 2.2)
53
55
  factory_girl (~> 4.5)
54
56
  network-client!
55
57
  rake (~> 10.0)
data/README.md CHANGED
@@ -20,7 +20,7 @@ And then execute:
20
20
  $ bundle
21
21
  ```
22
22
 
23
- Or install it yourself as:
23
+ Or install the gem directly:
24
24
 
25
25
  ```sh
26
26
  $ gem install network-client
@@ -29,6 +29,7 @@ $ gem install network-client
29
29
  ## Usage
30
30
 
31
31
 
32
+ For more refer to [the API docuemntation](#soon).
32
33
 
33
34
  ## Contributing
34
35
 
@@ -6,12 +6,9 @@ require 'logger'
6
6
 
7
7
 
8
8
  module NetworkClient
9
- # This class is simple HTTP client that meant to be initialized configured with a single URI.
9
+ # This class is simple HTTP client that is meant to be initialized configured with a single URI.
10
10
  # Subsequent calls should target endpoints/paths of that URI.
11
11
  #
12
- # Return values of its rest-like methods is Struct holding two values for the code and response
13
- # body parsed as JSON.
14
- #
15
12
  class Client
16
13
 
17
14
  HTTP_VERBS = {
@@ -21,6 +18,25 @@ module NetworkClient
21
18
  :delete => Net::HTTP::Delete
22
19
  }
23
20
 
21
+ DEFAULT_HEADERS = { 'accept' => 'application/json',
22
+ 'Content-Type' => 'application/json' }.freeze
23
+
24
+ # Return values of rest-like methods is a struct holding two values:
25
+ # the response code, and body (parsed as JSON in json request).
26
+ RESPONSE = Struct.new(:code, :body)
27
+
28
+ # Construct and prepare client for requests targeting :endpoint.
29
+ #
30
+ # = *endpoint*:
31
+ # Uri for the host with scheam and port. any other segment like paths will be discarded.
32
+ # = *tries*:
33
+ # Number to specify how many is to repeat falied calls.
34
+ # = *headers*:
35
+ # Hash to contain any common HTTP headers to be set in client calls.
36
+ #
37
+ # Example:
38
+ # =>
39
+ #
24
40
  def initialize(endpoint:, tries: 1, headers: {})
25
41
  @uri = URI.parse(endpoint)
26
42
  @tries = tries
@@ -28,7 +44,6 @@ module NetworkClient
28
44
  set_http_client
29
45
  set_default_headers(headers)
30
46
  set_logger
31
- set_response_struct
32
47
  end
33
48
 
34
49
  def get(path, params = {}, headers = {})
@@ -76,19 +91,14 @@ module NetworkClient
76
91
  end
77
92
 
78
93
  def set_default_headers(headers)
79
- defaults = { 'accept' => 'application/json', 'Content-Type' => 'application/json' }
80
- @default_headers = defaults.merge(headers)
81
- end
82
-
83
- def set_response_struct
84
- @response_struct = Struct.new(:code, :body)
94
+ @default_headers = DEFAULT_HEADERS.merge(headers)
85
95
  end
86
96
 
87
97
  def request_json(http_method, path, params, headers)
88
98
  response = request(http_method, path, params, headers)
89
99
  body = JSON.parse(response.body)
90
100
 
91
- @response_struct.new(response.code, body)
101
+ RESPONSE.new(response.code, body)
92
102
 
93
103
  rescue JSON::ParserError => error
94
104
  @logger.error "parsing response body as json failed.\n Details: \n #{error.message}"
@@ -97,6 +107,7 @@ module NetworkClient
97
107
 
98
108
  def request(http_method, path, params, headers)
99
109
  headers = @default_headers.merge(headers)
110
+ path = formulate_path(path)
100
111
 
101
112
  case http_method
102
113
  when :get
@@ -123,7 +134,7 @@ module NetworkClient
123
134
  tries_count ||= @tries
124
135
  response = @http.request(request)
125
136
  rescue *errors_to_recover_by_retry => error
126
- @logger.warn(error.message)
137
+ @logger.warn "[Error]: #{error.message} \nRetry .."
127
138
  (tries_count -= 1).zero? ? raise : retry
128
139
  else
129
140
  response
@@ -132,16 +143,24 @@ module NetworkClient
132
143
 
133
144
  def errors_to_recover_by_retry
134
145
  [Errno::ECONNREFUSED, Net::HTTPServiceUnavailable, Net::ProtocolError, Net::ReadTimeout,
135
- Net::OpenTimeout, OpenSSL::SSL::SSLError]
146
+ Net::OpenTimeout, OpenSSL::SSL::SSLError, SocketError]
136
147
  end
137
148
 
138
149
  def errors_to_recover_by_propogate
150
+ # TODO: make configurable set of errors that stop net call without retry.
139
151
  end
140
152
 
141
153
  def encode_path_params(path, params)
142
- return path if params.empty?
143
- encoded = URI.encode_www_form(params)
144
- [path, encoded].join("?")
154
+ if params.empty?
155
+ path
156
+ else
157
+ encoded = URI.encode_www_form(params)
158
+ [path, encoded].join("?")
159
+ end
160
+ end
161
+
162
+ def formulate_path(path)
163
+ path.chars.last.nil? ? "#{path}/" : path
145
164
  end
146
165
  end
147
166
  end
@@ -1,3 +1,3 @@
1
1
  module NetworkClient
2
- VERSION = "1.0.8"
2
+ VERSION = "1.0.9"
3
3
  end
@@ -30,4 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency "factory_girl", "~> 4.5"
31
31
  spec.add_development_dependency "simplecov", "~> 0.14.1"
32
32
  spec.add_development_dependency "codeclimate-test-reporter", "~> 1.0"
33
+ spec.add_development_dependency "dotenv", "~> 2.2"
33
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: network-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.8
4
+ version: 1.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abdullah Barrak (abarrak)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-17 00:00:00.000000000 Z
11
+ date: 2017-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: dotenv
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.2'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.2'
97
111
  description: network-client gem is almost a drop-in thin layer around Net::HTTP classes with
98
112
  simple error handling and retry functionality implemented.
99
113
  email: