Sha256: be489605db744b182c999279445e2907b0630c18ca4b117902b7b4a1b98fbde0

Contents?: true

Size: 1.94 KB

Versions: 16

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true
require "money/currency/loader"

class Money
  class Currency
    @@mutex = Mutex.new
    @@loaded_currencies = {}

    class UnknownCurrency < ArgumentError; end

    class << self
      def new(currency_iso)
        raise UnknownCurrency, "Currency can't be blank" if currency_iso.nil? || currency_iso.to_s.empty?
        iso = currency_iso.to_s.downcase
        @@loaded_currencies[iso] || @@mutex.synchronize { @@loaded_currencies[iso] = super(iso) }
      end
      alias_method :find!, :new

      def find(currency_iso)
        new(currency_iso)
      rescue UnknownCurrency
        nil
      end

      def currencies
        @@currencies ||= Loader.load_currencies
      end
    end

    attr_reader :iso_code, :iso_numeric, :name, :smallest_denomination, :subunit_symbol,
                :subunit_to_unit, :minor_units, :symbol, :disambiguate_symbol, :decimal_mark

    def initialize(currency_iso)
      data = self.class.currencies[currency_iso]
      raise UnknownCurrency, "Invalid iso4217 currency '#{currency_iso}'" unless data
      @symbol                = data['symbol']
      @disambiguate_symbol   = data['disambiguate_symbol'] || data['symbol']
      @subunit_symbol        = data['subunit_symbol']
      @iso_code              = data['iso_code']
      @iso_numeric           = data['iso_numeric']
      @name                  = data['name']
      @smallest_denomination = data['smallest_denomination']
      @subunit_to_unit       = data['subunit_to_unit']
      @decimal_mark          = data['decimal_mark']
      @minor_units           = subunit_to_unit == 0 ? 0 : Math.log(subunit_to_unit, 10).round.to_i
      freeze
    end

    def eql?(other)
      self.class == other.class && iso_code == other.iso_code
    end

    def hash
      [ self.class, iso_code ].hash
    end

    def compatible?(other)
      other.is_a?(NullCurrency) || eql?(other)
    end

    alias_method :==, :eql?
    alias_method :to_s, :iso_code
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
shopify-money-3.0.0 lib/money/currency.rb
shopify-money-2.2.2 lib/money/currency.rb
shopify-money-2.2.1 lib/money/currency.rb
shopify-money-2.2.0 lib/money/currency.rb
shopify-money-2.0.0 lib/money/currency.rb
shopify-money-1.3.0 lib/money/currency.rb
shopify-money-1.2.1 lib/money/currency.rb
shopify-money-1.2.0 lib/money/currency.rb
shopify-money-1.1.2 lib/money/currency.rb
shopify-money-1.1.1 lib/money/currency.rb
shopify-money-1.1.0 lib/money/currency.rb
shopify-money-1.0.2.pre lib/money/currency.rb
shopify-money-1.0.1.pre lib/money/currency.rb
shopify-money-1.0.0.pre lib/money/currency.rb
shopify-money-0.16.0 lib/money/currency.rb
shopify-money-0.15.0 lib/money/currency.rb