require 'stockboy/provider'
require 'httpi'
module Stockboy::Providers
class HTTP < Stockboy::Provider
dsl_attr :get, attr_writer: false
dsl_attr :post, attr_writer: false
dsl_attr :method, attr_writer: false
dsl_attr :headers
dsl_attr :body
dsl_attr :username
dsl_attr :password
def uri
return nil if @uri.nil? || @uri.to_s.empty?
URI(@uri).tap { |u| u.query = URI.encode_www_form(@query) if @query }
end
def uri=(uri)
@uri = uri
end
dsl_attr :uri, attr_accessor: false, alias: :url
dsl_attr :query
def method=(http_method)
return @method = nil unless %w(get post).include? http_method.to_s.downcase
@method = http_method.to_s.downcase.to_sym
end
def get=(uri)
@method = :get
@uri = uri
end
def post=(uri)
@method = :post
@uri = uri
end
def initialize(opts={}, &block)
super(opts, &block)
self.uri = opts[:uri]
self.method = opts[:method] || :get
self.query = opts[:query] || Hash.new
self. = opts[:headers] || Hash.new
self.body = opts[:body]
self.username = opts[:username]
self.password = opts[:password]
DSL.new(self).instance_eval(&block) if block_given?
end
def client
orig_logger, HTTPI.logger = HTTPI.logger, logger
req = HTTPI::Request.new.tap { |c| c.url = uri }
req.auth.basic(username, password) if username && password
req. =
req.body = body
block_given? ? yield(req) : req
ensure
HTTPI.logger = orig_logger
end
private
def validate
errors << "uri must be specified" unless uri
errors << "method (:get, :post) must be specified" unless method
errors << "body must be specified" if [:post, :put, :patch].include?(method) && body.to_s.empty?
errors.empty?
end
def fetch_data
client do |request|
response = HTTPI.request(method, request)
if response.error?
errors << "HTTP response error: #{response.code}"
else
@data = response.body
end
end
end
end
end