Releases: ex-money/money
Money version 2.2.1
Bug Fixes
-
Correctly round to cash increment Money.round/2 now correctly uses the rounding increment for a currency. This is relevant for currencies like :AUD and :CHF which have minimum cash rounding of 0.05 even though the accounting increment is 0.01. Thanks to @maennchen. Closes #56.
-
Update documentation for
Money.round/2to correctly refer to the option:currency_digitswith the valid options of:cash,:accountingand:iso. The default is:iso. The optioncash: trueis invalid.
Money version 2.2.0
This release is primarily a refactoring of the exchange rates service. It separates the concerns of retrieval and caching. It also normalises the API amongst the three modules Money.ExchangeRates, Money.ExchangeRates.Retriever and Money.ExchangeRates.Cache. Each of these modules implements:
latest_rates/0historic_rates/1
This makes it clear that rates can be retrieved through the cache or the service API. The implementation in Money.ExchangeRates will return the cached value if available or will call the service API if not.
Migration from earlier releases
The only know issue for migrating from earlier releases is if your application requires a different supervision strategy for the exchange rate service that the default one. This is documented in the README in the section "Using Ecto or other applications from within the callback module". The change is the way in which the supervisor is defined. It is included here for completeness:
In prior releases:
supervisor(Money.ExchangeRates.Supervisor, [])
From this release onwards:
supervisor(Money.ExchangeRates.Supervisor, [[restart: true, start_retriever: true]])
Note that the option start_retriever: true is optional. The default is false. The option restart: true is required in this case because the exchange rates supervisor is always started when ex_money is started even if the retriever is not started.
Enhancements
-
Define an exchange rates cache behaviour
Money.ExchangeRates.Cache -
Adds the config key
:exchange_rates_cache_modulewhich can be set to a module that implements theMoney.ExchangeRates.Cachebehaviour. Two modules are provided:Money.ExchangeRates.Cache.Ets(the default) andMoney.ExchangeRates.Cache.Dets
-
Move all exchange rates retrieval functions to
Money.ExchangeRates.Retriever -
Add several functions to
Money.ExchangeRates.Retriever::config/0to return the current retriever configuration.reconfigure/1to allow reconfiguration of the exchange rates retriever.start/1to start the service. Delegates toMoney.ExchangeRates.Supervisor.start_retriever/1.stop/0to stop the service. Delegates toMoney.ExchangeRates.Supervisor.stop_retriever/0.restart/0to restart the service. Delegates toMoney.ExchangeRates.Supervisor.restart_retriever/0.delete/0to delete the service. It can be started again withstart/1. Delegates toMoney.ExchangeRates.Supervisor.delete_retriever/0.
-
If the config key
:exchange_rates_retrieve_everyis set to anatomrather than anintegerthen no periodic retrieval will be performed. This allows the configuration of the following, which is also the default:
config :ex_money,
exchange_rates_retrieve_every: :never
-
Use
etag's in theMoney.ExchangeRates.OpenExchangeRatesAPI module when retrieving exchange rates from the service. -
Add
Money.known_currencies/0which delegates toCldr.known_currencies/0and returns the list of known currency codes -
Add
Money.known_current_currencies/0to return the list of currencies currently active according to ISO 4217 -
Add
Money.known_historic_currencies/0to return a list of currencies known to Cldr but which are not considered in current use -
Add
Money.known_tender_currencies/0to return a list of currencies defined as legal tender in Cldr -
Add the configuration key
:json_librarythat specifies which json library to use for decoding json. The default isCldr.Config.json_library/0which is currentlyPoisonalthough this is likely to change toJasonwhenPhoenixmakes this change. -
Moves the protocol implementations for
String.Chars,InspectandPhoenix.HTML.Safeto a separate file so that recompilation on locale configuration change works correctly.
Money version 2.1.0
Enhancements
-
Money.to_integer_exp/2now uses the definition of digits (subunits) as defined by ISO 4217. Previously the definition was that supplied by CLDR. CLDR's definition is not always in alignment with ISO 4217. ISO 4217 is a firm requirement for financial transactions through payment gateways. -
Bump dependencies for
ex_cldrto 1.4.0 andex_cldr_numbersto 1.3.0 to support:iso_digits
Money version 2.1.0-rc.1
Enhancements
-
Money.to_integer_exp/1is nowMoney.to_integer/2 -
Money.to_integer/2now uses the definition of digits (subunits) as defined by ISO 4217. Previously the definition was that supplied by CLDR. CLDR's definition is not always in alignment with ISO 4217. ISO 4217 is a firm requirement for financial transactions through payment gateways. -
Note that the dependencies for
ex_cldrandex_cldr_numbershave been bumped accordingly.
Money version 2.1.0-rc.0
Enhancements
-
Money.to_integer_exp/1is nowMoney.to_integer/2 -
Money.to_integer/2now uses the definition of digits (subunits) as defined by ISO 4217. Previously the definition was that supplied by CLDR. CLDR's definition is not always in alignment with ISO 4217. ISO 4217 is a firm requirement for financial transactions through payment gateways. -
Note that the dependencies for
ex_cldrandex_cldr_numbershave been bumped accordingly.
Money version 2.0.4
Bug Fixes
- Fixed
from_float!/2which would fail sincenew/2does not return{:ok, Money.t}. Note that fromex_money3.0,Money.new/2will return{:ok, Money.t}to be consistent with canonical approaches in Elixir. Closes #48. Thanks for @LostKobrakai.
Money version 2.0.3
Bug Fixes
- Fixes the typespec for
Money.new/2and revises several other typespecs. Added a dialyzer configuration. SinceMoney.new/2allows flexible (probably too flexible) order or arguments, the typespec does not fully match the function implementation and Dialyzer understandably complains. However the value of a typespec as documentation argues against making the typespec formally correct. This will be revisited for Money 3.0.
Money version 2.0.2
Bug Fixes
Money.Sigilwas callingString.to_existing_atom/1directly rather thanCldr.validate_currency/1. Since currency codes are only loaded and therefore the atoms materialized whenCldris loaded this created a situation whereby a valid currency code may raise anagument error.Money.Sigilnow correctly callsCldr.validate_currency/1which ensures the currency atoms are loaded before validation. Closes #46.
Money version 2.0.1
Bug Fixes
Phoenix.HTML.Safeprotocol implementation correctly returns a formatted string, not an{:ok, string}tuple. Closes #45.
Money version 2.0.0
Breaking Changes
-
The function
Money.new/2no longer supports afloatamount. The new functionMoney.from_float/2is introduced. The factory functionMoney.new/2previously supported afloatamount as a parameter. There are many well-documented issues with float. Although a float with a precision of no more than 15 digits will convert (and round-trip) without loss of precision there is a real possibility that the upstream calculations that produced the float will have introduced rounding or precision errors. CallingMoney.new/2with a float amount will return an error tuple:{:error, { Money.InvalidAmountError, "Float amounts are not supported in new/2 due to potenial rounding " <> "and precision issues. If absolutely required, use Money.from_float/2"}} -
Remove support for
Moneytuples inMoney.Ecto.Composite.TypeandMoney.Ecto.Map.Type. Previously there has been support for dumpingMoneyin a tuple format. This support has now been removed and allMoneyoperations should be based on theMoney.tstruct.
Enhancements
-
Add
Money.from_float/2to create aMoneystruct from a float and a currency code. This function is named to make it clear that we risk losing precision due to upstream rounding errors. According to the standard and experimentation, floats of up to 15 digits of precision will round trip without error. Thereforefrom_float/2will check the precision of the number and return an error if the precision is greater than 15 since the correctness of the number cannot be verified beyond that. -
Add
Money.from_float!/2which is likefrom_float/2but raises on error -
Formatted the text the with the Elixir 1.6 code formatter