rapflag 0.0.2 → 0.0.3

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.
@@ -0,0 +1,325 @@
1
+ require 'csv'
2
+ require 'open-uri'
3
+ require 'faraday'
4
+ require 'fileutils'
5
+ require 'rapflag/history'
6
+ require 'poloniex'
7
+ require 'json'
8
+ require 'pp'
9
+
10
+ module RAPFLAG
11
+
12
+ class Poloniex < History
13
+ attr_reader :complete_balances, :active_loans, :lending_history, :deposits, :withdrawals, :deposit_addresses,
14
+ :trade_history, :available_account_balances, :open_orders, :tradable_balances
15
+
16
+ @@btc_to_usd = {}
17
+ @@bfx_to_usd = {}
18
+
19
+ def get_usd_exchange(date_time = Time.now, from='BTC')
20
+ return 1.0 if from == 'USD'
21
+ daily = ::Poloniex.get_all_daily_exchange_rates('BTC_GNT')
22
+
23
+ key = date_time.strftime(DATE_FORMAT)
24
+ return @@btc_to_usd[key] if from.eql?('BTC') && @@btc_to_usd.size > 0
25
+ return @@bfx_to_usd[key] if from.eql?('BFX') && @@bfx_to_usd.size > 0
26
+ ms = (date_time.is_a?(Date) ? date_time.to_time : date_time).to_i*1000
27
+ ms_next_date = ms + (3*24*3600)*1000
28
+ # this does not work
29
+ # url = "https://api.bitfinex.com/v2/candles/trade:1D:t#{from}USD/hist?start:#{ms}?end:#{ms_next_date}"
30
+ url = "https://api.bitfinex.com/v2/candles/trade:1D:t#{from}USD/hist?start:#{ms}?end:#{ms_next_date}"
31
+ # therefore we just return the most uptodate
32
+ url = "https://api.bitfinex.com/v2/candles/trade:1D:t#{from}USD/hist?start:#{ms}"
33
+ puts "Fetching #{date_time}: #{url} #{@@btc_to_usd.size} BTC #{@@bfx_to_usd.size} BFX" if $VERBOSE
34
+ response = Faraday.get(url)
35
+ items = eval(response.body)
36
+ rates = {}
37
+ items.each do |item|
38
+ if item.first.eql?(:error)
39
+ puts "Fetching returned #{item}. Aborting"
40
+ exit(1)
41
+ end
42
+ timestamp = Time.at(item.first/1000).strftime(DATE_FORMAT)
43
+ rates[timestamp] = item[2]
44
+ end;
45
+ from.eql?('BTC') ? @@btc_to_usd = rates.clone : @@bfx_to_usd = rates.clone
46
+ rates[key] ? rates[key] : nil
47
+ rescue => err
48
+ puts "Err #{err}"
49
+ end
50
+
51
+ def dump_history
52
+ load_history_info
53
+ FileUtils.makedirs('output') unless File.directory?('output')
54
+ CSV.open('output/trade_history.csv','w+',
55
+ :col_sep => ';',
56
+ :write_headers=> true,
57
+ :headers => [ 'currency_pair'] + @trade_history.values.first.first.to_h.keys
58
+ ) do |csv|
59
+ @trade_history.each do |currency_pair, trades|
60
+ trades.each do |trace|
61
+ csv << [ currency_pair] + trace.to_h.values
62
+ end
63
+ end
64
+ end
65
+ CSV.open('output/lending_history.csv','w+',
66
+ :col_sep => ';',
67
+ :write_headers=> true,
68
+ :headers => @lending_history.first.to_h.keys
69
+ ) do |csv|
70
+ @lending_history.each do |info|
71
+ csv << info.to_h.values
72
+ end
73
+ end
74
+ CSV.open('output/tradable_balances.csv','w+',
75
+ :col_sep => ';',
76
+ :write_headers=> true,
77
+ :headers => [ 'from_currency', 'to_from_currency', ]
78
+ ) do |csv|
79
+ @tradable_balances.each do |currency_pair, balance|
80
+ balance.each do |info|
81
+ csv << [ currency_pair] + info
82
+ end
83
+ end
84
+ end
85
+ CSV.open('output/complete_balances.csv', 'w+',
86
+ :col_sep => ';',
87
+ :write_headers=> true,
88
+ :headers => [ 'currency', 'available', 'onOrders', 'btcValue' ]
89
+ ) do |csv|
90
+ @complete_balances.each do |balance|
91
+ csv << [balance[0]] + balance[1].values
92
+ end
93
+ end
94
+ CSV.open('output/active_loans.csv', 'w+',
95
+ :col_sep => ';',
96
+ :write_headers=> true,
97
+ :headers => [ 'key', 'id', 'currency', 'rate', 'amount', 'duration', 'autoRenew', 'date', 'fees', ]
98
+ ) do |csv|
99
+ @active_loans.each do |key, loans|
100
+ loans.each do | loan |
101
+ csv << [key] + loan.values
102
+ end
103
+ end
104
+ end
105
+
106
+ CSV.open('output/available_account_balances.csv', 'w+',
107
+ :col_sep => ';',
108
+ :write_headers=> true,
109
+ :headers => [ 'key', 'currency', 'balance']
110
+ ) do |csv|
111
+ @available_account_balances.each do |key, balances|
112
+ balances.each do |currency, balance|
113
+ csv << [key, currency, balance]
114
+ end
115
+ end
116
+ end
117
+ CSV.open('output/deposit_addresses.csv', 'w+',
118
+ :col_sep => ';',
119
+ :write_headers=> true,
120
+ :headers => [ 'currency', 'id']
121
+ ) do |csv|
122
+ @deposit_addresses.each do |currency, id|
123
+ csv << [currency, id]
124
+ end
125
+ end
126
+ CSV.open('output/withdrawals.csv','w+',
127
+ :col_sep => ';',
128
+ :write_headers=> true,
129
+ :headers => @deposits.first.to_h.keys
130
+ ) do |csv|
131
+ @deposits.each do |info|
132
+ csv << info.to_h.values
133
+ end
134
+ end
135
+ CSV.open('output/deposits.csv','w+',
136
+ :col_sep => ';',
137
+ :write_headers=> true,
138
+ :headers => @withdrawals.first.to_h.keys
139
+ ) do |csv|
140
+ @withdrawals.each do |info|
141
+ csv << info.to_h.values
142
+ end
143
+ end
144
+ end
145
+
146
+ def find_per_currency_and_day(items, currency, date)
147
+ puts "Searching for #{currency} in day #{date}" if $VERBOSE
148
+ start_time = date.to_time.to_i
149
+ end_time = (date + 1).to_time.to_i
150
+ found = items.find_all{|item| item.currency.eql?(currency) && item.timestamp >= start_time && item.timestamp < end_time}
151
+ puts "find_per_currency_and_day: found #{found.size} #{found.first} #{found.last}" if $VERBOSE
152
+ found
153
+ end
154
+
155
+ def find_lending_info_day(currency, date)
156
+ puts "Searching lending (close) for #{currency} in day #{date}" if $VERBOSE
157
+ found = @lending_history.find_all { |item| item.currency.eql?(currency) && date.eql?(Date.parse(item.close)) }
158
+ puts "find_lending_info_day: found #{found.size} #{found.first} #{found.last}" if $VERBOSE
159
+ found
160
+ end
161
+
162
+ # type is either buy or sell
163
+ def find_day_trade(currency, date, type)
164
+ found = []
165
+ @trade_history.each do |currency_pair, trades|
166
+ next unless /^#{currency}/.match(currency_pair)
167
+ trades.each do |trade|
168
+ if trade.type.eql?(type) && date.eql?(Date.parse(trade.date))
169
+ trade.cucurrency_pair = currency_pair
170
+ found << trade
171
+ end
172
+ end
173
+ end
174
+ puts "find_day_trade: #{date} #{currency} found #{found.size}" if $VERBOSE
175
+ found
176
+ end
177
+ def create_csv_file
178
+ binding.pry
179
+ puts "create_csv_file: already done"
180
+ end
181
+
182
+ def fetch_csv_history
183
+ load_history_info
184
+ @trade_history.values.collect{|values| values.collect{|x| x.date} }.max
185
+
186
+ max_time = [ @deposits.collect{|x| x.timestamp}.max,
187
+ Time.parse(@trade_history.values.collect{|values| values.collect{|x| x.date} }.max.max).to_i,
188
+ Time.parse(@lending_history.collect{|x| x.close}.max).to_i,
189
+ @withdrawals.collect{|x| x.timestamp}.max,].max
190
+ min_time = [ @deposits.collect{|x| x.timestamp}.min,
191
+ Time.parse(@trade_history.values.collect{|values| values.collect{|x| x.date} }.min.min).to_i,
192
+ Time.parse(@lending_history.collect{|x| x.close}.min).to_i,
193
+ @withdrawals.collect{|x| x.timestamp}.min,].min
194
+
195
+ min_date = Time.at(min_time).to_date
196
+ max_date = Time.at(max_time).to_date
197
+
198
+ puts "We start using the available_account_balances"
199
+ pp @available_account_balances
200
+ puts
201
+ puts "Should we better start using the complete_balances"
202
+ pp @complete_balances
203
+ puts "How should I handle the following currency_pair"
204
+ pp @trade_history.keys
205
+ @available_account_balances.each do |key, balances|
206
+ balances.each do |currency, balance|
207
+ puts "Calculation history for #{key} #{currency} with current balance of #{balance}"
208
+ out_name = "output/poloniex/#{key}_#{currency}.csv"
209
+ FileUtils.makedirs(File.dirname(out_name)) unless File.exists?(File.dirname(out_name))
210
+ @history = []
211
+ current_day = max_date
212
+ current_balance = balance.to_f
213
+ while (current_day >= min_date)
214
+ entry = OpenStruct.new
215
+ entry.current_day = current_day
216
+ entry.current_balance = current_balance
217
+
218
+ deposits = find_per_currency_and_day(@deposits, currency,current_day)
219
+ sum_deposits = 0.0; deposits.each{ |x| sum_deposits += x.amount.to_f }
220
+ entry.deposits = sum_deposits
221
+
222
+ withdrawals = find_per_currency_and_day(@withdrawals, currency, current_day)
223
+ sum_withdrawals = 0.0; withdrawals.each{ |x| sum_withdrawals += x.amount.to_f }
224
+ entry.withdrawals = sum_withdrawals
225
+
226
+ lendings = find_lending_info_day(currency, current_day)
227
+ earned = 0.0; sum_fee = 0.0; lendings.each{ |x| earned += x.earned.to_f; sum_fee += x.fee.to_f }
228
+ entry.earned = earned
229
+ entry.fees = sum_fee
230
+
231
+ # End_of_Day_Balance = End_of_Day_Balance(-1) + Deposits - Withdrawals + Lending_Income - Trading_Fees + Purchases - Sales
232
+ sales = find_day_trade(currency, current_day, 'sell')
233
+ sum_sales = 0.0; sales.each{ |sale| sum_sales += sale.amount.to_f }
234
+ entry.sales = sum_sales
235
+
236
+ purchases = find_day_trade(currency, current_day, 'buy')
237
+ sum_purchase = 0.0; purchases.each{ |purchase| sum_purchase += purchase.amount.to_f }
238
+ entry.purchases = sum_purchase
239
+ entry.day_difference = sum_deposits - sum_withdrawals + sum_purchase - sum_sales + sum_fee
240
+ @history << entry
241
+ current_day -= 1
242
+ # balance for previous day
243
+ current_balance = entry.current_balance - entry.day_difference
244
+ end
245
+ next unless @history.size > 0
246
+ CSV.open(out_name,'w+',
247
+ :col_sep => ';',
248
+ :write_headers=> true,
249
+ :headers => @history.first.to_h.keys
250
+ ) do |csv|
251
+ @history.each do |info|
252
+ csv << info.to_h.values
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end
258
+ private
259
+ def check_config
260
+ @spec_data = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec', 'data'))
261
+ ['poloniex_api_key',
262
+ 'poloniex_secret',
263
+ ].each do |item|
264
+ raise "Must define #{item} in config.yml" unless Config[item]
265
+ end
266
+ ::Poloniex.setup do | config |
267
+ config.key = Config['poloniex_api_key']
268
+ config.secret = Config['poloniex_secret']
269
+ end
270
+ nil
271
+ end
272
+ private
273
+ def load_or_save_json(name, param = nil)
274
+ json_file = File.join(@spec_data, name.to_s + '.json')
275
+ if File.exist?(json_file) && defined?(RSpec)
276
+ body = IO.read(json_file)
277
+ else
278
+ cmd = param ? "::Poloniex.#{name.to_s}('#{param}').body" : "::Poloniex.#{name.to_s}.body"
279
+ body = eval(cmd)
280
+ File.open(json_file, 'w+') { |f| f.write(body)}
281
+ end
282
+ eval("@#{name} = JSON.parse(body)")
283
+ end
284
+ def load_history_info
285
+ check_config
286
+ begin
287
+ @balances = load_or_save_json(:balances)
288
+ rescue => error
289
+ puts "Error was #{error.inspect}"
290
+ puts "Calling @balances from poloniex failed. Configuration was"
291
+ pp ::Poloniex.configuration
292
+ exit 1
293
+ end
294
+ @active_loans = load_or_save_json(:active_loans)
295
+ @available_account_balances = load_or_save_json(:available_account_balances)
296
+ all = load_or_save_json(:complete_balances)
297
+ @complete_balances = all.find_all{ | currency, values| values["available"].to_f != 0.0 }
298
+ @deposit_addresses = load_or_save_json(:deposit_addresses)
299
+
300
+ @deposits_withdrawals = load_or_save_json(:deposits_withdrawls)
301
+ # deposits and withdrawals have a different structure
302
+ @deposits = []
303
+ @deposits_withdrawals['deposits'].each {|x| @deposits << OpenStruct.new(x) };
304
+ @withdrawals =[]
305
+ @deposits_withdrawals['withdrawals'].each {|x| @withdrawals << OpenStruct.new(x) };
306
+ info = load_or_save_json(:lending_history)
307
+ @lending_history = []
308
+ info.each {|x| @lending_history << OpenStruct.new(x) };
309
+
310
+ @open_orders = load_or_save_json(:open_orders, 'all')
311
+ info = load_or_save_json(:trade_history, 'all')
312
+ @trade_history = {}
313
+ info.each do |currency_pair, trades|
314
+ @trade_history[currency_pair] = []
315
+ trades.each {|x| @trade_history[currency_pair] << OpenStruct.new(x) };
316
+ @trade_history[currency_pair].sort!{|x,y| x[:date] <=> y[:date]}.collect{ |x| x[:date]}
317
+ end
318
+ # @trade_history.values.first.first.tradeID
319
+ @tradable_balances = load_or_save_json(:tradable_balances)
320
+ @active_loans # key
321
+ @provided_loans = []; @active_loans['provided'].each {|x| @provided_loans << OpenStruct.new(x) };
322
+ @used_loans = []; @active_loans['used'].each {|x| @used_loans << OpenStruct.new(x) };
323
+ end
324
+ end
325
+ end
@@ -1,4 +1,4 @@
1
1
  module RAPFLAG
2
2
  Wallets = ['trading', 'exchange', 'deposit']
3
- VERSION='0.0.2'
3
+ VERSION='0.0.3'
4
4
  end
data/rapflag.gemspec CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.add_dependency 'poloniex'
20
21
  spec.add_dependency 'bitfinex-rb'
21
22
  spec.add_dependency 'trollop'
22
23
 
@@ -0,0 +1,128 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'rapflag/bitfinex'
4
+ require 'vcr'
5
+ require 'date'
6
+
7
+ VCR.configure do |config|
8
+ config.cassette_library_dir = "fixtures/vcr_cassettes"
9
+ config.hook_into :faraday # or :fakeweb
10
+ end
11
+
12
+ VCR.eject_cassette # we use insert/eject around each example
13
+ describe RAPFLAG::Bitfinex do
14
+ OUTPUT_ROOT = File.expand_path(File.join(__FILE__, '..', '..', 'output', 'bitfinex'))
15
+ Bitfinex_CSV_Test_File = OUTPUT_ROOT + '/BTC_exchange.csv'
16
+ BITFINEX_SUMMARY_EXCHANGE_BTC_File = OUTPUT_ROOT + '/BTC_exchange_summary.csv'
17
+ BITFINEX_SUMMARY_DEPOSIT_BFX_File = OUTPUT_ROOT + '/BFX_deposit_summary.csv'
18
+
19
+ # include ServerMockHelper
20
+ before(:all) do
21
+ end
22
+ after(:all) do
23
+ end
24
+ context 'bitfinex' do
25
+ before(:all) do
26
+ VCR.use_cassette("rapflag", :record => :new_episodes) do
27
+ FileUtils.rm_f(Bitfinex_CSV_Test_File) if File.exist?(Bitfinex_CSV_Test_File)
28
+ FileUtils.rm_f(BITFINEX_SUMMARY_DEPOSIT_BFX_File) if File.exist?(BITFINEX_SUMMARY_DEPOSIT_BFX_File)
29
+ FileUtils.rm_f(BITFINEX_SUMMARY_EXCHANGE_BTC_File) if File.exist?(Bitfinex_CSV_Test_File)
30
+ expect(File.exist?(Bitfinex_CSV_Test_File)).to eql(false)
31
+ @rap = RAPFLAG::Bitfinex.new('exchange', 'BTC')
32
+ @rap.fetch_csv_history
33
+ @rap.create_csv_file
34
+ end
35
+ end
36
+ context 'history' do
37
+ it 'should have correct currency' do
38
+ expect(@rap.currency).to eql('BTC')
39
+ end
40
+ it 'should have correct size' do
41
+ expect(@rap.history.size).to eql(206)
42
+ end
43
+ end
44
+ end
45
+ context 'bitfinex CSV' do
46
+ context 'csv' do
47
+ it 'should have generated a correct CSV file' do
48
+ expect(File.exist?(Bitfinex_CSV_Test_File)).to eql(true)
49
+ lines = IO.readlines(Bitfinex_CSV_Test_File)
50
+ expect(lines.first.chomp).to eql('currency;amount;balance;description;date_time')
51
+ expect(lines[1].chomp).to eql(
52
+ 'BTC;-0.00000005;0.0;Transfer of 0.0 BTC from wallet Exchange to Deposit on wallet Exchange;2016.12.03 21:20:47')
53
+ end
54
+ end
55
+ end
56
+ context 'exchange option --clean' do
57
+ before(:all) do
58
+ @date_bfx_1 = Date.new(2017,1,10)
59
+ @date_btx_1 = Date.new(2017,1,21)
60
+ @date_btx_2 = Date.new(2017,1,10)
61
+ VCR.use_cassette("rapflag", :record => :new_episodes) do
62
+ FileUtils.rm_f(BITFINEX_SUMMARY_EXCHANGE_BTC_File) if File.exist?(Bitfinex_CSV_Test_File)
63
+ expect(File.exist?(BITFINEX_SUMMARY_EXCHANGE_BTC_File)).to eql(false)
64
+ @exchange = RAPFLAG::Bitfinex.new('exchange', 'BTC')
65
+ @exchange.fetch_csv_history
66
+ @exchange.create_summary
67
+ @bfx = @exchange.get_usd_exchange(@date_bfx_1, 'BFX')
68
+ @btx_1 = @exchange.get_usd_exchange(@date_btx_1, 'BTC')
69
+ @btx_2 = @exchange.get_usd_exchange(@date_btx_2, 'BTC')
70
+ end
71
+ end
72
+ it 'should have generated a correct summary CSV file' do
73
+ expect(File.exist?(BITFINEX_SUMMARY_EXCHANGE_BTC_File)).to eql(true)
74
+ lines = IO.readlines(BITFINEX_SUMMARY_EXCHANGE_BTC_File)
75
+ expect(lines.first.chomp).to eql('currency;date;income;balance;rate;balance_in_usd')
76
+ expect(lines[1].chomp).to eql('BTC;2016.01.15;0.0;8.99788147;;')
77
+ expect(lines[-1].chomp).to eql('BTC;2016.12.03;0.0;0.0;765.46;0.0')
78
+ end
79
+ it 'should have a balance for for each day' do
80
+ expect(File.exist?(BITFINEX_SUMMARY_EXCHANGE_BTC_File)).to eql(true)
81
+ lines = IO.readlines(BITFINEX_SUMMARY_EXCHANGE_BTC_File)
82
+ first_date = Date.strptime(lines[1].chomp.split(';')[1], '%Y.%m.%d')
83
+ last_date = Date.strptime(lines[-1].chomp.split(';')[1], '%Y.%m.%d')
84
+ (last_date > first_date).should be true
85
+ nr_dates = 323
86
+ (last_date - first_date).to_i.should eql nr_dates
87
+ (1..nr_dates).each do |j|
88
+ wish_date = (first_date + j).strftime('%Y.%m.%d')
89
+ binding.pry unless lines.find_all{|line| line.index(wish_date)}.size == 1
90
+ lines.find_all{|line| line.index(wish_date)}.size.should eql 1
91
+ end
92
+ end
93
+ it 'should have NOT have generated a correct summary deposit BFX CSV file' do
94
+ expect(File.exist?(BITFINEX_SUMMARY_DEPOSIT_BFX_File)).to eql(false)
95
+ end
96
+ it 'should have the correct BTC -> USD rate' do
97
+ expect(@btx_1).to eql 924.02
98
+ expect(@btx_2).to eql 905.76
99
+ end
100
+ it 'should have the correct BFX -> USD rate' do
101
+ expect(@bfx).to eql 0.5697
102
+ end
103
+ end
104
+ context 'deposit option --clean' do
105
+ before(:all) do
106
+ FileUtils.rm_f(BITFINEX_SUMMARY_EXCHANGE_BTC_File) if File.exist?(BITFINEX_SUMMARY_EXCHANGE_BTC_File)
107
+ FileUtils.rm_f(BITFINEX_SUMMARY_DEPOSIT_BFX_File) if File.exist?(Bitfinex_CSV_Test_File)
108
+ @date_bfx_1 = Date.new(2017,1,10)
109
+ @date_btx_1 = Date.new(2017,1,21)
110
+ @date_btx_2 = Date.new(2017,1,10)
111
+ VCR.use_cassette("rapflag", :record => :new_episodes) do
112
+ expect(File.exist?(BITFINEX_SUMMARY_DEPOSIT_BFX_File)).to eql(false)
113
+ @deposit = RAPFLAG::Bitfinex.new('deposit', 'BFX')
114
+ @deposit.fetch_csv_history
115
+ @deposit.create_summary
116
+ end
117
+ end
118
+ it 'should have NOT generated a exchange BTC summary CSV file' do
119
+ expect(File.exist?(BITFINEX_SUMMARY_EXCHANGE_BTC_File)).to eql(false)
120
+ end
121
+ it 'should have NOT generated a correct summary CSV file' do
122
+ expect(File.exist?(BITFINEX_SUMMARY_DEPOSIT_BFX_File)).to eql(true)
123
+ lines = IO.readlines(BITFINEX_SUMMARY_DEPOSIT_BFX_File)
124
+ expect(lines.first.chomp).to eql('currency;date;income;balance;rate;balance_in_usd')
125
+ expect(lines[1].chomp).to eql('BFX;2016.01.15;0.0;8.99788147;;')
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,115 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'rapflag/poloniex'
4
+ require 'vcr'
5
+
6
+ VCR.configure do |config|
7
+ config.cassette_library_dir = "fixtures/vcr_cassettes"
8
+ config.hook_into :faraday
9
+ end
10
+
11
+ VCR.eject_cassette # we use insert/eject around each example
12
+
13
+ describe RAPFLAG::Poloniex do
14
+ TEST_OUTPUT_ROOT = File.expand_path(File.join(__FILE__, '..', '..', 'output/poloniex'))
15
+ Poloniex_CSV_Test_File = TEST_OUTPUT_ROOT + '/BTC_exchange.csv'
16
+ Poloniex_SUMMARY_EXCHANGE_BTC_File = TEST_OUTPUT_ROOT + '/BTC_exchange_summary.csv'
17
+ Poloniex_SUMMARY_DEPOSIT_BFX_File = TEST_OUTPUT_ROOT + '/BFX_deposit_summary.csv'
18
+
19
+ context 'poloniex' do
20
+ before(:all) do
21
+ # skip("We cannot yet use VCR here. Therefore omitting all spec tests")
22
+ # VCR.use_cassette("poloniex", :record => :new_episodes) do
23
+ FileUtils.rm_f(Poloniex_CSV_Test_File) if File.exist?(Poloniex_CSV_Test_File)
24
+ FileUtils.rm_f(Poloniex_SUMMARY_DEPOSIT_BFX_File) if File.exist?(Poloniex_SUMMARY_DEPOSIT_BFX_File)
25
+ FileUtils.rm_f(Poloniex_SUMMARY_EXCHANGE_BTC_File) if File.exist?(Poloniex_CSV_Test_File)
26
+ expect(File.exist?(Poloniex_CSV_Test_File)).to eql(false)
27
+ @rap = RAPFLAG::Poloniex.new('exchange', 'BTC')
28
+ @rap.fetch_csv_history
29
+ # @rap.create_csv_file
30
+ # end
31
+ end
32
+ context 'history' do
33
+ it 'should have correct currency' do
34
+ expect(@rap.currency).to eql('BTC')
35
+ end
36
+ it 'should have correct size' do
37
+ expect(@rap.history.size).to eql(368)
38
+ end
39
+ end
40
+ end
41
+ context 'poloniex CSV' do
42
+ before(:all) do
43
+ skip("We cannot yet use VCR here. Therefore omitting all spec tests")
44
+ end
45
+ context 'csv' do
46
+ it 'should have generated a correct CSV file' do
47
+ expect(File.exist?(Poloniex_CSV_Test_File)).to eql(true)
48
+ lines = IO.readlines(Poloniex_CSV_Test_File)
49
+ expect(lines.first.chomp).to eql('currency,amount,balance,description,date_time')
50
+ expect(lines[1].chomp).to eql(
51
+ 'BTC,-0.00000005,0.0,Transfer of 0.0 BTC from wallet Exchange to Deposit on wallet Exchange,2016.12.03 21:20:47')
52
+ end
53
+ end
54
+ end
55
+ context 'exchange option --clean' do
56
+ before(:all) do
57
+ skip("We cannot yet use VCR here. Therefore omitting all spec tests")
58
+ @date_bfx_1 = Date.new(2017,1,10)
59
+ @date_btx_1 = Date.new(2017,1,21)
60
+ @date_btx_2 = Date.new(2017,1,10)
61
+ VCR.use_cassette("poloniex", :record => :new_episodes) do
62
+ FileUtils.rm_f(Poloniex_SUMMARY_EXCHANGE_BTC_File) if File.exist?(Poloniex_CSV_Test_File)
63
+ expect(File.exist?(Poloniex_SUMMARY_EXCHANGE_BTC_File)).to eql(false)
64
+ @exchange = RAPFLAG::Poloniex.new('exchange', 'BTC')
65
+ @exchange.fetch_csv_history
66
+ @exchange.create_summary
67
+ @bfx = @exchange.get_usd_exchange(@date_bfx_1, 'BFX')
68
+ @btx_1 = @exchange.get_usd_exchange(@date_btx_1, 'BTC')
69
+ @btx_2 = @exchange.get_usd_exchange(@date_btx_2, 'BTC')
70
+ end
71
+ end
72
+ it 'should have generated a correct summary CSV file' do
73
+ expect(File.exist?(Poloniex_SUMMARY_EXCHANGE_BTC_File)).to eql(true)
74
+ lines = IO.readlines(Poloniex_SUMMARY_EXCHANGE_BTC_File)
75
+ expect(lines.first.chomp).to eql('currency,date,income,balance,rate,balance_in_usd')
76
+ expect(lines[1].chomp).to eql('BTC,2016.01.15,0.0,8.99788147,,')
77
+ expect(lines[-1].chomp).to eql('BTC,2016.12.03,0.0,0.0,765.46,0.0')
78
+ end
79
+ it 'should have NOT have generated a correct summary deposit BFX CSV file' do
80
+ expect(File.exist?(Poloniex_SUMMARY_DEPOSIT_BFX_File)).to eql(false)
81
+ end
82
+ it 'should have the correct BTC -> USD rate' do
83
+ expect(@btx_1).to eql 924.02
84
+ expect(@btx_2).to eql 905.76
85
+ end
86
+ it 'should have the correct BFX -> USD rate' do
87
+ expect(@bfx).to eql 0.5697
88
+ end
89
+ end
90
+ context 'deposit option --clean' do
91
+ before(:all) do
92
+ skip("We cannot yet use VCR here. Therefore omitting all spec tests")
93
+ FileUtils.rm_f(Poloniex_SUMMARY_EXCHANGE_BTC_File) if File.exist?(Poloniex_SUMMARY_EXCHANGE_BTC_File)
94
+ FileUtils.rm_f(Poloniex_SUMMARY_DEPOSIT_BFX_File) if File.exist?(Poloniex_CSV_Test_File)
95
+ @date_bfx_1 = Date.new(2017,1,10)
96
+ @date_btx_1 = Date.new(2017,1,21)
97
+ @date_btx_2 = Date.new(2017,1,10)
98
+ VCR.use_cassette("rapflag", :record => :new_episodes) do
99
+ expect(File.exist?(Poloniex_SUMMARY_DEPOSIT_BFX_File)).to eql(false)
100
+ @deposit = RAPFLAG::Poloniex.new('deposit', 'BFX')
101
+ @deposit.fetch_csv_history
102
+ @deposit.create_summary
103
+ end
104
+ end
105
+ it 'should have NOT generated a exchange BTC summary CSV file' do
106
+ expect(File.exist?(Poloniex_SUMMARY_EXCHANGE_BTC_File)).to eql(false)
107
+ end
108
+ it 'should have NOT generated a correct summary CSV file' do
109
+ expect(File.exist?(Poloniex_SUMMARY_DEPOSIT_BFX_File)).to eql(true)
110
+ lines = IO.readlines(Poloniex_SUMMARY_DEPOSIT_BFX_File)
111
+ expect(lines.first.chomp).to eql('currency,date,income,balance,rate,balance_in_usd')
112
+ expect(lines[1].chomp).to eql('BFX,2016.01.15,0.0,8.99788147,,')
113
+ end
114
+ end
115
+ end
data/spec/spec_helper.rb CHANGED
@@ -4,7 +4,9 @@ rescue LOAD_ERROR
4
4
  end
5
5
 
6
6
  require 'rapflag/version'
7
+ require 'rapflag/config'
7
8
  require 'bitfinex-api-rb'
9
+ require 'poloniex'
8
10
 
9
11
  module RAPFLAG
10
12
  # create dummy config for spec tests
@@ -13,6 +15,10 @@ module RAPFLAG
13
15
  conf.secret = 'SECRECT_KEY'
14
16
  conf.websocket_api_endpoint = 'wss://api.bitfinex.com/ws'
15
17
  end
18
+ Poloniex.setup do | config |
19
+ config.key = 'P_123467889'
20
+ config.secret = 'P_SECRECT_KEY'
21
+ end
16
22
  end
17
23
 
18
24
  # This file was generated by the `rspec --init` command. Conventionally, all
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rapflag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zeno R.R. Davatz, Niklaus Giger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-29 00:00:00.000000000 Z
11
+ date: 2017-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: poloniex
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bitfinex-rb
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -133,16 +147,20 @@ files:
133
147
  - ".rspec"
134
148
  - ".travis.yml"
135
149
  - Gemfile
150
+ - History.md
136
151
  - LICENSE
137
152
  - README.md
138
153
  - Rakefile
139
154
  - bin/rapflag
140
155
  - fixtures/vcr_cassettes/rapflag.yml
156
+ - lib/rapflag/bitfinex.rb
141
157
  - lib/rapflag/config.rb
142
- - lib/rapflag/fetch.rb
158
+ - lib/rapflag/history.rb
159
+ - lib/rapflag/poloniex.rb
143
160
  - lib/rapflag/version.rb
144
161
  - rapflag.gemspec
145
- - spec/rapflag_spec.rb
162
+ - spec/bitfinex_spec.rb
163
+ - spec/poloniex_spec.rb
146
164
  - spec/spec_helper.rb
147
165
  homepage: https://github.com/zdavatz/rapflag
148
166
  licenses:
@@ -169,5 +187,6 @@ signing_key:
169
187
  specification_version: 4
170
188
  summary: Bitfinex Exporter for your Taxman from ywesee
171
189
  test_files:
172
- - spec/rapflag_spec.rb
190
+ - spec/bitfinex_spec.rb
191
+ - spec/poloniex_spec.rb
173
192
  - spec/spec_helper.rb