infertux/ubea

View on GitHub
lib/ubea/exchanges/base.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "open-uri"
require "json"
require "base64"
require "addressable/uri"
require "retryable"
require "faraday"
require "net/protocol"
require "zlib"
require "ubea"
require "ubea/log"
require "ubea/money"
require "ubea/offer"
require "ubea/order_book"

module Ubea
  module Exchange
    class Base
      attr_reader :order_book, :updated_at, :last_rtt

      def id
        @id ||= begin
          self.class.to_s.gsub(/.*::/, "").gsub(/([A-Z])/, "_\\1").gsub(/\A_/, "").downcase
        end
      end

      alias_method :to_param, :id

      def short_name
        @short_name ||= self.class.to_s.gsub(/.*::/, "")
      end

      alias_method :to_s, :short_name

      def name
        raise NotImplementedError, to_s
      end

      def trade_fee
        raise NotImplementedError, to_s
      end

      def balance
        raise NotImplementedError, to_s
      end

    protected

      def retryable_http_request
        exceptions = [
          Faraday::ConnectionFailed,
          Faraday::TimeoutError,
          Faraday::SSLError,
          Net::ReadTimeout,
          OpenURI::HTTPError,
          Zlib::BufError,
        ].freeze

        Retryable.retryable(tries: 5, sleep: 1, on: exceptions) do
          yield
        end
      end

    private

      def http_adapter(base_uri)
        @http ||= Faraday.new(url: base_uri) do |faraday|
          faraday.request :url_encoded
          faraday.adapter :net_http
          # faraday.response :logger                  # log requests to STDOUT
        end
      end

      def get_html(url)
        Retryable.retryable(tries: 5, sleep: 1) do
          open(url).read
        end
      end

      def get_json(url)
        html = get_html(url) or return

        begin
          JSON.parse(html)
        rescue JSON::ParserError
          nil
        end
      end

      def mark_as_refreshed
        now = Time.now.utc
        @last_rtt = now - updated_at if updated_at
        @updated_at = now

        Log.debug "Order book for #{self} has been refreshed"
      end
    end
  end
end