Sha256: 7c4dabadb2f4562d30616c1dd47051d71be716405b8fab8405ebc748db526eb2

Contents?: true

Size: 1.92 KB

Versions: 2

Compression:

Stored size: 1.92 KB

Contents

module Parliament
  class Request
    attr_reader :base_url

    def initialize(base_url: nil)
      @endpoint_parts = []
      @base_url = base_url || self.class.base_url || ENV['PARLIAMENT_BASE_URL']
    end

    def method_missing(method, *params, &block)
      # TODO: Fix this smell
      super if method == :base_url=

      @endpoint_parts << method.to_s
      @endpoint_parts << params
      @endpoint_parts = @endpoint_parts.flatten!
      self
    end

    def respond_to_missing?(method, include_private = false)
      (method != :base_url=) || super
    end

    def get
      net_response = Net::HTTP.get_response(URI(api_endpoint))

      handle_errors(net_response)

      build_parliament_response(net_response)
    end

    def build_parliament_response(response)
      objects = Grom::Reader.new(response.body).objects
      objects.map { |object| assign_decorator(object) }

      Parliament::Response.new(objects)
    end

    def handle_errors(response)
      handle_not_found_error(response)
      handle_server_error(response)
      handle_no_content_error(response)
    end

    def handle_server_error(response)
      raise StandardError, 'This is a HTTPServerError' if response.is_a?(Net::HTTPServerError)
    end

    def handle_not_found_error(response)
      raise StandardError, 'This is a HTTPClientError' if response.is_a?(Net::HTTPClientError)
    end

    def handle_no_content_error(response)
      raise Parliament::NoContentError if response.code == '204'
    end

    def assign_decorator(object)
      object_type = Grom::Helper.get_id(object.type)
      return object unless Parliament::Decorators.constants.include?(object_type.to_sym)
      decorator_module = Object.const_get("Parliament::Decorators::#{object_type}")
      object.extend(decorator_module)
    end

    private

    class << self
      attr_accessor :base_url
    end

    def api_endpoint
      [@base_url, @endpoint_parts].join('/') + '.nt'
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
parliament-ruby-0.2.2 lib/parliament/request.rb
parliament-ruby-0.2.1 lib/parliament/request.rb