oolite 0.0.3 → 0.0.4
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/.rspec +3 -0
- data/README.md +1 -1
- data/lib/oolite.rb +15 -10
- data/lib/oolite/console.rb +41 -0
- data/lib/oolite/market.rb +3 -3
- data/lib/oolite/system_data.rb +73 -0
- data/lib/oolite/systems_data.rb +49 -0
- data/lib/oolite/trade.rb +139 -58
- data/lib/oolite/version.rb +1 -1
- data/oolite.gemspec +2 -0
- data/spec/data/.oolite +142 -0
- data/spec/lib/oolite/system_data_spec.rb +59 -0
- data/spec/lib/oolite/systems_data_spec.rb +37 -0
- data/spec/spec_helper.rb +120 -0
- metadata +43 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0eacc2db825856e9b197799928c07c79d46f48c
|
4
|
+
data.tar.gz: 08add855baa60fc715f6d52740fab9c856523aeb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e72c5e6b8b21ba44b4d82a5b23792a42bc03071a0da2934299b4694977308d33943b9a9ee9f9e35bb5c1bacdffebe1d86b33b889564256c6ae15517d85561e8
|
7
|
+
data.tar.gz: 94cdc383bb4a0e47da8326e861990a9c63b647aca128c156bd293a5a5f50223fd71542b00fa9555a974fe04ccea110faf1cf94b3fd8e3d225528766e2bf829ec
|
data/.rspec
ADDED
data/README.md
CHANGED
data/lib/oolite.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
require "oolite/version"
|
2
|
+
require 'pathname'
|
3
|
+
require 'yaml'
|
4
|
+
require 'highline/import'
|
2
5
|
|
3
6
|
if ENV['DEBUG'].nil?
|
4
7
|
$debug = false
|
@@ -137,25 +140,25 @@ module Oolite
|
|
137
140
|
]
|
138
141
|
|
139
142
|
@economies = [
|
140
|
-
"
|
143
|
+
"Average Agricultural",
|
141
144
|
"Average Industrial",
|
142
|
-
"Poor Industrial",
|
143
|
-
"Mainly Industrial",
|
144
145
|
"Mainly Agricultural",
|
146
|
+
"Mainly Industrial",
|
147
|
+
"Poor Agricultural",
|
148
|
+
"Poor Industrial",
|
145
149
|
"Rich Agricultural",
|
146
|
-
"
|
147
|
-
"Poor Agricultural"
|
150
|
+
"Rich Industrial",
|
148
151
|
]
|
149
152
|
|
150
153
|
@governments = [
|
151
154
|
"Anarchy",
|
152
|
-
"Feudal",
|
153
|
-
"Multi-Government",
|
154
|
-
"Dictatorship",
|
155
155
|
"Communist",
|
156
156
|
"Confederacy",
|
157
|
+
"Corporate State",
|
157
158
|
"Democracy",
|
158
|
-
"
|
159
|
+
"Dictatorship",
|
160
|
+
"Feudal",
|
161
|
+
"Multi-Government",
|
159
162
|
]
|
160
163
|
|
161
164
|
@systems = Hash.new
|
@@ -178,11 +181,13 @@ module Oolite
|
|
178
181
|
end # Configuration
|
179
182
|
end
|
180
183
|
|
181
|
-
require 'yaml'
|
182
184
|
|
183
185
|
# Initialize the configuration
|
184
186
|
Oolite.configure
|
185
187
|
|
188
|
+
require 'oolite/console'
|
189
|
+
require 'oolite/system_data'
|
190
|
+
require 'oolite/systems_data'
|
186
191
|
require 'oolite/csv_doc'
|
187
192
|
require 'oolite/save_file'
|
188
193
|
require 'oolite/market_file'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
##############################################################################
|
2
|
+
# File:: console.rb
|
3
|
+
# Purpose:: Console Module includes helper methods related to console IO
|
4
|
+
#
|
5
|
+
# Author:: Jeff McAffee 05/22/2015
|
6
|
+
# Copyright:: Copyright (c) 2015, kTech Systems LLC. All rights reserved.
|
7
|
+
# Website:: http://ktechsystems.com
|
8
|
+
##############################################################################
|
9
|
+
|
10
|
+
module Oolite
|
11
|
+
module Console
|
12
|
+
def select_system systems, header, prompt = "? "
|
13
|
+
selected_system = choose do |menu|
|
14
|
+
menu.index = :letter
|
15
|
+
menu.index_suffix = " - "
|
16
|
+
menu.header = header
|
17
|
+
menu.prompt = prompt
|
18
|
+
|
19
|
+
systems.each do |sys|
|
20
|
+
info = system_info sys
|
21
|
+
menu.choice "#{sys.ljust(14)} #{info.ljust(50)}" do sys end
|
22
|
+
end
|
23
|
+
|
24
|
+
menu.choice :quit do 'q' end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def select_from items, header, prompt = "? "
|
29
|
+
selected_item = choose do |menu|
|
30
|
+
#menu.index = :number
|
31
|
+
menu.index_suffix = " - "
|
32
|
+
menu.header = header
|
33
|
+
menu.prompt = prompt
|
34
|
+
|
35
|
+
items.each do |item|
|
36
|
+
menu.choice item do item end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end # module
|
data/lib/oolite/market.rb
CHANGED
@@ -115,9 +115,9 @@ module Oolite
|
|
115
115
|
config.current_system_name = system
|
116
116
|
|
117
117
|
unless config.systems.key?(system)
|
118
|
-
details = { economy:
|
119
|
-
government:
|
120
|
-
tech_level:
|
118
|
+
details = { economy: '',
|
119
|
+
government: '',
|
120
|
+
tech_level: '',
|
121
121
|
}
|
122
122
|
config.systems[system] = details
|
123
123
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
##############################################################################
|
2
|
+
# File:: system_data.rb
|
3
|
+
# Purpose:: SystemData stores info about a single system
|
4
|
+
# (ie. economy, government, etc)
|
5
|
+
#
|
6
|
+
# Author:: Jeff McAffee 05/22/2015
|
7
|
+
# Copyright:: Copyright (c) 2015, kTech Systems LLC. All rights reserved.
|
8
|
+
# Website:: http://ktechsystems.com
|
9
|
+
##############################################################################
|
10
|
+
|
11
|
+
module Oolite
|
12
|
+
class SystemData
|
13
|
+
attr_reader :name, :economy, :government, :tech_level
|
14
|
+
|
15
|
+
def initialize name, data
|
16
|
+
data = Hash(data)
|
17
|
+
|
18
|
+
self.name = name
|
19
|
+
self.economy = data[:economy]
|
20
|
+
self.government = data[:government]
|
21
|
+
self.tech_level = data[:tech_level]
|
22
|
+
end
|
23
|
+
|
24
|
+
def name= val
|
25
|
+
fail "SystemData#name= name is nil" if val.nil?
|
26
|
+
fail "SystemData#name= name is empty" if val.empty?
|
27
|
+
@name = val
|
28
|
+
end
|
29
|
+
|
30
|
+
def economy= val
|
31
|
+
if val.nil?
|
32
|
+
@economy = ''
|
33
|
+
else
|
34
|
+
@economy = val
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def government= val
|
39
|
+
if val.nil?
|
40
|
+
@government = ''
|
41
|
+
else
|
42
|
+
@government = val
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def tech_level= val
|
47
|
+
if val.nil?
|
48
|
+
@tech_level = ''
|
49
|
+
else
|
50
|
+
@tech_level = val
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# When emitting as YAML, emit as a hash
|
56
|
+
#
|
57
|
+
|
58
|
+
def to_yaml
|
59
|
+
{
|
60
|
+
economy: @economy,
|
61
|
+
government: @government,
|
62
|
+
tech_level: @tech_level,
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
def all_data_present?
|
67
|
+
return false if economy.nil? || economy.empty?
|
68
|
+
return false if government.nil? || government.empty?
|
69
|
+
return false if tech_level.nil? || tech_level.empty?
|
70
|
+
return true
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
##############################################################################
|
2
|
+
# File:: systems_data.rb
|
3
|
+
# Purpose:: SystemsData stores info about systems
|
4
|
+
# (ie. economy, government, etc)
|
5
|
+
#
|
6
|
+
# Author:: Jeff McAffee 05/22/2015
|
7
|
+
# Copyright:: Copyright (c) 2015, kTech Systems LLC. All rights reserved.
|
8
|
+
# Website:: http://ktechsystems.com
|
9
|
+
##############################################################################
|
10
|
+
|
11
|
+
module Oolite
|
12
|
+
class SystemsData
|
13
|
+
def self.systems
|
14
|
+
@systems ||= read_config
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.names
|
18
|
+
systems.keys
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.add sys_data
|
22
|
+
systems[sys_data.name] = sys_data
|
23
|
+
write_config
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def self.read_config
|
29
|
+
data = Oolite.configuration.systems
|
30
|
+
sys_objs = Hash.new
|
31
|
+
|
32
|
+
data.each do |name, sys_data|
|
33
|
+
sys_objs[name] = SystemData.new name, sys_data
|
34
|
+
end
|
35
|
+
|
36
|
+
sys_objs
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.write_config
|
40
|
+
Oolite.configure do |config|
|
41
|
+
systems.each do |name, sys|
|
42
|
+
config.systems[name] = sys.to_yaml
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Oolite.save_configuration
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/oolite/trade.rb
CHANGED
@@ -13,28 +13,23 @@ require 'yaml'
|
|
13
13
|
|
14
14
|
module Oolite
|
15
15
|
class Trade
|
16
|
+
include Console
|
17
|
+
|
16
18
|
def display
|
17
19
|
puts "= Oolite Trader ="
|
18
20
|
puts
|
19
|
-
|
20
|
-
puts
|
21
|
-
puts " Available destinations:"
|
22
|
-
puts
|
21
|
+
ask_user_to_update_system_data(current_system_name)
|
23
22
|
|
24
|
-
systems = market.systems
|
25
|
-
systems.delete current_system_name
|
26
|
-
systems.each_with_index do |sys,i|
|
27
|
-
puts " #{i} - #{sys}"
|
28
|
-
end
|
29
23
|
puts
|
30
|
-
|
31
|
-
|
32
|
-
return if choice.downcase == 'q'
|
24
|
+
puts " Current Location: #{current_system_name} #{system_info(current_system_name)}"
|
33
25
|
puts
|
34
26
|
|
35
|
-
dest_system =
|
27
|
+
dest_system = get_destination
|
28
|
+
|
29
|
+
return if dest_system == 'q'
|
36
30
|
|
37
|
-
puts
|
31
|
+
puts
|
32
|
+
puts " -- Profitable Trades for #{dest_system} --"
|
38
33
|
puts
|
39
34
|
puts " #{'Item'.ljust(14)} #{'Amt Avail'.to_s.ljust(10)} #{'PricePerUnit'.to_s.rjust(8)} #{'ProfitPerUnit'.to_s.rjust(12)}"
|
40
35
|
puts
|
@@ -46,7 +41,7 @@ module Oolite
|
|
46
41
|
|
47
42
|
puts
|
48
43
|
|
49
|
-
puts " -- Suggested Transactions for #{dest_system} --"
|
44
|
+
puts " -- Suggested Transactions for #{current_system_name} to #{dest_system} Route --"
|
50
45
|
puts
|
51
46
|
puts " #{'Item'.ljust(14)} #{'Purch Amt'.to_s.ljust(10)} #{'Profit'.to_s.rjust(8)}"
|
52
47
|
puts
|
@@ -69,9 +64,79 @@ module Oolite
|
|
69
64
|
|
70
65
|
private
|
71
66
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
67
|
+
def systems_data
|
68
|
+
@systems_data ||= SystemsData
|
69
|
+
end
|
70
|
+
|
71
|
+
def system_info sys_name
|
72
|
+
info = ''
|
73
|
+
if systems_data.names.include? sys_name
|
74
|
+
sys_data = systems_data.systems[sys_name]
|
75
|
+
|
76
|
+
econ = sys_data.economy
|
77
|
+
gov = sys_data.government
|
78
|
+
tech = sys_data.tech_level
|
79
|
+
|
80
|
+
info = "(#{econ} - #{gov} - #{tech.to_s})"
|
81
|
+
end
|
82
|
+
info
|
83
|
+
end
|
84
|
+
|
85
|
+
def ask_user_to_update_system_data sys_name
|
86
|
+
need_update = false
|
87
|
+
need_update = true if !systems_data.names.include? sys_name
|
88
|
+
unless need_update
|
89
|
+
sys_data = systems_data.systems[sys_name]
|
90
|
+
need_update = true if !sys_data.all_data_present?
|
91
|
+
end
|
92
|
+
|
93
|
+
return unless need_update
|
94
|
+
|
95
|
+
if need_update
|
96
|
+
puts "We need to update our records for #{sys_name}"
|
97
|
+
result = ask("Would you like to update now (y/n)? ") { |q| q.default = 'y' }
|
98
|
+
return if result.downcase == 'n'
|
99
|
+
end
|
100
|
+
|
101
|
+
collect_system_data sys_name
|
102
|
+
end
|
103
|
+
|
104
|
+
def collect_system_data sys_name
|
105
|
+
econs = Oolite.configuration.economies.sort
|
106
|
+
govs = Oolite.configuration.governments.sort
|
107
|
+
prompt = ' Choice? '
|
108
|
+
|
109
|
+
puts " #{sys_name}"
|
110
|
+
|
111
|
+
puts
|
112
|
+
econ = select_from econs, 'Economy', prompt
|
113
|
+
|
114
|
+
puts
|
115
|
+
gov = select_from govs, 'Government', prompt
|
116
|
+
|
117
|
+
puts
|
118
|
+
puts "Tech Level:"
|
119
|
+
puts
|
120
|
+
tech_level = ask " Choice (1-14)? "
|
121
|
+
|
122
|
+
sys_data = SystemData.new sys_name, {}
|
123
|
+
sys_data.economy = econ
|
124
|
+
sys_data.government = gov
|
125
|
+
sys_data.tech_level = tech_level
|
126
|
+
|
127
|
+
SystemsData.add sys_data
|
128
|
+
|
129
|
+
puts
|
130
|
+
puts " #{sys_name} has been updated."
|
131
|
+
puts
|
132
|
+
end
|
133
|
+
|
134
|
+
def get_destination
|
135
|
+
systems = market.systems
|
136
|
+
systems.delete current_system_name
|
137
|
+
systems.sort!
|
138
|
+
|
139
|
+
select_system systems, "Available destinations", "Choose your destination: "
|
75
140
|
end
|
76
141
|
|
77
142
|
def current_system_name
|
@@ -108,6 +173,12 @@ module Oolite
|
|
108
173
|
end
|
109
174
|
end
|
110
175
|
|
176
|
+
#
|
177
|
+
# Calculate and return all *profitable* trades.
|
178
|
+
#
|
179
|
+
# Returned trades are sorted most expensive to least
|
180
|
+
#
|
181
|
+
|
111
182
|
def calculate_all_trades dest_system
|
112
183
|
src = market.data[current_system_name]
|
113
184
|
dest = market.data[dest_system]
|
@@ -119,7 +190,7 @@ module Oolite
|
|
119
190
|
end
|
120
191
|
end
|
121
192
|
|
122
|
-
|
193
|
+
profitable_trades = Array.new
|
123
194
|
|
124
195
|
src.keys.each do |item|
|
125
196
|
sprice = src[item][:price]
|
@@ -128,18 +199,26 @@ module Oolite
|
|
128
199
|
|
129
200
|
revenue = dprice - sprice
|
130
201
|
if revenue > 0.0 && amount > 0
|
131
|
-
|
202
|
+
profitable_trades << TradeItem.new(item, amount, sprice, revenue)
|
132
203
|
end
|
133
204
|
end
|
134
205
|
|
135
|
-
|
206
|
+
profitable_trades.sort { |a,b| b.revenue <=> a.revenue }
|
136
207
|
end
|
137
208
|
|
209
|
+
#
|
210
|
+
# Calculate the most profitable trades.
|
211
|
+
#
|
212
|
+
# We calculate 2 ways, buying the most expensive (and generally the
|
213
|
+
# most profitable) trades, then buying the cheapest first. The most
|
214
|
+
# profit determines the suggested trades.
|
215
|
+
#
|
216
|
+
|
138
217
|
def calc_best_trades trades
|
139
|
-
|
218
|
+
max_cargo = Oolite.configuration.cargo
|
140
219
|
credits = Oolite.configuration.current_credits
|
141
220
|
|
142
|
-
if
|
221
|
+
if max_cargo <= 0
|
143
222
|
return [[], 0]
|
144
223
|
end
|
145
224
|
|
@@ -154,59 +233,61 @@ module Oolite
|
|
154
233
|
return [[], 0]
|
155
234
|
end
|
156
235
|
|
157
|
-
|
158
|
-
|
159
|
-
suggested_trades_expensive_first = []
|
160
|
-
affordable_trades.each do |trade|
|
161
|
-
max_amt_by_price = balance / trade.cost
|
162
|
-
max_amt_by_cargo = [cargo, trade.amount].min
|
163
|
-
max_amt = [max_amt_by_price, max_amt_by_cargo].min
|
236
|
+
suggested_trades_exp = calc_trades(credits, max_cargo, affordable_trades)
|
237
|
+
total_profit_exp = calc_total_profit(suggested_trades_exp)
|
164
238
|
|
165
|
-
|
166
|
-
|
239
|
+
# Sort the trades in ascending order (cheapest first).
|
240
|
+
affordable_trades_asc = affordable_trades.sort { |a,b| a.revenue <=> b.revenue }
|
167
241
|
|
168
|
-
|
169
|
-
|
170
|
-
suggested_trades_expensive_first << transaction.dup
|
171
|
-
end
|
172
|
-
end
|
242
|
+
suggested_trades_cheap = calc_trades(credits, max_cargo, affordable_trades_asc)
|
243
|
+
total_profit_cheap = calc_total_profit(suggested_trades_cheap)
|
173
244
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
245
|
+
if total_profit_exp > total_profit_cheap
|
246
|
+
return [suggested_trades_exp, total_profit_exp]
|
247
|
+
else
|
248
|
+
return [suggested_trades_cheap, total_profit_cheap]
|
178
249
|
end
|
250
|
+
end
|
251
|
+
|
252
|
+
#
|
253
|
+
# Calculate the best trades using available credits, cargo and profitable trades
|
254
|
+
#
|
255
|
+
|
256
|
+
def calc_trades credits, cargo, trades
|
257
|
+
suggested_trades = []
|
179
258
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
cheap_affordable_trades = affordable_trades.sort { |a,b| a.revenue <=> b.revenue }
|
185
|
-
cheap_affordable_trades.each do |trade|
|
186
|
-
max_amt_by_price = balance / trade.cost
|
259
|
+
trades.each do |trade|
|
260
|
+
# We're limited by how much we can buy,
|
261
|
+
max_amt_by_price = credits / trade.cost
|
262
|
+
# and cargo space versus amount for sale.
|
187
263
|
max_amt_by_cargo = [cargo, trade.amount].min
|
188
264
|
max_amt = [max_amt_by_price, max_amt_by_cargo].min
|
189
265
|
|
190
|
-
|
266
|
+
credits = credits - (max_amt * trade.cost)
|
191
267
|
cargo = cargo - max_amt
|
192
268
|
|
193
269
|
if max_amt > 0
|
194
270
|
transaction = { item: trade, amount: max_amt }
|
195
|
-
|
271
|
+
suggested_trades << transaction.dup
|
196
272
|
end
|
197
273
|
end
|
198
274
|
|
199
|
-
|
200
|
-
|
275
|
+
suggested_trades
|
276
|
+
end
|
277
|
+
|
278
|
+
#
|
279
|
+
# Calculate the total anticipated profit if all trades are transacted.
|
280
|
+
#
|
281
|
+
|
282
|
+
def calc_total_profit trades
|
283
|
+
total_profit = 0
|
284
|
+
|
285
|
+
trades.each do |transaction|
|
201
286
|
profit = transaction[:item].revenue * transaction[:amount]
|
202
|
-
|
287
|
+
total_profit += profit
|
203
288
|
end
|
204
289
|
|
205
|
-
|
206
|
-
return [suggested_trades_expensive_first, expensive_first_total_profit]
|
207
|
-
else
|
208
|
-
return [suggested_trades_cheap_first, cheap_first_total_profit]
|
209
|
-
end
|
290
|
+
total_profit
|
210
291
|
end
|
211
292
|
end
|
212
293
|
end
|
data/lib/oolite/version.rb
CHANGED
data/oolite.gemspec
CHANGED
@@ -20,6 +20,8 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "rspec", "~> 3.2"
|
23
24
|
|
24
25
|
spec.add_runtime_dependency "nokogiri", "~> 1.6"
|
26
|
+
spec.add_runtime_dependency "highline", "~> 1.7"
|
25
27
|
end
|
data/spec/data/.oolite
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Oolite::Configuration
|
2
|
+
save_file_path: "/home/jeff/Jameson.oolite-save"
|
3
|
+
market_data_filename: oolite.market
|
4
|
+
current_system_name: Edinso
|
5
|
+
current_credits: 39558
|
6
|
+
cargo: 35
|
7
|
+
trade_contraband: false
|
8
|
+
contraband:
|
9
|
+
- Slaves
|
10
|
+
- Narcotics
|
11
|
+
- Firearms
|
12
|
+
economies:
|
13
|
+
- Rich Industrial
|
14
|
+
- Average Industrial
|
15
|
+
- Poor Industrial
|
16
|
+
- Mainly Industrial
|
17
|
+
- Mainly Agricultural
|
18
|
+
- Rich Agricultural
|
19
|
+
- Average Agricultural
|
20
|
+
- Poor Agricultural
|
21
|
+
governments:
|
22
|
+
- Anarchy
|
23
|
+
- Feudal
|
24
|
+
- Multi-Government
|
25
|
+
- Dictatorship
|
26
|
+
- Communist
|
27
|
+
- Confederacy
|
28
|
+
- Democracy
|
29
|
+
- Corporate State
|
30
|
+
systems:
|
31
|
+
Ensoreus:
|
32
|
+
:economy: Rich Industrial
|
33
|
+
:government: Corporate State
|
34
|
+
:tech_level: '12'
|
35
|
+
Isinor:
|
36
|
+
:economy: Poor Agricultural
|
37
|
+
:government: Confederacy
|
38
|
+
:tech_level: '7'
|
39
|
+
Qutiri:
|
40
|
+
:economy: Rich Industrial
|
41
|
+
:government: Multi-Government
|
42
|
+
:tech_level: '9'
|
43
|
+
Zaonce:
|
44
|
+
:economy: Average Industrial
|
45
|
+
:government: Corporate State
|
46
|
+
:tech_level: '12'
|
47
|
+
Tionisla:
|
48
|
+
:economy: Average Industrial
|
49
|
+
:government: Democracy
|
50
|
+
:tech_level: '12'
|
51
|
+
Bemaera:
|
52
|
+
:economy: Average Agricultural
|
53
|
+
:government: Multi-Government
|
54
|
+
:tech_level: '4'
|
55
|
+
Ontiat:
|
56
|
+
:economy: Average Agricultural
|
57
|
+
:government: Confederacy
|
58
|
+
:tech_level: '6'
|
59
|
+
Xeesle:
|
60
|
+
:economy: Mainly Industrial
|
61
|
+
:government: Feudal
|
62
|
+
:tech_level: '7'
|
63
|
+
Aronar:
|
64
|
+
:economy: Poor Industrial
|
65
|
+
:government: Feudal
|
66
|
+
:tech_level: '8'
|
67
|
+
Aesbion:
|
68
|
+
:economy: Mainly Industrial
|
69
|
+
:government: Corporate State
|
70
|
+
:tech_level: '10'
|
71
|
+
Lave:
|
72
|
+
:economy: Rich Agricultural
|
73
|
+
:government: Dictatorship
|
74
|
+
:tech_level: '5'
|
75
|
+
Esesla:
|
76
|
+
:economy: Average Agricultural
|
77
|
+
:government: Multi-Government
|
78
|
+
:tech_level: '4'
|
79
|
+
Zalela:
|
80
|
+
:economy: Average Agricultural
|
81
|
+
:government: Feudal
|
82
|
+
:tech_level: '5'
|
83
|
+
Erlaza:
|
84
|
+
:economy: Average Agricultural
|
85
|
+
:government: Dictatorship
|
86
|
+
:tech_level: '6'
|
87
|
+
Leesti:
|
88
|
+
:economy: Poor Industrial
|
89
|
+
:government: Corporate State
|
90
|
+
:tech_level: '11'
|
91
|
+
Diso:
|
92
|
+
:economy: Average Agricultural
|
93
|
+
:government: Democracy
|
94
|
+
:tech_level: '8'
|
95
|
+
Orerve:
|
96
|
+
:economy: Mainly Industrial
|
97
|
+
:government: Feudal
|
98
|
+
:tech_level: '6'
|
99
|
+
Riedquat:
|
100
|
+
:economy: Poor Agricultural
|
101
|
+
:government: Anarchy
|
102
|
+
:tech_level: '4'
|
103
|
+
Reorte:
|
104
|
+
:economy: Poor Agricultural
|
105
|
+
:government: Dictatorship
|
106
|
+
:tech_level: '6'
|
107
|
+
Quator:
|
108
|
+
:economy: Mainly Industrial
|
109
|
+
:government: Anarchy
|
110
|
+
:tech_level: '7'
|
111
|
+
Orrere:
|
112
|
+
:economy: Poor Agricultural
|
113
|
+
:government: Corporate State
|
114
|
+
:tech_level: '7'
|
115
|
+
Uszaa:
|
116
|
+
:economy: Mainly Industrial
|
117
|
+
:government: Anarchy
|
118
|
+
:tech_level: '8'
|
119
|
+
Ra:
|
120
|
+
:economy: Poor Agricultural
|
121
|
+
:government: Corporate State
|
122
|
+
:tech_level: '5'
|
123
|
+
Relaes:
|
124
|
+
:economy: Average Industrial
|
125
|
+
:government: Communist
|
126
|
+
:tech_level: '11'
|
127
|
+
Zasoer:
|
128
|
+
:economy: Average Agricultural
|
129
|
+
:government: Confederacy
|
130
|
+
:tech_level: '5'
|
131
|
+
Azaqu:
|
132
|
+
:economy: Average Agricultural
|
133
|
+
:government: Democracy
|
134
|
+
:tech_level: '7'
|
135
|
+
Begeabi:
|
136
|
+
:economy: Poor Agricultural
|
137
|
+
:government: Feudal
|
138
|
+
:tech_level: '2'
|
139
|
+
Edinso:
|
140
|
+
:economy: ''
|
141
|
+
:government: ''
|
142
|
+
:tech_level: ''
|
@@ -0,0 +1,59 @@
|
|
1
|
+
RSpec.describe SystemData do
|
2
|
+
|
3
|
+
#let(:test_config_path) { test_data_dir('.oolite') }
|
4
|
+
#let(:load_config) { Oolite.load_configuration(test_config_path) }
|
5
|
+
|
6
|
+
#before do
|
7
|
+
# load_config
|
8
|
+
#end
|
9
|
+
|
10
|
+
let(:system_data) do
|
11
|
+
data = {
|
12
|
+
economy: 'economy',
|
13
|
+
government: 'government',
|
14
|
+
tech_level: '12'
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:empty_system_data) do
|
19
|
+
data = {
|
20
|
+
economy: '',
|
21
|
+
government: '',
|
22
|
+
tech_level: ''
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'can be instantiated' do
|
27
|
+
expect(SystemData.new('name', system_data)).to_not be nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'stores data' do
|
31
|
+
actual = SystemData.new('name', system_data)
|
32
|
+
|
33
|
+
expect(actual.name).to eq 'name'
|
34
|
+
expect(actual.economy).to eq system_data[:economy]
|
35
|
+
expect(actual.government).to eq system_data[:government]
|
36
|
+
expect(actual.tech_level).to eq system_data[:tech_level]
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'emits a hash for yaml storage' do
|
40
|
+
actual = SystemData.new('name', system_data)
|
41
|
+
|
42
|
+
expect(actual.to_yaml).to eq system_data
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'can tell if all data is present' do
|
46
|
+
sysdata = SystemData.new('name', empty_system_data)
|
47
|
+
|
48
|
+
expect(sysdata.all_data_present?).to eq false
|
49
|
+
|
50
|
+
sysdata.economy = 'econ'
|
51
|
+
expect(sysdata.all_data_present?).to eq false
|
52
|
+
|
53
|
+
sysdata.government = 'gov'
|
54
|
+
expect(sysdata.all_data_present?).to eq false
|
55
|
+
|
56
|
+
sysdata.tech_level = '12'
|
57
|
+
expect(sysdata.all_data_present?).to eq true
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
RSpec.describe SystemsData do
|
2
|
+
|
3
|
+
let(:test_config_path) { temp_from_data_dir('.oolite') }
|
4
|
+
let(:load_config) { Oolite.load_configuration(test_config_path) }
|
5
|
+
|
6
|
+
before do
|
7
|
+
load_config
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'loads systems data from config' do
|
11
|
+
expect(SystemsData.systems.count).to be >= 28
|
12
|
+
ensoreus = SystemsData.systems['Ensoreus']
|
13
|
+
|
14
|
+
expect(ensoreus.name).to eq "Ensoreus"
|
15
|
+
expect(ensoreus.economy).to eq "Rich Industrial"
|
16
|
+
expect(ensoreus.government).to eq "Corporate State"
|
17
|
+
expect(ensoreus.tech_level).to eq "12"
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'returns list of system names' do
|
21
|
+
names = SystemsData.names
|
22
|
+
expect(names).to include 'Ensoreus'
|
23
|
+
expect(names).to include 'Lave'
|
24
|
+
expect(names).to include 'Diso'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'adds to the list' do
|
28
|
+
expect(SystemsData.names).to_not include 'New System'
|
29
|
+
new_sys = SystemData.new('New System', { economy: 'Economy', government: 'Government', tech_level: '12'} )
|
30
|
+
|
31
|
+
SystemsData.add new_sys
|
32
|
+
expect(SystemsData.names).to include 'New System'
|
33
|
+
expect(SystemsData.systems['New System']).to eq new_sys
|
34
|
+
|
35
|
+
expect(file_contains(test_config_path, 'New SysteM'))
|
36
|
+
end
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# The generated `.rspec` file contains `--require spec_helper` which will cause
|
4
|
+
# this file to always be loaded, without a need to explicitly require it in any
|
5
|
+
# files.
|
6
|
+
#
|
7
|
+
# Given that it is always loaded, you are encouraged to keep this file as
|
8
|
+
# light-weight as possible. Requiring heavyweight dependencies from this file
|
9
|
+
# will add to the boot time of your test suite on EVERY test run, even for an
|
10
|
+
# individual file that may not need all of that loaded. Instead, consider making
|
11
|
+
# a separate helper file that requires the additional dependencies and performs
|
12
|
+
# the additional setup, and require it from the spec files that actually need
|
13
|
+
# it.
|
14
|
+
#
|
15
|
+
# The `.rspec` file also contains a few flags that are not defaults but that
|
16
|
+
# users commonly want.
|
17
|
+
#
|
18
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
19
|
+
RSpec.configure do |config|
|
20
|
+
# rspec-expectations config goes here. You can use an alternate
|
21
|
+
# assertion/expectation library such as wrong or the stdlib/minitest
|
22
|
+
# assertions if you prefer.
|
23
|
+
config.expect_with :rspec do |expectations|
|
24
|
+
# This option will default to `true` in RSpec 4. It makes the `description`
|
25
|
+
# and `failure_message` of custom matchers include text for helper methods
|
26
|
+
# defined using `chain`, e.g.:
|
27
|
+
# be_bigger_than(2).and_smaller_than(4).description
|
28
|
+
# # => "be bigger than 2 and smaller than 4"
|
29
|
+
# ...rather than:
|
30
|
+
# # => "be bigger than 2"
|
31
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
32
|
+
end
|
33
|
+
|
34
|
+
# rspec-mocks config goes here. You can use an alternate test double
|
35
|
+
# library (such as bogus or mocha) by changing the `mock_with` option here.
|
36
|
+
config.mock_with :rspec do |mocks|
|
37
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
38
|
+
# a real object. This is generally recommended, and will default to
|
39
|
+
# `true` in RSpec 4.
|
40
|
+
mocks.verify_partial_doubles = true
|
41
|
+
end
|
42
|
+
|
43
|
+
# The settings below are suggested to provide a good initial experience
|
44
|
+
# with RSpec, but feel free to customize to your heart's content.
|
45
|
+
#=begin
|
46
|
+
# These two settings work together to allow you to limit a spec run
|
47
|
+
# to individual examples or groups you care about by tagging them with
|
48
|
+
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
|
49
|
+
# get run.
|
50
|
+
config.filter_run :focus
|
51
|
+
config.run_all_when_everything_filtered = true
|
52
|
+
|
53
|
+
# Limits the available syntax to the non-monkey patched syntax that is
|
54
|
+
# recommended. For more details, see:
|
55
|
+
# - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
|
56
|
+
# - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
57
|
+
# - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
|
58
|
+
config.disable_monkey_patching!
|
59
|
+
|
60
|
+
# This setting enables warnings. It's recommended, but in some cases may
|
61
|
+
# be too noisy due to issues in dependencies.
|
62
|
+
config.warnings = false
|
63
|
+
|
64
|
+
# Many RSpec users commonly either run the entire suite or an individual
|
65
|
+
# file, and it's useful to allow more verbose output when running an
|
66
|
+
# individual spec file.
|
67
|
+
if config.files_to_run.one?
|
68
|
+
# Use the documentation formatter for detailed output,
|
69
|
+
# unless a formatter has already been configured
|
70
|
+
# (e.g. via a command-line flag).
|
71
|
+
config.default_formatter = 'doc'
|
72
|
+
end
|
73
|
+
|
74
|
+
# Print the 10 slowest examples and example groups at the
|
75
|
+
# end of the spec run, to help surface which specs are running
|
76
|
+
# particularly slow.
|
77
|
+
#config.profile_examples = 10
|
78
|
+
|
79
|
+
# Run specs in random order to surface order dependencies. If you find an
|
80
|
+
# order dependency and want to debug it, you can fix the order by providing
|
81
|
+
# the seed, which is printed after each run.
|
82
|
+
# --seed 1234
|
83
|
+
config.order = :random
|
84
|
+
|
85
|
+
# Seed global randomization in this process using the `--seed` CLI option.
|
86
|
+
# Setting this allows you to use `--seed` to deterministically reproduce
|
87
|
+
# test failures related to randomization by passing the same `--seed` value
|
88
|
+
# as the one that triggered the failure.
|
89
|
+
Kernel.srand config.seed
|
90
|
+
#=end
|
91
|
+
end
|
92
|
+
|
93
|
+
lib_dir = File.expand_path('../../lib', __FILE__)
|
94
|
+
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
95
|
+
|
96
|
+
require 'fileutils'
|
97
|
+
require 'oolite'
|
98
|
+
include Oolite
|
99
|
+
|
100
|
+
def test_data_dir sub_path = nil
|
101
|
+
path = File.expand_path('../data', __FILE__)
|
102
|
+
path = Pathname(path)
|
103
|
+
path = path + sub_path unless sub_path.nil?
|
104
|
+
path.to_s
|
105
|
+
end
|
106
|
+
|
107
|
+
def temp_from_data_dir sub_path = nil
|
108
|
+
src = test_data_dir sub_path
|
109
|
+
dest = Pathname('tmp') + sub_path
|
110
|
+
dest.delete if dest.exist?
|
111
|
+
FileUtils.cp src, dest
|
112
|
+
dest
|
113
|
+
end
|
114
|
+
|
115
|
+
def file_contains file, needle
|
116
|
+
File.open(file, 'r').each do |ln|
|
117
|
+
return true if ln.include? needle
|
118
|
+
end
|
119
|
+
return false
|
120
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oolite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff McAffee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.2'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.2'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: nokogiri
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '1.6'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: highline
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.7'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.7'
|
55
83
|
description: Utility scripts for tracking markets and assisting with trading in the
|
56
84
|
Oolite game.
|
57
85
|
email:
|
@@ -64,6 +92,7 @@ extensions: []
|
|
64
92
|
extra_rdoc_files: []
|
65
93
|
files:
|
66
94
|
- ".gitignore"
|
95
|
+
- ".rspec"
|
67
96
|
- Gemfile
|
68
97
|
- LICENSE.txt
|
69
98
|
- README.md
|
@@ -72,13 +101,20 @@ files:
|
|
72
101
|
- bin/ootrader
|
73
102
|
- bin/ooupdatemarket
|
74
103
|
- lib/oolite.rb
|
104
|
+
- lib/oolite/console.rb
|
75
105
|
- lib/oolite/csv_doc.rb
|
76
106
|
- lib/oolite/market.rb
|
77
107
|
- lib/oolite/market_file.rb
|
78
108
|
- lib/oolite/save_file.rb
|
109
|
+
- lib/oolite/system_data.rb
|
110
|
+
- lib/oolite/systems_data.rb
|
79
111
|
- lib/oolite/trade.rb
|
80
112
|
- lib/oolite/version.rb
|
81
113
|
- oolite.gemspec
|
114
|
+
- spec/data/.oolite
|
115
|
+
- spec/lib/oolite/system_data_spec.rb
|
116
|
+
- spec/lib/oolite/systems_data_spec.rb
|
117
|
+
- spec/spec_helper.rb
|
82
118
|
homepage: https://github.com/jmcaffee/oolite
|
83
119
|
licenses:
|
84
120
|
- MIT
|
@@ -103,5 +139,9 @@ rubygems_version: 2.3.0
|
|
103
139
|
signing_key:
|
104
140
|
specification_version: 4
|
105
141
|
summary: Utility scripts for the Oolite game
|
106
|
-
test_files:
|
142
|
+
test_files:
|
143
|
+
- spec/data/.oolite
|
144
|
+
- spec/lib/oolite/system_data_spec.rb
|
145
|
+
- spec/lib/oolite/systems_data_spec.rb
|
146
|
+
- spec/spec_helper.rb
|
107
147
|
has_rdoc:
|