Merge branch 'develop'
diff --git a/lib/predictionio/client.rb b/lib/predictionio/client.rb
index ba3a2c8..65b9129 100644
--- a/lib/predictionio/client.rb
+++ b/lib/predictionio/client.rb
@@ -45,7 +45,7 @@
   #
   # == Installation
   # The easiest way is to use RubyGems:
-  #     gem install predictionio-0.5.0.gem
+  #     gem install predictionio-0.6.0.gem
   #
   # == Synopsis
   # The recommended usage of the SDK is to fire asynchronous requests as early as you can in your code,
@@ -103,6 +103,21 @@
   #     rescue ItemRecNotFoundError => e
   #       # graceful error handling
   #     end
+  #
+  # === Retrieving Top N Similar Items for an Item
+  #     # PredictionIO call to get similar items
+  #     response = client.aget_itemsim_top_n("barengine", "fooitem", 10)
+  #
+  #     #
+  #     # work you need to do for the page (rendering, db queries, etc)
+  #     #
+  #
+  #     begin
+  #       result = client.get_itemsim_top_n(response)
+  #       # display results, store results, or your other work...
+  #     rescue ItemSimNotFoundError => e
+  #       # graceful error handling
+  #     end
 
   class Client
 
@@ -139,6 +154,9 @@
     # Raised when ItemRec results cannot be found for a user after a synchronous API call.
     class ItemRecNotFoundError < StandardError; end
 
+    # Raised when ItemSim results cannot be found for an item after a synchronous API call.
+    class ItemSimNotFoundError < StandardError; end
+
     # Raised when an user-to-item action is not created after a synchronous API call.
     class U2IActionNotCreatedError < StandardError; end
 
@@ -512,6 +530,64 @@
     end
 
     # :category: Asynchronous Methods
+    # Asynchronously request to get the top n similar items for an item from an ItemSim engine and return a PredictionIO::AsyncResponse object immediately.
+    #
+    # Corresponding REST API method: GET /engines/itemsim/:engine/topn
+    #
+    # See also #get_itemsim_top_n.
+    def aget_itemsim_top_n(engine, iid, n, params = {})
+      rparams = Hash.new
+      rparams["pio_appkey"] = @appkey
+      rparams["pio_iid"] = iid
+      rparams["pio_n"] = n
+      if params["pio_itypes"] != nil &&
+          params["pio_itypes"].kind_of?(Array) &&
+          params["pio_itypes"].length > 0 then
+        rparams["pio_itypes"] = params["pio_itypes"].join(",")
+      else
+        rparams["pio_itypes"] = params["pio_itypes"]
+      end
+      if params["pio_latitude"] != nil && params["pio_longitude"] != nil then
+        rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
+      end
+      if params["pio_within"] != nil then
+        rparams["pio_within"] = params["pio_within"]
+      end
+      if params["pio_unit"] != nil then
+        rparams["pio_unit"] = params["pio_unit"]
+      end
+      @http.aget(PredictionIO::AsyncRequest.new(versioned_path("/engines/itemsim/#{engine}/topn.#{@apiformat}"), rparams))
+    end
+
+    # :category: Synchronous Methods
+    # Synchronously request to get the top n similar items for an item from an ItemSim engine and block until a response is received.
+    #
+    # See #aget_itemsim_top_n for a description of special argument handling.
+    #
+    # call-seq:
+    # aget_itemsim_top_n(engine, iid, n, params = {})
+    # aget_itemsim_top_n(async_response)
+    def get_itemsim_top_n(*args)
+      iid_or_res = args[0]
+      if iid_or_res.is_a?(PredictionIO::AsyncResponse) then
+        response = iid_or_res.get
+      else
+        response = aget_itemsim_top_n(*args).get
+      end
+      if response.is_a?(Net::HTTPOK) then
+        res = JSON.parse(response.body)
+        res["pio_iids"]
+      else
+        begin
+          msg = response.body
+        rescue Exception
+          raise ItemSimNotFoundError, response
+        end
+        raise ItemSimNotFoundError, msg
+      end
+    end
+
+    # :category: Asynchronous Methods
     # Asynchronously request to record an action on an item and return a PredictionIO::AsyncResponse object immediately.
     #
     # Corresponding REST API method: POST /actions/u2i
diff --git a/predictionio.gemspec b/predictionio.gemspec
index 46472f0..6ff8ca9 100644
--- a/predictionio.gemspec
+++ b/predictionio.gemspec
@@ -6,7 +6,7 @@
 provides convenient access of the PredictionIO API to Ruby programmers so that
 they can focus on their application logic.
   EOF
-  s.version = "0.5.0"
+  s.version = "0.6.0"
   s.author = "The PredictionIO Team"
   s.email = "support@prediction.io"
   s.homepage = "http://prediction.io"
diff --git a/test/test.rb b/test/test.rb
index a2dbd43..f666a0b 100644
--- a/test/test.rb
+++ b/test/test.rb
@@ -89,4 +89,15 @@
     assert(iids.include?("bar"))
     assert_equal(iids.length, 5)
   end
+
+  def test_itemsim
+    client = PredictionIO::Client.new(APPKEY, APITHREADS, APIURL)
+    iids = client.get_itemsim_top_n("test", "218", 5)
+    assert(iids.include?("itemsim"))
+    assert(iids.include?("218"))
+    assert(iids.include?("1"))
+    assert(iids.include?("foo"))
+    assert(iids.include?("bar"))
+    assert_equal(iids.length, 5)
+  end
 end