mycoins 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e1eeaa2d4398a92bbc3079a14e66f834deac201b
4
- data.tar.gz: 6b05e301b76e0c9b7faf6747c5033a8ee522f9cb
3
+ metadata.gz: ea88002b9657502cadc020c5b79b6fe502afe54f
4
+ data.tar.gz: a1c6d6a6052a58145716e88fedf219d56e1d40b3
5
5
  SHA512:
6
- metadata.gz: 4eceb49d43867af6b28b6c2c693f4befcf08788289d4dc54128c5729c3af1b0c16650905aeb610eb8ad88f6b30659d6ce383fee10a4c402e121c8342903fd4bd
7
- data.tar.gz: 65bb1cb36f12c85bbf742cee232d72ec1c325cffe70d7c9b76300c6bd5ee8130bdc26ff6a8f8cffb59e8ef0e3a18718c76faf3e97c58fff7bb4896cb1bb6c2b5
6
+ metadata.gz: aec15d42a4b70c89f1f1d96afeb3fd32f2d9820814fe2a8f075736318facdb2a40f11b554f3ec8cfb09bde16513b1e6db1f9d6a9768040fd63ff644fa947e5a1
7
+ data.tar.gz: 00fefa8ebf679cf303bea290ec5c56901d96f779bbdfd830f63053281e611721a7b93ead0a064be84eb766b5f80fba650eb4c1c6336c2a75285cb70b1066e477
checksums.yaml.gz.sig CHANGED
@@ -1,2 +1 @@
1
- u��� ��P�?*݉SD<�C(;���7v:��H��-Ш��\c\��@��cm#���̜7o���%�)��U$Ht�`�-��d������_� � ���δ�F?̎����Fi�[�h��)GB:��kT��K�����}EMNqϣ}r��'V���YIo
2
-
1
+ E�8�v�N�v��q�l������RЮ���{(�Go�f�.�: X�l�����G�>�i��7��3Hh�!���?ݝ�y&B��U�a�u�T��=�q��rWֻ֥��t��Xkm��nRRdJ�����?4�As#�6&W���*�$}r(H�� v�(����DP�M��������n��ד���z>�J f��ҲM�{�)��?�Q�"���#��]�m�q�o�Hy�x����{��@�R���FL/���
data/lib/mycoins.rb CHANGED
@@ -8,10 +8,13 @@ require 'cryptocoin_fanboi'
8
8
 
9
9
 
10
10
  class MyCoins
11
+
12
+ attr_accessor :mycurrency
11
13
 
12
- def initialize(source, date: nil, debug: false, mycurrency: 'USD')
14
+ def initialize(source, date: nil, debug: false,
15
+ mycurrency: 'USD', filepath: 'mycoins')
13
16
 
14
- @debug = debug
17
+ @debug, @filepath = debug, filepath
15
18
 
16
19
  @jer = JustExchangeRates.new(base: 'USD')
17
20
 
@@ -42,15 +45,86 @@ class MyCoins
42
45
  @ccf = CryptocoinFanboi.new(watch: mycoins)
43
46
 
44
47
  end
48
+
49
+ def archive()
50
+
51
+ filepath = File.join(@filepath, Time.now.year.to_s,
52
+ Time.now.strftime("c%d%m%Y.xml"))
53
+ FileUtils.mkdir_p File.dirname(filepath)
54
+ File.write filepath, to_xml
55
+
56
+ end
45
57
 
46
58
  def to_s()
47
59
  @ccf.to_s
48
60
  end
49
61
 
62
+ # return the value of a coin given either the qty or purchase amount in BTC
63
+ #
64
+ def price(coin_name, qty, btc: nil, date: nil)
65
+ coin = @ccf.find(coin_name)
66
+ "%.2f %s" % [(coin.price_usd.to_f * qty) * @jer.rate(@mycurrency),
67
+ @mycurrency]
68
+ end
69
+
50
70
  def portfolio()
51
71
 
72
+ r = build_portfolio(@dx.title)
73
+ format_portfolio(r)
74
+
75
+ end
76
+
77
+ def to_xml()
78
+
79
+ r = build_portfolio(@dx.title)
80
+ dx = Dynarex.new
81
+ dx.import r.records
82
+
83
+ h = r.to_h
84
+ h.delete :records
85
+ dx.summary.merge!(h)
86
+
87
+ dx.to_xml pretty: true
88
+
89
+ end
90
+
91
+ private
92
+
93
+ def build_portfolio(title)
94
+
95
+ if @portfolio and \
96
+ DateTime.parse(@portfolio.datetime) + 60 > DateTime.now then
97
+ return @portfolio
98
+ end
99
+
100
+ a = build_records()
101
+
102
+ invested = sum(a, :paid)
103
+ gross_profit_list, losses_list = a.partition {|x| x[:profit].to_f > 0}
104
+ gross_profit, losses = [gross_profit_list, losses_list]\
105
+ .map{|x| sum(x, :profit)}
106
+
107
+ h = {
108
+ title: title,
109
+ mycurrency: @mycurrency,
110
+ records: a,
111
+ datetime: Time.now.strftime("%d/%m/%Y at %H:%M%p"),
112
+ invested: invested,
113
+ revenue: sum(a, ('value_' + @mycurrency.downcase).to_sym),
114
+ gross_profit: gross_profit.round(2), losses: losses.round(2),
115
+ pct_gross_profit: (100 / (invested / gross_profit)).round(2),
116
+ pct_losses: (100 / (invested / losses)).round(2),
117
+ net_profit: sum(a, :profit).round(2)
118
+ }
119
+
120
+ @portfolio = OpenStruct.new(h).freeze
121
+
122
+ end
123
+
124
+ def build_records()
125
+
52
126
  # print out the coin name, qty,value in USD,value in Sterling, and BTC
53
- a = @dx.all.inject([]) do |r, x|
127
+ @dx.all.inject([]) do |r, x|
54
128
 
55
129
  puts 'x: ' + x.inspect if @debug
56
130
  coin = @ccf.find(x.title)
@@ -63,19 +137,20 @@ class MyCoins
63
137
  value_usd = (usd_rate * x.qty.to_f).round(2)
64
138
 
65
139
  h = {
140
+ title: x.title,
66
141
  rank: coin.rank.to_i,
67
- name: x.title,
68
142
  qty: x.qty,
69
143
  btc_price: x.btc_price,
70
144
  paid: "%.2f" % paid,
71
145
  value_usd: "%.2f" % value_usd
72
146
  }
73
147
 
74
-
75
148
  mycurrency = if @mycurrency and @mycurrency != 'USD' then
76
149
 
77
- local_value = ((usd_rate * x.qty.to_f) * @jer.rate(@mycurrency)).round(2)
78
- h.merge!(('value_' + @mycurrency.downcase).to_sym => "%.2f" % local_value)
150
+ local_value = ((usd_rate * x.qty.to_f) \
151
+ * @jer.rate(@mycurrency)).round(2)
152
+ h.merge!(('value_' \
153
+ + @mycurrency.downcase).to_sym => "%.2f" % local_value)
79
154
 
80
155
  @mycurrency
81
156
 
@@ -95,43 +170,35 @@ class MyCoins
95
170
  r << h.merge!(h2)
96
171
 
97
172
  end
98
-
99
- coins = a.sort_by{|x| x[:rank]}.map {|x| x.values}
100
173
 
101
- labels = %w(Rank Name Qty btc_price) + ["paid(#{@mycurrency}):", 'value(USD):']
174
+ end
175
+
176
+ def format_portfolio(r)
177
+
178
+ coins = r.records.sort_by{|x| x[:rank]}.map {|x| x.values}
179
+
180
+ labels = %w(Rank Name Qty btc_price) \
181
+ + ["paid(#{@mycurrency}):", 'value(USD):']
102
182
  labels << "value(#{@mycurrency}):" if @mycurrency
103
183
  labels += ['Profit:', 'Profit (%):']
104
184
 
105
185
  puts 'labels: ' + labels.inspect if @debug
186
+
106
187
  tf = TableFormatter.new(source: coins, labels: labels)
107
188
  out = "# " + @dx.title + "\n\n"
108
- out << "last_updated: " + Time.now.strftime("%d/%m/%Y\n\n")
189
+ out << "last_updated: %s\n\n" % r.datetime
109
190
  out << tf.display
110
-
111
- invested = sum(a, :paid)
112
- total = sum(a, ('value_' + @mycurrency.downcase).to_sym)
113
- net_profit = sum(a, :profit)
114
-
115
- gross_profit_list, losses_list = a.partition {|x| x[:profit].to_f > 0}
116
-
117
- gross_profit = sum(gross_profit_list, :profit)
118
- losses = sum(losses_list, :profit)
119
-
120
- pct_gross_profit = 100 / (invested / gross_profit)
121
- pct_losses = 100 / (invested / losses)
122
191
 
123
-
124
- out << "\n\nInvested: %.2f %s" % [invested, @mycurrency]
125
- out << "\nRevenue: %.2f %s" % [total, @mycurrency]
126
- out << "\n\nGross profit: %.2f %s (%%%.2f)" % [gross_profit, @mycurrency, pct_gross_profit]
127
- out << "\nLosses: %.2f %s (%%%.2f)" % [losses, @mycurrency, pct_losses]
128
- out << "\n\nNet profit: %.2f %s" % [net_profit, @mycurrency]
192
+ out << "\n\nInvested: %.2f %s" % [r.invested, @mycurrency]
193
+ out << "\nRevenue: %.2f %s" % [r.revenue, @mycurrency]
194
+ out << "\n\nGross profit: %.2f %s (%%%.2f)" % \
195
+ [r.gross_profit, @mycurrency, r.pct_gross_profit]
196
+ out << "\nLosses: %.2f %s (%%%.2f)" % [r.losses, @mycurrency, r.pct_losses]
197
+ out << "\n\nNet profit: %.2f %s" % [r.net_profit, @mycurrency]
129
198
  out
130
-
199
+
131
200
  end
132
201
 
133
- private
134
-
135
202
  def sum(a, field)
136
203
  a.inject(0) {|r, x| r + x[field].to_f }
137
204
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mycoins
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -30,7 +30,7 @@ cert_chain:
30
30
  sCz5KsiHA9vj8OfrxhYrEb+ML4+J28Umdki7V1vgnQWmnI+Ok2SWlkScgzcmGXF6
31
31
  TJ4=
32
32
  -----END CERTIFICATE-----
33
- date: 2018-01-06 00:00:00.000000000 Z
33
+ date: 2018-01-07 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: dynarex
metadata.gz.sig CHANGED
Binary file