Sha256: 0a4c2b2950a3687aad68c36c0e955cdccb1581809cca982f99d818d90560f0d2

Contents?: true

Size: 1.54 KB

Versions: 1

Compression:

Stored size: 1.54 KB

Contents

module OpenWeatherAPI
  module Resources
    class Base

      attr_reader :api_obj

      def initialize(api_obj)
        @api_obj = api_obj
      end

      def execute(**hash, &block)
        @parameters = hash
        setup_indifferent_access(@parameters)

        # Let's use json
        response = RestClient.send :get, base_url, params: build_params(@parameters)
        raise "Invalid response." unless response.code == 200

        # Handle the response format 
        response = self.send "handle_response_#{mode}", response

        # Handle the block
        return block.call(response) if block_given?
        response
      end

      private

      def mode
        (@parameters[:mode] || 'json').to_s.to_sym
      end

      def handle_response_json(response)
        json = JSON.parse(response.body)
        setup_indifferent_access(json)
      end

      def handle_response_xml(response)
        response.body
      end

      def handle_response_html(response)
        response.body
      end

      def base_url
        "http://api.openweathermap.org/data/#{API::VERSION || '2.5'}/"
      end

      def setup_indifferent_access(sub_hash)
        sub_hash.default_proc = proc{|h, k| h.key?(k.to_s) ? h[k.to_s] : nil}
        sub_hash.each { |k, v| setup_indifferent_access(v) if v.is_a?(Hash) }
      end

      def build_params(parameters = {})
        {
          APPID: @api_obj.api_key,
          lang:  @api_obj.default_language
        }.merge(parameters)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
open-weather-api-0.0.5 lib/open-weather-api/resources/base.rb