rapflag 0.0.1

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,174 @@
1
+ require 'csv'
2
+ require 'open-uri'
3
+ require 'faraday'
4
+
5
+ module RAPFLAG
6
+
7
+ class History
8
+ attr_reader :history, :wallet, :currency, :btc_to_usd, :bfx_to_usd
9
+ DATE_FORMAT = '%Y.%m.%d'
10
+ DATE_TIME_FORMAT = '%Y.%m.%d %H:%M:%S'
11
+ @@btc_to_usd = {}
12
+ @@bfx_to_usd = {}
13
+
14
+ def initialize(wallet = 'trading', currency = 'USD')
15
+ @wallet = wallet
16
+ @currency = currency
17
+ end
18
+
19
+ def get_usd_exchange(date_time = Time.now, from='BTC')
20
+ return 1.0 if from == 'USD'
21
+ key = date_time.strftime(DATE_FORMAT)
22
+ return @@btc_to_usd[key] if from.eql?('BTC') && @@btc_to_usd.size > 0
23
+ return @@bfx_to_usd[key] if from.eql?('BFX') && @@bfx_to_usd.size > 0
24
+
25
+ ms = (date_time.is_a?(Date) ? date_time.to_time : date_time).to_i*1000
26
+ ms_next_date = ms + (3*24*3600)*1000
27
+ # this does not work
28
+ # url = "https://api.bitfinex.com/v2/candles/trade:1D:t#{from}USD/hist?start:#{ms}?end:#{ms_next_date}"
29
+ url = "https://api.bitfinex.com/v2/candles/trade:1D:t#{from}USD/hist?start:#{ms}?end:#{ms_next_date}"
30
+ # therefore we just return the most uptodate
31
+ url = "https://api.bitfinex.com/v2/candles/trade:1D:t#{from}USD/hist?start:#{ms}"
32
+ puts "Fetching #{date_time}: #{url} #{@@btc_to_usd.size} BTC #{@@bfx_to_usd.size} BFX" if $VERBOSE
33
+ response = Faraday.get(url)
34
+ items = eval(response.body)
35
+ rates = {}
36
+ items.each do |item|
37
+ if item.first.eql?(:error)
38
+ puts "Fetching returned #{item}. Aborting"
39
+ exit(1)
40
+ end
41
+ # http://docs.bitfinex.com/v2/reference#rest-public-candles
42
+ # field definitions for [ MTS, OPEN, CLOSE, HIGH, LOW, VOLUME ],
43
+ # MTS int millisecond time stamp
44
+ # OPEN float First execution during the time frame
45
+ # CLOSE float Last execution during the time frame
46
+ # HIGH integer Highest execution during the time frame
47
+ # LOW float Lowest execution during the timeframe
48
+ # VOLUME float Quantity of symbol traded within the timeframe
49
+ # [[1489363200000,1224.4,1211.2,1238,1206.7,6157.96283895],
50
+ timestamp = Time.at(item.first/1000).strftime(DATE_FORMAT)
51
+ rates[timestamp] = item[2]
52
+ end;
53
+ from.eql?('BTC') ? @@btc_to_usd = rates.clone : @@bfx_to_usd = rates.clone
54
+ rates[key] ? rates[key] : nil
55
+ rescue => err
56
+ binding.pry
57
+ end
58
+
59
+ def fetch_csv_history
60
+ client = Bitfinex::Client.new
61
+ @history = []
62
+ timestamp = Time.now.to_i + 1
63
+ while true
64
+ begin
65
+ partial = client.history(@currency, { :limit => 500, :until => timestamp, :wallet => @wallet})
66
+ break unless partial && partial.size > 0
67
+ if partial.is_a?(Hash)
68
+ puts "Got #{partial['error']} while fetching #{@wallet} #{@currency} until #{Time.at(timestamp)}"
69
+ exit 3
70
+ end
71
+ first_time = Time.at(partial.first['timestamp'].to_i).strftime(DATE_TIME_FORMAT)
72
+ last_time = Time.at(partial.last['timestamp'].to_i).strftime(DATE_TIME_FORMAT)
73
+ puts "Feched #{partial.size} @history entries #{first_time} -> #{last_time}" if $VERBOSE
74
+ timestamp = (partial.last['timestamp'].to_i - 1)
75
+ @history = @history | partial
76
+ break if partial.size <= 1
77
+ rescue => error
78
+ puts "error #{error}"
79
+ end
80
+ end
81
+ puts "Feched #{@history.size} history entries" if $VERBOSE
82
+ end
83
+
84
+ # Configure the client with the proper KEY/SECRET, you can create a new one from:
85
+ # https://www.bitfinex.com/api
86
+ def create_csv_file
87
+ out_file = "output/#{@wallet}_#{@currency}.csv"
88
+ FileUtils.makedirs(File.dirname(out_file))
89
+ CSV.open(out_file,'w',
90
+ :write_headers=> true,
91
+ :headers => ['currency',
92
+ 'amount',
93
+ 'balance',
94
+ 'description',
95
+ 'date_time',
96
+ ] #< column header
97
+ ) do |csv|
98
+ @history.each do | hist_item|
99
+ csv << [ hist_item['currency'],
100
+ hist_item['amount'],
101
+ hist_item['balance'],
102
+ hist_item['description'],
103
+ Time.at(hist_item['timestamp'].to_i).strftime(DATE_TIME_FORMAT),
104
+ ]
105
+ end
106
+ end
107
+
108
+ sums = {}
109
+ @history.each do | hist_item|
110
+ key = /^[^\d]+/.match(hist_item['description'])[0].chomp
111
+ value = hist_item['amount'].to_f
112
+ if sums[key]
113
+ sums[key] += value
114
+ else
115
+ sums[key] = value
116
+ end
117
+ end
118
+
119
+ puts
120
+ puts "Summary for #{@wallet} #{@currency} (#{@history.size} entries}"
121
+ sums.each do |key, value|
122
+ puts " #{sprintf('%40s', key)} is #{value}"
123
+ end
124
+ end
125
+
126
+ Struct.new("Daily", :date, :amount, :balance, :description, :income)
127
+ def create_summary
128
+ @daily = {}
129
+ @history.sort{|x,y| x['timestamp'] <=> y['timestamp']}.each do | hist_item|
130
+ date = Time.at(hist_item['timestamp'].to_i).strftime(DATE_FORMAT)
131
+ info = Struct::Daily.new(date, hist_item['amount'].to_f, hist_item['balance'].to_f, hist_item['description'])
132
+ amount = hist_item['amount'].to_f
133
+ balance = hist_item['balance'].to_f
134
+ if @daily[date]
135
+ old_balance = @daily[date]
136
+ existing = @daily[date]
137
+ else
138
+ info.income = 0.0
139
+ existing = info
140
+ end
141
+ if /Wire Withdrawal fee|Trading fees for|Margin Funding Payment on wallet/i.match( hist_item['description'])
142
+ existing.income += amount
143
+ end
144
+ existing.balance = balance if balance != 0.0
145
+ @daily[date] = existing
146
+ end
147
+ out_file = "output/#{@wallet}_#{@currency}_summary.csv"
148
+ FileUtils.makedirs(File.dirname(out_file))
149
+ CSV.open(out_file,'w',
150
+ :write_headers=> true,
151
+ :headers => ['currency',
152
+ 'date',
153
+ 'income',
154
+ 'balance',
155
+ 'rate',
156
+ 'balance_in_usd',
157
+ ] #< column header
158
+ ) do |csv|
159
+ @daily.each do |date, info|
160
+ strings = date.split('.')
161
+ fetch_date = Date.new(strings[0].to_i, strings[1].to_i, strings[2].to_i)
162
+ rate = get_usd_exchange(fetch_date, @currency)
163
+ csv << [@currency,
164
+ date,
165
+ info.income,
166
+ info.balance,
167
+ rate ? rate : nil,
168
+ rate ? info.balance * get_usd_exchange(fetch_date, @currency) : nil,
169
+ ]
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,7 @@
1
+ module RAPFLAG
2
+
3
+ Currencies = [ 'USD', 'BTC', 'BFX']
4
+ Wallets = ['trading', 'exchange', 'deposit']
5
+
6
+ VERSION='0.0.1'
7
+ end
data/rapflag.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rapflag/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rapflag"
8
+ spec.version = RAPFLAG::VERSION
9
+ spec.author = "Zeno R.R. Davatz, Niklaus Giger"
10
+ spec.email = "zdavatz@ywesee.com, ngiger@ywesee.com"
11
+ spec.description = "Bitfinex Exporter for your Taxman"
12
+ spec.summary = "Bitfinex Exporter for your Taxman from ywesee"
13
+ spec.homepage = "https://github.com/zdavatz/rapflag"
14
+ spec.license = "GPL-v2"
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency 'bitfinex-rb'
21
+ spec.add_dependency 'trollop'
22
+
23
+ spec.add_development_dependency "bundler"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
+ spec.add_development_dependency "webmock"
27
+ spec.add_development_dependency "vcr"
28
+ spec.add_development_dependency "pry-byebug"
29
+ end
30
+
@@ -0,0 +1,115 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'rapflag/fetch'
4
+ require 'vcr'
5
+
6
+ VCR.configure do |config|
7
+ config.cassette_library_dir = "fixtures/vcr_cassettes"
8
+ config.hook_into :faraday # or :fakeweb
9
+ end
10
+
11
+ CSV_Test_File = File.expand_path(File.join(__FILE__, '..', '..', 'output/exchange_BTC.csv'))
12
+ SUMMARY_EXCHANGE_BTC_File = File.expand_path(File.join(__FILE__, '..', '..', 'output/exchange_BTC_summary.csv'))
13
+ SUMMARY_DEPOSIT_BFX_File = File.expand_path(File.join(__FILE__, '..', '..', 'output/deposit_BFX_summary.csv'))
14
+
15
+ VCR.eject_cassette # we use insert/eject around each example
16
+ describe RAPFLAG do
17
+ # include ServerMockHelper
18
+ before(:all) do
19
+ end
20
+ after(:all) do
21
+ end
22
+ context 'bitfinex' do
23
+ before(:all) do
24
+ VCR.use_cassette("rapflag", :record => :new_episodes) do
25
+ FileUtils.rm_f(CSV_Test_File) if File.exist?(CSV_Test_File)
26
+ FileUtils.rm_f(SUMMARY_DEPOSIT_BFX_File) if File.exist?(SUMMARY_DEPOSIT_BFX_File)
27
+ FileUtils.rm_f(SUMMARY_EXCHANGE_BTC_File) if File.exist?(CSV_Test_File)
28
+ expect(File.exist?(CSV_Test_File)).to eql(false)
29
+ @rap = RAPFLAG::History.new('exchange', 'BTC')
30
+ @rap.fetch_csv_history
31
+ @rap.create_csv_file
32
+ end
33
+ end
34
+ context 'history' do
35
+ it 'should have correct currency' do
36
+ expect(@rap.currency).to eql('BTC')
37
+ end
38
+ it 'should have correct size' do
39
+ expect(@rap.history.size).to eql(206)
40
+ end
41
+ end
42
+ end
43
+ context 'bitfinex CSV' do
44
+ context 'csv' do
45
+ it 'should have generated a correct CSV file' do
46
+ expect(File.exist?(CSV_Test_File)).to eql(true)
47
+ lines = IO.readlines(CSV_Test_File)
48
+ expect(lines.first.chomp).to eql('currency,amount,balance,description,date_time')
49
+ expect(lines[1].chomp).to eql(
50
+ 'BTC,-0.00000005,0.0,Transfer of 0.0 BTC from wallet Exchange to Deposit on wallet Exchange,2016.12.03 21:20:47')
51
+ end
52
+ end
53
+ end
54
+ context 'exchange option --clean' do
55
+ before(:all) do
56
+ @date_bfx_1 = Date.new(2017,1,10)
57
+ @date_btx_1 = Date.new(2017,1,21)
58
+ @date_btx_2 = Date.new(2017,1,10)
59
+ VCR.use_cassette("rapflag", :record => :new_episodes) do
60
+ FileUtils.rm_f(SUMMARY_EXCHANGE_BTC_File) if File.exist?(CSV_Test_File)
61
+ expect(File.exist?(SUMMARY_EXCHANGE_BTC_File)).to eql(false)
62
+ @exchange = RAPFLAG::History.new('exchange', 'BTC')
63
+ @exchange.fetch_csv_history
64
+ @exchange.create_summary
65
+ @bfx = @exchange.get_usd_exchange(@date_bfx_1, 'BFX')
66
+ @btx_1 = @exchange.get_usd_exchange(@date_btx_1, 'BTC')
67
+ @btx_2 = @exchange.get_usd_exchange(@date_btx_2, 'BTC')
68
+ end
69
+ end
70
+ it 'should have generated a correct summary CSV file' do
71
+ expect(File.exist?(SUMMARY_EXCHANGE_BTC_File)).to eql(true)
72
+ lines = IO.readlines(SUMMARY_EXCHANGE_BTC_File)
73
+ expect(lines.first.chomp).to eql('currency,date,income,balance,rate,balance_in_usd')
74
+ expect(lines[1].chomp).to eql('BTC,2016.01.15,0.0,8.99788147,,')
75
+ expect(lines[-1].chomp).to eql('BTC,2016.12.03,0.0,0.0,765.46,0.0')
76
+ end
77
+ it 'should have NOT have generated a correct summary deposit BFX CSV file' do
78
+ expect(File.exist?(SUMMARY_DEPOSIT_BFX_File)).to eql(false)
79
+ end
80
+ it 'should have the correct BTC -> USD rate' do
81
+ expect(@btx_1).to eql 924.02
82
+ expect(@btx_2).to eql 905.76
83
+ end
84
+ it 'should have the correct BFX -> USD rate' do
85
+ expect(@bfx).to eql 0.5697
86
+ end
87
+ end
88
+ context 'deposit option --clean' do
89
+ before(:all) do
90
+ FileUtils.rm_f(SUMMARY_EXCHANGE_BTC_File) if File.exist?(SUMMARY_EXCHANGE_BTC_File)
91
+ FileUtils.rm_f(SUMMARY_DEPOSIT_BFX_File) if File.exist?(CSV_Test_File)
92
+ @date_bfx_1 = Date.new(2017,1,10)
93
+ @date_btx_1 = Date.new(2017,1,21)
94
+ @date_btx_2 = Date.new(2017,1,10)
95
+ VCR.use_cassette("rapflag", :record => :new_episodes) do
96
+ expect(File.exist?(SUMMARY_DEPOSIT_BFX_File)).to eql(false)
97
+ @deposit = RAPFLAG::History.new('deposit', 'BFX')
98
+ @deposit.fetch_csv_history
99
+ @deposit.create_summary
100
+ end
101
+ end
102
+ it 'should have NOT generated a exchange BTC summary CSV file' do
103
+ expect(File.exist?(SUMMARY_EXCHANGE_BTC_File)).to eql(false)
104
+ end
105
+ it 'should have NOT generated a correct summary CSV file' do
106
+ expect(File.exist?(SUMMARY_DEPOSIT_BFX_File)).to eql(true)
107
+ lines = IO.readlines(SUMMARY_DEPOSIT_BFX_File)
108
+ expect(lines.first.chomp).to eql('currency,date,income,balance,rate,balance_in_usd')
109
+ expect(lines[1].chomp).to eql('BFX,2016.01.15,0.0,8.99788147,,')
110
+ end
111
+ end
112
+ end
113
+ # https://api.bitfinex.com/v2/candles/trade:1D:tBTCUSD/hist
114
+ # [[1489363200000,1224.4,1211.2,1238,1206.7,6157.96283895],
115
+ # [1489276800000,1172.5,1224.4,1232.7,1166.8,18976.8181757]
@@ -0,0 +1,120 @@
1
+ begin
2
+ require 'pry'
3
+ rescue LOAD_ERROR
4
+ end
5
+
6
+ require 'rapflag/version'
7
+ require 'bitfinex-api-rb'
8
+
9
+ module RAPFLAG
10
+ # create dummy config for spec tests
11
+ Bitfinex::Client.configure do |conf|
12
+ conf.api_key = '123467889'
13
+ conf.secret = 'SECRECT_KEY'
14
+ conf.websocket_api_endpoint = 'wss://api.bitfinex.com/ws'
15
+ end
16
+ end
17
+
18
+ # This file was generated by the `rspec --init` command. Conventionally, all
19
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
20
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
21
+ # this file to always be loaded, without a need to explicitly require it in any
22
+ # files.
23
+ #
24
+ # Given that it is always loaded, you are encouraged to keep this file as
25
+ # light-weight as possible. Requiring heavyweight dependencies from this file
26
+ # will add to the boot time of your test suite on EVERY test run, even for an
27
+ # individual file that may not need all of that loaded. Instead, consider making
28
+ # a separate helper file that requires the additional dependencies and performs
29
+ # the additional setup, and require it from the spec files that actually need
30
+ # it.
31
+ #
32
+ # The `.rspec` file also contains a few flags that are not defaults but that
33
+ # users commonly want.
34
+ #
35
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
36
+ RSpec.configure do |config|
37
+ # rspec-expectations config goes here. You can use an alternate
38
+ # assertion/expectation library such as wrong or the stdlib/minitest
39
+ # assertions if you prefer.
40
+ config.expect_with :rspec do |expectations|
41
+ # This option will default to `true` in RSpec 4. It makes the `description`
42
+ # and `failure_message` of custom matchers include text for helper methods
43
+ # defined using `chain`, e.g.:
44
+ # be_bigger_than(2).and_smaller_than(4).description
45
+ # # => "be bigger than 2 and smaller than 4"
46
+ # ...rather than:
47
+ # # => "be bigger than 2"
48
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
49
+ end
50
+
51
+ # rspec-mocks config goes here. You can use an alternate test double
52
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
53
+ config.mock_with :rspec do |mocks|
54
+ # Prevents you from mocking or stubbing a method that does not exist on
55
+ # a real object. This is generally recommended, and will default to
56
+ # `true` in RSpec 4.
57
+ mocks.verify_partial_doubles = true
58
+ end
59
+
60
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
61
+ # have no way to turn it off -- the option exists only for backwards
62
+ # compatibility in RSpec 3). It causes shared context metadata to be
63
+ # inherited by the metadata hash of host groups and examples, rather than
64
+ # triggering implicit auto-inclusion in groups with matching metadata.
65
+ config.shared_context_metadata_behavior = :apply_to_host_groups
66
+
67
+ # The settings below are suggested to provide a good initial experience
68
+ # with RSpec, but feel free to customize to your heart's content.
69
+ =begin
70
+ # This allows you to limit a spec run to individual examples or groups
71
+ # you care about by tagging them with `:focus` metadata. When nothing
72
+ # is tagged with `:focus`, all examples get run. RSpec also provides
73
+ # aliases for `it`, `describe`, and `context` that include `:focus`
74
+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
75
+ config.filter_run_when_matching :focus
76
+
77
+ # Allows RSpec to persist some state between runs in order to support
78
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
79
+ # you configure your source control system to ignore this file.
80
+ config.example_status_persistence_file_path = "spec/examples.txt"
81
+
82
+ # Limits the available syntax to the non-monkey patched syntax that is
83
+ # recommended. For more details, see:
84
+ # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
85
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
86
+ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
87
+ config.disable_monkey_patching!
88
+
89
+ # This setting enables warnings. It's recommended, but in some cases may
90
+ # be too noisy due to issues in dependencies.
91
+ config.warnings = true
92
+
93
+ # Many RSpec users commonly either run the entire suite or an individual
94
+ # file, and it's useful to allow more verbose output when running an
95
+ # individual spec file.
96
+ if config.files_to_run.one?
97
+ # Use the documentation formatter for detailed output,
98
+ # unless a formatter has already been configured
99
+ # (e.g. via a command-line flag).
100
+ config.default_formatter = 'doc'
101
+ end
102
+
103
+ # Print the 10 slowest examples and example groups at the
104
+ # end of the spec run, to help surface which specs are running
105
+ # particularly slow.
106
+ config.profile_examples = 10
107
+
108
+ # Run specs in random order to surface order dependencies. If you find an
109
+ # order dependency and want to debug it, you can fix the order by providing
110
+ # the seed, which is printed after each run.
111
+ # --seed 1234
112
+ config.order = :random
113
+
114
+ # Seed global randomization in this process using the `--seed` CLI option.
115
+ # Setting this allows you to use `--seed` to deterministically reproduce
116
+ # test failures related to randomization by passing the same `--seed` value
117
+ # as the one that triggered the failure.
118
+ Kernel.srand config.seed
119
+ =end
120
+ end
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rapflag
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Zeno R.R. Davatz, Niklaus Giger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-03-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bitfinex-rb
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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: trollop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: vcr
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Bitfinex Exporter for your Taxman
126
+ email: zdavatz@ywesee.com, ngiger@ywesee.com
127
+ executables:
128
+ - rapflag.rb
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rspec"
134
+ - ".travis.yml"
135
+ - Gemfile
136
+ - LICENSE
137
+ - README.md
138
+ - Rakefile
139
+ - bin/rapflag.rb
140
+ - fixtures/vcr_cassettes/rapflag.yml
141
+ - lib/rapflag/config.rb
142
+ - lib/rapflag/fetch.rb
143
+ - lib/rapflag/version.rb
144
+ - rapflag.gemspec
145
+ - spec/rapflag_spec.rb
146
+ - spec/spec_helper.rb
147
+ homepage: https://github.com/zdavatz/rapflag
148
+ licenses:
149
+ - GPL-v2
150
+ metadata: {}
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ required_rubygems_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubyforge_project:
167
+ rubygems_version: 2.6.8
168
+ signing_key:
169
+ specification_version: 4
170
+ summary: Bitfinex Exporter for your Taxman from ywesee
171
+ test_files:
172
+ - spec/rapflag_spec.rb
173
+ - spec/spec_helper.rb