carsensor-api 0.0.1.alpha.1 → 0.0.1.alpha.2

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: df4d8bdfa2ef6e4210bfae98f7801b1571cac2d794c5f618c1833c5f590d48f8
4
- data.tar.gz: 7159a8f0944360ea6f935c710c043d569d4d841fde069e17b8ac2751d1be7649
3
+ metadata.gz: 538bfeef5a5107c35cf56609afeba4e3877543121e4269fd7dd6ac6dd245104a
4
+ data.tar.gz: bd877ad61e56a4fdfe942629e5c935701645f5cd67f43f0a66493eced170a7fb
5
5
  SHA512:
6
- metadata.gz: 6d1f1111efd31f7548472191fb5cb179e02855fa12434cf73f07b00426382bd64ac19cb75e38cb74a854ab351e3b5401b9ff1a76176fc90ac158846acba4f558
7
- data.tar.gz: cf7aef493c202fa72e5bb8c25d13f4ffe7b0946a960e8602094093948e01a236cf40fde58446111eee3d4c7a7c63909e9637a8d11c060690c0212c4d465a7e88
6
+ metadata.gz: 0a58a0d7500ecd48dc06ab7a3253f87fa95b24751caa4a2d7c513caf12167ad543eabdc8181073dd0330dffcc1904edcbb24f1a2424856b7ca2b5072e43d222e
7
+ data.tar.gz: 60e5338ced38e7ca10f20c8e83feb07778687bc32fab9a2c194ea4eec380f013f4b0c402e37b3c21ae865c96bd5a665dbe0e1cd36159cfadd957a797cc64cee0
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ['lib']
26
26
 
27
27
  spec.add_dependency 'rack'
28
+ spec.add_dependency 'retriable', '~>3.1'
28
29
 
29
30
  spec.add_development_dependency 'bundler', '~> 2.0'
30
31
  spec.add_development_dependency 'pry-byebug'
data/lib/carsensor/api.rb CHANGED
@@ -1,19 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'logger'
3
4
  require 'uri'
4
5
  require 'open-uri'
5
6
  require 'carsensor/api/version'
6
7
  require 'rack/utils'
8
+ require 'retriable'
7
9
 
8
10
  module Carsensor
9
- # A thin wrapper for Carsensor Web API at (https://webservice.recruit.co.jp/carsensor/reference.html
11
+ # A thin wrapper for Carsensor Web API at https://webservice.recruit.co.jp/carsensor/reference.html
10
12
  class API
11
13
  # Exception class for errors which would occur during invocation of Carsensor API
12
14
  class Error < StandardError
13
15
  # @param message [String] Message for the exception
14
16
  # @param code [Integer,String] Error code of API itself or error status of HTTP
15
- def initialize(message:, code:)
16
- super('%s(code: %s)' % [message, code])
17
+ def initialize(message:, code: nil)
18
+ if code
19
+ super('%s(code: %s)' % [message, code])
20
+ else
21
+ super(message)
22
+ end
17
23
  end
18
24
  end
19
25
 
@@ -25,10 +31,12 @@ module Carsensor
25
31
  end
26
32
 
27
33
  # @param key [String] The API key
28
- def initialize(key:)
34
+ def initialize(key:, logger: Logger.new(STDOUT), tries: 3)
29
35
  raise ArgumentError, 'key: must be a String' unless key.is_a?(String)
30
36
 
31
37
  @key = key
38
+ @logger = logger
39
+ @tries = tries
32
40
  end
33
41
 
34
42
  # Returns bodies for given criterion
@@ -97,13 +105,33 @@ module Carsensor
97
105
  private
98
106
 
99
107
  def call_api(root, path, **query)
100
- (method(:build_uri) >> method(:read_uri) >> method(:parse_body) >> method(:extract_result).curry[root]).(path, query)
108
+ Retriable.retriable(tries: @tries, on: [Error], on_retry: on_retry_proc(path, query)) do
109
+ (method(:build_uri) >> method(:read_uri) >> method(:parse_body) >> method(:extract_result).curry[root]).(path, query)
110
+ end
111
+ end
112
+
113
+ def on_retry_proc(path, **query)
114
+ lambda do |exception, _try, _elapsed_time, _next_interval|
115
+ return unless @logger
116
+
117
+ @logger.info(retry_message(exception, path, query))
118
+ end
119
+ end
120
+
121
+ def retry_message(exception, path, **query)
122
+ query_string = build_query_string(query)
123
+ request = query_string.length.zero? ? path : path + '?' + query_string
124
+ '%s %s %s' % [exception.class, exception.message, request]
125
+ end
126
+
127
+ def build_query_string(**query)
128
+ Rack::Utils.build_query(key: @key, format: 'json', **query.transform_values {|v| v.is_a?(Array) ? v.join(',') : v })
101
129
  end
102
130
 
103
131
  def build_uri(path, **query)
104
132
  ENDPOINT_BASE_URI.dup.tap do |u|
105
133
  u.path = path
106
- u.query = Rack::Utils.build_query(key: @key, format: 'json', **query.transform_values {|v| v.is_a?(Array) ? v.join(',') : v })
134
+ u.query = build_query_string(query)
107
135
  end
108
136
  end
109
137
 
@@ -112,6 +140,8 @@ module Carsensor
112
140
  rescue OpenURI::HTTPError => e
113
141
  status = e.io.status
114
142
  raise Error.new(message: status[1], code: status[0])
143
+ rescue SocketError => e
144
+ raise Error.new(message: e.message)
115
145
  end
116
146
 
117
147
  def parse_body(body)
@@ -119,6 +149,8 @@ module Carsensor
119
149
  api_error = data.dig(:results, :error, 0)
120
150
  raise Error.new(**api_error) if api_error
121
151
  end
152
+ rescue JSON::ParserError => e
153
+ raise Error.new(message: e.message)
122
154
  end
123
155
 
124
156
  def extract_result(root, data)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Carsensor
4
4
  class API
5
- VERSION = '0.0.1.alpha.1'
5
+ VERSION = '0.0.1.alpha.2'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carsensor-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha.1
4
+ version: 0.0.1.alpha.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - OZAWA Sakuro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-12 00:00:00.000000000 Z
11
+ date: 2019-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: retriable
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement