Cache the API discovery doc for at least 24 hours (refs #1923)
[arvados.git] / sdk / ruby / lib / arvados.rb
index 5be1fd939ea4ac797c1ceeb263d41b77bc709473..f8bb4c0e70b6546eb7ecd2279fbd4c42fc314524 100644 (file)
@@ -2,6 +2,7 @@ require 'rubygems'
 require 'google/api_client'
 require 'active_support/inflector'
 require 'json'
+require 'fileutils'
 
 ActiveSupport::Inflector.inflections do |inflect|
   inflect.irregular 'specimen', 'specimens'
@@ -109,12 +110,19 @@ class Arvados
       api = api.to_s
       return @discovery_documents["#{api}:#{version}"] ||=
         begin
-          response = self.execute!(
-                                   :http_method => :get,
-                                   :uri => self.discovery_uri(api, version),
-                                   :authenticated => false
-                                   )
-          response.body.class == String ? JSON.parse(response.body) : response.body
+          # fetch new API discovery doc if stale
+          cached_doc = File.expand_path '~/.cache/arvados/discovery_uri.json'
+          if not File.exist?(cached_doc) or (Time.now - File.mtime(cached_doc)) > 86400
+            response = self.execute!(:http_method => :get,
+                                     :uri => self.discovery_uri(api, version),
+                                     :authenticated => false)
+            FileUtils.makedirs(File.dirname cached_doc)
+            File.open(cached_doc, 'w') do |f|
+              f.puts response.body
+            end
+          end
+
+          File.open(cached_doc) { |f| JSON.load f }
         end
     end
   end