latinum 0.5.6 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +128 -3
- data/lib/latinum/bank.rb +7 -0
- data/lib/latinum/formatters.rb +4 -0
- data/lib/latinum/version.rb +1 -1
- data/spec/latinum/bank_spec.rb +12 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4a1959c3b1c833751fdc2536ce1db9c040e48be
|
4
|
+
data.tar.gz: a870124602130bfcfc036ba61abdbcc529af9645
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85efa5c7e88b2a0e5b41f039054daae59f55848060d24f9d6d0d8a88e406391a77309febdf727c10db505e4bd2de76e656de1e6e996eed485c3f396fdcc72027
|
7
|
+
data.tar.gz: c620f6a689945b472cee3290a01f89c4fef33d192c6600fbe5f14346b0071b92c46cb0c5d865b38ffce630d2f4b38825edbca8c9a098692f565c6d50c3a3f496
|
data/README.md
CHANGED
@@ -9,15 +9,15 @@ Latinum is a library for resource and currency calculations. It provides immutab
|
|
9
9
|
|
10
10
|
Add this line to your application's Gemfile:
|
11
11
|
|
12
|
-
|
12
|
+
gem 'latinum'
|
13
13
|
|
14
14
|
And then execute:
|
15
15
|
|
16
|
-
|
16
|
+
$ bundle
|
17
17
|
|
18
18
|
Or install it yourself as:
|
19
19
|
|
20
|
-
|
20
|
+
$ gem install latinum
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
@@ -58,6 +58,64 @@ To add multiple currencies together, use a collection:
|
|
58
58
|
> currencies.collect {|currency| collection[currency]}
|
59
59
|
=> [10.0 NZD, 20.0 AUD]
|
60
60
|
|
61
|
+
#### Calculating Totals
|
62
|
+
|
63
|
+
The `Latinum::Collection` is the correct way to sum up a list of transactions or other items with an
|
64
|
+
associated `Latinum::Resource`. Here is an example:
|
65
|
+
|
66
|
+
<table class="listing transactions" data-model="Transaction">
|
67
|
+
<thead>
|
68
|
+
<tr>
|
69
|
+
<th class="name">Name</th>
|
70
|
+
<th class="date">Date</th>
|
71
|
+
<th class="price">Price</th>
|
72
|
+
<th class="quantity">Quantity</th>
|
73
|
+
<th class="subtotal">Sub-total</th>
|
74
|
+
<th class="tax_rate">Tax</th>
|
75
|
+
<th class="total">Total</th>
|
76
|
+
</tr>
|
77
|
+
</thead>
|
78
|
+
<tbody>
|
79
|
+
<?r
|
80
|
+
currencies = Set.new
|
81
|
+
|
82
|
+
summary = {
|
83
|
+
:subtotal => Latinum::Collection.new(currencies),
|
84
|
+
:tax => Latinum::Collection.new(currencies),
|
85
|
+
:total => Latinum::Collection.new(currencies)
|
86
|
+
}
|
87
|
+
|
88
|
+
invoice.transactions.each do |transaction|
|
89
|
+
subtotal = transaction.subtotal
|
90
|
+
summary[:subtotal] << subtotal
|
91
|
+
summary[:tax] << subtotal * transaction.tax_rate.to_d
|
92
|
+
summary[:total] << transaction.total
|
93
|
+
|
94
|
+
?>
|
95
|
+
<tr data-id="#{transaction.id}" data-rev="#{transaction.rev}">
|
96
|
+
<th class="name">#{f.text transaction.name}</th>
|
97
|
+
<td class="date">#{f.text transaction.date}</td>
|
98
|
+
<td class="price">#{f.text transaction.price}</td>
|
99
|
+
<td class="quantity">#{f.quantity transaction}</td>
|
100
|
+
<td class="subtotal">#{f.text subtotal}</td>
|
101
|
+
<td class="tax_rate">#{f.tax transaction}</td>
|
102
|
+
<td class="total">#{f.text transaction.total}</td>
|
103
|
+
</tr>
|
104
|
+
<?r end ?>
|
105
|
+
</tbody>
|
106
|
+
<tfoot>
|
107
|
+
<?r currencies.each do |currency| ?>
|
108
|
+
<tr>
|
109
|
+
<td colspan="5">#{currency} Summary:</td>
|
110
|
+
<td class="subtotal">#{f.text summary[:subtotal][currency]}</td>
|
111
|
+
<td class="tax_rate">#{f.text summary[:tax][currency]}</td>
|
112
|
+
<td class="total">#{f.text summary[:total][currency]}</td>
|
113
|
+
<td></td>
|
114
|
+
</tr>
|
115
|
+
<?r end ?>
|
116
|
+
</tfoot>
|
117
|
+
</table>
|
118
|
+
|
61
119
|
### Banks and Exchange Rates
|
62
120
|
|
63
121
|
The bank is responsible for formatting and exchange rates:
|
@@ -108,6 +166,73 @@ For storage in traditional databases, you may prefer to use integers. Based on t
|
|
108
166
|
|
109
167
|
As BitCoin has 8 decimal places, it requires an integer representation with at least 10^8.
|
110
168
|
|
169
|
+
### ActiveRecord Serialization
|
170
|
+
|
171
|
+
Latinum can be easily used in a [ActiveRecord](https://github.com/rails/rails/tree/master/activerecord) model simply by declaring a serialized data-type for a string or text column, e.g.
|
172
|
+
|
173
|
+
class Transaction < ActiveRecord::Base
|
174
|
+
serialize :total, Latinum::Resource
|
175
|
+
end
|
176
|
+
|
177
|
+
It can be used like so:
|
178
|
+
|
179
|
+
> transaction = Transaction.new(:total => "10 NZD")
|
180
|
+
> transaction.total * 2
|
181
|
+
=> "20.0 NZD"
|
182
|
+
|
183
|
+
To format the output, use a `Latinum::Bank`, e.g. assuming the bank is set up correctly:
|
184
|
+
|
185
|
+
> bank.format(transaction.total)
|
186
|
+
=> "$20.00 NZD"
|
187
|
+
|
188
|
+
> bank.format(transaction.total, name: nil)
|
189
|
+
=> "$20.00"
|
190
|
+
|
191
|
+
> bank.format(transaction.total, symbol: nil)
|
192
|
+
=> "20.00 NZD"
|
193
|
+
|
194
|
+
### Relaxo Serialization
|
195
|
+
|
196
|
+
Latinum is natively supported by [Relaxo](https://github.com/ioquatix/relaxo) (CouchDB) and as such can be used in [Relaxo models](https://github.com/ioquatix/relaxo-model) easily.
|
197
|
+
|
198
|
+
require 'latinum'
|
199
|
+
require 'relaxo/model'
|
200
|
+
require 'relaxo/model/properties/latinum'
|
201
|
+
|
202
|
+
class Transaction
|
203
|
+
include Relaxo::Model
|
204
|
+
|
205
|
+
property :name
|
206
|
+
property :price, Attribute[Latinum::Resource]
|
207
|
+
end
|
208
|
+
|
209
|
+
db = Relaxo.connect('test')
|
210
|
+
db.create!
|
211
|
+
|
212
|
+
t = Transaction.create(db, price: Latinum::Resource.load("50 NZD"))
|
213
|
+
|
214
|
+
t.price
|
215
|
+
# => <Latinum::Resource "50.0 NZD">
|
216
|
+
|
217
|
+
# Save and reload from database server:
|
218
|
+
t.save
|
219
|
+
t = Transaction.fetch(db, t.id)
|
220
|
+
|
221
|
+
t.price
|
222
|
+
# => <Latinum::Resource "50.0 NZD">
|
223
|
+
|
224
|
+
It gets stored in the database like so:
|
225
|
+
|
226
|
+
{
|
227
|
+
"_id": "740f4728fc9a571d826688db2f004771",
|
228
|
+
"_rev": "1-45a29c63311cfa0d5a765707184b2b3b",
|
229
|
+
"type": "transaction",
|
230
|
+
"price": [
|
231
|
+
"50.0",
|
232
|
+
"NZD"
|
233
|
+
]
|
234
|
+
}
|
235
|
+
|
111
236
|
## Contributing
|
112
237
|
|
113
238
|
1. Fork it
|
data/lib/latinum/bank.rb
CHANGED
@@ -115,6 +115,13 @@ module Latinum
|
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
118
|
+
def round(resource)
|
119
|
+
formatter = @formatters[resource.name]
|
120
|
+
raise ArgumentError.new("No formatter found for #{resource.name}") unless formatter
|
121
|
+
|
122
|
+
Latinum::Resource.new(formatter.round(resource.amount), resource.name)
|
123
|
+
end
|
124
|
+
|
118
125
|
# Format a resource as a string according to the loaded currencies.
|
119
126
|
def format(resource, *args)
|
120
127
|
formatter = @formatters[resource.name]
|
data/lib/latinum/formatters.rb
CHANGED
@@ -53,6 +53,10 @@ module Latinum
|
|
53
53
|
@name = options[:name]
|
54
54
|
end
|
55
55
|
|
56
|
+
def round(amount)
|
57
|
+
return amount.round(@places)
|
58
|
+
end
|
59
|
+
|
56
60
|
def format(amount, options = DEFAULT_OPTIONS)
|
57
61
|
# Round to the desired number of places. Truncation used to be the default.
|
58
62
|
amount = amount.round(@places)
|
data/lib/latinum/version.rb
CHANGED
data/spec/latinum/bank_spec.rb
CHANGED
@@ -48,6 +48,18 @@ module Latinum::BankSpec
|
|
48
48
|
expect(@bank.format(resource)).to be == "B⃦1.12345678 BTC"
|
49
49
|
end
|
50
50
|
|
51
|
+
it "should round up using correct precision" do
|
52
|
+
resource = Latinum::Resource.new("19.9989", "NZD")
|
53
|
+
|
54
|
+
expect(@bank.round(resource)).to be == Latinum::Resource.new(20, "NZD")
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should round down using correct precision" do
|
58
|
+
resource = Latinum::Resource.new("19.991", "NZD")
|
59
|
+
|
60
|
+
expect(@bank.round(resource)).to be == Latinum::Resource.new("19.99", "NZD")
|
61
|
+
end
|
62
|
+
|
51
63
|
it "should round values when formatting" do
|
52
64
|
resource = Latinum::Resource.new("19.9989", "NZD")
|
53
65
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: latinum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|