module Barometer # # A simple Geo class # # Used to store location data # class Data::Geo attr_accessor :latitude, :longitude, :query attr_accessor :locality, :region, :country, :country_code, :address def initialize(location=nil) return unless location raise ArgumentError unless location.is_a?(Hash) self.build_from_hash(location) self end def build_from_hash(location=nil) return nil unless location raise ArgumentError unless location.is_a?(Hash) if location["geometry"] && location["geometry"]["location"] @latitude = location["geometry"]["location"]["lat"].to_f @longitude = location["geometry"]["location"]["lng"].to_f end query_parts = [] if location["address_components"] location["address_components"].each do |address_components| skip unless address_components["types"] # sublocality trumps locality if address_components["types"].include?('sublocality') @locality = address_components["long_name"] end if address_components["types"].include?('locality') @locality ||= address_components["long_name"] end if address_components["types"].include?('administrative_area_level_1') #@region = address_components["long_name"] @region = address_components["short_name"] end if address_components["types"].include?('country') @country = address_components["long_name"] @country_code = address_components["short_name"] end if !(address_components["types"] & location["types"]).empty? query_parts << address_components["long_name"] end end end @query = query_parts.join(', ') @address = "" end def coordinates [@latitude, @longitude].join(',') end def to_s s = [@address, @locality, @region, @country || @country_code] s.delete("") s.compact.join(', ') end end end