danconia 0.2.3 → 0.2.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ebf1db97ca89c6a822b12279f873193c97d7e9f412aa0054967cf02e1d3f74d
4
- data.tar.gz: da1e807e1d5e0c4ec0619f8d93a7a023c4e8361c4b48a3f16b138c4013122fed
3
+ metadata.gz: fc840f5913a010c41495c7fd843304d67565217acf7eb7c248be9bf4c17624f8
4
+ data.tar.gz: d8906df663f918a41d91525b6ac51de9f8ac6decef179c813fc30145be876c50
5
5
  SHA512:
6
- metadata.gz: 1836de03b18616b074b76028d6ff6cf392e8148e294d80783a918836c9d75eb78aa2f6df666302a5d68435362f90091f3690daa7ca1c08bf1fa746bd4b0171ab
7
- data.tar.gz: bc00add76fb57dd0b30ddc8c0a2c4ba5790335bc4f4ad5dd4e29c73b2445fe5b3cec06edd8df2dd5eec4b9abcadc158196f2cb8a146807dcb43a6952b67f5c68
6
+ metadata.gz: dc66bbeaf202e6b288f79d4a6fb9b93cc66585771f9543c14a14980252f5a112eb4e6a2cad21d15e4132bda2400f74cdb5567eb9a47a4f7ac7b6161105c2ae9c
7
+ data.tar.gz: 222d602fb10b842955d921ede2c7bae8bba4fd56dcdb1bcbcc74c12f795959c58250141f05943b607f0de80cdb3a07dc7425219e38f534c375236a0029d29ce2
@@ -1 +1,5 @@
1
+ ---
2
+ sudo: false
1
3
  language: ruby
4
+ cache: bundler
5
+ before_install: gem install bundler -v 1.16.1
@@ -1,28 +1,27 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- danconia (0.2.3)
4
+ danconia (0.2.8)
5
5
  activerecord (>= 3.0.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (5.2.0)
11
- activesupport (= 5.2.0)
12
- activerecord (5.2.0)
13
- activemodel (= 5.2.0)
14
- activesupport (= 5.2.0)
15
- arel (>= 9.0)
16
- activesupport (5.2.0)
10
+ activemodel (6.0.3.1)
11
+ activesupport (= 6.0.3.1)
12
+ activerecord (6.0.3.1)
13
+ activemodel (= 6.0.3.1)
14
+ activesupport (= 6.0.3.1)
15
+ activesupport (6.0.3.1)
17
16
  concurrent-ruby (~> 1.0, >= 1.0.2)
18
17
  i18n (>= 0.7, < 2)
19
18
  minitest (~> 5.1)
20
19
  tzinfo (~> 1.1)
20
+ zeitwerk (~> 2.2, >= 2.2.2)
21
21
  addressable (2.5.2)
22
22
  public_suffix (>= 2.0.2, < 4.0)
23
- arel (9.0.0)
24
23
  coderay (1.1.2)
25
- concurrent-ruby (1.0.5)
24
+ concurrent-ruby (1.1.6)
26
25
  crack (0.4.3)
27
26
  safe_yaml (~> 1.0.0)
28
27
  diff-lcs (1.3)
@@ -43,7 +42,7 @@ GEM
43
42
  guard-compat (~> 1.1)
44
43
  rspec (>= 2.99.0, < 4.0)
45
44
  hashdiff (0.3.7)
46
- i18n (1.0.1)
45
+ i18n (1.8.3)
47
46
  concurrent-ruby (~> 1.0)
48
47
  listen (3.1.5)
49
48
  rb-fsevent (~> 0.9, >= 0.9.4)
@@ -51,7 +50,7 @@ GEM
51
50
  ruby_dep (~> 1.2)
52
51
  lumberjack (1.0.13)
53
52
  method_source (0.9.0)
54
- minitest (5.11.3)
53
+ minitest (5.14.1)
55
54
  nenv (0.3.0)
56
55
  notiffany (0.1.1)
57
56
  nenv (~> 0.1)
@@ -60,7 +59,7 @@ GEM
60
59
  coderay (~> 1.1.0)
61
60
  method_source (~> 0.9.0)
62
61
  public_suffix (3.0.2)
63
- rake (10.3.2)
62
+ rake (13.0.1)
64
63
  rb-fsevent (0.10.3)
65
64
  rb-inotify (0.9.10)
66
65
  ffi (>= 0.5.0, < 2)
@@ -80,15 +79,16 @@ GEM
80
79
  ruby_dep (1.5.0)
81
80
  safe_yaml (1.0.4)
82
81
  shellany (0.0.1)
83
- sqlite3 (1.3.13)
82
+ sqlite3 (1.4.1)
84
83
  thor (0.20.0)
85
84
  thread_safe (0.3.6)
86
- tzinfo (1.2.5)
85
+ tzinfo (1.2.7)
87
86
  thread_safe (~> 0.1)
88
87
  webmock (3.4.2)
89
88
  addressable (>= 2.3.6)
90
89
  crack (>= 0.3.2)
91
90
  hashdiff
91
+ zeitwerk (2.3.0)
92
92
 
93
93
  PLATFORMS
94
94
  ruby
@@ -103,4 +103,4 @@ DEPENDENCIES
103
103
  webmock
104
104
 
105
105
  BUNDLED WITH
106
- 1.16.1
106
+ 1.17.3
data/README.md CHANGED
@@ -65,6 +65,18 @@ Product.new(price: 30, price_currency: 'ARS').price # => 30 ARS
65
65
 
66
66
  Currently, there is no option to customize the names of the columns but should be fairly simple to implement if needed.
67
67
 
68
+ ## Testing
69
+
70
+ There is a FixedRates exchange that can be used during testing to supply static rates (see `examples/fixed_rates.rb`). Another possibility is to use the following helper:
71
+
72
+ ```ruby
73
+ require 'danconia/test_helpers'
74
+
75
+ Danconia::TestHelpers.with_rates 'USDARS' => 3 do
76
+ Money(2, 'USD').exchange_to('ARS') # => 6.0 ARS
77
+ end
78
+ ```
79
+
68
80
  ## Contributing
69
81
 
70
82
  1. Fork it
@@ -23,4 +23,4 @@ end
23
23
  puts 'Updating dates with CurrencyLayer API...'
24
24
  Danconia.config.default_exchange.update_rates!
25
25
 
26
- puts Money(1, 'USD').exchange_to('EUR').inspect # => 0.854896 EUR
26
+ puts Money(1, 'USD').exchange_to('EUR').inspect # => 0.854896 EUR
@@ -5,4 +5,4 @@ module Danconia
5
5
  new Danconia.config.available_currencies.find { |c| c[:code] == code } || {code: code, symbol: '$'}
6
6
  end
7
7
  end
8
- end
8
+ end
@@ -8,7 +8,9 @@ module Danconia
8
8
  end
9
9
 
10
10
  def rate from, to
11
- if from == 'USD' and direct_rate = @store.direct_rate(from, to)
11
+ if from == to
12
+ 1.0
13
+ elsif from == 'USD' and direct_rate = @store.direct_rate(from, to)
12
14
  direct_rate
13
15
  elsif to == 'USD' and inverse_rate = @store.direct_rate(to, from)
14
16
  (1.0 / inverse_rate).round 6
@@ -28,4 +30,4 @@ module Danconia
28
30
  end
29
31
  end
30
32
  end
31
- end
33
+ end
@@ -13,13 +13,12 @@ module Danconia
13
13
  @exchange = exchange
14
14
  end
15
15
 
16
- def format decimals: @decimals
17
- ActiveSupport::NumberHelper.number_to_currency amount, precision: decimals, unit: currency.symbol
16
+ def format decimals: @decimals, **other_options
17
+ opts = other_options.reverse_merge precision: decimals, unit: currency.symbol
18
+ ActiveSupport::NumberHelper.number_to_currency amount, opts
18
19
  end
19
20
 
20
- def to_s
21
- format
22
- end
21
+ alias to_s format
23
22
 
24
23
  def inspect
25
24
  "#{amount} #{currency.code}"
@@ -46,23 +45,17 @@ module Danconia
46
45
  amount <=> other
47
46
  end
48
47
 
49
- def exchange_to other_currency
48
+ def exchange_to other_currency, exchange: @exchange
50
49
  other_currency = other_currency.presence && Currency.find(other_currency, exchange) || currency
51
- rate = exchange_rate_to(other_currency.code)
52
- clone_with amount * rate, other_currency
53
- end
54
-
55
- def exchange_rate_to to
56
- from = currency.code
57
- return 1 if from == to
58
- exchange.rate from, to
50
+ rate = exchange.rate currency.code, other_currency.code
51
+ clone_with amount * rate, other_currency, exchange
59
52
  end
60
53
 
61
54
  %w(+ - * /).each do |op|
62
55
  class_eval <<-EOR, __FILE__, __LINE__ + 1
63
56
  def #{op} other
64
- other = other.exchange_to(currency).amount if other.is_a? Money
65
- clone_with amount #{op} other
57
+ other = other.exchange_to(currency, exchange: @exchange).amount if other.is_a? Money
58
+ clone_with(amount #{op} other)
66
59
  end
67
60
  EOR
68
61
  end
@@ -75,6 +68,10 @@ module Danconia
75
68
  (self * 100).round
76
69
  end
77
70
 
71
+ def as_json *args
72
+ amount.as_json *args
73
+ end
74
+
78
75
  def default_currency?
79
76
  currency.code == Danconia.config.default_currency
80
77
  end
@@ -97,7 +94,7 @@ module Danconia
97
94
  BigDecimal(object.to_s) rescue BigDecimal(0)
98
95
  end
99
96
 
100
- def clone_with amount, currency = @currency
97
+ def clone_with amount, currency = @currency, exchange = @exchange
101
98
  Money.new amount, currency, decimals: decimals, exchange: exchange
102
99
  end
103
100
  end
@@ -14,7 +14,7 @@ module Danconia
14
14
  end
15
15
 
16
16
  def rates
17
- ExchangeRate.all
17
+ Hash[ExchangeRate.all.map { |er| [er.pair, er.rate] }]
18
18
  end
19
19
  end
20
20
 
@@ -1,3 +1,3 @@
1
1
  module Danconia
2
- VERSION = '0.2.3'
2
+ VERSION = '0.2.8'
3
3
  end
@@ -39,7 +39,7 @@ module Danconia
39
39
  end
40
40
 
41
41
  it 'should exchange the other currency if it is different' do
42
- expect(Money(1, 'ARS') + Money(1, 'USD', exchange: fake_exchange(rate: 4))).to eq Money(5, 'ARS')
42
+ expect(Money(1, 'ARS', exchange: fake_exchange(rate: 4)) + Money(1, 'USD')).to eq Money(5, 'ARS')
43
43
  end
44
44
 
45
45
  it 'should return a new object with the same options' do
@@ -89,6 +89,10 @@ module Danconia
89
89
  it 'allow to override the number of decimals' do
90
90
  expect(Money(3.561, decimals: 3).format(decimals: 1)).to eq '$3.6'
91
91
  end
92
+
93
+ it 'pass the options to the activesupport helper' do
94
+ expect(Money(2).format(format: '%n %u')).to eq '2.00 $'
95
+ end
92
96
  end
93
97
 
94
98
  context 'to_s' do
@@ -117,17 +121,29 @@ module Danconia
117
121
  end
118
122
 
119
123
  context 'exchange_to' do
120
- it 'should use the exchange passed to the instance to get the rate' do
121
- expect(Money(2, 'USD', exchange: fake_exchange(rate: 3)).exchange_to('ARS')).to eq Money(6, 'ARS')
122
- end
123
-
124
- it 'should use the default exchange if not set' do
124
+ it 'should use a default exchange if not overriden' do
125
125
  TestHelpers.with_rates 'USDEUR' => 3, 'USDARS' => 4 do
126
126
  expect(Money(2, 'USD').exchange_to('EUR')).to eq Money(6, 'EUR')
127
127
  expect(Money(2, 'USD').exchange_to('ARS')).to eq Money(8, 'ARS')
128
128
  end
129
129
  end
130
130
 
131
+ it 'should allow to pass the exchange to the instance' do
132
+ expect(Money(2, 'USD', exchange: fake_exchange(rate: 3)).exchange_to('ARS')).to eq Money(6, 'ARS')
133
+ end
134
+
135
+ it 'should allow to pass the exchange when converting' do
136
+ expect(Money(2, 'USD').exchange_to('ARS', exchange: fake_exchange(rate: 4))).to eq Money(8, 'ARS')
137
+ end
138
+
139
+ it 'when overriding the exchange, should preserve it in the new instances' do
140
+ m1 = Money(1, 'USD').exchange_to('ARS', exchange: fake_exchange(rate: 2))
141
+ m2 = m1 + Money(3, 'USD')
142
+ m3 = m2 * Money(1, 'USD')
143
+ expect(m2).to eq Money(8, 'ARS')
144
+ expect(m3).to eq Money(16, 'ARS')
145
+ end
146
+
131
147
  it 'if no rate if found should raise error' do
132
148
  expect { Money(2, 'USD').exchange_to('ARS') }.to raise_error Errors::ExchangeRateNotFound
133
149
  end
@@ -167,8 +183,14 @@ module Danconia
167
183
  end
168
184
  end
169
185
 
186
+ context 'to_json' do
187
+ it 'should delegate to the amount' do
188
+ expect(Money(1).to_json).to eq '"1.0"'
189
+ end
190
+ end
191
+
170
192
  def fake_exchange args = {}
171
- double 'exchange', args.reverse_merge(rate: nil)
193
+ double 'Danconia::Exchanges::Exchange', args.reverse_merge(rate: nil)
172
194
  end
173
195
  end
174
196
  end
@@ -7,7 +7,7 @@ module Danconia
7
7
  it 'should create or update the rates' do
8
8
  ExchangeRate.create! pair: 'USDEUR', rate: 2
9
9
  expect { subject.save_rates 'USDEUR' => 3, 'USDARS' => 4 }.to change { ExchangeRate.count }.by 1
10
- expect(subject.rates.map { |e| [e.pair, e.rate] }).to eq({'USDEUR' => 3, 'USDARS' => 4}.to_a)
10
+ expect(subject.rates).to eq('USDEUR' => 3, 'USDARS' => 4)
11
11
  end
12
12
  end
13
13
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danconia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emmanuel Nicolau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-06 00:00:00.000000000 Z
11
+ date: 2020-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord