caddie 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/caddie/crest_data_retriever.rb +10 -7
  3. data/app/models/caddie/crest_price_history_last_day_timestamp.rb +30 -0
  4. data/app/models/caddie/crest_price_history_update.rb +50 -25
  5. data/app/models/caddie/crest_price_history_update_log.rb +10 -0
  6. data/app/models/caddie/m_threaded_updater.rb +12 -10
  7. data/db/migrate/20160803094530_create_caddie_crest_price_history_last_day_timestamps.rb +12 -0
  8. data/lib/caddie/version.rb +1 -1
  9. data/lib/tasks/caddie_tasks.rake +4 -6
  10. data/{app → test/dummy/app}/models/crest_price_history.rb +0 -0
  11. data/test/dummy/app/models/eve_item.rb +5 -9
  12. data/test/dummy/db/migrate/20150815033941_add_epic_blueprint_to_eve_item.rb +5 -0
  13. data/test/dummy/db/migrate/20150916052729_add_market_group_ref_to_eve_item.rb +6 -0
  14. data/test/dummy/db/migrate/20160803143148_crest_price_history_index_rework_and_others.rb +17 -0
  15. data/test/dummy/db/schema.rb +25 -15
  16. data/test/factories/caddie/crest_price_history.rb +7 -0
  17. data/test/factories/caddie/crest_price_history_last_day_timestamp.rb +7 -0
  18. data/test/factories/caddie/crest_price_history_updates.rb +3 -0
  19. data/test/factories/caddie/eve_items.rb +1 -39
  20. data/test/factories/caddie/regions.rb +4 -27
  21. data/test/models/caddie/crest_data_retriever_test.rb +36 -0
  22. data/test/models/caddie/crest_price_history_last_day_timestamp_test.rb +102 -0
  23. data/test/models/caddie/crest_price_history_update_log_test.rb +15 -3
  24. data/test/models/caddie/crest_price_history_update_test.rb +31 -9
  25. data/test/models/caddie/m_threaded_updater_test.rb +13 -25
  26. data/test/test_helper.rb +7 -2
  27. metadata +64 -66
  28. data/lib/tasks/m_threaded_updater_test.no_rake +0 -53
  29. data/test/dummy/log/development.log +0 -637
  30. data/test/dummy/log/test.log +0 -46048
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c989d34f34beda7cd0080ba8727797560fd3b564
4
- data.tar.gz: 966a09a7fdf2044efa9cecb9dd62a5a72c29fa0e
3
+ metadata.gz: d606561f09dd648d0014e7e792072fd3a1a3f04a
4
+ data.tar.gz: d9bb7137dd695d8bf4e3e1a071b7d1e984329e05
5
5
  SHA512:
6
- metadata.gz: 33abff89f2ae029ddf6691027b51525bf262de8881b13b8351277e3abdc71eecd355c2c0760fdf12b9cfa2ea5980045bc25f49c8753169e94e51460ce7c295e8
7
- data.tar.gz: 2675616080c8e7755b88d3e30cf7513434869cd8f2031a1869fabbe1ec7c664a683431367fa31ab98e053f96d24463da685df2fac0b2290fefc2585eb52eee16
6
+ metadata.gz: baeec0fd6bb87e6704ad84a7241adac21b5086f1a073df8f0429b38c05f32b97e9284fcfc56fbaa3119bda697b8bdbd93abb07d0dd4970e20dcecc36ce285f6f
7
+ data.tar.gz: c941f62d954c7f843dd04326debc5778eb3f6e103586a976c4138fc4189e05d6dd2734ceaba19a33a5040abe17804ee392b1bae77f51f0e7edff2b8ead58713c
@@ -5,12 +5,13 @@ module Caddie
5
5
 
6
6
  CREST_BASE_URL='https://crest-tq.eveonline.com/'
7
7
 
8
- def get_markets( region_id, type_id )
8
+ def get_markets( region_id, type_id, thread_log_file: nil )
9
9
 
10
10
  debug = ENV[ 'EBS_DEBUG_MODE' ] && ENV[ 'EBS_DEBUG_MODE' ].downcase == 'true'
11
+ output = thread_log_file ? thread_log_file : STDERR
11
12
 
12
13
  type_url = "https://crest-tq.eveonline.com/inventory/types/#{type_id}"
13
- items, connections_count = get_multipage_data( "market/#{region_id}/history/?type=#{type_url}", debug )
14
+ items, connections_count = get_multipage_data( "market/#{region_id}/history/?type=#{type_url}", debug, thread_log_file: thread_log_file )
14
15
 
15
16
  [ items, connections_count ]
16
17
  end
@@ -21,17 +22,19 @@ module Caddie
21
22
  "#{CREST_BASE_URL}/#{rest}/"
22
23
  end
23
24
 
24
- def get_multipage_data( rest, debug_request = false )
25
+ def get_multipage_data( rest, debug_request = false, thread_log_file: nil )
26
+
27
+ output = thread_log_file ? thread_log_file : STDOUT
25
28
 
26
29
  next_url = get_crest_url( rest )
27
30
  items = []
28
31
  connections_count = 0
29
32
  begin
30
33
 
31
- puts "Fetching : #{next_url}" if debug_request
34
+ output.puts "Fetching : #{next_url}" if debug_request
32
35
 
33
- @start_time = Time.now unless @start_time
34
- @hit_count = 0 unless @hit_count
36
+ @start_time ||= Time.now
37
+ @hit_count ||= 0
35
38
  @hit_count += 1
36
39
 
37
40
  json_result = open( next_url ).read
@@ -46,7 +49,7 @@ module Caddie
46
49
 
47
50
  end while next_url
48
51
 
49
- puts "items.count = #{items.count}" if debug_request
52
+ output.puts "Retrieved items.count = #{items.count}" if debug_request
50
53
 
51
54
  [ items, connections_count ]
52
55
  end
@@ -0,0 +1,30 @@
1
+ module Caddie
2
+ class CrestPriceHistoryLastDayTimestamp < ActiveRecord::Base
3
+ belongs_to :eve_item
4
+ belongs_to :region
5
+
6
+ def self.find_or_create_last_day_timestamp( region_id, eve_item_id )
7
+
8
+ last_update_record = CrestPriceHistoryLastDayTimestamp.find_by_region_id_and_eve_item_id( region_id, eve_item_id )
9
+
10
+ if last_update_record
11
+ last_update_date = last_update_record.day_timestamp
12
+ else
13
+ last_update_date = CrestPriceHistory.where( region_id: region_id, eve_item_id: eve_item_id ).maximum( :history_date )
14
+ end
15
+
16
+ last_update_date = Time.new( 0 ) unless last_update_date
17
+
18
+ [ last_update_date, last_update_record ]
19
+ end
20
+
21
+ def self.create_or_update_last_day_timestamp( last_update_record, max_date_info, region_id, eve_item_id )
22
+ if last_update_record
23
+ last_update_record.update!( day_timestamp: max_date_info )
24
+ else
25
+ last_update_record = CrestPriceHistoryLastDayTimestamp.create!( region_id: region_id, eve_item_id: eve_item_id, day_timestamp: max_date_info )
26
+ end
27
+ last_update_record
28
+ end
29
+ end
30
+ end
@@ -1,4 +1,5 @@
1
1
  require 'set'
2
+ require 'open-uri'
2
3
 
3
4
  module Caddie
4
5
 
@@ -16,59 +17,83 @@ module Caddie
16
17
  ActiveRecord::Base.connection.execute( request )
17
18
  end
18
19
 
19
- def self.feed_price_histories( thread_id = nil )
20
+ def self.feed_price_histories( updates_ids: nil, thread_log_file: nil )
20
21
  total_connections_counts = 0
21
22
  total_inserts = 0
22
23
  date_deb = Time.now
23
24
 
24
- dol = daily_operations_list
25
+ debug = ENV[ 'EBS_DEBUG_MODE' ] && ENV[ 'EBS_DEBUG_MODE' ].downcase == 'true' && Rails.env != 'test'
26
+ output = thread_log_file ? thread_log_file : STDOUT
27
+ outerr = thread_log_file ? thread_log_file : STDERR
25
28
 
26
- # pp dol.to_a
27
- dol = dol.where( thread_slice_id: thread_id ) if thread_id
29
+ if updates_ids
30
+ dol = self.where( id: updates_ids ).order( :process_queue_priority ) if updates_ids
31
+ else
32
+ dol = daily_operations_list
33
+ end
28
34
 
29
- puts dol.reload.count
30
- dol.joins( :eve_item, :region ).pluck( :eve_item_id, :region_id, :cpp_eve_item_id, :cpp_region_id ).each do |row|
35
+ output.puts "dol.count = #{dol.count}" if debug
31
36
 
32
- # puts "Processing row = #{row}"
37
+ global_errors_count = 0
38
+ dol.joins( :eve_item, :region ).pluck( :eve_item_id, :region_id, :cpp_eve_item_id, :cpp_region_id, :id ).each do |row|
33
39
 
34
40
  eve_item_id, region_id, cpp_eve_item_id, cpp_region_id = row
35
- # puts "Requesting : #{cpp_region_id}, #{cpp_eve_item_id}"
41
+ if debug
42
+ output.puts
43
+ output.puts '*'*50
44
+ output.puts 'Requesting:'
45
+ output.puts "r = Region.find_by_cpp_region_id( #{cpp_region_id} )"
46
+ output.puts "i = EveItem.find_by_cpp_eve_item_id( #{cpp_eve_item_id} )"
47
+ end
36
48
 
37
49
  items = []
38
50
  connections_count = 0
51
+ http_errors = 0
52
+ # We retry 2 times
39
53
  begin
40
- items, connections_count = get_markets( cpp_region_id, cpp_eve_item_id )
41
- rescue OpenURI::HTTPError => e
42
- puts e.inspect
43
- end
54
+ begin
55
+ items, connections_count = get_markets( cpp_region_id, cpp_eve_item_id, thread_log_file: thread_log_file )
56
+ rescue => e
57
+ http_errors += 1
58
+ global_errors_count += 1
59
+ outerr.puts "#{e.message} for cpp_region_id = #{cpp_region_id} and cpp_eve_item_id = #{cpp_eve_item_id}" unless Rails.env == 'test'
60
+ sleep( 5 ) # in case of an error, we don't retry immediately.
61
+ end
62
+ end while http_errors >= 1 && http_errors < 2
44
63
 
45
64
  total_connections_counts += connections_count
46
65
 
47
66
  ActiveRecord::Base.transaction do
48
67
 
49
- # TODO : This operation is extremely costly. Keep the last updated timestamp and use it to shorten insert.
50
- # puts 'About to reject already used lines'
51
- timestamps = CrestPriceHistory.where( region_id: region_id, eve_item_id: eve_item_id ).pluck( :day_timestamp ).to_set
52
- items.reject! do |item|
53
- date_info = DateTime.parse( item['date'] )
54
- date_info_ts = date_info.strftime( '%Y%m%d' )
55
- timestamps.include?( date_info_ts )
56
- end
57
- # puts 'Lines rejected'
68
+ last_update_date, last_update_record = Caddie::CrestPriceHistoryLastDayTimestamp.
69
+ find_or_create_last_day_timestamp( region_id, eve_item_id )
58
70
 
59
- items.each do |item_data|
71
+ output.puts "Last update record date = #{last_update_date.inspect}" if debug
72
+
73
+ items.reject!{ |item| DateTime.parse( item['date'] ) <= last_update_date }
60
74
 
75
+ output.puts "Kept items.count = #{items.count}" if debug
76
+
77
+ max_date_info = last_update_date
78
+ items.each do |item_data|
61
79
  date_info = DateTime.parse( item_data['date'] )
62
- date_info_ts = date_info.strftime( '%Y%m%d' )
80
+ max_date_info = [ max_date_info, date_info ].max
63
81
 
64
- CrestPriceHistory.create!( region_id: region_id, eve_item_id: eve_item_id, day_timestamp: date_info_ts,
82
+ CrestPriceHistory.create!( region_id: region_id, eve_item_id: eve_item_id,
65
83
  history_date: date_info, order_count: item_data['orderCount'], volume: item_data['volume'],
66
84
  low_price: item_data['lowPrice'], avg_price: item_data['avgPrice'], high_price: item_data['highPrice'] )
67
85
  total_inserts += 1
68
86
  end
87
+
88
+ output.puts "Computed max date info = #{max_date_info}" if debug
89
+
90
+ Caddie::CrestPriceHistoryLastDayTimestamp.create_or_update_last_day_timestamp(
91
+ last_update_record, max_date_info, region_id, eve_item_id )
69
92
  end
93
+ output.flush
94
+
70
95
  end
71
- [ total_inserts, total_connections_counts, Time.now - date_deb ]
96
+ [ total_inserts, total_connections_counts, Time.now - date_deb, global_errors_count ]
72
97
  end
73
98
 
74
99
  private
@@ -1,4 +1,14 @@
1
1
  module Caddie
2
2
  class CrestPriceHistoryUpdateLog < ActiveRecord::Base
3
+
4
+ def self.store_log_data( feed_date, update_planning_time, feeding_time, total_inserts, total_connections, total_time )
5
+ log = Caddie::CrestPriceHistoryUpdateLog.where( feed_date: feed_date ).first_or_initialize
6
+ log.update_planning_time = update_planning_time
7
+ log.feeding_time = feeding_time
8
+ log.total_inserts = total_inserts
9
+ log.co_seconds = total_connections.to_f / total_time
10
+ log.save!
11
+ log
12
+ end
3
13
  end
4
14
  end
@@ -12,12 +12,14 @@ class Caddie::MThreadedUpdater
12
12
  end
13
13
 
14
14
  def feed_price_histories_threaded
15
+ split_work_for_threads
15
16
  Thread::abort_on_exception = true
16
17
  threads = []
17
18
  0.upto( @max_threads-1 ).each do |thread_id|
18
19
  threads << Thread.new {
19
- puts Thread.inspect
20
- Thread.current[:timings] = Caddie::CrestPriceHistoryUpdate.feed_price_histories( thread_id )
20
+ thread_log = File.open( "log/feed_price_histories_threaded_#{thread_id}.log", 'w')
21
+ Thread.current[:timings] = Caddie::CrestPriceHistoryUpdate.
22
+ feed_price_histories( updates_ids: @threads_split[ thread_id ], thread_log_file: thread_log )
21
23
  }
22
24
  end
23
25
  result = []
@@ -25,19 +27,19 @@ class Caddie::MThreadedUpdater
25
27
  thread_result = t[:timings]
26
28
  result << thread_result
27
29
  end
28
- tmp = result.map { |a| Vector[*a] }.inject(:+)
29
- tmp.to_a
30
+ results = result.map { |a| Vector[*a] }.inject(:+).to_a
31
+ results[ 2 ] = result.map{ |e| e[2] }.max # For timings we are using the max, not the sum.
32
+ results
30
33
  end
31
34
 
32
35
  def split_work_for_threads
33
36
  puts 'Start splitting work for threads'
34
37
  ids = @daily_operations_list.pluck( :id )
35
- ActiveRecord::Base.transaction do
36
- slice_size = ids.count/@max_threads + 1
37
- ( 0 ... @max_threads ).each do |thread_id|
38
- ids_slice = ids.shift( slice_size )
39
- @daily_operations_list.where( id: ids_slice ).update_all( thread_slice_id: thread_id )
40
- end
38
+ @threads_split = []
39
+
40
+ slice_size = ids.count/@max_threads + 1
41
+ ( 0 ... @max_threads ).each do |thread_id|
42
+ @threads_split[ thread_id ] = ids.shift( slice_size )
41
43
  end
42
44
  puts 'Finished splitting work for threads'
43
45
  end
@@ -0,0 +1,12 @@
1
+ class CreateCaddieCrestPriceHistoryLastDayTimestamps < ActiveRecord::Migration
2
+ def change
3
+ create_table :caddie_crest_price_history_last_day_timestamps do |t|
4
+ t.references :eve_item, index: false, foreign_key: true
5
+ t.references :region, index: false, foreign_key: true
6
+ t.datetime :day_timestamp
7
+
8
+ t.timestamps null: false
9
+ end
10
+ add_index :caddie_crest_price_history_last_day_timestamps, [ :region_id, :eve_item_id ], unique: true, name: :index_caddie_crest_price_history_last_day_timestamps
11
+ end
12
+ end
@@ -1,3 +1,3 @@
1
1
  module Caddie
2
- VERSION = '0.2.3'
2
+ VERSION = '0.2.4'
3
3
  end
@@ -15,17 +15,15 @@ namespace :caddie do
15
15
  update_planning_time = end_update_time - start_time
16
16
 
17
17
  puts 'About to feed crest_price_histories'
18
- total_inserts, total_connections, total_time = Caddie::CrestPriceHistoryUpdate.feed_price_histories
19
- th = Caddie::MThreadedUpdater.new( Caddie::CrestPriceHistoryUpdate::NB_THREADS, Caddie::CrestPriceHistoryUpdate.daily_operations_list )
20
- th.split_work_for_threads
21
- total_inserts, total_connections, total_time = th.feed_price_histories_threaded
18
+ total_inserts, total_connections, total_time = Caddie::CrestPriceHistoryUpdate.feed_price_histories
19
+ # th = Caddie::MThreadedUpdater.new( Caddie::CrestPriceHistoryUpdate::NB_THREADS, Caddie::CrestPriceHistoryUpdate.daily_operations_list )
20
+ # total_inserts, total_connections, total_time = th.feed_price_histories_threaded
22
21
  puts "#{total_inserts} insertions, #{total_connections} connections in #{total_time.round( 2 )} seconds. #{(total_connections/total_time).round( 2 )} co/sec"
23
22
 
24
23
  end_feeding_time = Time.now
25
24
  feeding_time = end_feeding_time - end_update_time
26
25
 
27
- Caddie::CrestPriceHistoryUpdateLog.create!( feed_date: feed_date, update_planning_time: update_planning_time,
28
- feeding_time: feeding_time, total_inserts: total_inserts, co_seconds: total_connections.to_f / total_time )
26
+ Caddie::CrestPriceHistoryUpdateLog.store_log_data( feed_date, update_planning_time, feeding_time, total_inserts, total_connections, total_time )
29
27
 
30
28
  end
31
29
  end
@@ -1,15 +1,7 @@
1
- # require 'open-uri'
2
- # # require 'open-uri/cached'
3
1
  require 'pp'
4
2
 
5
3
  class EveItem < ActiveRecord::Base
6
4
 
7
- # include Assert
8
- # include ItemsInit::ItemSetupAndComp
9
- # extend ItemsInit::ItemSetupAndCompSelf
10
- # extend MultiplePriceRetriever
11
- # extend Setup::UpdateEveItems
12
-
13
5
  has_and_belongs_to_many :users
14
6
  has_one :blueprint, dependent: :destroy
15
7
  has_many :materials, through: :blueprint
@@ -47,7 +39,11 @@ class EveItem < ActiveRecord::Base
47
39
  end
48
40
 
49
41
  def full_batch_size
50
- blueprint.nb_runs*blueprint.prod_qtt if blueprint
42
+ unless blueprint
43
+ puts "EveItem#full_batch_size : #{self.inspect} has no blueprint"
44
+ return -Float::INFINITY
45
+ end
46
+ blueprint.nb_runs*blueprint.prod_qtt
51
47
  end
52
48
 
53
49
  end
@@ -0,0 +1,5 @@
1
+ class AddEpicBlueprintToEveItem < ActiveRecord::Migration
2
+ def change
3
+ add_column :eve_items, :epic_blueprint, :boolean, default: false
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddMarketGroupRefToEveItem < ActiveRecord::Migration
2
+ def change
3
+ add_reference :eve_items, :market_group, index: true
4
+ remove_column :eve_items, :cpp_market_group_id
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ class CrestPriceHistoryIndexReworkAndOthers < ActiveRecord::Migration
2
+ def change
3
+
4
+ remove_column :crest_price_histories, :day_timestamp
5
+
6
+ remove_index :crest_price_histories, :eve_item_id
7
+ remove_index :crest_price_histories, :region_id
8
+ # remove_index :crest_price_histories, :history_date
9
+ # remove_index :crest_price_histories, name: :price_histories_all_keys_index
10
+
11
+ add_index :crest_price_histories, [ :region_id, :eve_item_id ], name: :index_crest_price_histories_on_region_and_item
12
+ add_index :crest_price_histories, :history_date
13
+
14
+ # remove_index :crest_prices_last_month_averages, name: :prices_lmavg_all_keys_index
15
+
16
+ end
17
+ end
@@ -11,11 +11,21 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 20160725091214) do
14
+ ActiveRecord::Schema.define(version: 20160803143148) do
15
15
 
16
16
  # These are extensions that must be enabled in order to support this database
17
17
  enable_extension "plpgsql"
18
18
 
19
+ create_table "caddie_crest_price_history_last_day_timestamps", force: :cascade do |t|
20
+ t.integer "eve_item_id"
21
+ t.integer "region_id"
22
+ t.datetime "day_timestamp"
23
+ t.datetime "created_at", null: false
24
+ t.datetime "updated_at", null: false
25
+ end
26
+
27
+ add_index "caddie_crest_price_history_last_day_timestamps", ["region_id", "eve_item_id"], name: "index_caddie_crest_price_history_last_day_timestamps", unique: true, using: :btree
28
+
19
29
  create_table "caddie_crest_price_history_update_logs", force: :cascade do |t|
20
30
  t.date "feed_date"
21
31
  t.integer "update_planning_time"
@@ -51,23 +61,20 @@ ActiveRecord::Schema.define(version: 20160725091214) do
51
61
  add_index "caddie_crest_price_history_updates", ["thread_slice_id"], name: "index_caddie_crest_price_history_updates_on_thread_slice_id", using: :btree
52
62
 
53
63
  create_table "crest_price_histories", force: :cascade do |t|
54
- t.integer "region_id", null: false
55
- t.integer "eve_item_id", null: false
56
- t.string "day_timestamp", null: false
57
- t.datetime "history_date", null: false
58
- t.integer "order_count", limit: 8
59
- t.integer "volume", limit: 8
64
+ t.integer "region_id", null: false
65
+ t.integer "eve_item_id", null: false
66
+ t.datetime "history_date", null: false
67
+ t.integer "order_count", limit: 8
68
+ t.integer "volume", limit: 8
60
69
  t.float "low_price"
61
70
  t.float "avg_price"
62
71
  t.float "high_price"
63
- t.datetime "created_at", null: false
64
- t.datetime "updated_at", null: false
72
+ t.datetime "created_at", null: false
73
+ t.datetime "updated_at", null: false
65
74
  end
66
75
 
67
- add_index "crest_price_histories", ["day_timestamp"], name: "index_crest_price_histories_on_day_timestamp", using: :btree
68
- add_index "crest_price_histories", ["eve_item_id"], name: "index_crest_price_histories_on_eve_item_id", using: :btree
69
- add_index "crest_price_histories", ["region_id", "eve_item_id", "day_timestamp"], name: "price_histories_all_keys_index", unique: true, using: :btree
70
- add_index "crest_price_histories", ["region_id"], name: "index_crest_price_histories_on_region_id", using: :btree
76
+ add_index "crest_price_histories", ["history_date"], name: "index_crest_price_histories_on_history_date", using: :btree
77
+ add_index "crest_price_histories", ["region_id", "eve_item_id"], name: "index_crest_price_histories_on_region_and_item", using: :btree
71
78
 
72
79
  create_table "eve_items", force: :cascade do |t|
73
80
  t.integer "cpp_eve_item_id"
@@ -76,12 +83,13 @@ ActiveRecord::Schema.define(version: 20160725091214) do
76
83
  t.datetime "updated_at"
77
84
  t.string "name_lowcase"
78
85
  t.float "cost"
79
- t.integer "cpp_market_group_id"
86
+ t.boolean "epic_blueprint", default: false
80
87
  t.boolean "involved_in_blueprint", default: false
88
+ t.integer "market_group_id"
81
89
  end
82
90
 
83
91
  add_index "eve_items", ["cpp_eve_item_id"], name: "index_eve_items_on_cpp_eve_item_id", using: :btree
84
- add_index "eve_items", ["cpp_market_group_id"], name: "index_eve_items_on_cpp_market_group_id", using: :btree
92
+ add_index "eve_items", ["market_group_id"], name: "index_eve_items_on_market_group_id", using: :btree
85
93
 
86
94
  create_table "regions", force: :cascade do |t|
87
95
  t.string "cpp_region_id", null: false
@@ -92,6 +100,8 @@ ActiveRecord::Schema.define(version: 20160725091214) do
92
100
 
93
101
  add_index "regions", ["cpp_region_id"], name: "index_regions_on_cpp_region_id", unique: true, using: :btree
94
102
 
103
+ add_foreign_key "caddie_crest_price_history_last_day_timestamps", "eve_items"
104
+ add_foreign_key "caddie_crest_price_history_last_day_timestamps", "regions"
95
105
  add_foreign_key "caddie_crest_price_history_updates", "eve_items"
96
106
  add_foreign_key "caddie_crest_price_history_updates", "regions"
97
107
  add_foreign_key "crest_price_histories", "eve_items"
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :crest_price_history, class: CrestPriceHistory do
3
+ history_date { Time.now }
4
+ region
5
+ eve_item
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :crest_price_history_last_day_timestamp, class: Caddie::CrestPriceHistoryLastDayTimestamp do
3
+ eve_item
4
+ region
5
+ day_timestamp { Time.now }
6
+ end
7
+ end
@@ -1,4 +1,7 @@
1
1
  FactoryGirl.define do
2
2
  factory :crest_price_history_update, class: Caddie::CrestPriceHistoryUpdate do
3
+ eve_item
4
+ region
5
+ next_process_date { Time.now }
3
6
  end
4
7
  end
@@ -1,7 +1,5 @@
1
1
  FactoryGirl.define do
2
-
3
- factory :caddie_eve_item, class: EveItem do
4
-
2
+ factory :eve_item, class: EveItem do
5
3
  cost 5
6
4
  involved_in_blueprint true
7
5
 
@@ -14,41 +12,5 @@ FactoryGirl.define do
14
12
  sequence :name_lowcase do |n|
15
13
  "name #{n}"
16
14
  end
17
-
18
- # An example of item with blueprint and market group
19
- factory :caddie_inferno_fury_cruise_missile do
20
- cpp_eve_item_id 2621
21
- name "Inferno Fury Cruise Missile"
22
- name_lowcase "inferno fury cruise missile"
23
- cost 1815252.83
24
- # market_group { FactoryGirl.create( :advanced_high_damage_cruise_missiles_market_group ) }
25
-
26
- after(:create) do |eve_item|
27
- # create( :inferno_fury_cruise_blueprint, eve_item: eve_item )
28
- end
29
-
30
- end
31
-
32
- # An example of item with blueprint but no market group
33
- factory :caddie_mjolnir_fury_cruise_missile do
34
- cpp_eve_item_id 24535
35
- name "Mjolnir Fury Cruise Missile"
36
- name_lowcase "mjolnir fury cruise missile"
37
- cost 1815252.83
38
-
39
- after(:create) do |eve_item|
40
- # create( :inferno_fury_cruise_blueprint, eve_item: eve_item )
41
- end
42
-
43
- end
44
-
45
- # An example with no blueprint and no market group
46
- factory :caddie_inferno_precision_cruise_missile do
47
- cpp_eve_item_id 2637
48
- name "Inferno Precision Cruise Missile"
49
- name_lowcase "inferno precision cruise missile"
50
- cost 1815252.83
51
- end
52
-
53
15
  end
54
16
  end
@@ -1,33 +1,10 @@
1
1
  FactoryGirl.define do
2
-
3
- factory :caddie_region, class: Region do
4
-
5
- factory :caddie_heimatar do
2
+ factory :region, class: Region do
3
+ cpp_region_id '123456'
4
+ name 'Region test'
5
+ factory :heimatar do
6
6
  cpp_region_id '10000030'
7
7
  name 'Heimatar'
8
-
9
- after(:create) do |region|
10
-
11
- # pator = create( :rens, region: region )
12
- # rens = create( :pator, region: region )
13
-
14
- blueprint_and_market_group = create( :caddie_inferno_fury_cruise_missile )
15
- blueprint_but_no_market_group = create( :caddie_mjolnir_fury_cruise_missile )
16
- no_market_group_and_no_blueprint = create( :caddie_inferno_precision_cruise_missile )
17
-
18
- [ blueprint_and_market_group, blueprint_but_no_market_group, no_market_group_and_no_blueprint ].each do |item|
19
-
20
- # [ pator, rens ].each do |trade_hub|
21
- # create( :min_price, trade_hub: trade_hub, eve_item: item )
22
- # end
23
-
24
- # create( :crest_prices_last_month_average, eve_item: item, region: region )
25
-
26
- end
27
- end
28
-
29
8
  end
30
-
31
9
  end
32
-
33
10
  end
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ module Caddie
4
+ class CrestDataRetrieverTest < ActiveSupport::TestCase
5
+
6
+ def setup
7
+ create( :crest_price_history_update )
8
+
9
+ Object.stubs( :read ).returns( { items: [ 'item_test' ] }.to_json )
10
+ Caddie::CrestPriceHistoryUpdate.stubs( :open ).returns( Object )
11
+ end
12
+
13
+ test 'get_multipage_data' do
14
+ result = Caddie::CrestPriceHistoryUpdate.get_markets( 1, 1 )
15
+ assert_equal [['item_test'], 1], result
16
+ end
17
+
18
+ test 'Shoud properly handle OpenURI::HTTPError' do
19
+ Caddie::CrestPriceHistoryUpdate.unstub( :open )
20
+ Caddie::CrestPriceHistoryUpdate.stubs(:open).raises( OpenURI::HTTPError.new( 'No connection', STDERR ) )
21
+
22
+ Caddie::CrestPriceHistoryUpdate.stubs(:sleep)
23
+
24
+ result = Caddie::CrestPriceHistoryUpdate.feed_price_histories
25
+ assert_equal 2, result[3]
26
+
27
+ Caddie::CrestPriceHistoryUpdate.unstub(:sleep)
28
+ end
29
+
30
+ teardown do
31
+ Object.unstub(:read)
32
+ Caddie::CrestPriceHistoryUpdate.unstub(:open)
33
+ end
34
+
35
+ end
36
+ end