class TesouroDireto::Price

Constants

API_URL
MAIN_XPATH

Public Class Methods

sync() click to toggle source
# File lib/tesouro_direto.rb, line 8
def self.sync
        self.parse_response(self.get_data_from_website)
end

Private Class Methods

format_response(data) click to toggle source

Format parsed response

# File lib/tesouro_direto.rb, line 59
def self.format_response(data)
        data[1] = Date.strptime(data[1], "%d/%m/%Y")
        data[2].strip == "-" ? data[2] = nil : data[2] = data[2].to_delocalized_decimal.to_f
        data[3].strip == "-" ? data[3] = nil : data[3] = data[3].to_delocalized_decimal.to_f
        data[4].strip == "-" ? data[4] = nil : data[4] = data[4].to_delocalized_decimal.gsub("R$ ", "").to_f
        data[5].strip == "-" ? data[5] = nil : data[5] = data[5].to_delocalized_decimal.gsub("R$ ", "").to_f
        data << data[0].match(/\b(IGPM)|(IPCA)|(SELIC)|(Prefixado)\b/i).to_s
        data.unshift data[0].match(/\(([A-Z\s])*\)/i)[0].gsub("(", "").gsub(")", "")
end
get_data_from_website() click to toggle source

Request data from the server

# File lib/tesouro_direto.rb, line 17
def self.get_data_from_website
        url = URI(API_URL)
        req = Net::HTTP::Get.new(url.to_s)
        res = Net::HTTP.start(url.host, url.port) {|http| http.request(req)}
        res.body
end
parse_response(body) click to toggle source

Parse response body with Nokogiri

# File lib/tesouro_direto.rb, line 25
def self.parse_response(body)
        cols_amount = 6
        k = 0
        lines = []

        doc = Nokogiri::HTML(body)
        #Check if body has titles data
        if !doc.at_xpath(MAIN_XPATH).nil? then
                doc.remove_empty_lines!
                doc.xpath("//comment()").remove
                doc.xpath("#{MAIN_XPATH}/td[@class='listing1']").remove

                @@updated_at = DateTime.strptime(doc.xpath("#{MAIN_XPATH}/td[@class='listing2']/b").first.text, "%d-%m-%Y %H:%M:%S")
                doc.xpath("#{MAIN_XPATH}/td[@class='listing2']").remove
                (doc.xpath("#{MAIN_XPATH}/td[@class!='listing1']").count / cols_amount).times do |i|
                        line = []
                        cols_amount.times do
                                line << doc.xpath("#{MAIN_XPATH}/td[@class!='listing1']")[k].text
                                k +=1
                        end
                        lines << self.format_response(line)
                end

                self.to_hash(lines)
        else
                return {
                        updated_at: nil,
                        titles: nil,
                        message: "The market isn't open, please try again latter."
                }
        end
end
to_hash(data) click to toggle source

Convert formated response to hash

# File lib/tesouro_direto.rb, line 70
def self.to_hash(data)
        response_hash = {}
        response_hash[:updated_at] = DateTime.parse(@@updated_at.to_s)
        response_hash[:titles] = {}

        data.each do |field|
                response_hash[:titles]["#{field[0].downcase.gsub(/\s/, "_")}_#{field[2].year}".to_sym] = {
                        abbreviation: field[0].upcase,
                        name: field[1],
                        expire_date: field[2],
                        buy_rate: field[3],
                        sell_rate: field[4],
                        buy_price: field[5],
                        sell_price: field[6],
                        index: field[7].downcase
                }
        end

        return response_hash
end