Last Updated: March 01, 2016
·
2.918K
· stuliston

A Simple Technique for Wrapping 3rd-Party API Clients

Kudos to my colleague, Kunal (@techthumb) for showing me this today.

I wanted a single instance (singleton) of a 3rd-party client object to be available across my app. Ideally, I should be able to ask this wrapper the same questions as I would ask the client itself (delegation).

Here's an example of how this mix of the singleton and delegator patterns can be achieved in Ruby. The example uses the google_places gem by @marceldegraaf:

class GooglePlacesClient < SimpleDelegator

  include Singleton

  def initialize
    client = GooglePlaces::Client.new("[my_api_key]")
    super(client)
  end

end

The two ruby components used here are:

  • The SimpleDelegator superclass - which delegates all supported method calls to the object passed into the constructor (in this case client). In other words, my GooglePlacesClient.instance now responds to all of the messages that the gem's GooglePlaces::Client responds to.

  • The Singleton mixin - which ensures that only one instance of my GooglePlacesClient can be created.

For completeness, here's an example of how you'd consume this singleton class:

GooglePlacesClient.instance.spots(1, 1)

This delegates the 'spots' message to the instance variable which in turn responds with an array of type GooglePlaces::Spot for the supplied latitude, longitude.

Pretty neat.

Stu