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 +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
|