eve_online 0.18.0 → 0.19.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.
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