eve_online 0.18.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -1
  3. data/Gemfile.lock +3 -7
  4. data/Gemfile.mutant.lock +20 -24
  5. data/README.md +208 -52
  6. data/TODO.md +2 -2
  7. data/eve_online.gemspec +1 -2
  8. data/lib/eve_online.rb +62 -35
  9. data/lib/eve_online/esi/alliance_corporations.rb +1 -1
  10. data/lib/eve_online/esi/alliances.rb +1 -1
  11. data/lib/eve_online/esi/ancestries.rb +1 -1
  12. data/lib/eve_online/esi/base.rb +72 -36
  13. data/lib/eve_online/esi/bloodlines.rb +1 -1
  14. data/lib/eve_online/esi/character_assets.rb +0 -4
  15. data/lib/eve_online/esi/character_assets_locations.rb +43 -0
  16. data/lib/eve_online/esi/character_assets_names.rb +43 -0
  17. data/lib/eve_online/esi/character_blueprints.rb +0 -4
  18. data/lib/eve_online/esi/character_bookmark_folders.rb +0 -4
  19. data/lib/eve_online/esi/character_bookmarks.rb +0 -4
  20. data/lib/eve_online/esi/character_implants.rb +1 -1
  21. data/lib/eve_online/esi/character_killmails_recent.rb +0 -4
  22. data/lib/eve_online/esi/character_wallet_journal.rb +0 -4
  23. data/lib/eve_online/esi/corporation_blueprints.rb +0 -4
  24. data/lib/eve_online/esi/corporation_industry_jobs.rb +0 -4
  25. data/lib/eve_online/esi/corporation_killmails_recent.rb +0 -4
  26. data/lib/eve_online/esi/corporation_orders.rb +0 -4
  27. data/lib/eve_online/esi/dogma_attributes.rb +1 -1
  28. data/lib/eve_online/esi/dogma_effect.rb +41 -0
  29. data/lib/eve_online/esi/dogma_effects.rb +19 -0
  30. data/lib/eve_online/esi/factions.rb +1 -1
  31. data/lib/eve_online/esi/models/asset_location.rb +23 -0
  32. data/lib/eve_online/esi/models/asset_name.rb +24 -0
  33. data/lib/eve_online/esi/models/constellation.rb +4 -15
  34. data/lib/eve_online/esi/models/dogma_attribute_short.rb +24 -0
  35. data/lib/eve_online/esi/models/dogma_attributes.rb +21 -0
  36. data/lib/eve_online/esi/models/dogma_effect.rb +118 -0
  37. data/lib/eve_online/esi/models/dogma_effect_modifier.rb +44 -0
  38. data/lib/eve_online/esi/models/dogma_effect_modifiers.rb +21 -0
  39. data/lib/eve_online/esi/models/dogma_effect_short.rb +24 -0
  40. data/lib/eve_online/esi/models/dogma_effects.rb +21 -0
  41. data/lib/eve_online/esi/models/position.rb +29 -0
  42. data/lib/eve_online/esi/models/type.rb +8 -2
  43. data/lib/eve_online/esi/races.rb +1 -1
  44. data/lib/eve_online/esi/universe_constellation.rb +3 -3
  45. data/lib/eve_online/esi/universe_constellations.rb +1 -1
  46. data/lib/eve_online/esi/universe_region.rb +1 -1
  47. data/lib/eve_online/esi/universe_regions.rb +1 -1
  48. data/lib/eve_online/esi/universe_systems.rb +1 -1
  49. data/lib/eve_online/esi/universe_type.rb +2 -2
  50. data/lib/eve_online/esi/universe_types.rb +1 -5
  51. data/lib/eve_online/esi/war_killmails.rb +0 -4
  52. data/lib/eve_online/esi/wars.rb +1 -1
  53. data/lib/eve_online/version.rb +1 -1
  54. metadata +17 -17
data/TODO.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # TODO
2
2
 
3
3
  * Fix MD024
4
- * Add caching (ETag)
5
4
  * Add corporation roles
6
5
  * Add caching timeout
7
- * Add translations
6
+ * Add 420 error status
7
+ * Add errors limits
data/eve_online.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
 
13
13
  spec.summary = 'EveOnline ESI API.'
14
14
  spec.description = 'EveOnline ESI API.'
15
- spec.homepage = 'https://github.com/biow0lf/eve_online'
15
+ spec.homepage = 'https://github.com/evemonk/eve_online'
16
16
  spec.license = 'MIT'
17
17
 
18
18
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|bin)/}) }
@@ -30,7 +30,6 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'mdl'
31
31
 
32
32
  spec.add_runtime_dependency 'activesupport', '>= 4.2.0'
33
- spec.add_runtime_dependency 'faraday'
34
33
  spec.add_runtime_dependency 'json'
35
34
  spec.add_runtime_dependency 'memoist'
36
35
  end
data/lib/eve_online.rb CHANGED
@@ -17,67 +17,87 @@ require 'eve_online/exceptions/no_content'
17
17
  # ESI API
18
18
  require 'eve_online/esi/base'
19
19
 
20
- require 'eve_online/esi/character'
21
- require 'eve_online/esi/character_portrait'
22
- require 'eve_online/esi/character_skills'
23
- require 'eve_online/esi/character_skill_queue'
24
- require 'eve_online/esi/character_loyalty_points'
25
- require 'eve_online/esi/character_wallet'
26
- require 'eve_online/esi/character_wallet_journal'
20
+ require 'eve_online/esi/alliances'
21
+ require 'eve_online/esi/alliance'
22
+ require 'eve_online/esi/alliance_corporations'
23
+ require 'eve_online/esi/alliance_icon'
24
+
27
25
  require 'eve_online/esi/character_assets'
28
- require 'eve_online/esi/character_attributes'
29
- require 'eve_online/esi/character_location'
30
- require 'eve_online/esi/character_ship'
31
- require 'eve_online/esi/character_industry_jobs'
32
- require 'eve_online/esi/character_clones'
33
- require 'eve_online/esi/character_implants'
34
- require 'eve_online/esi/character_blueprints'
35
- require 'eve_online/esi/character_standings'
36
- require 'eve_online/esi/character_fatigue'
37
- require 'eve_online/esi/character_online'
38
- require 'eve_online/esi/character_orders'
26
+ require 'eve_online/esi/character_assets_locations'
27
+ require 'eve_online/esi/character_assets_names'
28
+
39
29
  require 'eve_online/esi/character_bookmarks'
40
30
  require 'eve_online/esi/character_bookmark_folders'
41
- require 'eve_online/esi/character_notifications'
31
+
42
32
  require 'eve_online/esi/character_calendar'
43
- require 'eve_online/esi/character_killmails_recent'
44
33
 
45
- require 'eve_online/esi/market_history'
34
+ require 'eve_online/esi/character'
35
+ require 'eve_online/esi/character_blueprints'
36
+ require 'eve_online/esi/character_fatigue'
37
+ require 'eve_online/esi/character_notifications'
38
+ require 'eve_online/esi/character_portrait'
39
+ require 'eve_online/esi/character_standings'
40
+
41
+ require 'eve_online/esi/character_clones'
42
+ require 'eve_online/esi/character_implants'
46
43
 
47
44
  require 'eve_online/esi/corporation'
48
- require 'eve_online/esi/corporation_industry_jobs'
49
45
  require 'eve_online/esi/corporation_blueprints'
50
- require 'eve_online/esi/corporation_orders'
51
- require 'eve_online/esi/corporation_killmails_recent'
52
-
53
- require 'eve_online/esi/alliances'
54
- require 'eve_online/esi/alliance'
55
- require 'eve_online/esi/alliance_corporations'
56
- require 'eve_online/esi/alliance_icon'
57
46
 
58
47
  require 'eve_online/esi/dogma_attributes'
59
48
  require 'eve_online/esi/dogma_attribute'
49
+ require 'eve_online/esi/dogma_effects'
50
+ require 'eve_online/esi/dogma_effect'
51
+
52
+ require 'eve_online/esi/character_industry_jobs'
53
+ require 'eve_online/esi/corporation_industry_jobs'
54
+
55
+ require 'eve_online/esi/character_killmails_recent'
56
+ require 'eve_online/esi/corporation_killmails_recent'
57
+
58
+ require 'eve_online/esi/character_location'
59
+ require 'eve_online/esi/character_online'
60
+ require 'eve_online/esi/character_ship'
61
+
62
+ require 'eve_online/esi/character_loyalty_points'
63
+
64
+ require 'eve_online/esi/character_orders'
65
+ require 'eve_online/esi/corporation_orders'
66
+ require 'eve_online/esi/market_history'
67
+
68
+ require 'eve_online/esi/character_attributes'
69
+ require 'eve_online/esi/character_skill_queue'
70
+ require 'eve_online/esi/character_skills'
60
71
 
61
72
  require 'eve_online/esi/server_status'
62
- require 'eve_online/esi/races'
73
+
74
+ require 'eve_online/esi/ancestries'
63
75
  require 'eve_online/esi/bloodlines'
76
+ require 'eve_online/esi/universe_constellations'
77
+ require 'eve_online/esi/universe_constellation'
64
78
  require 'eve_online/esi/factions'
65
- require 'eve_online/esi/ancestries'
66
- require 'eve_online/esi/universe_types'
67
- require 'eve_online/esi/universe_type'
79
+ require 'eve_online/esi/races'
68
80
  require 'eve_online/esi/universe_regions'
69
81
  require 'eve_online/esi/universe_region'
70
- require 'eve_online/esi/universe_constellations'
71
- require 'eve_online/esi/universe_constellation'
72
82
  require 'eve_online/esi/universe_systems'
83
+ require 'eve_online/esi/universe_types'
84
+ require 'eve_online/esi/universe_type'
85
+
86
+ require 'eve_online/esi/character_wallet'
87
+ require 'eve_online/esi/character_wallet_journal'
88
+
73
89
  require 'eve_online/esi/wars'
74
90
  require 'eve_online/esi/war_killmails'
75
91
 
92
+ # Models
76
93
  require 'eve_online/esi/models/base'
94
+ require 'eve_online/esi/models/position'
77
95
  require 'eve_online/esi/models/loyalty_point'
78
96
  require 'eve_online/esi/models/skill_queue_entry'
79
97
  require 'eve_online/esi/models/skill'
80
98
  require 'eve_online/esi/models/asset'
99
+ require 'eve_online/esi/models/asset_location'
100
+ require 'eve_online/esi/models/asset_name'
81
101
  require 'eve_online/esi/models/online'
82
102
  require 'eve_online/esi/models/attributes'
83
103
  require 'eve_online/esi/models/character'
@@ -110,6 +130,13 @@ require 'eve_online/esi/models/alliance_short'
110
130
  require 'eve_online/esi/models/alliance_icon'
111
131
 
112
132
  require 'eve_online/esi/models/dogma_attribute'
133
+ require 'eve_online/esi/models/dogma_attributes'
134
+ require 'eve_online/esi/models/dogma_attribute_short'
135
+ require 'eve_online/esi/models/dogma_effect'
136
+ require 'eve_online/esi/models/dogma_effects'
137
+ require 'eve_online/esi/models/dogma_effect_short'
138
+ require 'eve_online/esi/models/dogma_effect_modifier'
139
+ require 'eve_online/esi/models/dogma_effect_modifiers'
113
140
 
114
141
  require 'eve_online/esi/models/race'
115
142
  require 'eve_online/esi/models/bloodline'
@@ -13,7 +13,7 @@ module EveOnline
13
13
  @alliance_id = options.fetch(:alliance_id)
14
14
  end
15
15
 
16
- def corporations
16
+ def corporation_ids
17
17
  response
18
18
  end
19
19
 
@@ -5,7 +5,7 @@ module EveOnline
5
5
  class Alliances < Base
6
6
  API_ENDPOINT = 'https://esi.evetech.net/v1/alliances/?datasource=%<datasource>s'
7
7
 
8
- def alliances
8
+ def alliance_ids
9
9
  response
10
10
  end
11
11
 
@@ -3,7 +3,7 @@
3
3
  module EveOnline
4
4
  module ESI
5
5
  class Ancestries < Base
6
- API_ENDPOINT = 'https://esi.evetech.net/v1/universe/ancestries/?datasource=%<datasource>s&language=en-us'
6
+ API_ENDPOINT = 'https://esi.evetech.net/v1/universe/ancestries/?datasource=%<datasource>s'
7
7
 
8
8
  def ancestries
9
9
  output = []
@@ -1,23 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'net/http'
4
+ require 'openssl'
3
5
  require 'json'
4
6
  require 'memoist'
5
7
  require 'active_support/time'
6
- require 'faraday'
7
8
 
8
9
  module EveOnline
9
10
  module ESI
10
11
  class Base
11
12
  extend Memoist
12
13
 
13
- attr_reader :token, :parser, :_read_timeout, :_open_timeout, :datasource
14
+ attr_reader :token, :parser, :_read_timeout, :_open_timeout, :etag,
15
+ :datasource, :language
14
16
 
15
17
  def initialize(options = {})
16
- @token = options[:token]
17
- @parser = options[:parser] || JSON
18
- @_read_timeout = options[:read_timeout] || 60
19
- @_open_timeout = options[:open_timeout] || 60
20
- @datasource = options[:datasource] || 'tranquility'
18
+ @token = options.fetch(:token, nil)
19
+ @parser = options.fetch(:parser, JSON)
20
+ @_read_timeout = options.fetch(:read_timeout, 60)
21
+ @_open_timeout = options.fetch(:open_timeout, 60)
22
+ @etag = options.fetch(:etag, nil)
23
+ @datasource = options.fetch(:datasource, 'tranquility')
24
+ @language = options.fetch(:language, 'en-us')
21
25
  end
22
26
 
23
27
  def url
@@ -29,80 +33,112 @@ module EveOnline
29
33
  end
30
34
 
31
35
  def user_agent
32
- "EveOnline API (https://github.com/biow0lf/eve_online) v#{ VERSION }"
36
+ "EveOnline API (https://github.com/evemonk/eve_online) v#{ VERSION }"
37
+ end
38
+
39
+ def http_method
40
+ 'Get'
33
41
  end
34
42
 
35
43
  def read_timeout
36
- client.options.timeout
44
+ client.read_timeout
37
45
  end
38
46
 
39
47
  def read_timeout=(value)
40
- client.options.timeout = value
48
+ client.read_timeout = value
41
49
  end
42
50
 
43
51
  def open_timeout
44
- client.options.open_timeout
52
+ client.open_timeout
45
53
  end
46
54
 
47
55
  def open_timeout=(value)
48
- client.options.open_timeout = value
56
+ client.open_timeout = value
57
+ end
58
+
59
+ def current_etag
60
+ resource.header['Etag']&.gsub('"', '')
49
61
  end
50
62
 
51
63
  def page; end
52
64
 
53
- # def total_pages
54
- # resource.headers['x-pages']&.to_i
55
- # end
65
+ def total_pages
66
+ resource.header['X-Pages']&.to_i
67
+ end
56
68
 
57
69
  def client
58
70
  @client ||= begin
59
- faraday = Faraday.new
71
+ http = Net::HTTP.new(uri.host, uri.port)
72
+ http.read_timeout = _read_timeout
73
+ http.open_timeout = _open_timeout
74
+ http.use_ssl = true
75
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
76
+ # http.set_debug_output($stdout)
77
+ http
78
+ end
79
+ end
60
80
 
61
- faraday.headers[:user_agent] = user_agent
62
- faraday.authorization(:Bearer, token) if token
63
- faraday.options.timeout = _read_timeout
64
- faraday.options.open_timeout = _open_timeout
65
- faraday
81
+ def request
82
+ @request ||= begin
83
+ request = "Net::HTTP::#{ http_method }".constantize.new(uri.request_uri)
84
+
85
+ request['User-Agent'] = user_agent
86
+ request['Accept'] = 'application/json'
87
+ request['Accept-Language'] = language
88
+ request['Authorization'] = "Bearer #{ token }" if token
89
+ request['If-None-Match'] = "\"#{ etag }\"" if etag
90
+ request['Content-Type'] = 'application/json' if http_method == 'Post'
91
+ request.body = payload if http_method == 'Post'
92
+
93
+ request
66
94
  end
67
95
  end
68
96
 
97
+ def uri
98
+ @uri ||= URI.parse(url)
99
+ end
100
+
69
101
  def resource
70
- @resource ||= client.get(url)
102
+ @resource ||= client.request(request)
103
+ end
104
+
105
+ def no_content?
106
+ resource.is_a?(Net::HTTPNotModified)
71
107
  end
72
108
 
73
109
  def content
74
- case resource.status
75
- when 200
110
+ case resource
111
+ when Net::HTTPOK
76
112
  resource.body
77
- when 201
113
+ when Net::HTTPCreated
78
114
  # TODO: write
79
115
  raise NotImplementedError
80
- when 204
116
+ when Net::HTTPNoContent
81
117
  # TODO: write
82
118
  # raise NotImplementedError
83
119
  raise EveOnline::Exceptions::NoContent
84
- when 304
85
- # TODO: write
120
+ when Net::HTTPNotModified
121
+ # TODO: write etag support
86
122
  raise NotImplementedError
87
- when 400
123
+ when Net::HTTPBadRequest
88
124
  raise EveOnline::Exceptions::BadRequest
89
- when 401
125
+ when Net::HTTPUnauthorized
90
126
  raise EveOnline::Exceptions::Unauthorized
91
- when 403
127
+ when Net::HTTPForbidden
92
128
  raise EveOnline::Exceptions::Forbidden
93
- when 404
129
+ when Net::HTTPNotFound
94
130
  raise EveOnline::Exceptions::ResourceNotFound
95
- when 500
131
+ when Net::HTTPInternalServerError
96
132
  raise EveOnline::Exceptions::InternalServerError
97
- when 502
133
+ when Net::HTTPBadGateway
98
134
  raise EveOnline::Exceptions::BadGateway
99
- when 503
135
+ when Net::HTTPServiceUnavailable
100
136
  raise EveOnline::Exceptions::ServiceUnavailable
101
137
  else
102
138
  # raise EveOnline::Exceptions::UnknownStatus
103
139
  raise NotImplementedError
104
140
  end
105
- rescue Faraday::TimeoutError
141
+ rescue Net::OpenTimeout, Net::ReadTimeout
106
142
  raise EveOnline::Exceptions::Timeout
107
143
  end
108
144
  memoize :content
@@ -3,7 +3,7 @@
3
3
  module EveOnline
4
4
  module ESI
5
5
  class Bloodlines < Base
6
- API_ENDPOINT = 'https://esi.evetech.net/v1/universe/bloodlines/?datasource=%<datasource>s&language=en-us'
6
+ API_ENDPOINT = 'https://esi.evetech.net/v1/universe/bloodlines/?datasource=%<datasource>s'
7
7
 
8
8
  def bloodlines
9
9
  output = []
@@ -23,10 +23,6 @@ module EveOnline
23
23
  end
24
24
  memoize :assets
25
25
 
26
- def total_pages
27
- resource.headers['x-pages']&.to_i
28
- end
29
-
30
26
  def scope
31
27
  'esi-assets.read_assets.v1'
32
28
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EveOnline
4
+ module ESI
5
+ class CharacterAssetsLocations < Base
6
+ API_ENDPOINT = 'https://esi.evetech.net/v2/characters/%<character_id>s/assets/locations/?datasource=%<datasource>s'
7
+
8
+ attr_reader :character_id, :item_ids
9
+
10
+ def initialize(options)
11
+ super
12
+
13
+ @character_id = options.fetch(:character_id)
14
+ @item_ids = options.fetch(:item_ids)
15
+ end
16
+
17
+ def assets_locations
18
+ output = []
19
+ response.each do |asset_location|
20
+ output << Models::AssetLocation.new(asset_location)
21
+ end
22
+ output
23
+ end
24
+ memoize :assets_locations
25
+
26
+ def http_method
27
+ 'Post'
28
+ end
29
+
30
+ def payload
31
+ item_ids.to_json
32
+ end
33
+
34
+ def scope
35
+ 'esi-assets.read_assets.v1'
36
+ end
37
+
38
+ def url
39
+ format(API_ENDPOINT, character_id: character_id, datasource: datasource)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EveOnline
4
+ module ESI
5
+ class CharacterAssetsNames < Base
6
+ API_ENDPOINT = 'https://esi.evetech.net/v1/characters/%<character_id>s/assets/names/?datasource=%<datasource>s'
7
+
8
+ attr_reader :character_id, :item_ids
9
+
10
+ def initialize(options)
11
+ super
12
+
13
+ @character_id = options.fetch(:character_id)
14
+ @item_ids = options.fetch(:item_ids)
15
+ end
16
+
17
+ def assets_names
18
+ output = []
19
+ response.each do |asset_name|
20
+ output << Models::AssetName.new(asset_name)
21
+ end
22
+ output
23
+ end
24
+ memoize :assets_names
25
+
26
+ def http_method
27
+ 'Post'
28
+ end
29
+
30
+ def payload
31
+ item_ids.to_json
32
+ end
33
+
34
+ def scope
35
+ 'esi-assets.read_assets.v1'
36
+ end
37
+
38
+ def url
39
+ format(API_ENDPOINT, character_id: character_id, datasource: datasource)
40
+ end
41
+ end
42
+ end
43
+ end