danconia 0.2.2 → 0.2.3

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
  SHA256:
3
- metadata.gz: 38d88815b5c3c9155db3c64433d6469614656a2464ab6a0c0eae51b3429b084d
4
- data.tar.gz: d8962d50c98a68e8acfbc2a1424e81b77b1d506d069d4e87c0fa32803482d2b0
3
+ metadata.gz: 0ebf1db97ca89c6a822b12279f873193c97d7e9f412aa0054967cf02e1d3f74d
4
+ data.tar.gz: da1e807e1d5e0c4ec0619f8d93a7a023c4e8361c4b48a3f16b138c4013122fed
5
5
  SHA512:
6
- metadata.gz: 69fa03e8ae6c01a37eaafaf9fe358b1e57eca34bd4e1113fb795002b80d4f5dc2a3934c06f1b3102a3c64e3403e16f3d6fd97c9f301b819f9de6b742c3ea088d
7
- data.tar.gz: 4881c55540c4b0e51e6018a23aae7923effc31ea9694295aae07a08a62fa60b32d6943adea8bd3798d5349b6f15c97ab2948f6410593c6d03ceb35c136e12c9b
6
+ metadata.gz: 1836de03b18616b074b76028d6ff6cf392e8148e294d80783a918836c9d75eb78aa2f6df666302a5d68435362f90091f3690daa7ca1c08bf1fa746bd4b0171ab
7
+ data.tar.gz: bc00add76fb57dd0b30ddc8c0a2c4ba5790335bc4f4ad5dd4e29c73b2445fe5b3cec06edd8df2dd5eec4b9abcadc158196f2cb8a146807dcb43a6952b67f5c68
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- danconia (0.2.2)
4
+ danconia (0.2.3)
5
5
  activerecord (>= 3.0.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,26 +1,69 @@
1
1
  # Danconia
2
2
 
3
- TODO: Write a gem description
3
+ A very simple money library for Ruby, backed by BigDecimal (no conversion to cents, i.e. "infinite precision") with support for external exchange rates services.
4
4
 
5
5
  [![Build Status](https://travis-ci.org/eeng/danconia.svg?branch=master)](https://travis-ci.org/eeng/danconia)
6
6
 
7
7
  ## Installation
8
8
 
9
- Add this line to your application's Gemfile:
9
+ ```ruby
10
+ gem 'danconia'
11
+ ```
10
12
 
11
- gem 'danconia'
13
+ ## Basic Usage
12
14
 
13
- And then execute:
15
+ If you only need to work with a single currency:
14
16
 
15
- $ bundle
17
+ ```ruby
18
+ # USD by default, but can be configured
19
+ m1 = Money(10.25) # => 10.25 USD
16
20
 
17
- Or install it yourself as:
21
+ # Note that we keep all decimal places
22
+ m2 = m1 / 2 # => 5.125 USD
18
23
 
19
- $ gem install danconia
24
+ # Simple formatting by default
25
+ puts m2 # => $5.13
26
+ ```
20
27
 
21
- ## Usage
28
+ Please refer to `examples/single_currency.rb` for some configuration options.
22
29
 
23
- TODO: Write usage instructions here
30
+ ## Multi-Currency Support
31
+
32
+ To handle multiple currencies you need to configure an `Exchange` in order to fetch the rates. For example, with [CurrencyLayer](https://currencylayer.com/):
33
+
34
+ ```ruby
35
+ # This can be placed in a Rails initializer
36
+ Danconia.configure do |config|
37
+ config.default_exchange = Danconia::Exchanges::CurrencyLayer.new(access_key: '...')
38
+ end
39
+ ```
40
+
41
+ Then, download the exchange rates:
42
+ ```ruby
43
+ # You should do this periodically to keep rates up to date
44
+ Danconia.config.default_exchange.update_rates!
45
+ ```
46
+
47
+ And finally to convert between currencies:
48
+ ```ruby
49
+ Money(9, 'JPY').exchange_to('ARS') # => 2.272401 ARS
50
+ ```
51
+
52
+ By default, rates are stored in memory, but you can supply a store in the exchange constructor to save them elsewhere. Please refer to `examples/currency_layer.rb` for an ActiveRecord example.
53
+
54
+ ## Active Record Integration
55
+
56
+ Given a `products` table with a decimal column `price` and a string column `price_currency` (optional), then you can use the `money` class method to automatically convert it to Money:
57
+
58
+ ```ruby
59
+ class Product < ActiveRecord::Base
60
+ money :price
61
+ end
62
+
63
+ Product.new(price: 30, price_currency: 'ARS').price # => 30 ARS
64
+ ```
65
+
66
+ Currently, there is no option to customize the names of the columns but should be fairly simple to implement if needed.
24
67
 
25
68
  ## Contributing
26
69
 
@@ -6,11 +6,12 @@ require 'danconia/version'
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = "danconia"
8
8
  gem.version = Danconia::VERSION
9
- gem.authors = ["Emmanuel Nicolau"]
10
- gem.email = ["emmanicolau@gmail.com"]
9
+ gem.author = "Emmanuel Nicolau"
10
+ gem.email = "emmanicolau@gmail.com"
11
11
  gem.description = %q{Multi-currency money library backed by BigDecimal}
12
12
  gem.summary = %q{Multi-currency money library backed by BigDecimal}
13
- gem.homepage = ""
13
+ gem.homepage = "https://github.com/eeng/danconia"
14
+ gem.license = "MIT"
14
15
 
15
16
  gem.files = `git ls-files`.split($/)
16
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -1,8 +1,10 @@
1
+ # Remember to supply your CurrencyLayer key in the ACCESS_KEY environment variable to run this example
1
2
  require 'danconia'
2
3
 
3
4
  ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
4
5
 
5
6
  ActiveRecord::Schema.define do
7
+ # You can use this in a Rails migration
6
8
  create_table :exchange_rates do |t|
7
9
  t.string :pair, limit: 6
8
10
  t.decimal :rate, precision: 12, scale: 6
@@ -11,10 +13,13 @@ ActiveRecord::Schema.define do
11
13
  end
12
14
 
13
15
  Danconia.configure do |config|
14
- config.default_exchange = Danconia::Exchanges::CurrencyLayer.new(access_key: ENV['ACCESS_KEY'], store: Danconia::Stores::ActiveRecord.new)
16
+ config.default_exchange = Danconia::Exchanges::CurrencyLayer.new(
17
+ access_key: ENV['ACCESS_KEY'],
18
+ store: Danconia::Stores::ActiveRecord.new
19
+ )
15
20
  end
16
21
 
17
- # Periodically do this
22
+ # Periodically call this method to keep rates up to date
18
23
  puts 'Updating dates with CurrencyLayer API...'
19
24
  Danconia.config.default_exchange.update_rates!
20
25
 
@@ -0,0 +1,14 @@
1
+ require 'danconia'
2
+
3
+ # USD is the default currency if no configuration is provided
4
+ puts (Money(10.25) / 2).inspect # => 5.125 USD
5
+ puts (Money(10.25) / 2).to_s # => $5.13
6
+
7
+ # Lets switch to other currency
8
+ Danconia.configure do |config|
9
+ config.default_currency = 'EUR'
10
+ config.available_currencies = [{code: 'EUR', symbol: '€'}]
11
+ end
12
+
13
+ puts Money(10.25).inspect # => 10.25 EUR
14
+ puts Money(10.25).to_s # => €10.25
@@ -14,11 +14,12 @@ module Danconia
14
14
  end
15
15
 
16
16
  class Config
17
- attr_accessor :default_currency, :default_exchange
17
+ attr_accessor :default_currency, :default_exchange, :available_currencies
18
18
 
19
19
  def initialize
20
20
  @default_currency = 'USD'
21
21
  @default_exchange = Exchanges::FixedRates.new
22
+ @available_currencies = []
22
23
  end
23
24
  end
24
25
  end
@@ -2,7 +2,7 @@ module Danconia
2
2
  class Currency < Struct.new(:code, :symbol, :description, keyword_init: true)
3
3
  def self.find code, exchange
4
4
  return code if code.is_a? Currency
5
- new exchange.currencies.find { |c| c[:code] == code } || {code: code, symbol: '$'}
5
+ new Danconia.config.available_currencies.find { |c| c[:code] == code } || {code: code, symbol: '$'}
6
6
  end
7
7
  end
8
8
  end
@@ -1,11 +1,10 @@
1
1
  module Danconia
2
2
  module Exchanges
3
3
  class Exchange
4
- attr_reader :store, :currencies
4
+ attr_reader :store
5
5
 
6
- def initialize store: Stores::InMemory.new, currencies: []
6
+ def initialize store: Stores::InMemory.new
7
7
  @store = store
8
- @currencies = currencies
9
8
  end
10
9
 
11
10
  def rate from, to
@@ -9,7 +9,7 @@ module Danconia
9
9
 
10
10
  def with_rates rates
11
11
  with_config do |config|
12
- config.default_exchange = Exchanges::FixedRates.new rates: rates, currencies: config.default_exchange.currencies
12
+ config.default_exchange = Exchanges::FixedRates.new rates: rates
13
13
  yield
14
14
  end
15
15
  end
@@ -1,3 +1,3 @@
1
1
  module Danconia
2
- VERSION = '0.2.2'
2
+ VERSION = '0.2.3'
3
3
  end
@@ -96,7 +96,7 @@ module Danconia
96
96
  expect(Money(3.25).to_s).to eq '$3.25'
97
97
 
98
98
  TestHelpers.with_config do |config|
99
- config.default_exchange = Exchanges::FixedRates.new currencies: [{code: 'EUR', symbol: '€'}, {code: 'JPY', symbol: '¥'}]
99
+ config.available_currencies = [{code: 'EUR', symbol: '€'}, {code: 'JPY', symbol: '¥'}]
100
100
 
101
101
  expect(Money(1, 'EUR').to_s).to eq '€1.00'
102
102
  expect(Money(1, 'JPY').to_s).to eq '¥1.00'
@@ -168,7 +168,7 @@ module Danconia
168
168
  end
169
169
 
170
170
  def fake_exchange args = {}
171
- double 'exchange', args.reverse_merge(rate: nil, currencies: [])
171
+ double 'exchange', args.reverse_merge(rate: nil)
172
172
  end
173
173
  end
174
174
  end
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.2
4
+ version: 0.2.3
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-04 00:00:00.000000000 Z
11
+ date: 2018-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -109,8 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  description: Multi-currency money library backed by BigDecimal
112
- email:
113
- - emmanicolau@gmail.com
112
+ email: emmanicolau@gmail.com
114
113
  executables: []
115
114
  extensions: []
116
115
  extra_rdoc_files: []
@@ -128,6 +127,7 @@ files:
128
127
  - danconia.gemspec
129
128
  - examples/currency_layer.rb
130
129
  - examples/fixed_rates.rb
130
+ - examples/single_currency.rb
131
131
  - lib/danconia.rb
132
132
  - lib/danconia/config.rb
133
133
  - lib/danconia/currency.rb
@@ -150,8 +150,9 @@ files:
150
150
  - spec/danconia/stores/active_record_spec.rb
151
151
  - spec/spec_helper.rb
152
152
  - spec/support/database.rb
153
- homepage: ''
154
- licenses: []
153
+ homepage: https://github.com/eeng/danconia
154
+ licenses:
155
+ - MIT
155
156
  metadata: {}
156
157
  post_install_message:
157
158
  rdoc_options: []