lib/capwatch.rb in capwatch-0.1.10 vs lib/capwatch.rb in capwatch-0.1.11
- old
+ new
@@ -1,211 +1,8 @@
-require 'json'
-require 'optparse'
-require 'ostruct'
-require 'net/http'
-
require 'colorize'
require 'terminal-table'
require 'capwatch/version'
-
-module Capwatch
- class CoinMarketCap
- def self.fetch
- JSON.parse(Net::HTTP.get(URI('http://api.coinmarketcap.com/v1/ticker/')))
- end
- end
-
- class Calculator
- def self.fund_hash(fund, coinmarketcap_json)
- table = []
-
- title = fund['name']
- symbols = fund['symbols']
- fund_keys = symbols.keys
-
- price_eth_btc = coinmarketcap_json.find do |x|
- x['symbol'] == 'ETH'
- end['price_usd'].to_f
-
- filtered_response_json = coinmarketcap_json.select do |x|
- fund_keys.include?(x['symbol'])
- end
-
- total_value_usd = filtered_response_json.inject(0) do |sum, n|
- sum + symbols[n['symbol']] * n['price_usd'].to_f
- end
-
- total_value_btc = filtered_response_json.inject(0) do |sum, n|
- sum + symbols[n['symbol']] * n['price_btc'].to_f
- end
-
- total_value_eth = filtered_response_json.inject(0) do |sum, n|
- sum + symbols[n['symbol']] * n['price_usd'].to_f / price_eth_btc
- end
-
- distribution_hash = {}
-
- fund_keys.each do |x|
- x = filtered_response_json.find { |e| e['symbol'] == x }
- symbol = x['symbol']
- asset_name = "#{x['name']} (#{symbol})"
- quant_value = symbols[symbol]
- price = x['price_usd'].to_f
- value_btc = quant_value * x['price_btc'].to_f
- value_eth = quant_value * x['price_usd'].to_f / price_eth_btc
- value_usd = quant_value * x['price_usd'].to_f
- distribution_float = value_usd / total_value_usd
- distribution_hash[symbol] = distribution_float
- distribution = distribution_float * 100
- percent_change_1h = x['percent_change_1h'].to_f || 0
- percent_change_24h = x['percent_change_24h'].to_f || 0
- percent_change_7d = x['percent_change_7d'].to_f || 0
- table << [
- asset_name,
- quant_value,
- price,
- value_usd,
- value_btc,
- value_eth,
- distribution,
- percent_change_1h,
- percent_change_24h,
- percent_change_7d
- ]
- end
-
- a_1h = filtered_response_json.inject(0) do |sum, n|
- sum + n['percent_change_1h'].to_f * distribution_hash[n['symbol']].to_f
- end
-
- a_24h = filtered_response_json.inject(0) do |sum, n|
- sum + n['percent_change_24h'].to_f * distribution_hash[n['symbol']].to_f
- end
-
- a_7d = filtered_response_json.inject(0) do |sum, n|
- sum + n['percent_change_7d'].to_f * distribution_hash[n['symbol']].to_f
- end
-
- footer = [
- '',
- '',
- '',
- total_value_usd,
- total_value_btc,
- total_value_eth,
- '',
- a_1h,
- a_24h,
- a_7d
- ]
-
- table.sort_by! { |a| -a[6].to_f } # DIST (%)
-
- {}
- .merge(title: title)
- .merge(table: table)
- .merge(footer: footer)
- end
- end
-
- class CLI
- def self.parse(args)
- options = OpenStruct.new
- options.tick = 60 * 5
- opt_parser = OptionParser.new do |opts|
- opts.on('-t', '--tick [Integer]', Integer, 'Tick Interval') do |t|
- options.tick = t
- end
- end
- opt_parser.parse!(args)
- options
- end
- end
-
- module ConsoleFormatter
- def format_usd(n)
- '$' + n.round(2).to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
- end
-
- def format_btc(value)
- format('฿%.2f', value)
- end
-
- def format_eth(value)
- format('Ξ%.2f', value)
- end
-
- def format_percent(value)
- format('%.2f%', value)
- end
-
- def condition_color(value)
- percent_value = value.to_f
- if percent_value > 1
- value.green
- elsif percent_value < 0
- value.red
- else
- value.green
- end
- end
- end
-
- class Console
- extend ConsoleFormatter
-
- def self.colorize_table(hash)
- hash[:table].each do |x|
- x[2] = format_usd(x[2])
- x[3] = format_usd(x[3])
- x[4] = format_btc(x[4])
- x[5] = format_eth(x[5])
- x[6] = format_percent(x[6])
- x[7] = condition_color(format_percent(x[7]))
- x[8] = condition_color(format_percent(x[8]))
- x[9] = condition_color(format_percent(x[9]))
- end
- hash[:footer][3] = format_usd(hash[:footer][3])
- hash[:footer][4] = format_btc(hash[:footer][4])
- hash[:footer][5] = format_eth(hash[:footer][5])
- hash[:footer][7] = condition_color(format_percent(hash[:footer][7]))
- hash[:footer][8] = condition_color(format_percent(hash[:footer][8]))
- hash[:footer][9] = condition_color(format_percent(hash[:footer][9]))
- hash
- end
-
- def self.draw_table(hash)
- hash = colorize_table(hash)
- table = Terminal::Table.new do |t|
- t.title = hash[:title].upcase
- t.style = {
- border_top: false,
- border_bottom: false,
- border_y: '',
- border_i: '',
- padding_left: 1,
- padding_right: 1
- }
- t.headings = [
- 'ASSET',
- 'QUANTITY',
- 'PRICE',
- 'VALUE (USD)',
- 'VALUE (BTC)',
- 'VALUE (ETH)',
- 'DIST (%)',
- '%(1H)',
- '%(24H)',
- '%(7D)'
- ]
- hash[:table].each do |x|
- t << x
- end
- t.add_separator
- t.add_row hash[:footer]
- end
-
- table
- end
- end
-end
+require 'capwatch/coinmarketcap'
+require 'capwatch/calculator'
+require 'capwatch/cli'
+require 'capwatch/console'