eve_badger 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6d466155cb066385f95d91b504852a9e926229b7
4
- data.tar.gz: f20836c0e7d123b9d3f841300b1178ec38eded52
3
+ metadata.gz: 7106375fe68a66fd53f03bff72a195bd64d98e7b
4
+ data.tar.gz: 3c1a5413f29c173d50dd79d2ec8393e129014e0a
5
5
  SHA512:
6
- metadata.gz: a6309c1516bf5e704f878ba241e9480d47ab9609e4be1e48404c19fdeb39c05c8dd3dc11e21edec7c96837591abc9bb338fa115c9bfb15bc77e7ec13e7deb97c
7
- data.tar.gz: 85a43012be2168f6f89e11a79be09a60054467445a9974619d882fb054c2383d1bd1dbdec8e2f8a8827e51f1313105ad333bcb430faed7aa9248055a37849dc6
6
+ metadata.gz: 8e45cc78bef49f7b6afaca5bbc2ca6cf1a3a902f840bef7caf9a76cce47ccbbf734e074357dceb0c7a06d0be4d7b267674a78a6bce3a1c761959fe41a50666f3
7
+ data.tar.gz: b62c670fd8059cbf02ada0e30b93e7917ee64430970d47e2c12ac98477731300f81214f1042e08c4ed891fbc40d26757e0b740cd241fc06bde49a1a2aa8ba73e
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.4
@@ -9,14 +9,17 @@ module EveBadger
9
9
  @version ||= File.read(File.expand_path(File.join(File.dirname(__FILE__), '..', 'VERSION'))).chomp
10
10
  end
11
11
 
12
+ # provides the default user agent for EveAPI objects, it's a good idea to customize your user agent string to identify your application
12
13
  def self.default_user_agent
13
14
  "EveBadger-#{EveBadger.version}/Ruby-#{RUBY_VERSION}"
14
15
  end
15
16
 
17
+ # provides the default domain for the tranquility (live game server) api
16
18
  def self.default_tq_domain
17
19
  'https://api.eveonline.com/'
18
20
  end
19
21
 
22
+ # provides the detault domain for the singularity (public test server, nicknamed "sisi") api
20
23
  def self.default_sisi_domain
21
24
  'https://api.testeveonline.com/'
22
25
  end
@@ -18,18 +18,22 @@ module EveBadger
18
18
  @cache = Moneta.new(*args, **kwargs)
19
19
  end
20
20
 
21
+ # disable request caching
21
22
  def self.disable
22
23
  @cache = nil
23
24
  end
24
25
 
26
+ # test whether request caching is enabled
25
27
  def self.enabled?
26
28
  @cache ? true : false
27
29
  end
28
30
 
31
+ # return the class type of the enabled cache, caches adapters which don't natively support expiration will all appear as Moneta::Expires
29
32
  def self.type
30
33
  @cache.class
31
34
  end
32
35
 
36
+ # store a value in the cache if it is enabled
33
37
  def self.store(key, value, options={})
34
38
  if @cache
35
39
  @cache.store(key, value, options)
@@ -38,6 +42,7 @@ module EveBadger
38
42
  end
39
43
  end
40
44
 
45
+ # retrieve a value from the cache it if is enabled
41
46
  def self.get(key)
42
47
  if @cache
43
48
  @cache[key]
@@ -4,52 +4,63 @@ module EveBadger
4
4
  class Endpoint
5
5
  attr_reader :path, :access_mask, :detail_id
6
6
 
7
+ # initialize with :path, :access_mask and optionally :detail_id
7
8
  def initialize(data)
8
9
  @path = data[:path]
9
10
  @access_mask = data[:access_mask]
10
11
  @detail_id = data[:detail_id] if data[:detail_id]
11
12
  end
12
13
 
14
+ # test whether a given api key bitmask is sufficient to make a request against this endpoint
13
15
  def permitted?(other_mask)
14
16
  @access_mask.zero? or (other_mask & @access_mask != 0)
15
17
  end
16
18
  end
17
19
 
20
+ # loads endpoint data from JSON files packaged with the gem, these JSON files are easily edited if API endpoints are added or changed in the future
18
21
  module Endpoints
22
+ # load account endpoint data
19
23
  open(File.join(File.dirname(__FILE__), 'json', 'account_endpoints.json'), 'r') do |file|
20
24
  @account_endpoints = JSON.parse(file.read.to_s, :symbolize_names => true)
21
25
  end
22
26
 
27
+ # load character endpoint data
23
28
  open(File.join(File.dirname(__FILE__), 'json', 'character_endpoints.json'), 'r') do |file|
24
29
  @character_endpoints = JSON.parse(file.read.to_s, :symbolize_names => true)
25
30
  end
26
31
 
32
+ # load corporation endpoint data
27
33
  open(File.join(File.dirname(__FILE__), 'json', 'corporation_endpoints.json'), 'r') do |file|
28
34
  @corporation_endpoints = JSON.parse(file.read.to_s, :symbolize_names => true)
29
35
  end
30
36
 
37
+ # load detail endpoint data
31
38
  open(File.join(File.dirname(__FILE__), 'json', 'detail_endpoints.json'), 'r') do |file|
32
39
  @detail_endpoints = JSON.parse(file.read.to_s, :symbolize_names => true)
33
40
  end
34
41
 
42
+ # takes an account endpoint name and returns an endpoint data object
35
43
  def self.account(endpoint)
36
44
  data = @account_endpoints[endpoint]
37
45
  raise ArgumentError, "unsupported endpoint: #{endpoint}" unless data
38
46
  Endpoint.new(data)
39
47
  end
40
48
 
49
+ # takes a character endpoint name and returns an endpoint data object
41
50
  def self.character(endpoint)
42
51
  data = @character_endpoints[endpoint]
43
52
  raise ArgumentError, "unsupported endpoint: #{endpoint}" unless data
44
53
  Endpoint.new(data)
45
54
  end
46
55
 
56
+ # takes a corporation endpoint name and returns an endpoint data object
47
57
  def self.corporation(endpoint)
48
58
  data = @corporation_endpoints[endpoint]
49
59
  raise ArgumentError, "unsupported endpoint: #{endpoint}" unless data
50
60
  Endpoint.new(data)
51
61
  end
52
62
 
63
+ # takes a detail endpoint name and returns an endpoint data object
53
64
  def self.detail(endpoint)
54
65
  data = @detail_endpoints[endpoint]
55
66
  raise ArgumentError, "unsupported endpoint: #{endpoint}" unless data
@@ -18,40 +18,49 @@ module EveBadger
18
18
  @key_type = args[:key_type].to_sym if args[:key_type]
19
19
  end
20
20
 
21
+ # sets key_it, coerces to string
21
22
  def key_id=(id)
22
23
  @key_id = id ? id.to_s : nil
23
24
  end
24
25
 
26
+ # sets vcode, coerces to string
25
27
  def vcode=(code)
26
28
  @vcode = code ? code.to_s : nil
27
29
  end
28
30
 
31
+ # sets character_id, coerces to string
29
32
  def character_id=(id)
30
33
  @character_id = id ? id.to_s : nil
31
34
  end
32
35
 
36
+ # sets access_mask, coerces to integer
33
37
  def access_mask=(mask)
34
38
  @access_mask = mask ? mask.to_i : nil
35
39
  end
36
40
 
41
+ # sets key_type, coerces to symbol
37
42
  def key_type=(type)
38
43
  @key_type = type ? type.to_sym : nil
39
44
  end
40
45
 
46
+ # access or retrieve access_mask, will also set key_type if an automatic fetch is triggered
41
47
  def access_mask
42
48
  @access_mask ||= get_access_mask
43
49
  end
44
50
 
51
+ # access or retrieve key_type, will also set access_mask if an automatic fetch is triggered
45
52
  def key_type
46
53
  @key_type ||= get_key_type
47
54
  end
48
55
 
56
+ # takes an account endpoint name and returns a response object, raises an APIKeyError if the request would fail
49
57
  def account(endpoint_name)
50
58
  raise EveBadger::APIKeyError, 'missing required key_id or vcode' unless @key_id && @vcode
51
59
  endpoint = EveBadger::Endpoints.account(endpoint_name.to_sym)
52
60
  api_request(endpoint)
53
61
  end
54
62
 
63
+ # takes a character endpoint name and returns a response object, raises an APIKeyError if the request would fail
55
64
  def character(endpoint_name)
56
65
  raise EveBadger::APIKeyError, 'missing required character_id key_id or_vcode' unless @character_id && @key_id && @vcode
57
66
  raise EveBadger::APIKeyError, 'wrong key type' unless [:Character, :Account].include?(key_type)
@@ -59,6 +68,7 @@ module EveBadger
59
68
  api_request(endpoint)
60
69
  end
61
70
 
71
+ # takes a corporation endpoint name and returns a response object, raises an APIKeyError if the request would fail
62
72
  def corporation(endpoint_name)
63
73
  raise EveBadger::APIKeyError, 'missing required character_id key_id or_vcode' unless @character_id && @key_id && @vcode
64
74
  raise EveBadger::APIKeyError, 'wrong key type' unless key_type == :Corporation
@@ -66,6 +76,7 @@ module EveBadger
66
76
  api_request(endpoint)
67
77
  end
68
78
 
79
+ # takes a detail endpoint name and id of interest then returns a response from the given endpoint name, raises an APIKeyError if the request would fail
69
80
  def details(endpoint_name, id_of_interest, fromid=nil, rowcount=nil)
70
81
  raise EveBadger::APIKeyError, 'wrong key type' unless [:Character, :Corporation, :Account].include?(key_type)
71
82
  endpoint = EveBadger::Endpoints.detail(endpoint_name.to_sym)
@@ -81,6 +92,7 @@ module EveBadger
81
92
  end
82
93
 
83
94
  private
95
+ # takes an endpoint hash and makes an api request to it, raises an APIKeyError if the request would fail
84
96
  def api_request(endpoint)
85
97
  if endpoint.access_mask.zero? or endpoint.permitted?(access_mask)
86
98
  get_response(build_uri(endpoint))
@@ -89,41 +101,49 @@ module EveBadger
89
101
  end
90
102
  end
91
103
 
104
+ # returns the access mask for a key and will retrieve it if not present
92
105
  def get_access_mask
93
106
  fetch_key_info unless @access_mask
94
107
  @access_mask
95
108
  end
96
109
 
110
+ # returns api key type as a symbol example: :Account, :Character, :Corporation
97
111
  def get_key_type
98
112
  fetch_key_info unless @key_type
99
113
  @key_type
100
114
  end
101
115
 
116
+ # sets @access_mask and @key_type from the public :api_key_info endpoint
102
117
  def fetch_key_info
103
118
  info = account(:api_key_info).result_as_json
104
119
  @access_mask = info['key']['@accessMask'].to_i
105
120
  @key_type = info['key']['@type'].to_sym
106
121
  end
107
122
 
123
+ # builds a uri string for a given endpoint
108
124
  def build_uri(endpoint)
109
125
  "#{@domain}#{endpoint.path}.xml.aspx#{params}"
110
126
  end
111
127
 
128
+ # builds the default params string for most requests
112
129
  def params
113
130
  "?keyID=#{@key_id}&vCode=#{@vcode}#{"&characterID=#{@character_id}" if @character_id}"
114
131
  end
115
132
 
133
+ # attempts to get a http response from the request cache first, then makes an http request if not found
116
134
  def get_response(uri)
117
135
  response = cache_get(uri) || http_get(uri)
118
136
  EveBadger::Response.new(response)
119
137
  end
120
138
 
139
+ # get an http response from the cache if is enabled, returns nil if expired or not found
121
140
  def cache_get(uri)
122
141
  if EveBadger::Cache.enabled?
123
142
  EveBadger::Cache.get(hash_of(uri))
124
143
  end
125
144
  end
126
145
 
146
+ # get a uri via http
127
147
  def http_get(uri)
128
148
  begin
129
149
  response = open(uri) { |res| res.read }
@@ -134,6 +154,7 @@ module EveBadger
134
154
  response || cache_get(uri)
135
155
  end
136
156
 
157
+ # store an http response in the cache if it is enabled
137
158
  def store_response(uri, response)
138
159
  if EveBadger::Cache.enabled?
139
160
  EveBadger::Cache.store(hash_of(uri), response, expires: cached_until(response))
@@ -145,6 +166,7 @@ module EveBadger
145
166
  Digest::SHA1.hexdigest(uri)
146
167
  end
147
168
 
169
+ # returns the number of seconds until the cachedUntil value in the xml response from the the API
148
170
  def cached_until(xml)
149
171
  noko = Nokogiri::XML xml
150
172
  seconds_until_expire = Time.parse(noko.xpath('//cachedUntil').text)
@@ -8,26 +8,27 @@ module EveBadger
8
8
  @content = content
9
9
  end
10
10
 
11
- # returns json in badgerfish notation
11
+ # returns the response content as ruby hash representing badgerfish notation JSON
12
12
  def as_json
13
13
  Badgerfish::Parser.new.load(@content)
14
14
  end
15
15
 
16
- # returns the response content as xml string
16
+ # returns the response content as raw XML which you can feed into your favorite parser
17
17
  def as_xml
18
18
  @content
19
19
  end
20
20
 
21
- # same as #as_xml but truncates to just <result> data
21
+ # same as #as_xml, but only returns the content of the <result> tag
22
22
  def result_as_xml
23
23
  Nokogiri::XML(@content).xpath("//result/*").to_s
24
24
  end
25
25
 
26
- # same as #as_json but truncates to just <result> data
26
+ # same as #as_json, but only returns the content of the <result> tag
27
27
  def result_as_json
28
28
  Badgerfish::Parser.new.load(@content)['eveapi']['result']
29
29
  end
30
30
 
31
+ # fetch any <error> tag in the document, helpful for api error checking
31
32
  def api_errors
32
33
  document = Nokogiri::XML(@content)
33
34
  document.xpath('//error')
@@ -2,24 +2,25 @@ require 'slowweb'
2
2
 
3
3
  module EveBadger
4
4
  module Throttle
5
+ # disable request throttling
5
6
  def self.disable
6
7
  SlowWeb.reset
7
8
  end
8
9
 
9
- # enables the default rate limit of 30 requests per minute which ccp expects users to obey
10
+ # enables the default rate limit of 30 requests per second
10
11
  def self.enable_default
11
- SlowWeb.limit(EveBadger.default_tq_domain, 30, 60)
12
- SlowWeb.limit(EveBadger.default_sisi_domain, 30, 60)
12
+ SlowWeb.limit(EveBadger.default_tq_domain, 30, 1)
13
+ SlowWeb.limit(EveBadger.default_sisi_domain, 30, 1)
13
14
  end
14
15
 
15
- #
16
- def self.enable_custom(requests_per_minute)
16
+ # set a custom rate limit if ccp has granted your application an exception
17
+ def self.enable_custom(requests_per_second)
17
18
  SlowWeb.reset
18
- SlowWeb.limit(EveBadger.default_tq_domain, requests_per_minute, 60)
19
- SlowWeb.limit(EveBadger.default_sisi_domain, requests_per_minute, 60)
19
+ SlowWeb.limit(EveBadger.default_tq_domain, requests_per_second, 1)
20
+ SlowWeb.limit(EveBadger.default_sisi_domain, requests_per_second, 1)
20
21
  end
21
22
 
22
-
23
+ # test if request throttling is currently enabled
23
24
  def self.enabled?
24
25
  if SlowWeb.get_limit(EveBadger.default_tq_domain) || SlowWeb.get_limit(EveBadger.default_sisi_domain)
25
26
  true
@@ -28,4 +29,4 @@ module EveBadger
28
29
  end
29
30
  end
30
31
  end
31
- end
32
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eve_badger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Corey Smedstad
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-15 00:00:00.000000000 Z
11
+ date: 2015-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 5.7.0
75
+ version: '5.7'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 5.7.0
82
+ version: '5.7'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: load_path
85
85
  requirement: !ruby/object:Gem::Requirement