esi-sdk 1.1.2 → 2.1.0
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/.github/workflows/cicd.yml +17 -2
- data/.gitignore +2 -0
- data/CHANGELOG.md +38 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +21 -40
- data/README.md +2 -0
- data/Rakefile +75 -37
- data/bin/console +1 -1
- data/esi-sdk.gemspec +2 -3
- data/lib/esi/client/alliance.rb +103 -10
- data/lib/esi/client/assets.rb +193 -18
- data/lib/esi/client/bookmarks.rb +130 -12
- data/lib/esi/client/calendar.rb +144 -16
- data/lib/esi/client/character.rb +414 -42
- data/lib/esi/client/clones.rb +65 -6
- data/lib/esi/client/contacts.rb +294 -30
- data/lib/esi/client/contracts.rb +294 -31
- data/lib/esi/client/corporation.rb +755 -152
- data/lib/esi/client/dogma.rb +118 -12
- data/lib/esi/client/faction_warfare.rb +198 -14
- data/lib/esi/client/fittings.rb +94 -10
- data/lib/esi/client/fleets.rb +469 -49
- data/lib/esi/client/incursions.rb +23 -1
- data/lib/esi/client/industry.rb +250 -23
- data/lib/esi/client/insurance.rb +23 -1
- data/lib/esi/client/killmails.rb +95 -10
- data/lib/esi/client/location.rb +98 -9
- data/lib/esi/client/loyalty.rb +57 -6
- data/lib/esi/client/mail.rb +262 -28
- data/lib/esi/client/market.rb +322 -34
- data/lib/esi/client/opportunities.rb +124 -13
- data/lib/esi/client/planetary_interaction.rb +124 -13
- data/lib/esi/client/routes.rb +34 -6
- data/lib/esi/client/search.rb +64 -7
- data/lib/esi/client/skills.rb +95 -9
- data/lib/esi/client/sovereignty.rb +69 -3
- data/lib/esi/client/status.rb +24 -1
- data/lib/esi/client/universe.rb +817 -194
- data/lib/esi/client/user_interface.rb +157 -14
- data/lib/esi/client/wallet.rb +199 -22
- data/lib/esi/client/wars.rb +81 -9
- data/lib/esi/client.rb +74 -82
- data/lib/esi/errors.rb +12 -1
- data/lib/esi/version.rb +1 -1
- data/package.json +19 -0
- data/release.config.js +2 -2
- data/yarn.lock +3695 -0
- metadata +10 -22
data/lib/esi/client/wars.rb
CHANGED
@@ -12,7 +12,7 @@ module ESI
|
|
12
12
|
# @esi_version legacy
|
13
13
|
# @esi_version v1
|
14
14
|
#
|
15
|
-
# @param war_id [Integer
|
15
|
+
# @param war_id [Integer] ID for a war
|
16
16
|
# @param params [Hash] Additional query string parameters
|
17
17
|
# @param headers [Hash] Additional headers
|
18
18
|
#
|
@@ -24,11 +24,35 @@ module ESI
|
|
24
24
|
# @raise [ESI::Errors::GatewayTimeoutError] Gateway timeout
|
25
25
|
#
|
26
26
|
# @see https://esi.evetech.net/ui/#/Wars/get_wars_war_id
|
27
|
-
def get_war(war_id:,
|
28
|
-
|
27
|
+
def get_war(war_id:, headers: {}, params: {})
|
28
|
+
get_war_raw(war_id: war_id, headers: headers, params: params).json
|
29
29
|
end
|
30
30
|
alias get_wars_war_id get_war
|
31
31
|
|
32
|
+
# Return details about a war.
|
33
|
+
#
|
34
|
+
# This endpoint is cached for up to 3600 seconds.
|
35
|
+
#
|
36
|
+
# @esi_version dev
|
37
|
+
# @esi_version legacy
|
38
|
+
# @esi_version v1
|
39
|
+
#
|
40
|
+
# @param war_id [Integer] ID for a war
|
41
|
+
# @param params [Hash] Additional query string parameters
|
42
|
+
# @param headers [Hash] Additional headers
|
43
|
+
#
|
44
|
+
# @raise [ESI::Errors::BadRequestError] Bad request
|
45
|
+
# @raise [ESI::Errors::ErrorLimitedError] Error limited
|
46
|
+
# @raise [ESI::Errors::UnprocessableEntityError] War not found
|
47
|
+
# @raise [ESI::Errors::InternalServerError] Internal server error
|
48
|
+
# @raise [ESI::Errors::ServiceUnavailableError] Service unavailable
|
49
|
+
# @raise [ESI::Errors::GatewayTimeoutError] Gateway timeout
|
50
|
+
#
|
51
|
+
# @see https://esi.evetech.net/ui/#/Wars/get_wars_war_id
|
52
|
+
def get_war_raw(war_id:, headers: {}, params: {})
|
53
|
+
get("/wars/#{war_id}/", headers: headers, params: params)
|
54
|
+
end
|
55
|
+
|
32
56
|
# Return a list of kills related to a war.
|
33
57
|
#
|
34
58
|
# This endpoint is cached for up to 3600 seconds.
|
@@ -37,7 +61,7 @@ module ESI
|
|
37
61
|
# @esi_version legacy
|
38
62
|
# @esi_version v1
|
39
63
|
#
|
40
|
-
# @param war_id [Integer
|
64
|
+
# @param war_id [Integer] A valid war ID
|
41
65
|
# @param params [Hash] Additional query string parameters
|
42
66
|
# @param headers [Hash] Additional headers
|
43
67
|
#
|
@@ -49,11 +73,59 @@ module ESI
|
|
49
73
|
# @raise [ESI::Errors::GatewayTimeoutError] Gateway timeout
|
50
74
|
#
|
51
75
|
# @see https://esi.evetech.net/ui/#/Wars/get_wars_war_id_killmails
|
52
|
-
def get_war_killmails(war_id:,
|
53
|
-
|
76
|
+
def get_war_killmails(war_id:, headers: {}, params: {})
|
77
|
+
responses = get_war_killmails_raw(war_id: war_id, headers: headers, params: params)
|
78
|
+
responses.map(&:json).reduce([], :concat)
|
54
79
|
end
|
55
80
|
alias get_wars_war_id_killmails get_war_killmails
|
56
81
|
|
82
|
+
# Return a list of kills related to a war.
|
83
|
+
#
|
84
|
+
# This endpoint is cached for up to 3600 seconds.
|
85
|
+
#
|
86
|
+
# @esi_version dev
|
87
|
+
# @esi_version legacy
|
88
|
+
# @esi_version v1
|
89
|
+
#
|
90
|
+
# @param war_id [Integer] A valid war ID
|
91
|
+
# @param params [Hash] Additional query string parameters
|
92
|
+
# @param headers [Hash] Additional headers
|
93
|
+
#
|
94
|
+
# @raise [ESI::Errors::BadRequestError] Bad request
|
95
|
+
# @raise [ESI::Errors::ErrorLimitedError] Error limited
|
96
|
+
# @raise [ESI::Errors::UnprocessableEntityError] War not found
|
97
|
+
# @raise [ESI::Errors::InternalServerError] Internal server error
|
98
|
+
# @raise [ESI::Errors::ServiceUnavailableError] Service unavailable
|
99
|
+
# @raise [ESI::Errors::GatewayTimeoutError] Gateway timeout
|
100
|
+
#
|
101
|
+
# @see https://esi.evetech.net/ui/#/Wars/get_wars_war_id_killmails
|
102
|
+
def get_war_killmails_raw(war_id:, headers: {}, params: {})
|
103
|
+
get("/wars/#{war_id}/killmails/", headers: headers, params: params)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Return a list of wars.
|
107
|
+
#
|
108
|
+
# This endpoint is cached for up to 3600 seconds.
|
109
|
+
#
|
110
|
+
# @esi_version dev
|
111
|
+
# @esi_version legacy
|
112
|
+
# @esi_version v1
|
113
|
+
#
|
114
|
+
# @param max_war_id [Integer] Only return wars with ID smaller than this
|
115
|
+
# @param params [Hash] Additional query string parameters
|
116
|
+
# @param headers [Hash] Additional headers
|
117
|
+
#
|
118
|
+
# @raise [ESI::Errors::BadRequestError] Bad request
|
119
|
+
# @raise [ESI::Errors::ErrorLimitedError] Error limited
|
120
|
+
# @raise [ESI::Errors::InternalServerError] Internal server error
|
121
|
+
# @raise [ESI::Errors::ServiceUnavailableError] Service unavailable
|
122
|
+
# @raise [ESI::Errors::GatewayTimeoutError] Gateway timeout
|
123
|
+
#
|
124
|
+
# @see https://esi.evetech.net/ui/#/Wars/get_wars
|
125
|
+
def get_wars(max_war_id: nil, headers: {}, params: {})
|
126
|
+
get_wars_raw(max_war_id: max_war_id, headers: headers, params: params).json
|
127
|
+
end
|
128
|
+
|
57
129
|
# Return a list of wars.
|
58
130
|
#
|
59
131
|
# This endpoint is cached for up to 3600 seconds.
|
@@ -73,9 +145,9 @@ module ESI
|
|
73
145
|
# @raise [ESI::Errors::GatewayTimeoutError] Gateway timeout
|
74
146
|
#
|
75
147
|
# @see https://esi.evetech.net/ui/#/Wars/get_wars
|
76
|
-
def
|
77
|
-
|
78
|
-
get("/wars
|
148
|
+
def get_wars_raw(max_war_id: nil, headers: {}, params: {})
|
149
|
+
params.merge!("max_war_id" => max_war_id)
|
150
|
+
get("/wars/", headers: headers, params: params)
|
79
151
|
end
|
80
152
|
end
|
81
153
|
end
|
data/lib/esi/client.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
4
|
-
require "faraday-http-cache"
|
5
|
-
require "faraday_middleware"
|
3
|
+
require "httpx"
|
6
4
|
require "timeout"
|
7
5
|
|
8
6
|
require_relative "./errors"
|
@@ -91,135 +89,129 @@ module ESI
|
|
91
89
|
520 => ESI::Errors::EveServerError
|
92
90
|
}.freeze
|
93
91
|
|
94
|
-
attr_reader :base_url, :cache, :user_agent, :version
|
92
|
+
attr_reader :base_url, :cache, :instrumentation, :logger, :user_agent, :version
|
95
93
|
|
96
94
|
# Returns a new {ESI::Client}.
|
97
95
|
#
|
96
|
+
# See the [faraday-http-cache](https://github.com/sourcelevel/faraday-http-cache) documentation for information on
|
97
|
+
# how to set up caching via the `cache` parameter.
|
98
|
+
#
|
98
99
|
# @param user_agent [String] Value of the `User-Agent` header for HTTP calls
|
99
100
|
# @param base_url [String] The base URL of the ESI API
|
100
101
|
# @param version [String] The version of the ESI API
|
102
|
+
# @param logger [Object] The logger to use
|
101
103
|
# @param cache [Hash] The cache configuration to use
|
102
104
|
# @option cache [Object] :store The cache store (e.g. `Rails.cache`)
|
103
105
|
# @option cache [Object] :logger The logger (e.g. `Rails.logger`)
|
104
106
|
# @option cache [Object] :instrumenter The instrumenter (e.g. `ActiveSupport::Notifications`)
|
105
|
-
|
107
|
+
# @param instrumentation [Hash] The instrumentation configuration to use
|
108
|
+
# @option instrumentation [String] :name The name to use for instrumentation
|
109
|
+
# @option instrumentation [Object] :instrumenter The instrumenter to use (e.g. `ActiveSupport::Notifications`)
|
110
|
+
def initialize(user_agent:, base_url: DEFAULT_BASE_URL, version: DEFAULT_VERSION, cache: {}, instrumentation: {}, logger: nil) # rubocop:disable Layout/LineLength, Metrics/ParameterLists
|
106
111
|
@base_url = base_url
|
107
112
|
@cache = cache
|
113
|
+
@instrumentation = instrumentation
|
108
114
|
@user_agent = user_agent
|
109
115
|
@version = version
|
116
|
+
@logger = logger
|
110
117
|
end
|
111
118
|
|
112
119
|
# Set the `Authorization` header for subsequent requests.
|
113
120
|
#
|
114
121
|
# @param token [String] The [EVE SSO JWT token](https://docs.esi.evetech.net/docs/sso/) to use
|
115
122
|
def authorize(token)
|
116
|
-
|
117
|
-
json_encoded_connection.authorization :Bearer, token
|
123
|
+
session.authentication token
|
118
124
|
end
|
119
125
|
|
120
|
-
private
|
121
|
-
|
122
|
-
ESI_RETRY_EXCEPTIONS = [Errno::ETIMEDOUT, Timeout::Error, Faraday::TimeoutError, Faraday::ConnectionFailed,
|
123
|
-
Faraday::ParsingError, SocketError].freeze
|
124
|
-
|
125
126
|
def delete(path, params: {}, headers: {})
|
126
|
-
|
127
|
-
response.
|
127
|
+
params.delete_if { |_, v| v.nil? }
|
128
|
+
response = session.delete("/#{version}#{path}", params: params, headers: headers)
|
129
|
+
response.raise_for_status
|
130
|
+
response
|
131
|
+
rescue HTTPX::Error
|
132
|
+
raise_error(response)
|
128
133
|
end
|
129
134
|
|
130
135
|
def get(path, params: {}, headers: {})
|
131
|
-
|
136
|
+
params.delete_if { |_, v| v.nil? }
|
137
|
+
response = session.get("/#{version}#{path}", params: params, headers: headers)
|
138
|
+
response.raise_for_status
|
132
139
|
|
133
|
-
return paginate(response, params, headers) if paginated?(response)
|
140
|
+
return paginate(response, "/#{version}#{path}", params, headers) if paginated?(response)
|
134
141
|
|
135
|
-
response
|
142
|
+
response
|
143
|
+
rescue HTTPX::Error
|
144
|
+
raise_error(response)
|
136
145
|
end
|
137
146
|
|
138
|
-
def post(path, payload: {}, headers: {})
|
139
|
-
|
140
|
-
response.
|
147
|
+
def post(path, payload: {}, params: {}, headers: {})
|
148
|
+
params.delete_if { |_, v| v.nil? }
|
149
|
+
response = session.post("/#{version}#{path}",
|
150
|
+
params: params,
|
151
|
+
headers: headers,
|
152
|
+
json: payload)
|
153
|
+
response.raise_for_status
|
154
|
+
response
|
155
|
+
rescue HTTPX::Error
|
156
|
+
raise_error(response)
|
141
157
|
end
|
142
158
|
|
143
|
-
def put(path, payload: {}, headers: {})
|
144
|
-
|
145
|
-
response.
|
159
|
+
def put(path, payload: {}, params: {}, headers: {})
|
160
|
+
params.delete_if { |_, v| v.nil? }
|
161
|
+
response = session.put("/#{version}#{path}",
|
162
|
+
params: params,
|
163
|
+
headers: headers,
|
164
|
+
json: payload)
|
165
|
+
response.raise_for_status
|
166
|
+
response
|
167
|
+
rescue HTTPX::Error
|
168
|
+
raise_error(response)
|
146
169
|
end
|
147
170
|
|
148
|
-
|
149
|
-
all_items = response.body
|
150
|
-
page_count = response.headers["X-Pages"].to_i - 1
|
151
|
-
page_count.times do |n|
|
152
|
-
page_number = n + 1
|
153
|
-
params = params.merge(page: page_number)
|
154
|
-
page = make_get_request(path, params: params, headers: headers)
|
155
|
-
all_items += page.body
|
156
|
-
end
|
157
|
-
|
158
|
-
all_items
|
159
|
-
end
|
160
|
-
|
161
|
-
def make_delete_request(path, params: {}, headers: {})
|
162
|
-
res = url_encoded_connection.delete("/#{version}#{path}", params, headers)
|
163
|
-
|
164
|
-
raise_error(res) unless res.success?
|
165
|
-
|
166
|
-
res
|
167
|
-
end
|
168
|
-
|
169
|
-
def make_get_request(path, params: {}, headers: {})
|
170
|
-
res = url_encoded_connection.get("/#{version}#{path}", params, headers)
|
171
|
-
|
172
|
-
raise_error(res) unless res.success?
|
173
|
-
|
174
|
-
res
|
175
|
-
end
|
176
|
-
|
177
|
-
def make_post_request(path, payload: {}, headers: {})
|
178
|
-
res = json_encoded_connection.post("/#{version}#{path}", payload, headers)
|
179
|
-
|
180
|
-
raise_error(res) unless res.success?
|
171
|
+
private
|
181
172
|
|
182
|
-
|
183
|
-
|
173
|
+
def paginate(response, path, params, headers) # rubocop:disable Metrics/MethodLength
|
174
|
+
response_headers = normalize_headers(response.headers)
|
175
|
+
page_count = response_headers["x-pages"].to_i
|
184
176
|
|
185
|
-
|
186
|
-
|
177
|
+
requests = (2..page_count).map do |n|
|
178
|
+
session.build_request(:get, path, params: params.merge(page: n), headers: headers)
|
179
|
+
end
|
180
|
+
responses = requests.any? ? session.request(*requests) : []
|
181
|
+
responses.unshift(response)
|
187
182
|
|
188
|
-
|
183
|
+
if responses.any?(&:error)
|
184
|
+
raise ESI::Errors::PaginationError.new("Error paginating request", responses: responses)
|
185
|
+
end
|
189
186
|
|
190
|
-
|
187
|
+
responses
|
191
188
|
end
|
192
189
|
|
193
190
|
def paginated?(response)
|
194
|
-
|
191
|
+
headers = normalize_headers(response.headers)
|
192
|
+
headers.key?("x-pages")
|
195
193
|
end
|
196
194
|
|
197
|
-
def
|
198
|
-
|
195
|
+
def normalize_headers(headers)
|
196
|
+
headers.to_h.transform_keys(&:downcase)
|
199
197
|
end
|
200
198
|
|
201
|
-
def
|
202
|
-
|
203
|
-
|
204
|
-
f.request :url_encoded
|
205
|
-
f.request :retry, { exceptions: ESI_RETRY_EXCEPTIONS }
|
206
|
-
f.response :follow_redirects
|
207
|
-
f.response :json
|
208
|
-
end
|
199
|
+
def raise_error(res)
|
200
|
+
raise (ERROR_MAPPING[res.status] || ESI::Errors::ClientError).new("(#{res.status}) #{res.json["error"]}",
|
201
|
+
response: res)
|
209
202
|
end
|
210
203
|
|
211
|
-
def
|
212
|
-
@
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
end
|
204
|
+
def session
|
205
|
+
@session ||= HTTPX.with(origin: base_url)
|
206
|
+
.with_headers(default_headers)
|
207
|
+
.plugin(:authentication)
|
208
|
+
.plugin(:persistent)
|
209
|
+
.plugin(:response_cache)
|
210
|
+
.plugin(:retries)
|
219
211
|
end
|
220
212
|
|
221
213
|
def default_headers
|
222
|
-
{ "User-Agent": user_agent }
|
214
|
+
{ "User-Agent": user_agent, Accept: "application/json" }
|
223
215
|
end
|
224
216
|
end
|
225
217
|
end
|
data/lib/esi/errors.rb
CHANGED
@@ -9,7 +9,7 @@ module ESI
|
|
9
9
|
|
10
10
|
# Base class for ESI client errors.
|
11
11
|
class ClientError < Error
|
12
|
-
attr_reader :response
|
12
|
+
attr_reader :response, :responses
|
13
13
|
|
14
14
|
def initialize(msg, response:)
|
15
15
|
super(msg)
|
@@ -18,6 +18,17 @@ module ESI
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
# ESI pagination error.
|
22
|
+
class PaginationError < ClientError
|
23
|
+
attr_reader :responses
|
24
|
+
|
25
|
+
def initialize(msg, responses:)
|
26
|
+
super(msg, response: nil)
|
27
|
+
|
28
|
+
@responses = responses
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
21
32
|
# ESI unauthorized error.
|
22
33
|
class UnauthorizedError < ClientError; end
|
23
34
|
|
data/lib/esi/version.rb
CHANGED
data/package.json
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
{
|
2
|
+
"name": "esi-sdk",
|
3
|
+
"private": true,
|
4
|
+
"dependencies": {},
|
5
|
+
"version": "1.2.0",
|
6
|
+
"description": "API client for the EVE Swagger Interface (ESI)",
|
7
|
+
"repository": "https://github.com/bokoboshahni/esi-sdk-ruby.git",
|
8
|
+
"author": "Bokobo Shahni <shahni@bokobo.space>",
|
9
|
+
"license": "MIT",
|
10
|
+
"devDependencies": {
|
11
|
+
"@semantic-release/changelog": "^5.0.1",
|
12
|
+
"@semantic-release/exec": "^6.0.1",
|
13
|
+
"@semantic-release/git": "^9.0.1",
|
14
|
+
"semantic-release": "^17.4.7"
|
15
|
+
},
|
16
|
+
"scripts": {
|
17
|
+
"release": "semantic-release"
|
18
|
+
}
|
19
|
+
}
|
data/release.config.js
CHANGED
@@ -21,10 +21,10 @@ module.exports = {
|
|
21
21
|
changelogTitle: '# ESI SDK Changelog'
|
22
22
|
}],
|
23
23
|
['@semantic-release/exec', {
|
24
|
-
prepareCmd: "VERSION=${nextRelease.version} bundle exec rake set_version"
|
24
|
+
prepareCmd: "VERSION=${nextRelease.version} bundle exec rake set_version && bundle install"
|
25
25
|
}],
|
26
26
|
['@semantic-release/git', {
|
27
|
-
assets: ['CHANGELOG.md', 'lib/esi/version.rb']
|
27
|
+
assets: ['CHANGELOG.md', 'Gemfile.lock', 'lib/esi/version.rb']
|
28
28
|
}],
|
29
29
|
['@semantic-release/exec', {
|
30
30
|
publishCmd: "bundle exec rake build release:rubygem_push"
|