Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
sunlight / lib / sunlight / times.rb
Size: Mime:
require 'http'
require 'ostruct'
require 'geocoder'

module Sunlight
  class Times
    extend Forwardable

    API_BASE_URL = 'http://api.sunrise-sunset.org/json?'

    def_delegator :data, :sunrise
    def_delegator :data, :sunset
    def_delegator :data, :solar_noon
    def_delegator :data, :day_length
    def_delegator :data, :civil_twilight_begin
    def_delegator :data, :civil_twilight_end
    def_delegator :data, :nautical_twilight_begin
    def_delegator :data, :nautical_twilight_end
    def_delegator :data, :astronomical_twilight_begin
    def_delegator :data, :astronomical_twilight_end

    def initialize(date:, lat_lng:)
      raise ArgumentError.new('Please provide a date and location') if (date.nil? || lat_lng.nil?)
      lat, lng = lat_lng
      @url     = "#{API_BASE_URL}lat=#{lat}&lng=#{lng}&date=#{formatted_date(date)}&formatted=0"
    end

    private

    attr_reader :url

    def data
      @data ||= begin
        response = HTTP.get(url)
        parse(response.body.to_s)
      end
    end

    def formatted_date(date)
      date.is_a?(Date) ? date.strftime('%Y-%m-%d') : date.to_s
    end

    def parse(response)
      json_body = JSON.parse(response)
      results   = json_body['results'].inject({}) { |memo, (key, val)| memo[key.to_sym] = parse_date(val); memo }
      OpenStruct.new(results)
    end

    def parse_date(time_string)
      DateTime.parse(time_string)
    rescue
      time_string
    end

  end
end