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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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