arvados-google-api-client 0.8.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/CHANGELOG.md +178 -0
 - data/Gemfile +9 -0
 - data/LICENSE +202 -0
 - data/README.md +218 -0
 - data/Rakefile +41 -0
 - data/google-api-client.gemspec +43 -0
 - data/lib/cacerts.pem +2183 -0
 - data/lib/compat/multi_json.rb +19 -0
 - data/lib/google/api_client.rb +750 -0
 - data/lib/google/api_client/auth/compute_service_account.rb +28 -0
 - data/lib/google/api_client/auth/file_storage.rb +59 -0
 - data/lib/google/api_client/auth/installed_app.rb +126 -0
 - data/lib/google/api_client/auth/jwt_asserter.rb +126 -0
 - data/lib/google/api_client/auth/key_utils.rb +93 -0
 - data/lib/google/api_client/auth/pkcs12.rb +41 -0
 - data/lib/google/api_client/auth/storage.rb +102 -0
 - data/lib/google/api_client/auth/storages/file_store.rb +58 -0
 - data/lib/google/api_client/auth/storages/redis_store.rb +54 -0
 - data/lib/google/api_client/batch.rb +326 -0
 - data/lib/google/api_client/charset.rb +33 -0
 - data/lib/google/api_client/client_secrets.rb +179 -0
 - data/lib/google/api_client/discovery.rb +19 -0
 - data/lib/google/api_client/discovery/api.rb +310 -0
 - data/lib/google/api_client/discovery/media.rb +77 -0
 - data/lib/google/api_client/discovery/method.rb +363 -0
 - data/lib/google/api_client/discovery/resource.rb +156 -0
 - data/lib/google/api_client/discovery/schema.rb +117 -0
 - data/lib/google/api_client/environment.rb +42 -0
 - data/lib/google/api_client/errors.rb +65 -0
 - data/lib/google/api_client/gzip.rb +28 -0
 - data/lib/google/api_client/logging.rb +32 -0
 - data/lib/google/api_client/media.rb +259 -0
 - data/lib/google/api_client/railtie.rb +18 -0
 - data/lib/google/api_client/reference.rb +27 -0
 - data/lib/google/api_client/request.rb +350 -0
 - data/lib/google/api_client/result.rb +255 -0
 - data/lib/google/api_client/service.rb +233 -0
 - data/lib/google/api_client/service/batch.rb +110 -0
 - data/lib/google/api_client/service/request.rb +144 -0
 - data/lib/google/api_client/service/resource.rb +40 -0
 - data/lib/google/api_client/service/result.rb +162 -0
 - data/lib/google/api_client/service/simple_file_store.rb +151 -0
 - data/lib/google/api_client/service/stub_generator.rb +61 -0
 - data/lib/google/api_client/service_account.rb +21 -0
 - data/lib/google/api_client/version.rb +26 -0
 - data/spec/google/api_client/auth/storage_spec.rb +122 -0
 - data/spec/google/api_client/auth/storages/file_store_spec.rb +40 -0
 - data/spec/google/api_client/auth/storages/redis_store_spec.rb +70 -0
 - data/spec/google/api_client/batch_spec.rb +248 -0
 - data/spec/google/api_client/client_secrets_spec.rb +53 -0
 - data/spec/google/api_client/discovery_spec.rb +708 -0
 - data/spec/google/api_client/gzip_spec.rb +98 -0
 - data/spec/google/api_client/media_spec.rb +178 -0
 - data/spec/google/api_client/request_spec.rb +29 -0
 - data/spec/google/api_client/result_spec.rb +207 -0
 - data/spec/google/api_client/service_account_spec.rb +169 -0
 - data/spec/google/api_client/service_spec.rb +618 -0
 - data/spec/google/api_client/simple_file_store_spec.rb +133 -0
 - data/spec/google/api_client_spec.rb +352 -0
 - data/spec/spec_helper.rb +66 -0
 - metadata +339 -0
 
| 
         @@ -0,0 +1,33 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'faraday'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'zlib'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
         
     | 
| 
      
 4 
     | 
    
         
            +
            module Google
         
     | 
| 
      
 5 
     | 
    
         
            +
              class APIClient
         
     | 
| 
      
 6 
     | 
    
         
            +
                class Charset < Faraday::Response::Middleware
         
     | 
| 
      
 7 
     | 
    
         
            +
                  include Google::APIClient::Logging
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  def charset_for_content_type(type)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    if type
         
     | 
| 
      
 11 
     | 
    
         
            +
                      m = type.match(/(?:charset|encoding)="?([a-z0-9-]+)"?/i)
         
     | 
| 
      
 12 
     | 
    
         
            +
                      if m
         
     | 
| 
      
 13 
     | 
    
         
            +
                        return Encoding.find(m[1])
         
     | 
| 
      
 14 
     | 
    
         
            +
                      end
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
                    nil
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  def adjust_encoding(env)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    charset = charset_for_content_type(env[:response_headers]['content-type'])
         
     | 
| 
      
 21 
     | 
    
         
            +
                    if charset && env[:body].encoding != charset
         
     | 
| 
      
 22 
     | 
    
         
            +
                      env[:body].force_encoding(charset)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    end
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  
         
     | 
| 
      
 26 
     | 
    
         
            +
                  def on_complete(env)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    adjust_encoding(env)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
         
     | 
| 
      
 33 
     | 
    
         
            +
            Faraday::Response.register_middleware :charset => Google::APIClient::Charset
         
     | 
| 
         @@ -0,0 +1,179 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright 2010 Google Inc.
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
      
 3 
     | 
    
         
            +
            # Licensed under the Apache License, Version 2.0 (the "License");
         
     | 
| 
      
 4 
     | 
    
         
            +
            # you may not use this file except in compliance with the License.
         
     | 
| 
      
 5 
     | 
    
         
            +
            # You may obtain a copy of the License at
         
     | 
| 
      
 6 
     | 
    
         
            +
            #
         
     | 
| 
      
 7 
     | 
    
         
            +
            #      http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 8 
     | 
    
         
            +
            #
         
     | 
| 
      
 9 
     | 
    
         
            +
            # Unless required by applicable law or agreed to in writing, software
         
     | 
| 
      
 10 
     | 
    
         
            +
            # distributed under the License is distributed on an "AS IS" BASIS,
         
     | 
| 
      
 11 
     | 
    
         
            +
            # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         
     | 
| 
      
 12 
     | 
    
         
            +
            # See the License for the specific language governing permissions and
         
     | 
| 
      
 13 
     | 
    
         
            +
            # limitations under the License.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            require 'compat/multi_json'
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            module Google
         
     | 
| 
      
 20 
     | 
    
         
            +
              class APIClient
         
     | 
| 
      
 21 
     | 
    
         
            +
                ##
         
     | 
| 
      
 22 
     | 
    
         
            +
                # Manages the persistence of client configuration data and secrets. Format
         
     | 
| 
      
 23 
     | 
    
         
            +
                # inspired by the Google API Python client.
         
     | 
| 
      
 24 
     | 
    
         
            +
                #
         
     | 
| 
      
 25 
     | 
    
         
            +
                # @see https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
         
     | 
| 
      
 26 
     | 
    
         
            +
                #
         
     | 
| 
      
 27 
     | 
    
         
            +
                # @example
         
     | 
| 
      
 28 
     | 
    
         
            +
                #   {
         
     | 
| 
      
 29 
     | 
    
         
            +
                #     "web": {
         
     | 
| 
      
 30 
     | 
    
         
            +
                #       "client_id": "asdfjasdljfasdkjf",
         
     | 
| 
      
 31 
     | 
    
         
            +
                #       "client_secret": "1912308409123890",
         
     | 
| 
      
 32 
     | 
    
         
            +
                #       "redirect_uris": ["https://www.example.com/oauth2callback"],
         
     | 
| 
      
 33 
     | 
    
         
            +
                #       "auth_uri": "https://accounts.google.com/o/oauth2/auth",
         
     | 
| 
      
 34 
     | 
    
         
            +
                #       "token_uri": "https://accounts.google.com/o/oauth2/token"
         
     | 
| 
      
 35 
     | 
    
         
            +
                #     }
         
     | 
| 
      
 36 
     | 
    
         
            +
                #   }
         
     | 
| 
      
 37 
     | 
    
         
            +
                #
         
     | 
| 
      
 38 
     | 
    
         
            +
                # @example
         
     | 
| 
      
 39 
     | 
    
         
            +
                #   {
         
     | 
| 
      
 40 
     | 
    
         
            +
                #     "installed": {
         
     | 
| 
      
 41 
     | 
    
         
            +
                #       "client_id": "837647042410-75ifg...usercontent.com",
         
     | 
| 
      
 42 
     | 
    
         
            +
                #       "client_secret":"asdlkfjaskd",
         
     | 
| 
      
 43 
     | 
    
         
            +
                #       "redirect_uris": ["http://localhost", "urn:ietf:oauth:2.0:oob"],
         
     | 
| 
      
 44 
     | 
    
         
            +
                #       "auth_uri": "https://accounts.google.com/o/oauth2/auth",
         
     | 
| 
      
 45 
     | 
    
         
            +
                #       "token_uri": "https://accounts.google.com/o/oauth2/token"
         
     | 
| 
      
 46 
     | 
    
         
            +
                #     }
         
     | 
| 
      
 47 
     | 
    
         
            +
                #   }
         
     | 
| 
      
 48 
     | 
    
         
            +
                class ClientSecrets
         
     | 
| 
      
 49 
     | 
    
         
            +
                  
         
     | 
| 
      
 50 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 51 
     | 
    
         
            +
                  # Reads client configuration from a file
         
     | 
| 
      
 52 
     | 
    
         
            +
                  #
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # @param [String] filename
         
     | 
| 
      
 54 
     | 
    
         
            +
                  #   Path to file to load
         
     | 
| 
      
 55 
     | 
    
         
            +
                  #
         
     | 
| 
      
 56 
     | 
    
         
            +
                  # @return [Google::APIClient::ClientSecrets]
         
     | 
| 
      
 57 
     | 
    
         
            +
                  #   OAuth client settings
         
     | 
| 
      
 58 
     | 
    
         
            +
                  def self.load(filename=nil)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    if filename && File.directory?(filename)
         
     | 
| 
      
 60 
     | 
    
         
            +
                      search_path = File.expand_path(filename)
         
     | 
| 
      
 61 
     | 
    
         
            +
                      filename = nil
         
     | 
| 
      
 62 
     | 
    
         
            +
                    end
         
     | 
| 
      
 63 
     | 
    
         
            +
                    while filename == nil
         
     | 
| 
      
 64 
     | 
    
         
            +
                      search_path ||= File.expand_path('.')
         
     | 
| 
      
 65 
     | 
    
         
            +
                      if File.exists?(File.join(search_path, 'client_secrets.json'))
         
     | 
| 
      
 66 
     | 
    
         
            +
                        filename = File.join(search_path, 'client_secrets.json')
         
     | 
| 
      
 67 
     | 
    
         
            +
                      elsif search_path == '/' || search_path =~ /[a-zA-Z]:[\/\\]/
         
     | 
| 
      
 68 
     | 
    
         
            +
                        raise ArgumentError,
         
     | 
| 
      
 69 
     | 
    
         
            +
                          'No client_secrets.json filename supplied ' +
         
     | 
| 
      
 70 
     | 
    
         
            +
                          'and/or could not be found in search path.'
         
     | 
| 
      
 71 
     | 
    
         
            +
                      else
         
     | 
| 
      
 72 
     | 
    
         
            +
                        search_path = File.expand_path(File.join(search_path, '..'))
         
     | 
| 
      
 73 
     | 
    
         
            +
                      end
         
     | 
| 
      
 74 
     | 
    
         
            +
                    end
         
     | 
| 
      
 75 
     | 
    
         
            +
                    data = File.open(filename, 'r') { |file| MultiJson.load(file.read) }
         
     | 
| 
      
 76 
     | 
    
         
            +
                    return self.new(data)
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 80 
     | 
    
         
            +
                  # Intialize OAuth client settings.
         
     | 
| 
      
 81 
     | 
    
         
            +
                  #
         
     | 
| 
      
 82 
     | 
    
         
            +
                  # @param [Hash] options
         
     | 
| 
      
 83 
     | 
    
         
            +
                  #   Parsed client secrets files
         
     | 
| 
      
 84 
     | 
    
         
            +
                  def initialize(options={})
         
     | 
| 
      
 85 
     | 
    
         
            +
                    # Client auth configuration
         
     | 
| 
      
 86 
     | 
    
         
            +
                    @flow = options[:flow] || options.keys.first.to_s || 'web'
         
     | 
| 
      
 87 
     | 
    
         
            +
                    fdata = options[@flow]
         
     | 
| 
      
 88 
     | 
    
         
            +
                    @client_id = fdata[:client_id] || fdata["client_id"]
         
     | 
| 
      
 89 
     | 
    
         
            +
                    @client_secret = fdata[:client_secret] || fdata["client_secret"]
         
     | 
| 
      
 90 
     | 
    
         
            +
                    @redirect_uris = fdata[:redirect_uris] || fdata["redirect_uris"]
         
     | 
| 
      
 91 
     | 
    
         
            +
                    @redirect_uris ||= [fdata[:redirect_uri] || fdata["redirect_uri"]].compact
         
     | 
| 
      
 92 
     | 
    
         
            +
                    @javascript_origins = (
         
     | 
| 
      
 93 
     | 
    
         
            +
                      fdata[:javascript_origins] ||
         
     | 
| 
      
 94 
     | 
    
         
            +
                      fdata["javascript_origins"]
         
     | 
| 
      
 95 
     | 
    
         
            +
                    )
         
     | 
| 
      
 96 
     | 
    
         
            +
                    @javascript_origins ||= [fdata[:javascript_origin] || fdata["javascript_origin"]].compact
         
     | 
| 
      
 97 
     | 
    
         
            +
                    @authorization_uri = fdata[:auth_uri] || fdata["auth_uri"]
         
     | 
| 
      
 98 
     | 
    
         
            +
                    @authorization_uri ||= fdata[:authorization_uri]
         
     | 
| 
      
 99 
     | 
    
         
            +
                    @token_credential_uri = fdata[:token_uri] || fdata["token_uri"]
         
     | 
| 
      
 100 
     | 
    
         
            +
                    @token_credential_uri ||= fdata[:token_credential_uri]
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                    # Associated token info
         
     | 
| 
      
 103 
     | 
    
         
            +
                    @access_token = fdata[:access_token] || fdata["access_token"]
         
     | 
| 
      
 104 
     | 
    
         
            +
                    @refresh_token = fdata[:refresh_token] || fdata["refresh_token"]
         
     | 
| 
      
 105 
     | 
    
         
            +
                    @id_token = fdata[:id_token] || fdata["id_token"]
         
     | 
| 
      
 106 
     | 
    
         
            +
                    @expires_in = fdata[:expires_in] || fdata["expires_in"]
         
     | 
| 
      
 107 
     | 
    
         
            +
                    @expires_at = fdata[:expires_at] || fdata["expires_at"]
         
     | 
| 
      
 108 
     | 
    
         
            +
                    @issued_at = fdata[:issued_at] || fdata["issued_at"]
         
     | 
| 
      
 109 
     | 
    
         
            +
                  end
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
                  attr_reader(
         
     | 
| 
      
 112 
     | 
    
         
            +
                    :flow, :client_id, :client_secret, :redirect_uris, :javascript_origins,
         
     | 
| 
      
 113 
     | 
    
         
            +
                    :authorization_uri, :token_credential_uri, :access_token,
         
     | 
| 
      
 114 
     | 
    
         
            +
                    :refresh_token, :id_token, :expires_in, :expires_at, :issued_at
         
     | 
| 
      
 115 
     | 
    
         
            +
                  )
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 118 
     | 
    
         
            +
                  # Serialize back to the original JSON form
         
     | 
| 
      
 119 
     | 
    
         
            +
                  #
         
     | 
| 
      
 120 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 121 
     | 
    
         
            +
                  #   JSON
         
     | 
| 
      
 122 
     | 
    
         
            +
                  def to_json
         
     | 
| 
      
 123 
     | 
    
         
            +
                    return MultiJson.dump(to_hash)
         
     | 
| 
      
 124 
     | 
    
         
            +
                  end
         
     | 
| 
      
 125 
     | 
    
         
            +
                  
         
     | 
| 
      
 126 
     | 
    
         
            +
                  def to_hash
         
     | 
| 
      
 127 
     | 
    
         
            +
                    {
         
     | 
| 
      
 128 
     | 
    
         
            +
                      self.flow => ({
         
     | 
| 
      
 129 
     | 
    
         
            +
                        'client_id' => self.client_id,
         
     | 
| 
      
 130 
     | 
    
         
            +
                        'client_secret' => self.client_secret,
         
     | 
| 
      
 131 
     | 
    
         
            +
                        'redirect_uris' => self.redirect_uris,
         
     | 
| 
      
 132 
     | 
    
         
            +
                        'javascript_origins' => self.javascript_origins,
         
     | 
| 
      
 133 
     | 
    
         
            +
                        'auth_uri' => self.authorization_uri,
         
     | 
| 
      
 134 
     | 
    
         
            +
                        'token_uri' => self.token_credential_uri,
         
     | 
| 
      
 135 
     | 
    
         
            +
                        'access_token' => self.access_token,
         
     | 
| 
      
 136 
     | 
    
         
            +
                        'refresh_token' => self.refresh_token,
         
     | 
| 
      
 137 
     | 
    
         
            +
                        'id_token' => self.id_token,
         
     | 
| 
      
 138 
     | 
    
         
            +
                        'expires_in' => self.expires_in,
         
     | 
| 
      
 139 
     | 
    
         
            +
                        'expires_at' => self.expires_at,
         
     | 
| 
      
 140 
     | 
    
         
            +
                        'issued_at' => self.issued_at
         
     | 
| 
      
 141 
     | 
    
         
            +
                      }).inject({}) do |accu, (k, v)|
         
     | 
| 
      
 142 
     | 
    
         
            +
                        # Prunes empty values from JSON output.
         
     | 
| 
      
 143 
     | 
    
         
            +
                        unless v == nil || (v.respond_to?(:empty?) && v.empty?)
         
     | 
| 
      
 144 
     | 
    
         
            +
                          accu[k] = v
         
     | 
| 
      
 145 
     | 
    
         
            +
                        end
         
     | 
| 
      
 146 
     | 
    
         
            +
                        accu
         
     | 
| 
      
 147 
     | 
    
         
            +
                      end
         
     | 
| 
      
 148 
     | 
    
         
            +
                    }
         
     | 
| 
      
 149 
     | 
    
         
            +
                  end
         
     | 
| 
      
 150 
     | 
    
         
            +
                  
         
     | 
| 
      
 151 
     | 
    
         
            +
                  def to_authorization
         
     | 
| 
      
 152 
     | 
    
         
            +
                    gem 'signet', '>= 0.4.0'
         
     | 
| 
      
 153 
     | 
    
         
            +
                    require 'signet/oauth_2/client'
         
     | 
| 
      
 154 
     | 
    
         
            +
                    # NOTE: Do not rely on this default value, as it may change
         
     | 
| 
      
 155 
     | 
    
         
            +
                    new_authorization = Signet::OAuth2::Client.new
         
     | 
| 
      
 156 
     | 
    
         
            +
                    new_authorization.client_id = self.client_id
         
     | 
| 
      
 157 
     | 
    
         
            +
                    new_authorization.client_secret = self.client_secret
         
     | 
| 
      
 158 
     | 
    
         
            +
                    new_authorization.authorization_uri = (
         
     | 
| 
      
 159 
     | 
    
         
            +
                      self.authorization_uri ||
         
     | 
| 
      
 160 
     | 
    
         
            +
                      'https://accounts.google.com/o/oauth2/auth'
         
     | 
| 
      
 161 
     | 
    
         
            +
                    )
         
     | 
| 
      
 162 
     | 
    
         
            +
                    new_authorization.token_credential_uri = (
         
     | 
| 
      
 163 
     | 
    
         
            +
                      self.token_credential_uri ||
         
     | 
| 
      
 164 
     | 
    
         
            +
                      'https://accounts.google.com/o/oauth2/token'
         
     | 
| 
      
 165 
     | 
    
         
            +
                    )
         
     | 
| 
      
 166 
     | 
    
         
            +
                    new_authorization.redirect_uri = self.redirect_uris.first
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
                    # These are supported, but unlikely.
         
     | 
| 
      
 169 
     | 
    
         
            +
                    new_authorization.access_token = self.access_token
         
     | 
| 
      
 170 
     | 
    
         
            +
                    new_authorization.refresh_token = self.refresh_token
         
     | 
| 
      
 171 
     | 
    
         
            +
                    new_authorization.id_token = self.id_token
         
     | 
| 
      
 172 
     | 
    
         
            +
                    new_authorization.expires_in = self.expires_in
         
     | 
| 
      
 173 
     | 
    
         
            +
                    new_authorization.issued_at = self.issued_at if self.issued_at
         
     | 
| 
      
 174 
     | 
    
         
            +
                    new_authorization.expires_at = self.expires_at if self.expires_at
         
     | 
| 
      
 175 
     | 
    
         
            +
                    return new_authorization
         
     | 
| 
      
 176 
     | 
    
         
            +
                  end
         
     | 
| 
      
 177 
     | 
    
         
            +
                end
         
     | 
| 
      
 178 
     | 
    
         
            +
              end
         
     | 
| 
      
 179 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright 2010 Google Inc.
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
      
 3 
     | 
    
         
            +
            # Licensed under the Apache License, Version 2.0 (the "License");
         
     | 
| 
      
 4 
     | 
    
         
            +
            # you may not use this file except in compliance with the License.
         
     | 
| 
      
 5 
     | 
    
         
            +
            # You may obtain a copy of the License at
         
     | 
| 
      
 6 
     | 
    
         
            +
            #
         
     | 
| 
      
 7 
     | 
    
         
            +
            #      http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 8 
     | 
    
         
            +
            #
         
     | 
| 
      
 9 
     | 
    
         
            +
            # Unless required by applicable law or agreed to in writing, software
         
     | 
| 
      
 10 
     | 
    
         
            +
            # distributed under the License is distributed on an "AS IS" BASIS,
         
     | 
| 
      
 11 
     | 
    
         
            +
            # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         
     | 
| 
      
 12 
     | 
    
         
            +
            # See the License for the specific language governing permissions and
         
     | 
| 
      
 13 
     | 
    
         
            +
            # limitations under the License.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            require 'google/api_client/discovery/api'
         
     | 
| 
      
 17 
     | 
    
         
            +
            require 'google/api_client/discovery/resource'
         
     | 
| 
      
 18 
     | 
    
         
            +
            require 'google/api_client/discovery/method'
         
     | 
| 
      
 19 
     | 
    
         
            +
            require 'google/api_client/discovery/schema'
         
     | 
| 
         @@ -0,0 +1,310 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright 2010 Google Inc.
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
      
 3 
     | 
    
         
            +
            # Licensed under the Apache License, Version 2.0 (the "License");
         
     | 
| 
      
 4 
     | 
    
         
            +
            # you may not use this file except in compliance with the License.
         
     | 
| 
      
 5 
     | 
    
         
            +
            # You may obtain a copy of the License at
         
     | 
| 
      
 6 
     | 
    
         
            +
            #
         
     | 
| 
      
 7 
     | 
    
         
            +
            #      http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 8 
     | 
    
         
            +
            #
         
     | 
| 
      
 9 
     | 
    
         
            +
            # Unless required by applicable law or agreed to in writing, software
         
     | 
| 
      
 10 
     | 
    
         
            +
            # distributed under the License is distributed on an "AS IS" BASIS,
         
     | 
| 
      
 11 
     | 
    
         
            +
            # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         
     | 
| 
      
 12 
     | 
    
         
            +
            # See the License for the specific language governing permissions and
         
     | 
| 
      
 13 
     | 
    
         
            +
            # limitations under the License.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            require 'addressable/uri'
         
     | 
| 
      
 17 
     | 
    
         
            +
            require 'multi_json'
         
     | 
| 
      
 18 
     | 
    
         
            +
            require 'active_support/inflector'
         
     | 
| 
      
 19 
     | 
    
         
            +
            require 'google/api_client/discovery/resource'
         
     | 
| 
      
 20 
     | 
    
         
            +
            require 'google/api_client/discovery/method'
         
     | 
| 
      
 21 
     | 
    
         
            +
            require 'google/api_client/discovery/media'
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            module Google
         
     | 
| 
      
 24 
     | 
    
         
            +
              class APIClient
         
     | 
| 
      
 25 
     | 
    
         
            +
                ##
         
     | 
| 
      
 26 
     | 
    
         
            +
                # A service that has been described by a discovery document.
         
     | 
| 
      
 27 
     | 
    
         
            +
                class API
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 30 
     | 
    
         
            +
                  # Creates a description of a particular version of a service.
         
     | 
| 
      
 31 
     | 
    
         
            +
                  #
         
     | 
| 
      
 32 
     | 
    
         
            +
                  # @param [String] document_base
         
     | 
| 
      
 33 
     | 
    
         
            +
                  #   Base URI for the discovery document.
         
     | 
| 
      
 34 
     | 
    
         
            +
                  # @param [Hash] discovery_document
         
     | 
| 
      
 35 
     | 
    
         
            +
                  #   The section of the discovery document that applies to this service
         
     | 
| 
      
 36 
     | 
    
         
            +
                  #   version.
         
     | 
| 
      
 37 
     | 
    
         
            +
                  #
         
     | 
| 
      
 38 
     | 
    
         
            +
                  # @return [Google::APIClient::API] The constructed service object.
         
     | 
| 
      
 39 
     | 
    
         
            +
                  def initialize(document_base, discovery_document)
         
     | 
| 
      
 40 
     | 
    
         
            +
                    @document_base = Addressable::URI.parse(document_base)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    @discovery_document = discovery_document
         
     | 
| 
      
 42 
     | 
    
         
            +
                    metaclass = (class << self; self; end)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    self.discovered_resources.each do |resource|
         
     | 
| 
      
 44 
     | 
    
         
            +
                      method_name = ActiveSupport::Inflector.underscore(resource.name).to_sym
         
     | 
| 
      
 45 
     | 
    
         
            +
                      if !self.respond_to?(method_name)
         
     | 
| 
      
 46 
     | 
    
         
            +
                        metaclass.send(:define_method, method_name) { resource }
         
     | 
| 
      
 47 
     | 
    
         
            +
                      end
         
     | 
| 
      
 48 
     | 
    
         
            +
                    end
         
     | 
| 
      
 49 
     | 
    
         
            +
                    self.discovered_methods.each do |method|
         
     | 
| 
      
 50 
     | 
    
         
            +
                      method_name = ActiveSupport::Inflector.underscore(method.name).to_sym
         
     | 
| 
      
 51 
     | 
    
         
            +
                      if !self.respond_to?(method_name)
         
     | 
| 
      
 52 
     | 
    
         
            +
                        metaclass.send(:define_method, method_name) { method }
         
     | 
| 
      
 53 
     | 
    
         
            +
                      end
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
                  
         
     | 
| 
      
 57 
     | 
    
         
            +
                  # @return [String] unparsed discovery document for the API
         
     | 
| 
      
 58 
     | 
    
         
            +
                  attr_reader :discovery_document
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 61 
     | 
    
         
            +
                  # Returns the id of the service.
         
     | 
| 
      
 62 
     | 
    
         
            +
                  #
         
     | 
| 
      
 63 
     | 
    
         
            +
                  # @return [String] The service id.
         
     | 
| 
      
 64 
     | 
    
         
            +
                  def id
         
     | 
| 
      
 65 
     | 
    
         
            +
                    return (
         
     | 
| 
      
 66 
     | 
    
         
            +
                      @discovery_document['id'] ||
         
     | 
| 
      
 67 
     | 
    
         
            +
                      "#{self.name}:#{self.version}"
         
     | 
| 
      
 68 
     | 
    
         
            +
                    )
         
     | 
| 
      
 69 
     | 
    
         
            +
                  end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 72 
     | 
    
         
            +
                  # Returns the identifier for the service.
         
     | 
| 
      
 73 
     | 
    
         
            +
                  #
         
     | 
| 
      
 74 
     | 
    
         
            +
                  # @return [String] The service identifier.
         
     | 
| 
      
 75 
     | 
    
         
            +
                  def name
         
     | 
| 
      
 76 
     | 
    
         
            +
                    return @discovery_document['name']
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 80 
     | 
    
         
            +
                  # Returns the version of the service.
         
     | 
| 
      
 81 
     | 
    
         
            +
                  #
         
     | 
| 
      
 82 
     | 
    
         
            +
                  # @return [String] The service version.
         
     | 
| 
      
 83 
     | 
    
         
            +
                  def version
         
     | 
| 
      
 84 
     | 
    
         
            +
                    return @discovery_document['version']
         
     | 
| 
      
 85 
     | 
    
         
            +
                  end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 88 
     | 
    
         
            +
                  # Returns a human-readable title for the API.
         
     | 
| 
      
 89 
     | 
    
         
            +
                  #
         
     | 
| 
      
 90 
     | 
    
         
            +
                  # @return [Hash] The API title.
         
     | 
| 
      
 91 
     | 
    
         
            +
                  def title
         
     | 
| 
      
 92 
     | 
    
         
            +
                    return @discovery_document['title']
         
     | 
| 
      
 93 
     | 
    
         
            +
                  end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 96 
     | 
    
         
            +
                  # Returns a human-readable description of the API.
         
     | 
| 
      
 97 
     | 
    
         
            +
                  #
         
     | 
| 
      
 98 
     | 
    
         
            +
                  # @return [Hash] The API description.
         
     | 
| 
      
 99 
     | 
    
         
            +
                  def description
         
     | 
| 
      
 100 
     | 
    
         
            +
                    return @discovery_document['description']
         
     | 
| 
      
 101 
     | 
    
         
            +
                  end
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 104 
     | 
    
         
            +
                  # Returns a URI for the API documentation.
         
     | 
| 
      
 105 
     | 
    
         
            +
                  #
         
     | 
| 
      
 106 
     | 
    
         
            +
                  # @return [Hash] The API documentation.
         
     | 
| 
      
 107 
     | 
    
         
            +
                  def documentation
         
     | 
| 
      
 108 
     | 
    
         
            +
                    return Addressable::URI.parse(@discovery_document['documentationLink'])
         
     | 
| 
      
 109 
     | 
    
         
            +
                  end
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 112 
     | 
    
         
            +
                  # Returns true if this is the preferred version of this API.
         
     | 
| 
      
 113 
     | 
    
         
            +
                  #
         
     | 
| 
      
 114 
     | 
    
         
            +
                  # @return [TrueClass, FalseClass]
         
     | 
| 
      
 115 
     | 
    
         
            +
                  #   Whether or not this is the preferred version of this API.
         
     | 
| 
      
 116 
     | 
    
         
            +
                  def preferred
         
     | 
| 
      
 117 
     | 
    
         
            +
                    return !!@discovery_document['preferred']
         
     | 
| 
      
 118 
     | 
    
         
            +
                  end
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 121 
     | 
    
         
            +
                  # Returns the list of API features.
         
     | 
| 
      
 122 
     | 
    
         
            +
                  #
         
     | 
| 
      
 123 
     | 
    
         
            +
                  # @return [Array]
         
     | 
| 
      
 124 
     | 
    
         
            +
                  #   The features supported by this API.
         
     | 
| 
      
 125 
     | 
    
         
            +
                  def features
         
     | 
| 
      
 126 
     | 
    
         
            +
                    return @discovery_document['features'] || []
         
     | 
| 
      
 127 
     | 
    
         
            +
                  end
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 130 
     | 
    
         
            +
                  # Returns the root URI for this service.
         
     | 
| 
      
 131 
     | 
    
         
            +
                  #
         
     | 
| 
      
 132 
     | 
    
         
            +
                  # @return [Addressable::URI] The root URI.
         
     | 
| 
      
 133 
     | 
    
         
            +
                  def root_uri
         
     | 
| 
      
 134 
     | 
    
         
            +
                    return @root_uri ||= (
         
     | 
| 
      
 135 
     | 
    
         
            +
                      Addressable::URI.parse(self.discovery_document['rootUrl'])
         
     | 
| 
      
 136 
     | 
    
         
            +
                    )
         
     | 
| 
      
 137 
     | 
    
         
            +
                  end
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 140 
     | 
    
         
            +
                  # Returns true if this API uses a data wrapper.
         
     | 
| 
      
 141 
     | 
    
         
            +
                  #
         
     | 
| 
      
 142 
     | 
    
         
            +
                  # @return [TrueClass, FalseClass]
         
     | 
| 
      
 143 
     | 
    
         
            +
                  #   Whether or not this API uses a data wrapper.
         
     | 
| 
      
 144 
     | 
    
         
            +
                  def data_wrapper?
         
     | 
| 
      
 145 
     | 
    
         
            +
                    return self.features.include?('dataWrapper')
         
     | 
| 
      
 146 
     | 
    
         
            +
                  end
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 149 
     | 
    
         
            +
                  # Returns the base URI for the discovery document.
         
     | 
| 
      
 150 
     | 
    
         
            +
                  #
         
     | 
| 
      
 151 
     | 
    
         
            +
                  # @return [Addressable::URI] The base URI.
         
     | 
| 
      
 152 
     | 
    
         
            +
                  attr_reader :document_base
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 155 
     | 
    
         
            +
                  # Returns the base URI for this version of the service.
         
     | 
| 
      
 156 
     | 
    
         
            +
                  #
         
     | 
| 
      
 157 
     | 
    
         
            +
                  # @return [Addressable::URI] The base URI that methods are joined to.
         
     | 
| 
      
 158 
     | 
    
         
            +
                  def method_base
         
     | 
| 
      
 159 
     | 
    
         
            +
                    if @discovery_document['basePath']
         
     | 
| 
      
 160 
     | 
    
         
            +
                      return @method_base ||= (
         
     | 
| 
      
 161 
     | 
    
         
            +
                        self.root_uri.join(Addressable::URI.parse(@discovery_document['basePath']))
         
     | 
| 
      
 162 
     | 
    
         
            +
                      ).normalize
         
     | 
| 
      
 163 
     | 
    
         
            +
                    else
         
     | 
| 
      
 164 
     | 
    
         
            +
                      return nil
         
     | 
| 
      
 165 
     | 
    
         
            +
                    end
         
     | 
| 
      
 166 
     | 
    
         
            +
                  end
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 169 
     | 
    
         
            +
                  # Updates the hierarchy of resources and methods with the new base.
         
     | 
| 
      
 170 
     | 
    
         
            +
                  #
         
     | 
| 
      
 171 
     | 
    
         
            +
                  # @param [Addressable::URI, #to_str, String] new_method_base
         
     | 
| 
      
 172 
     | 
    
         
            +
                  #   The new base URI to use for the service.
         
     | 
| 
      
 173 
     | 
    
         
            +
                  def method_base=(new_method_base)
         
     | 
| 
      
 174 
     | 
    
         
            +
                    @method_base = Addressable::URI.parse(new_method_base)
         
     | 
| 
      
 175 
     | 
    
         
            +
                    self.discovered_resources.each do |resource|
         
     | 
| 
      
 176 
     | 
    
         
            +
                      resource.method_base = @method_base
         
     | 
| 
      
 177 
     | 
    
         
            +
                    end
         
     | 
| 
      
 178 
     | 
    
         
            +
                    self.discovered_methods.each do |method|
         
     | 
| 
      
 179 
     | 
    
         
            +
                      method.method_base = @method_base
         
     | 
| 
      
 180 
     | 
    
         
            +
                    end
         
     | 
| 
      
 181 
     | 
    
         
            +
                  end
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
      
 183 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 184 
     | 
    
         
            +
                  # Returns the base URI for batch calls to this service.
         
     | 
| 
      
 185 
     | 
    
         
            +
                  #
         
     | 
| 
      
 186 
     | 
    
         
            +
                  # @return [Addressable::URI] The base URI that methods are joined to.
         
     | 
| 
      
 187 
     | 
    
         
            +
                  def batch_path
         
     | 
| 
      
 188 
     | 
    
         
            +
                    if @discovery_document['batchPath']
         
     | 
| 
      
 189 
     | 
    
         
            +
                      return @batch_path ||= (
         
     | 
| 
      
 190 
     | 
    
         
            +
                        self.document_base.join(Addressable::URI.parse('/' +
         
     | 
| 
      
 191 
     | 
    
         
            +
                            @discovery_document['batchPath']))
         
     | 
| 
      
 192 
     | 
    
         
            +
                      ).normalize
         
     | 
| 
      
 193 
     | 
    
         
            +
                    else
         
     | 
| 
      
 194 
     | 
    
         
            +
                      return nil
         
     | 
| 
      
 195 
     | 
    
         
            +
                    end
         
     | 
| 
      
 196 
     | 
    
         
            +
                  end
         
     | 
| 
      
 197 
     | 
    
         
            +
             
     | 
| 
      
 198 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 199 
     | 
    
         
            +
                  # A list of schemas available for this version of the API.
         
     | 
| 
      
 200 
     | 
    
         
            +
                  #
         
     | 
| 
      
 201 
     | 
    
         
            +
                  # @return [Hash] A list of {Google::APIClient::Schema} objects.
         
     | 
| 
      
 202 
     | 
    
         
            +
                  def schemas
         
     | 
| 
      
 203 
     | 
    
         
            +
                    return @schemas ||= (
         
     | 
| 
      
 204 
     | 
    
         
            +
                      (@discovery_document['schemas'] || []).inject({}) do |accu, (k, v)|
         
     | 
| 
      
 205 
     | 
    
         
            +
                        accu[k] = Google::APIClient::Schema.parse(self, v)
         
     | 
| 
      
 206 
     | 
    
         
            +
                        accu
         
     | 
| 
      
 207 
     | 
    
         
            +
                      end
         
     | 
| 
      
 208 
     | 
    
         
            +
                    )
         
     | 
| 
      
 209 
     | 
    
         
            +
                  end
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
      
 211 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 212 
     | 
    
         
            +
                  # Returns a schema for a kind value.
         
     | 
| 
      
 213 
     | 
    
         
            +
                  #
         
     | 
| 
      
 214 
     | 
    
         
            +
                  # @return [Google::APIClient::Schema] The associated Schema object.
         
     | 
| 
      
 215 
     | 
    
         
            +
                  def schema_for_kind(kind)
         
     | 
| 
      
 216 
     | 
    
         
            +
                    api_name, schema_name = kind.split('#', 2)
         
     | 
| 
      
 217 
     | 
    
         
            +
                    if api_name != self.name
         
     | 
| 
      
 218 
     | 
    
         
            +
                      raise ArgumentError,
         
     | 
| 
      
 219 
     | 
    
         
            +
                        "The kind does not match this API. " +
         
     | 
| 
      
 220 
     | 
    
         
            +
                        "Expected '#{self.name}', got '#{api_name}'."
         
     | 
| 
      
 221 
     | 
    
         
            +
                    end
         
     | 
| 
      
 222 
     | 
    
         
            +
                    for k, v in self.schemas
         
     | 
| 
      
 223 
     | 
    
         
            +
                      return v if k.downcase == schema_name.downcase
         
     | 
| 
      
 224 
     | 
    
         
            +
                    end
         
     | 
| 
      
 225 
     | 
    
         
            +
                    return nil
         
     | 
| 
      
 226 
     | 
    
         
            +
                  end
         
     | 
| 
      
 227 
     | 
    
         
            +
             
     | 
| 
      
 228 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 229 
     | 
    
         
            +
                  # A list of resources available at the root level of this version of the
         
     | 
| 
      
 230 
     | 
    
         
            +
                  # API.
         
     | 
| 
      
 231 
     | 
    
         
            +
                  #
         
     | 
| 
      
 232 
     | 
    
         
            +
                  # @return [Array] A list of {Google::APIClient::Resource} objects.
         
     | 
| 
      
 233 
     | 
    
         
            +
                  def discovered_resources
         
     | 
| 
      
 234 
     | 
    
         
            +
                    return @discovered_resources ||= (
         
     | 
| 
      
 235 
     | 
    
         
            +
                      (@discovery_document['resources'] || []).inject([]) do |accu, (k, v)|
         
     | 
| 
      
 236 
     | 
    
         
            +
                        accu << Google::APIClient::Resource.new(
         
     | 
| 
      
 237 
     | 
    
         
            +
                          self, self.method_base, k, v
         
     | 
| 
      
 238 
     | 
    
         
            +
                        )
         
     | 
| 
      
 239 
     | 
    
         
            +
                        accu
         
     | 
| 
      
 240 
     | 
    
         
            +
                      end
         
     | 
| 
      
 241 
     | 
    
         
            +
                    )
         
     | 
| 
      
 242 
     | 
    
         
            +
                  end
         
     | 
| 
      
 243 
     | 
    
         
            +
             
     | 
| 
      
 244 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 245 
     | 
    
         
            +
                  # A list of methods available at the root level of this version of the
         
     | 
| 
      
 246 
     | 
    
         
            +
                  # API.
         
     | 
| 
      
 247 
     | 
    
         
            +
                  #
         
     | 
| 
      
 248 
     | 
    
         
            +
                  # @return [Array] A list of {Google::APIClient::Method} objects.
         
     | 
| 
      
 249 
     | 
    
         
            +
                  def discovered_methods
         
     | 
| 
      
 250 
     | 
    
         
            +
                    return @discovered_methods ||= (
         
     | 
| 
      
 251 
     | 
    
         
            +
                      (@discovery_document['methods'] || []).inject([]) do |accu, (k, v)|
         
     | 
| 
      
 252 
     | 
    
         
            +
                        accu << Google::APIClient::Method.new(self, self.method_base, k, v)
         
     | 
| 
      
 253 
     | 
    
         
            +
                        accu
         
     | 
| 
      
 254 
     | 
    
         
            +
                      end
         
     | 
| 
      
 255 
     | 
    
         
            +
                    )
         
     | 
| 
      
 256 
     | 
    
         
            +
                  end
         
     | 
| 
      
 257 
     | 
    
         
            +
             
     | 
| 
      
 258 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 259 
     | 
    
         
            +
                  # Allows deep inspection of the discovery document.
         
     | 
| 
      
 260 
     | 
    
         
            +
                  def [](key)
         
     | 
| 
      
 261 
     | 
    
         
            +
                    return @discovery_document[key]
         
     | 
| 
      
 262 
     | 
    
         
            +
                  end
         
     | 
| 
      
 263 
     | 
    
         
            +
             
     | 
| 
      
 264 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 265 
     | 
    
         
            +
                  # Converts the service to a flat mapping of RPC names and method objects.
         
     | 
| 
      
 266 
     | 
    
         
            +
                  #
         
     | 
| 
      
 267 
     | 
    
         
            +
                  # @return [Hash] All methods available on the service.
         
     | 
| 
      
 268 
     | 
    
         
            +
                  #
         
     | 
| 
      
 269 
     | 
    
         
            +
                  # @example
         
     | 
| 
      
 270 
     | 
    
         
            +
                  #   # Discover available methods
         
     | 
| 
      
 271 
     | 
    
         
            +
                  #   method_names = client.discovered_api('buzz').to_h.keys
         
     | 
| 
      
 272 
     | 
    
         
            +
                  def to_h
         
     | 
| 
      
 273 
     | 
    
         
            +
                    return @hash ||= (begin
         
     | 
| 
      
 274 
     | 
    
         
            +
                      methods_hash = {}
         
     | 
| 
      
 275 
     | 
    
         
            +
                      self.discovered_methods.each do |method|
         
     | 
| 
      
 276 
     | 
    
         
            +
                        methods_hash[method.id] = method
         
     | 
| 
      
 277 
     | 
    
         
            +
                      end
         
     | 
| 
      
 278 
     | 
    
         
            +
                      self.discovered_resources.each do |resource|
         
     | 
| 
      
 279 
     | 
    
         
            +
                        methods_hash.merge!(resource.to_h)
         
     | 
| 
      
 280 
     | 
    
         
            +
                      end
         
     | 
| 
      
 281 
     | 
    
         
            +
                      methods_hash
         
     | 
| 
      
 282 
     | 
    
         
            +
                    end)
         
     | 
| 
      
 283 
     | 
    
         
            +
                  end
         
     | 
| 
      
 284 
     | 
    
         
            +
             
     | 
| 
      
 285 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 286 
     | 
    
         
            +
                  # Returns a <code>String</code> representation of the service's state.
         
     | 
| 
      
 287 
     | 
    
         
            +
                  #
         
     | 
| 
      
 288 
     | 
    
         
            +
                  # @return [String] The service's state, as a <code>String</code>.
         
     | 
| 
      
 289 
     | 
    
         
            +
                  def inspect
         
     | 
| 
      
 290 
     | 
    
         
            +
                    sprintf(
         
     | 
| 
      
 291 
     | 
    
         
            +
                      "#<%s:%#0x ID:%s>", self.class.to_s, self.object_id, self.id
         
     | 
| 
      
 292 
     | 
    
         
            +
                    )
         
     | 
| 
      
 293 
     | 
    
         
            +
                  end
         
     | 
| 
      
 294 
     | 
    
         
            +
                  
         
     | 
| 
      
 295 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 296 
     | 
    
         
            +
                  # Marshalling support - serialize the API to a string (doc base + original 
         
     | 
| 
      
 297 
     | 
    
         
            +
                  # discovery document).
         
     | 
| 
      
 298 
     | 
    
         
            +
                  def _dump(level)
         
     | 
| 
      
 299 
     | 
    
         
            +
                    MultiJson.dump([@document_base.to_s, @discovery_document])
         
     | 
| 
      
 300 
     | 
    
         
            +
                  end
         
     | 
| 
      
 301 
     | 
    
         
            +
                  
         
     | 
| 
      
 302 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 303 
     | 
    
         
            +
                  # Marshalling support - Restore an API instance from serialized form
         
     | 
| 
      
 304 
     | 
    
         
            +
                  def self._load(obj)
         
     | 
| 
      
 305 
     | 
    
         
            +
                    new(*MultiJson.load(obj)) 
         
     | 
| 
      
 306 
     | 
    
         
            +
                  end
         
     | 
| 
      
 307 
     | 
    
         
            +
             
     | 
| 
      
 308 
     | 
    
         
            +
                end
         
     | 
| 
      
 309 
     | 
    
         
            +
              end
         
     | 
| 
      
 310 
     | 
    
         
            +
            end
         
     |