Commit f732951

mo khan <mo@mokhan.ca>
2016-05-21 16:39:10
extract yelp search class.
1 parent 3f106db
Changed files (2)
app/models/gym.rb
@@ -61,7 +61,8 @@ class Gym < ActiveRecord::Base
   end
 
   def self.import(city, pages: 5)
-    return if Rails.env.test? || city.blank?
+    return if city.blank?
+    return [] if Rails.env.test?
     (1..pages).each do |page|
       Gym.search_yelp(q: 'gym', city: city, page: page).each(&:save!)
     end
app/models/search.rb
@@ -1,18 +1,50 @@
 class Search
-  def self.yelp(q, categories = [], city, page, per_page, &block)
-    key = "#{q}-#{city}-#{page}-#{per_page}"
-    Rails.cache.fetch(key, expires_in: 1.hour) do
-      city = city.present? ? city : "Calgary"
-      categories = categories.present? ? categories.join(",") : "fitness"
-      offset = (page * per_page) - per_page
-      Kaminari.paginate_array(
-        Yelp.client.search(city, {
-          category_filter: categories,
-          limit: per_page,
-          offset: offset,
-          term: q,
-        }).businesses.map(&block)
-      )
+  class Yelp
+    attr_reader :client
+
+    def initialize(client = ::Yelp.client)
+      @client = client
+    end
+
+    def search(q, categories = [], city, page, per_page, &block)
+      return [] if city.blank?
+
+      cache(key: key_for(q, city, page, per_page)) do
+        paginate(results_for(q, city, categories, page, per_page).map(&block))
+      end
+    end
+
+    private
+
+    def key_for(*args)
+      args.join('-')
+    end
+
+    def results_for(q, city, categories, page, per_page)
+      client.search(city, {
+        category_filter: categories.join(","),
+        limit: per_page,
+        offset: offset_for(page, per_page),
+        term: q,
+      }).businesses
+    end
+
+    def paginate(results)
+      Kaminari.paginate_array(results)
     end
+
+    def cache(key:)
+      Rails.cache.fetch(key, expires_in: 1.hour) do
+        yield
+      end
+    end
+
+    def offset_for(page, per_page)
+      (page * per_page) - per_page
+    end
+  end
+
+  def self.yelp(q, categories = [], city, page, per_page, &block)
+    Yelp.new.search(q, categories, city, page, per_page, &block)
   end
 end