eve 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +174 -0
- data/PostInstall.txt +6 -0
- data/README.rdoc +126 -0
- data/Rakefile +128 -0
- data/features/support/env.rb +1 -0
- data/lib/eve.rb +31 -0
- data/lib/eve/api.rb +247 -0
- data/lib/eve/api/connectivity.rb +39 -0
- data/lib/eve/api/request.rb +74 -0
- data/lib/eve/api/response.rb +100 -0
- data/lib/eve/api/response/inspection.rb +62 -0
- data/lib/eve/api/response/rowset.rb +56 -0
- data/lib/eve/api/response/rowsets.rb +42 -0
- data/lib/eve/api/response/wrap_object.rb +15 -0
- data/lib/eve/api/services.rb +20 -0
- data/lib/eve/api/services/account.rb +12 -0
- data/lib/eve/api/services/character.rb +96 -0
- data/lib/eve/api/services/corporation.rb +150 -0
- data/lib/eve/api/services/eve.rb +76 -0
- data/lib/eve/api/services/map.rb +45 -0
- data/lib/eve/api/services/misc.rb +24 -0
- data/lib/eve/api/services/server.rb +20 -0
- data/lib/eve/core_extensions.rb +3 -0
- data/lib/eve/core_extensions/hash.rb +51 -0
- data/lib/eve/core_extensions/string.rb +11 -0
- data/lib/eve/dependencies.rb +18 -0
- data/lib/eve/errors.rb +129 -0
- data/lib/eve/errors/authentication_errors.rb +33 -0
- data/lib/eve/errors/internal_errors.rb +64 -0
- data/lib/eve/errors/miscellaneous_errors.rb +19 -0
- data/lib/eve/errors/user_input_errors.rb +62 -0
- data/lib/eve/helpers.rb +12 -0
- data/lib/eve/helpers/javascript_helper.rb +198 -0
- data/lib/eve/helpers/view_helper.rb +13 -0
- data/lib/eve/trust.rb +88 -0
- data/lib/eve/trust/controller_helpers.rb +90 -0
- data/lib/eve/trust/igb_interface.rb +88 -0
- data/lib/eve/trust/mime_types.rb +4 -0
- data/script/console +10 -0
- data/script/console.cmd +1 -0
- data/script/destroy +14 -0
- data/script/destroy.cmd +1 -0
- data/script/generate +14 -0
- data/script/generate.cmd +1 -0
- data/spec/lib/eve/api/calls/account/characters_spec.rb +22 -0
- data/spec/lib/eve/api/calls/character/account_balance_spec.rb +21 -0
- data/spec/lib/eve/api/calls/character/asset_list_spec.rb +23 -0
- data/spec/lib/eve/api/calls/character/character_sheet_spec.rb +51 -0
- data/spec/lib/eve/api/calls/character/fac_war_stats_spec.rb +31 -0
- data/spec/lib/eve/api/calls/character/industry_jobs_spec.rb +27 -0
- data/spec/lib/eve/api/calls/character/kill_log_spec.rb +27 -0
- data/spec/lib/eve/api/calls/character/mail_messages_spec.rb +21 -0
- data/spec/lib/eve/api/calls/character/mailing_lists_spec.rb +21 -0
- data/spec/lib/eve/api/calls/character/market_orders_spec.rb +21 -0
- data/spec/lib/eve/api/calls/character/medals_spec.rb +24 -0
- data/spec/lib/eve/api/calls/character/research_spec.rb +21 -0
- data/spec/lib/eve/api/calls/character/skill_in_training_spec.rb +44 -0
- data/spec/lib/eve/api/calls/character/skill_queue_spec.rb +21 -0
- data/spec/lib/eve/api/calls/character/standings_spec.rb +26 -0
- data/spec/lib/eve/api/calls/character/wallet_journal_spec.rb +21 -0
- data/spec/lib/eve/api/calls/character/wallet_transactions_spec.rb +21 -0
- data/spec/lib/eve/api/calls/character_portrait_spec.rb +17 -0
- data/spec/lib/eve/api/calls/corporation/account_balances_spec.rb +21 -0
- data/spec/lib/eve/api/calls/corporation/asset_list_spec.rb +25 -0
- data/spec/lib/eve/api/calls/corporation/container_log_spec.rb +23 -0
- data/spec/lib/eve/api/calls/corporation/corporation_sheet_spec.rb +36 -0
- data/spec/lib/eve/api/calls/corporation/fac_war_stats_spec.rb +23 -0
- data/spec/lib/eve/api/calls/corporation/industry_jobs_spec.rb +30 -0
- data/spec/lib/eve/api/calls/corporation/kill_log_spec.rb +27 -0
- data/spec/lib/eve/api/calls/corporation/market_orders_spec.rb +22 -0
- data/spec/lib/eve/api/calls/corporation/medals_spec.rb +21 -0
- data/spec/lib/eve/api/calls/corporation/member_medals_spec.rb +21 -0
- data/spec/lib/eve/api/calls/corporation/member_security_log_spec.rb +24 -0
- data/spec/lib/eve/api/calls/corporation/member_security_spec.rb +25 -0
- data/spec/lib/eve/api/calls/corporation/member_tracking_spec.rb +22 -0
- data/spec/lib/eve/api/calls/corporation/shareholders_spec.rb +23 -0
- data/spec/lib/eve/api/calls/corporation/standings_spec.rb +30 -0
- data/spec/lib/eve/api/calls/corporation/starbase_detail_spec.rb +32 -0
- data/spec/lib/eve/api/calls/corporation/starbase_list_spec.rb +22 -0
- data/spec/lib/eve/api/calls/corporation/titles_spec.rb +26 -0
- data/spec/lib/eve/api/calls/corporation/wallet_journal_spec.rb +22 -0
- data/spec/lib/eve/api/calls/corporation/wallet_transactions_spec.rb +22 -0
- data/spec/lib/eve/api/calls/empty_call_spec.rb +29 -0
- data/spec/lib/eve/api/calls/eve/alliance_list_spec.rb +26 -0
- data/spec/lib/eve/api/calls/eve/certificate_tree_spec.rb +18 -0
- data/spec/lib/eve/api/calls/eve/character_id_spec.rb +27 -0
- data/spec/lib/eve/api/calls/eve/conquerable_station_list_spec.rb +11 -0
- data/spec/lib/eve/api/calls/eve/error_list_spec.rb +21 -0
- data/spec/lib/eve/api/calls/eve/fac_war_stats_spec.rb +25 -0
- data/spec/lib/eve/api/calls/eve/fac_war_top_stats_spec.rb +54 -0
- data/spec/lib/eve/api/calls/eve/ref_types_spec.rb +11 -0
- data/spec/lib/eve/api/calls/eve/skill_tree_spec.rb +17 -0
- data/spec/lib/eve/api/calls/map/fac_war_systems_spec.rb +11 -0
- data/spec/lib/eve/api/calls/map/jumps_spec.rb +11 -0
- data/spec/lib/eve/api/calls/map/kills_spec.rb +15 -0
- data/spec/lib/eve/api/calls/map/sovereignty_spec.rb +11 -0
- data/spec/lib/eve/api/calls/server_status_spec.rb +24 -0
- data/spec/lib/eve/api/request_spec.rb +17 -0
- data/spec/lib/eve/api/response/error_spec.rb +13 -0
- data/spec/lib/eve/api/response/rowset_spec.rb +28 -0
- data/spec/lib/eve/api/response_spec.rb +79 -0
- data/spec/lib/eve/api_spec.rb +13 -0
- data/spec/lib/eve/core_extensions/hash_spec.rb +23 -0
- data/spec/lib/eve/core_extensions/string_spec.rb +8 -0
- data/spec/lib/eve/helpers/javascript_helper_spec.rb +80 -0
- data/spec/lib/eve/helpers/view_helper_spec.rb +12 -0
- data/spec/lib/eve/trust/controller_helpers_spec.rb +70 -0
- data/spec/lib/eve/trust/igb_interface_spec.rb +102 -0
- data/spec/rcov.opts +2 -0
- data/spec/readme_spec.rb +36 -0
- data/spec/sample_api_key.yml +20 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/behaves_like_rowset.rb +50 -0
- data/spec/support/controllers/trust_controller.rb +7 -0
- data/spec/support/jpg/mock_portrait.jpg +0 -0
- data/spec/support/mock_api_helpers.rb +41 -0
- data/spec/support/xml/account/characters.xml +15 -0
- data/spec/support/xml/character/account_balance.xml +10 -0
- data/spec/support/xml/character/asset_list.xml +50 -0
- data/spec/support/xml/character/character_sheet.xml +65 -0
- data/spec/support/xml/character/fac_war_stats.xml +20 -0
- data/spec/support/xml/character/industry_jobs.xml +70 -0
- data/spec/support/xml/character/kill_log.xml +51 -0
- data/spec/support/xml/character/mail_messages.xml +12 -0
- data/spec/support/xml/character/mailing_lists.xml +12 -0
- data/spec/support/xml/character/market_orders.xml +11 -0
- data/spec/support/xml/character/medals.xml +13 -0
- data/spec/support/xml/character/research.xml +13 -0
- data/spec/support/xml/character/skill_in_training.xml +14 -0
- data/spec/support/xml/character/skill_not_in_training.xml +7 -0
- data/spec/support/xml/character/skill_queue.xml +11 -0
- data/spec/support/xml/character/standings.xml +32 -0
- data/spec/support/xml/character/wallet_journal.xml +39 -0
- data/spec/support/xml/character/wallet_transactions.xml +44 -0
- data/spec/support/xml/corporation/account_balance.xml +15 -0
- data/spec/support/xml/corporation/asset_list.xml +50 -0
- data/spec/support/xml/corporation/container_log.xml +32 -0
- data/spec/support/xml/corporation/fac_war_stats.xml +19 -0
- data/spec/support/xml/corporation/industry_jobs.xml +70 -0
- data/spec/support/xml/corporation/kill_log.xml +51 -0
- data/spec/support/xml/corporation/market_orders.xml +37 -0
- data/spec/support/xml/corporation/medals.xml +8 -0
- data/spec/support/xml/corporation/member_corporation_sheet.xml +51 -0
- data/spec/support/xml/corporation/member_medals.xml +10 -0
- data/spec/support/xml/corporation/member_security.xml +21 -0
- data/spec/support/xml/corporation/member_security_log.xml +55 -0
- data/spec/support/xml/corporation/member_tracking.xml +18 -0
- data/spec/support/xml/corporation/non_member_corporation_sheet.xml +30 -0
- data/spec/support/xml/corporation/shareholders.xml +11 -0
- data/spec/support/xml/corporation/standings.xml +33 -0
- data/spec/support/xml/corporation/starbase_detail.xml +33 -0
- data/spec/support/xml/corporation/starbase_list.xml +17 -0
- data/spec/support/xml/corporation/titles.xml +34 -0
- data/spec/support/xml/corporation/wallet_journal.xml +40 -0
- data/spec/support/xml/corporation/wallet_transactions.xml +12 -0
- data/spec/support/xml/errors/106.xml +5 -0
- data/spec/support/xml/errors/516.xml +5 -0
- data/spec/support/xml/eve/alliance_list.xml +22 -0
- data/spec/support/xml/eve/certificate_tree.xml +49 -0
- data/spec/support/xml/eve/character_id.xml +15 -0
- data/spec/support/xml/eve/conquerable_station_list.xml +24 -0
- data/spec/support/xml/eve/error_list.xml +78 -0
- data/spec/support/xml/eve/fac_war_stats.xml +31 -0
- data/spec/support/xml/eve/fac_war_top_stats.xml +238 -0
- data/spec/support/xml/eve/ref_types.xml +105 -0
- data/spec/support/xml/eve/skill_tree.xml +52 -0
- data/spec/support/xml/map/fac_war_systems.xml +180 -0
- data/spec/support/xml/map/jumps.xml +166 -0
- data/spec/support/xml/map/kills.xml +191 -0
- data/spec/support/xml/map/sovereignty.xml +20 -0
- data/spec/support/xml/rowset_with_mismatched_attributes.xml +6 -0
- data/spec/support/xml/server/server_status.xml +9 -0
- metadata +364 -0
data/lib/eve/api.rb
ADDED
@@ -0,0 +1,247 @@
|
|
1
|
+
require 'eve/api/request'
|
2
|
+
require 'eve/api/response'
|
3
|
+
require 'eve/api/services'
|
4
|
+
require 'eve/api/connectivity'
|
5
|
+
|
6
|
+
module Eve
|
7
|
+
# = Eve API Libraries
|
8
|
+
#
|
9
|
+
# EVE Online has made available various APIs which allow for querying the server for information about the server's
|
10
|
+
# current status, general game information such as skill and certificate trees, top player rankings, and the players
|
11
|
+
# and characters themselves. This library interfaces with that API to provide an intuitive way of retrieving this
|
12
|
+
# data.
|
13
|
+
#
|
14
|
+
# == The Basics
|
15
|
+
#
|
16
|
+
# There are two forms of authentication that the API uses: a limited API key and a full API key. For some information,
|
17
|
+
# such as the server's current status, no API key at all is required; for other information, such as which characters
|
18
|
+
# are owned by a particular user account, a limited API key will suffice. For more personal information, such as
|
19
|
+
# a character's transaction history, a full API key is required. Using an inappropriate or missing API key will result
|
20
|
+
# in an error being raised.
|
21
|
+
#
|
22
|
+
# === Instantiation & [Re]Configuration
|
23
|
+
# To interface with the Eve API, you need to instantiate the API object. This is simple:
|
24
|
+
# api = Eve::API.new
|
25
|
+
#
|
26
|
+
# If you plan to make use of information requiring an API key, you'll need to pass in those options:
|
27
|
+
# api = Eve::API.new(:user_id => 'a_user_id', :api_key => 'an_api_key')
|
28
|
+
#
|
29
|
+
# If you need to make use of Character-specific API calls, then you should also pass a +:character_id+ key. Same goes
|
30
|
+
# for Corporation-specific API calls: pass a +corporation_id+ key. If you don't know those yet (for instance, because
|
31
|
+
# you need the user to make a selection), then don't fret. You can always instantiate a new API object, or simply
|
32
|
+
# set the option directly on the API object you've already got:
|
33
|
+
# api.set(:character_id => 'a_character_id')
|
34
|
+
# # -or-
|
35
|
+
# api[:character_id] = 'a_character_id'
|
36
|
+
#
|
37
|
+
# === Making API Calls
|
38
|
+
# Actually retrieving information is just as straightforward as instantiation of the API object was, though the syntax
|
39
|
+
# does sometimes vary from one call to the next. Here's how to get the current server status:
|
40
|
+
# status = api.server_status
|
41
|
+
#
|
42
|
+
# And retrieving the list of characters belonging to :user_id is done like so:
|
43
|
+
# charlist = api.account.characters
|
44
|
+
#
|
45
|
+
# === List of API Calls
|
46
|
+
# This section is split into 3 subsections, one for each level of API key required for the call in question. This
|
47
|
+
# table assumes the presence of an "api" object, which is an instantiation of the API object as shown above. For
|
48
|
+
# more information on a particular subset of calls, including the exact return values, click on the corresponding
|
49
|
+
# class name to the left.
|
50
|
+
#
|
51
|
+
# ==== No API Key
|
52
|
+
# Eve::API::Services::Corporation:: api.corporation.corporation_sheet
|
53
|
+
# Eve::API::Services::Eve:: api.eve.alliance_list
|
54
|
+
# Eve::API::Services::Eve:: api.eve.certificate_tree
|
55
|
+
# Eve::API::Services::Eve:: api.eve.conquerable_station_list
|
56
|
+
# Eve::API::Services::Eve:: api.eve.error_list
|
57
|
+
# Eve::API::Services::Eve:: api.eve.fac_war_stats / api.eve.factional_warfare_stats
|
58
|
+
# Eve::API::Services::Eve:: api.eve.fac_war_top_stats / api.eve.factional_warfare_top100
|
59
|
+
# Eve::API::Services::Eve:: api.eve.character_name(*ids)
|
60
|
+
# Eve::API::Services::Eve:: api.eve.character_id(*names)
|
61
|
+
# Eve::API::Services::Eve:: api.eve.corporation_name(*ids)
|
62
|
+
# Eve::API::Services::Eve:: api.eve.corporation_id(*names)
|
63
|
+
# Eve::API::Services::Eve:: api.eve.alliance_name(*ids)
|
64
|
+
# Eve::API::Services::Eve:: api.eve.alliance_id(*names)
|
65
|
+
# Eve::API::Services::Eve:: api.eve.ref_types
|
66
|
+
# Eve::API::Services::Eve:: api.eve.skill_tree
|
67
|
+
# Eve::API::Services::Map:: api.map.fac_war_systems / api.map.contested_systems
|
68
|
+
# Eve::API::Services::Map:: api.map.sovereignty
|
69
|
+
# Eve::API::Services::Map:: api.map.kills
|
70
|
+
# Eve::API::Services::Map:: api.map.jumps
|
71
|
+
# Eve::API::Services::Misc:: api.misc.character_portrait
|
72
|
+
# Eve::API::Services::Server:: api.server.server_status
|
73
|
+
#
|
74
|
+
# ==== Limited API Key
|
75
|
+
# Eve::API::Services::Account:: api.account.characters
|
76
|
+
# Eve::API::Services::Character:: api.character.character_sheet
|
77
|
+
# Eve::API::Services::Character:: api.character.fac_war_stats
|
78
|
+
# Eve::API::Services::Character:: api.character.medals
|
79
|
+
# Eve::API::Services::Character:: api.character.skill_in_training
|
80
|
+
# Eve::API::Services::Character:: api.character.skill_queue
|
81
|
+
# Eve::API::Services::Character:: api.character.standings
|
82
|
+
# Eve::API::Services::Corporation:: api.corporation.corporation_sheet
|
83
|
+
# Eve::API::Services::Corporation:: api.corporation.fac_war_stats
|
84
|
+
# Eve::API::Services::Corporation:: api.corporation.medals
|
85
|
+
# Eve::API::Services::Corporation:: api.corporation.member_medals
|
86
|
+
#
|
87
|
+
# ==== Full API Key
|
88
|
+
# Eve::API::Services::Character:: api.character.account_balance
|
89
|
+
# Eve::API::Services::Character:: api.character.asset_list(version = nil)
|
90
|
+
# Eve::API::Services::Character:: api.character.industry_jobs
|
91
|
+
# Eve::API::Services::Character:: api.character.kill_log(options = {})
|
92
|
+
# Eve::API::Services::Character:: api.character.mailing_lists
|
93
|
+
# Eve::API::Services::Character:: api.character.mail_messages
|
94
|
+
# Eve::API::Services::Character:: api.character.market_orders
|
95
|
+
# Eve::API::Services::Character:: api.character.notifications
|
96
|
+
# Eve::API::Services::Character:: api.character.research
|
97
|
+
# Eve::API::Services::Character:: api.character.wallet_journal(account_key = 1000, options = {})
|
98
|
+
# Eve::API::Services::Character:: api.character.journal_entries(account_key = 1000, options = {})
|
99
|
+
# Eve::API::Services::Character:: api.character.wallet_transactions(options = {})
|
100
|
+
# Eve::API::Services::Corporation:: api.corporation.account_balance
|
101
|
+
# Eve::API::Services::Corporation:: api.corporation.asset_list
|
102
|
+
# Eve::API::Services::Corporation:: api.corporation.container_log
|
103
|
+
# Eve::API::Services::Corporation:: api.corporation.corporation_sheet(corporation_id = nil)
|
104
|
+
# Eve::API::Services::Corporation:: api.corporation.fac_war_stats
|
105
|
+
# Eve::API::Services::Corporation:: api.corporation.industry_jobs
|
106
|
+
# Eve::API::Services::Corporation:: api.corporation.kill_log(options = {})
|
107
|
+
# Eve::API::Services::Corporation:: api.corporation.market_orders
|
108
|
+
# Eve::API::Services::Corporation:: api.corporation.member_security
|
109
|
+
# Eve::API::Services::Corporation:: api.corporation.member_security_log
|
110
|
+
# Eve::API::Services::Corporation:: api.corporation.member_tracking
|
111
|
+
# Eve::API::Services::Corporation:: api.corporation.starbase_detail(item_id, version = 2)
|
112
|
+
# Eve::API::Services::Corporation:: api.corporation.starbase_list
|
113
|
+
# Eve::API::Services::Corporation:: api.corporation.shareholders
|
114
|
+
# Eve::API::Services::Corporation:: api.corporation.standings
|
115
|
+
# Eve::API::Services::Corporation:: api.corporation.titles
|
116
|
+
# Eve::API::Services::Corporation:: api.corporation.wallet_journal(account_key = 1000, options = {})
|
117
|
+
# Eve::API::Services::Corporation:: api.corporation.wallet_transactions(account_key = 1000, options = {})
|
118
|
+
#
|
119
|
+
# === Interpreting Responses
|
120
|
+
# Response objects are generated automatically, and should be able to accommodate any changes in the API reasonably
|
121
|
+
# well.
|
122
|
+
#
|
123
|
+
# The classes listed above attempt to document the API calls. However, if you are unsure of
|
124
|
+
# how to process the return value of a particular API call, don't be afraid to check it out directly:
|
125
|
+
# irb(main):004:0> puts api.server_status.to_yaml
|
126
|
+
# ---
|
127
|
+
# current_time: 2010-03-14T04:41:51+00:00
|
128
|
+
# cached_until: 2010-03-14T04:44:51+00:00
|
129
|
+
# online_players: 30694
|
130
|
+
# server_open: true
|
131
|
+
# api_version: "2"
|
132
|
+
#
|
133
|
+
# In this example, #server_status provides 5 fields: #api_version, #cached_until, #current_time, #online_players,
|
134
|
+
# and #server_open.
|
135
|
+
#
|
136
|
+
# Some fields in a given response are essentially arrays with some additional fields. These are called Rowsets. For
|
137
|
+
# instance, the call to +api.account.characters+, above, returned a response with a #characters method, which
|
138
|
+
# contained up to 3 characters. Each element, or Row, in a Rowset has in turn its own fields and/or Rowsets. Each
|
139
|
+
# character in this example includes a #character_id, #corporation_id, and #corporation_name.
|
140
|
+
#
|
141
|
+
# Additionally, all responses always have a #name field. For basic responses, the #name is "(Response)", and
|
142
|
+
# probably doesn't mean much to you. For Rowsets, the #name is the name of the Rowset (for example, "characters").
|
143
|
+
# For individual Rows, the #name might mean something more useful -- the name of a character, for instance.
|
144
|
+
#
|
145
|
+
class API
|
146
|
+
include Eve::API::Connectivity
|
147
|
+
include Eve::API::Services
|
148
|
+
attr_reader :options
|
149
|
+
attr_reader :map
|
150
|
+
|
151
|
+
def initialize(options = {})
|
152
|
+
@options = default_options.merge(options)
|
153
|
+
send_includes
|
154
|
+
instantiate_submodules
|
155
|
+
end
|
156
|
+
|
157
|
+
def set(key, value = nil)
|
158
|
+
raise "Key can't be nil" unless key
|
159
|
+
if key.kind_of?(Hash)
|
160
|
+
key.each { |k, v| set(k, v) }
|
161
|
+
else
|
162
|
+
if value then @options[key] = value
|
163
|
+
else @options.delete key
|
164
|
+
end
|
165
|
+
[@options[:submodules]].flatten.each do |sub|
|
166
|
+
self.send(sub).set(key, value) if sub
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def [](key); @options[key]; end
|
172
|
+
def []=(key, value); set(key, value); end
|
173
|
+
|
174
|
+
private
|
175
|
+
class << self
|
176
|
+
def validate_credentials(key_type, *args)
|
177
|
+
case key_type
|
178
|
+
when :limited, :full
|
179
|
+
args.flatten!
|
180
|
+
options = args.extract_options!
|
181
|
+
method_names = options.delete(:for)
|
182
|
+
raise ArgumentError, "Unexpected options: #{options.keys.inspect}" unless options.empty?
|
183
|
+
|
184
|
+
method_names.each do |method_name|
|
185
|
+
define_method "#{method_name}_with_credential_validation" do |*a|
|
186
|
+
validate_credentials(key_type, *args)
|
187
|
+
send("#{method_name}_without_credential_validation", *a)
|
188
|
+
end
|
189
|
+
alias_method_chain method_name, :credential_validation
|
190
|
+
end
|
191
|
+
|
192
|
+
else raise ArgumentError, "Expected :limited or :full credential type"
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def validate_credentials(type, *additional_requirements)
|
198
|
+
raise ArgumentError, "user_id is required" unless options[:user_id]
|
199
|
+
raise ArgumentError, "api_key is required" unless options[:api_key]
|
200
|
+
additional_requirements.each do |r|
|
201
|
+
raise ArgumentError, "#{r} is required" unless options[r]
|
202
|
+
end
|
203
|
+
|
204
|
+
case type
|
205
|
+
when :limited, :full # currently no difference. Wish we could validate on this.
|
206
|
+
else raise ArgumentError, "Expected :limited or :full credential type"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def validate_options(options, *keys)
|
211
|
+
options.keys.each do |key|
|
212
|
+
raise ArgumentError, "Options should only include #{keys.inspect}" unless keys.include?(key)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def send_includes
|
217
|
+
[@options[:includes]].flatten.each do |mod|
|
218
|
+
next unless mod
|
219
|
+
mod = mod.to_s unless mod.kind_of?(String)
|
220
|
+
eigenclass.send(:include, "::Eve::API::Services::#{mod.camelize}".constantize)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def instantiate_submodules
|
225
|
+
[@options[:submodules]].flatten.each do |mod|
|
226
|
+
next unless mod
|
227
|
+
instance_variable_set("@#{mod}", ::Eve::API.new(options.merge(:includes => mod, :submodules => nil)))
|
228
|
+
eigenclass.send(:attr_reader, mod)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def eigenclass
|
233
|
+
class << self; self; end
|
234
|
+
end
|
235
|
+
|
236
|
+
def default_options
|
237
|
+
{
|
238
|
+
:submodules => [:map, :eve, :account, :character, :corporation],
|
239
|
+
:cache => true
|
240
|
+
}
|
241
|
+
end
|
242
|
+
|
243
|
+
def cache_namespace
|
244
|
+
self.class.name.underscore
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Eve
|
2
|
+
class API
|
3
|
+
module Connectivity
|
4
|
+
MAX_JOURNAL_ENTRIES = 1000
|
5
|
+
|
6
|
+
def walk(walk_id, walk_association, options = {}, &block)
|
7
|
+
raise ArgumentError, "Requires :walk_id" if walk_id.blank?
|
8
|
+
raise ArgumentError, "Requires :walk_association" if walk_association.blank?
|
9
|
+
options[walk_id] ||= 0
|
10
|
+
return_value = yield options
|
11
|
+
array = return_value.send(walk_association)
|
12
|
+
if array.size >= MAX_JOURNAL_ENTRIES
|
13
|
+
begin
|
14
|
+
min_id = nil
|
15
|
+
primary_key = array.primary_key
|
16
|
+
array.each { |txn| min_id = txn.send(primary_key) if min_id.nil? || min_id > txn.send(primary_key) }
|
17
|
+
array.concat walk(walk_id, options.merge(walk_id => min_id), &block).send(walk_association)
|
18
|
+
rescue Eve::Errors::UserInputErrors::InvalidBeforeTransID, Eve::Errors::UserInputErrors::InvalidBeforeRefID,
|
19
|
+
Eve::Errors::UserInputErrors::InvalidBeforeKillID
|
20
|
+
# walking is internal, so we should catch the error internally too.
|
21
|
+
end
|
22
|
+
end
|
23
|
+
return_value
|
24
|
+
end
|
25
|
+
|
26
|
+
def request(namespace, service_name, options = {})
|
27
|
+
walk_id = options.delete(:walk_id) # we don't want these being sent to the server; it messes with the cache.
|
28
|
+
walk_association = options.delete(:walk_association)
|
29
|
+
if options.delete(:walk)
|
30
|
+
walk(walk_id.to_s, walk_association, options) do |walk_options|
|
31
|
+
Eve::API::Request.new(namespace, service_name, self.options.merge(walk_options)).dispatch
|
32
|
+
end
|
33
|
+
else
|
34
|
+
Eve::API::Request.new(namespace, service_name, self.options.merge(options)).dispatch
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Eve
|
2
|
+
class API
|
3
|
+
class Request
|
4
|
+
extend ActiveSupport::Memoizable
|
5
|
+
attr_reader :response, :uri, :options, :namespace, :service
|
6
|
+
|
7
|
+
def initialize(namespace, service, options = {})
|
8
|
+
options.reverse_merge! default_options
|
9
|
+
namespace = namespace.to_s if namespace.is_a?(Symbol)
|
10
|
+
service = service.to_s if service.is_a?(Symbol)
|
11
|
+
|
12
|
+
unless [:xml,:string].include? options[:response_type]
|
13
|
+
raise ArgumentError, "Expected :response_type to be :xml or :string"
|
14
|
+
end
|
15
|
+
|
16
|
+
@options = options.dup
|
17
|
+
@service = options[:camelize] ? service.camelize : service
|
18
|
+
@namespace = namespace
|
19
|
+
@response_type = options[:response_type]
|
20
|
+
|
21
|
+
@uri = File.join(@options.delete(:base_uri), @namespace, "#{@service}.#{options[:extension]}")
|
22
|
+
end
|
23
|
+
|
24
|
+
def dispatch
|
25
|
+
r = (cached_response || cache_response(Net::HTTP.post_form(URI.parse(uri), post_options).body))
|
26
|
+
if r.respond_to?(:error) && r.error
|
27
|
+
Eve::Errors.raise(:code => r.error.code, :message => r.error)
|
28
|
+
end
|
29
|
+
r
|
30
|
+
end
|
31
|
+
|
32
|
+
def cached_response
|
33
|
+
if xml = (options[:cache] ? Eve.cache.read(cache_key) : nil)
|
34
|
+
potential_response = response_for(xml)
|
35
|
+
if !potential_response.respond_to?(:cached_until) || potential_response.cached_until >= Time.now
|
36
|
+
return potential_response
|
37
|
+
end
|
38
|
+
end
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def response_for(body)
|
43
|
+
@response_type == :xml ? Eve::API::Response.new(body, options) : body
|
44
|
+
end
|
45
|
+
|
46
|
+
def cache_response(xml)
|
47
|
+
Eve.cache.write(cache_key, xml) if options[:cache]
|
48
|
+
response_for xml
|
49
|
+
end
|
50
|
+
|
51
|
+
def cache_key
|
52
|
+
ActiveSupport::Cache.expand_cache_key(post_options, @uri)
|
53
|
+
end
|
54
|
+
|
55
|
+
memoize :cache_key
|
56
|
+
|
57
|
+
private
|
58
|
+
def post_options
|
59
|
+
options.without(default_options.keys).camelize_keys
|
60
|
+
end
|
61
|
+
|
62
|
+
def default_options
|
63
|
+
{
|
64
|
+
:base_uri => "http://api.eve-online.com",
|
65
|
+
:extension => "xml.aspx",
|
66
|
+
:camelize => true,
|
67
|
+
:response_type => :xml,
|
68
|
+
:column_mapping => nil,
|
69
|
+
:cache => true
|
70
|
+
}
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'eve/api/response/inspection'
|
2
|
+
require 'eve/api/response/wrap_object'
|
3
|
+
require 'eve/api/response/rowsets'
|
4
|
+
require 'eve/api/response/rowset'
|
5
|
+
|
6
|
+
module Eve
|
7
|
+
class API
|
8
|
+
class Response
|
9
|
+
include Eve::API::Response::WrapObject
|
10
|
+
include Eve::API::Response::Rowsets
|
11
|
+
include Eve::API::Response::Inspection
|
12
|
+
attr_reader :api_version, :content
|
13
|
+
|
14
|
+
def initialize(xml, options = {})
|
15
|
+
@options = options
|
16
|
+
xml = Hpricot::XML(xml).root if xml.kind_of?(String)
|
17
|
+
@xml = xml
|
18
|
+
#@attributes = {}
|
19
|
+
|
20
|
+
parse_xml unless options[:process_xml] == false
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_hash
|
24
|
+
hash = {}
|
25
|
+
(instance_variables - protected_instance_variables + (@name.blank? ? [] : ["@name"])).each do |ivar|
|
26
|
+
value = instance_variable_get(ivar)
|
27
|
+
value = case value
|
28
|
+
when Rowset then value.to_a
|
29
|
+
when Response then value.to_hash
|
30
|
+
else value
|
31
|
+
end
|
32
|
+
hash[ivar[1..-1]] = value
|
33
|
+
end
|
34
|
+
hash
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_yaml(*args)
|
38
|
+
to_hash.to_yaml(*args)
|
39
|
+
end
|
40
|
+
|
41
|
+
def [](key)
|
42
|
+
key = key.to_s if !key.kind_of?(String)
|
43
|
+
key = key.underscore
|
44
|
+
instance_variable_get("@#{key}") ||
|
45
|
+
raise(ArgumentError, "No attribute called '#{key}' seems to exist in #{self.inspect}")
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
def parse_xml(node = @xml)
|
50
|
+
case node
|
51
|
+
when Hpricot::Elem
|
52
|
+
parse_elem(node)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def check_for_datetime(value)
|
57
|
+
if value =~ /\A[0-9]{4}\-[0-9]{2}\-[0-9]{2} [0-9]{2}\:[0-9]{2}\:[0-9]{2}\z/
|
58
|
+
DateTime.parse(value)
|
59
|
+
else
|
60
|
+
value
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def wrap_method_around_node(node = @xml)
|
65
|
+
# TODO: refactor me.
|
66
|
+
if !node.children || !node.children.select { |c| c.is_a?(Hpricot::Elem) }.empty?
|
67
|
+
@content = node.inner_text.strip if !node.children
|
68
|
+
value = Eve::API::Response.new(node, @options.merge(:process_xml => false))
|
69
|
+
value.send(:copy_attributes, node.attributes.to_hash.keys, node)
|
70
|
+
value.parse_children
|
71
|
+
else
|
72
|
+
value = value_for(node.inner_text)
|
73
|
+
value = check_for_datetime(value)
|
74
|
+
# now define any attributes as methods on the resultant object
|
75
|
+
node_attributes = node.attributes.to_hash
|
76
|
+
copy_attributes(node_attributes.keys, node, value)
|
77
|
+
end
|
78
|
+
|
79
|
+
wrap_object(node.name, value)
|
80
|
+
end
|
81
|
+
|
82
|
+
def parse_elem(node = @xml)
|
83
|
+
case node.name
|
84
|
+
when 'eveapi' then
|
85
|
+
@api_version = node['version']
|
86
|
+
parse_children(node)
|
87
|
+
when 'result' then
|
88
|
+
parse_children(node)
|
89
|
+
when 'rowset' then
|
90
|
+
add_rowset Rowset.new(node, @options)
|
91
|
+
else wrap_method_around_node(node)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def parse_children(node = @xml)
|
96
|
+
node.children.each { |child| parse_xml(child) } if node.children
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|