module Europe::Vat::Rates

Rates

Constants

FALLBACK_RATES
RATES_URL

Public Class Methods

extract_rates(resp) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/europe/vat/rates.rb, line 27
def self.extract_rates(resp)
  rates = {}

  begin
    data = resp.scan(%r{\<tbody\>(.*)\<\/tbody\>}m).first.first.strip
  rescue NoMethodError
    return FALLBACK_RATES
  end

  xml = REXML::Document.new("<root>#{data}</root>")
  xml.first.elements.each('tr') do |result|
    next if result[3].nil?

    rates = filter_rate(result, rates)
  end
  rates
end
fetch_rates() click to toggle source
# File lib/europe/vat/rates.rb, line 54
def self.fetch_rates
  resp = Net::HTTP.get_response(URI.parse(RATES_URL))
  resp.code.to_i == 200 ? resp.body : nil
end
filter_rate(result, rates) click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/europe/vat/rates.rb, line 46
def self.filter_rate(result, rates)
  country = result[0].text
  rate = result[3].text
  country_code = Europe::Countries::Reversed.generate(:name)[country]
  rates[country_code] = rate.to_f if country_code
  rates
end
retrieve() click to toggle source
# File lib/europe/vat/rates.rb, line 19
def self.retrieve
  resp = fetch_rates
  return FALLBACK_RATES if resp.nil?

  extract_rates(resp)
end