Leetsoft's Money library
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib fixed assert_equal -12.to_money, Money.empty - (12.to_money) Feb 13, 2006
tests fixed assert_equal -12.to_money, Money.empty - (12.to_money) Feb 13, 2006
README git-svn-id: svn://leetsoft.com/money/trunk@10 da9ee5fb-4aef-0310-b2bf… Jul 21, 2005
Rakefile bumped version to 1.6 Jan 15, 2006


== Money class

This money class is based on the example from the ActiveRecord doc:

Its in production use at http://www.snowdevil.ca and I haven't found any major issues
so far. 
The main reason to open source it is because It might be useful to other people and 
I hope i'll get some feedback on how to improve the class. 

I bundled the exporter with the money class since some tests depend on it and I figured
that most applications which need to deal with Money also need to deal with proper 

== Download

Preferred method of installation is gem: 

  gem install --source http://dist.leetsoft.com money 

Alternatively you can get the library packed

== Usage

Use the compose_of helper to let active record deal with embedding the money
object in your models. The following example requires a cents and a currency field.

  class ProductUnit < ActiveRecord::Base
    belongs_to :product
    composed_of :price, :class_name => "Money", :mapping => [%w(cents cents) %(currency currency)]

      validate :cents_not_zero
      def cents_not_zero
        errors.add("cents", "cannot be zero or less") unless cents > 0
      validates_presence_of :sku, :currency
      validates_uniqueness_of :sku        
== Class configuration

Two const class variables are available to tailor Money to your needs. 
If you don't need currency exchange at all, just ignore those.

=== Default Currency

By default Money defaults to USD as its currency. This can be overwritten using

  Money.default_currency = "CAD"
If you use rails, the environment.rb is a very good place to put this. 

=== Currency Exchange

The second parameter is a bit more complex. It lets you provide your own implementation of the 
currency exchange service. By default Money throws an exception when trying to call .exchange_to. 

A second minimalist implementation is provided which lets you supply custom exchange rates:

  Money.bank = VariableExchangeBank.new 
  Money.bank.add_rate("USD", "CAD", 1.24515)
  Money.bank.add_rate("CAD", "USD", 0.803115)
  Money.us_dollar(100).exchange_to("CAD") => Money.ca_dollar(124)
  Money.ca_dollar(100).exchange_to("USD") => Money.us_dollar(80)

There is nothing stopping you from creating bank objects which scrape www.xe.com for the current rates or just return rand(2)
== Code

If you have any improvements please email them to tobi [at] leetsoft.com