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 +4 -4
- data/carsensor-api.gemspec +1 -0
- data/lib/carsensor/api.rb +38 -6
- data/lib/carsensor/api/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 538bfeef5a5107c35cf56609afeba4e3877543121e4269fd7dd6ac6dd245104a
|
4
|
+
data.tar.gz: bd877ad61e56a4fdfe942629e5c935701645f5cd67f43f0a66493eced170a7fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a58a0d7500ecd48dc06ab7a3253f87fa95b24751caa4a2d7c513caf12167ad543eabdc8181073dd0330dffcc1904edcbb24f1a2424856b7ca2b5072e43d222e
|
7
|
+
data.tar.gz: 60e5338ced38e7ca10f20c8e83feb07778687bc32fab9a2c194ea4eec380f013f4b0c402e37b3c21ae865c96bd5a665dbe0e1cd36159cfadd957a797cc64cee0
|
data/carsensor-api.gemspec
CHANGED
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
|
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
|
-
|
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
|
-
(
|
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 =
|
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)
|
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.
|
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-
|
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
|