Class: GooglePlaces::Request

Inherits:
Object
  • Object
show all
Includes:
HTTParty
Defined in:
lib/google_places/request.rb

Overview

This class performs the queries on the API

Constant Summary collapse

NEARBY_SEARCH_URL =
'https://maps.googleapis.com/maps/api/place/nearbysearch/json'
DETAILS_URL =
'https://maps.googleapis.com/maps/api/place/details/json'
PHOTO_URL =
'https://maps.googleapis.com/maps/api/place/photo'
TEXT_SEARCH_URL =
'https://maps.googleapis.com/maps/api/place/textsearch/json'
PAGETOKEN_URL =
'https://maps.googleapis.com/maps/api/place/search/json'
RADAR_SEARCH_URL =
'https://maps.googleapis.com/maps/api/place/radarsearch/json'
AUTOCOMPLETE_URL =
'https://maps.googleapis.com/maps/api/place/autocomplete/json'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url, options, follow_redirects = true) ⇒ Request

Create a new Request for a given uri and the provided params

Parameters:

  • url (String)

    The uri to make the query on

  • options (Hash)

    A Hash providing options for the request

Options Hash (options):

  • :key (String)

    the provided api key. Note that this is a mandatory parameter

  • :radius (Integer)

    Defines the distance (in meters) within which to return Place results. The maximum allowed radius is 50,000 meters. Note that radius must not be included if :rankby is specified Note that this is a mandatory parameter

  • :location ((Integer, Integer), String)

    The latitude/longitude around which to retrieve Spot information. This must be specified as latitude,longitude Note that this is a mandatory parameter

  • :types (String, Array)

    Restricts the results to Spots matching at least one of the specified types

  • :name (String)

    A term to be matched against the names of Places. Results will be restricted to those containing the passed name value.

  • :keyword (String)

    A term to be matched against all content that Google has indexed for this Spot, including but not limited to name, type, and address, as well as customer reviews and other third-party content.

  • :language (String)

    The language code, indicating in which language the results should be returned, if possible.

  • :exclude (String, Array<String>) — default: []

    A String or an Array of types to exclude from results

  • :retry_options (Hash) — default: {}

    A Hash containing parameters for search retries

  • :retry_options[:status] (Object) — default: []
  • :retry_options[:max] (Integer) — default: 0

    the maximum retries

  • :retry_options[:delay] (Integer) — default: 5

    the delay between each retry in seconds

See Also:



265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
# File 'lib/google_places/request.rb', line 265

def initialize(url, options, follow_redirects = true)
  retry_options = options.delete(:retry_options) || {}

  retry_options[:status] ||= []
  retry_options[:max]    ||= 0
  retry_options[:delay]  ||= 5

  retry_options[:status] = [retry_options[:status]] unless retry_options[:status].is_a?(Array)
  @response = self.class.get(url, :query => options, :follow_redirects => follow_redirects)

  # puts @response.request.last_uri.to_s

  return unless retry_options[:max] > 0 && retry_options[:status].include?(@response.parsed_response['status'])

  retry_request = proc do
    for i in (1..retry_options[:max])
      sleep(retry_options[:delay])

      @response = self.class.get(url, :query => options, :follow_redirects => follow_redirects)

      break unless retry_options[:status].include?(@response.parsed_response['status'])
    end
  end

  if retry_options[:timeout]
    begin
      Timeout::timeout(retry_options[:timeout]) do
        retry_request.call
      end
    rescue Timeout::Error
      raise RetryTimeoutError.new(@response)
    end
  else
    retry_request.call

    raise RetryError.new(@response) if retry_options[:status].include?(@response.parsed_response['status'])
  end
end

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



6
7
8
# File 'lib/google_places/request.rb', line 6

def options
  @options
end

#responseHTTParty::Response

Returns the retrieved response from the API.

Returns:

  • (HTTParty::Response)

    the retrieved response from the API



5
6
7
# File 'lib/google_places/request.rb', line 5

def response
  @response
end

Class Method Details

.photo_url(options = {}) ⇒ URL

Search for a Photo’s URL with a reference key

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :key (String)

    the provided api key. Note that this is a mandatory parameter

  • :maxwidth (Integer)

    The maximum width of the photo url to be returned Note that this is a mandatory parameter

  • :photoreference (String)

    The reference of a already retrieved Photo Note that this is a mandatory parameter

  • :retry_options (Hash) — default: {}

    A Hash containing parameters for search retries

  • :retry_options[:status] (Object) — default: []
  • :retry_options[:max] (Integer) — default: 0

    the maximum retries

  • :retry_options[:delay] (Integer) — default: 5

    the delay between each retry in seconds

Returns:

  • (URL)


222
223
224
225
# File 'lib/google_places/request.rb', line 222

def self.photo_url(options = {})
  request = new(PHOTO_URL, options, false)
  request.parsed_response
end

.predictions_by_input(options = {}) ⇒ Array<Prediction>

Query for Place Predictions

Parameters:

  • api_key (String)

    the provided api key

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :exclude (String, Array<String>) — default: []

    A String or an Array of types to exclude from results

  • :retry_options (Hash) — default: {}

    A Hash containing parameters for search retries

  • :retry_options[:status] (Object) — default: []
  • :retry_options[:max] (Integer) — default: 0

    the maximum retries

  • :retry_options[:delay] (Integer) — default: 5

    the delay between each retry in seconds

Returns:

See Also:



199
200
201
202
# File 'lib/google_places/request.rb', line 199

def self.predictions_by_input(options = {})
  request = new(AUTOCOMPLETE_URL, options)
  request.parsed_response
end

.spot(options = {}) ⇒ Spot

Search for a Spot with a place_id key

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :key (String)

    the provided api key. Note that this is a mandatory parameter

  • :place_id (String)

    The place_id of the Spot. This parameter should be sent as placeid in requests but is snake_cased in responses (place_id) @see: developers.google.com/places/documentation/details Note that this is a mandatory parameter

  • :language (String)

    The language code, indicating in which language the results should be returned, if possible.

  • :retry_options (Hash) — default: {}

    A Hash containing parameters for search retries

  • :retry_options[:status] (Object) — default: []
  • :retry_options[:max] (Integer) — default: 0

    the maximum retries

  • :retry_options[:delay] (Integer) — default: 5

    the delay between each retry in seconds

Returns:



81
82
83
84
# File 'lib/google_places/request.rb', line 81

def self.spot(options = {})
  request = new(DETAILS_URL, options)
  request.parsed_response
end

.spots(options = {}) ⇒ Array<Spot>

Search for Spots at the provided location

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :key (String)

    the provided api key. Note that this is a mandatory parameter

  • :radius (Integer)

    Defines the distance (in meters) within which to return Place results. The maximum allowed radius is 50,000 meters. Note that radius must not be included if :rankby is specified Note that this is a mandatory parameter

  • :location ((Integer, Integer), String)

    The latitude/longitude around which to retrieve Spot information. This must be specified as latitude,longitude Note that this is a mandatory parameter

  • :types (String, Array)

    Restricts the results to Spots matching at least one of the specified types

  • :name (String)

    A term to be matched against the names of Places. Results will be restricted to those containing the passed name value.

  • :keyword (String)

    A term to be matched against all content that Google has indexed for this Spot, including but not limited to name, type, and address, as well as customer reviews and other third-party content.

  • :language (String)

    The language code, indicating in which language the results should be returned, if possible.

  • :exclude (String, Array<String>) — default: []

    A String or an Array of types to exclude from results

  • :retry_options (Hash) — default: {}

    A Hash containing parameters for search retries

  • :retry_options[:status] (Object) — default: []
  • :retry_options[:max] (Integer) — default: 0

    the maximum retries

  • :retry_options[:delay] (Integer) — default: 5

    the delay between each retry in seconds

Returns:

See Also:



56
57
58
59
# File 'lib/google_places/request.rb', line 56

def self.spots(options = {})
  request = new(NEARBY_SEARCH_URL, options)
  request.parsed_response
end

.spots_by_pagetoken(options = {}) ⇒ Array<Spot>

Search for Spots with a page token

Parameters:

  • pagetoken (String)

    the next page token to search for

  • api_key (String)

    the provided api key

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :exclude (String, Array<String>) — default: []

    A String or an Array of types to exclude from results

  • :retry_options (Hash) — default: {}

    A Hash containing parameters for search retries

  • :retry_options[:status] (Object) — default: []
  • :retry_options[:max] (Integer) — default: 0

    the maximum retries

  • :retry_options[:delay] (Integer) — default: 5

    the delay between each retry in seconds

Returns:

See Also:



180
181
182
183
# File 'lib/google_places/request.rb', line 180

def self.spots_by_pagetoken(options = {})
  request = new(PAGETOKEN_URL, options)
  request.parsed_response
end

.spots_by_query(options = {}) ⇒ Array<Spot>

Search for Spots with a query

Parameters:

  • query (String)

    the query to search for

  • api_key (String)

    the provided api key

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :lat (String, Integer)

    the latitude for the search

  • :lng (String, Integer)

    the longitude for the search

  • :radius (Integer)

    Defines the distance (in meters) within which to return Place results. The maximum allowed radius is 50,000 meters. Note that radius must not be included if :rankby is specified Note that this is a mandatory parameter

  • :types (String, Array)

    Restricts the results to Spots matching at least one of the specified types

  • :language (String)

    The language code, indicating in which language the results should be returned, if possible.

  • :exclude (String, Array<String>) — default: []

    A String or an Array of types to exclude from results

  • :retry_options (Hash) — default: {}

    A Hash containing parameters for search retries

  • :retry_options[:status] (Object) — default: []
  • :retry_options[:max] (Integer) — default: 0

    the maximum retries

  • :retry_options[:delay] (Integer) — default: 5

    the delay between each retry in seconds

Returns:

See Also:



160
161
162
163
# File 'lib/google_places/request.rb', line 160

def self.spots_by_query(options = {})
  request = new(TEXT_SEARCH_URL, options)
  request.parsed_response
end

.spots_by_radar(options = {}) ⇒ Object

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :key (String)

    the provided api key. Note that this is a mandatory parameter

  • :location (String)

    the lat, lng for the search

  • :radius (Integer) — default: 1000

    Defines the distance (in meters) within which to return Place results. The maximum allowed radius is 50,000 meters. Note that this is a mandatory parameter

  • :types (String, Array)

    Restricts the results to Spots matching at least one of the specified types

  • :name (String)

    A term to be matched against the names of Places. Results will be restricted to those containing the passed name value.

  • :keyword (String)

    A term to be matched against all content that Google has indexed for this Spot, including but not limited to name, type, and address, as well as customer reviews and other third-party content.

  • :minprice (Integer)

    Restricts results to only those places within the specified price range. Valid values range between 0 (most affordable) to 4 (most expensive), inclusive.

  • :maxprice (Integer)

    Restricts results to only those places within the specified price range. Valid values range between 0 (most affordable) to 4 (most expensive), inclusive.

  • :opennow (Boolean)

    Retricts results to those Places that are open for business at the time the query is sent. Places that do not specify opening hours in the Google Places database will not be returned if you include this parameter in your query. Setting openNow to false has no effect.

  • :zagatselected (Boolean)

    Restrict your search to only those locations that are Zagat selected businesses. This parameter does not require a true or false value, simply including the parameter in the request is sufficient to restrict your search. The zagatselected parameter is experimental, and only available to Places API enterprise customers.

  • :retry_options (Hash) — default: {}

    A Hash containing parameters for search retries

  • :retry_options[:status] (Object) — default: []
  • :retry_options[:max] (Integer) — default: 0

    the maximum retries

  • :retry_options[:delay] (Integer) — default: 5

    the delay between each retry in seconds

See Also:



125
126
127
128
# File 'lib/google_places/request.rb', line 125

def self.spots_by_radar(options = {})
  request = new(RADAR_SEARCH_URL, options)
  request.parsed_response
end

Instance Method Details

#executeObject



304
305
306
# File 'lib/google_places/request.rb', line 304

def execute
  @response = self.class.get(url, :query => options, :follow_redirects => follow_redirects)
end

#parsed_responseString

Parse errors from the server respons, if any

Returns:

  • (String)

    the response from the server as JSON

Raises:

  • (OverQueryLimitError)

    when server response object includes status ‘OVER_QUERY_LIMIT’

  • (RequestDeniedError)

    when server response object includes ‘REQUEST_DENIED’

  • (InvalidRequestError)

    when server response object includes ‘INVALID_REQUEST’

  • (UnknownError)

    when server response object includes ‘UNKNOWN_ERROR’

  • (NotFoundError)

    when server response object includes ‘NOT_FOUND’



315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
# File 'lib/google_places/request.rb', line 315

def parsed_response
  return @response.headers["location"] if @response.code >= 300 and @response.code < 400
  case @response.parsed_response['status']
  when 'OK', 'ZERO_RESULTS'
    @response.parsed_response
  when 'OVER_QUERY_LIMIT'
    raise OverQueryLimitError.new(@response)
  when 'REQUEST_DENIED'
    raise RequestDeniedError.new(@response)
  when 'INVALID_REQUEST'
    raise InvalidRequestError.new(@response)
  when 'UNKNOWN_ERROR'
    raise UnknownError.new(@response)
  when 'NOT_FOUND'
    raise NotFoundError.new(@response)
  end
end