class Bubbles::Configuration
The configuration of the Bubbles
rest client.
Use this class if you want to retrieve configuration values set during initialization.
Public Class Methods
# File lib/bubbles/config.rb, line 41 def initialize @environments = Hash.new @endpoints = Hash.new end
Public Instance Methods
Retrieve the list of +Endpoint+s configured in this Configuration
object.
@return {Array} An Array of {Endpoint}s.
# File lib/bubbles/config.rb, line 128 def endpoints @endpoints end
Add all {Endpoint} objects within this {Configuration} instance.
{Endpoint} objects are defined using two required parameters: type and location, and three optional parameters: authenticated, api_key_required and name.
- method: Indicates the HTTP method used to access the endpoint. Must be one of {Endpoint::METHODS}. - location: Indicates the path at which the {Endpoint} can be accessed on the host environment. - authenticated: (Optional) A true or false value indicating whether the {Endpoint} requires an authorization token to access it. Defaults to false. - api_key_required: (Optional) A true or false value indicating whether the {Endpoint} requires a API key to access it. Defaults to false. - name: (Optional): A +String+ indicating the name of the method to add. If not provided, the method name will be the same as the +location+.
# File lib/bubbles/config.rb, line 146 def endpoints=(endpoints) new_endpoints = Hash.new endpoints.each do |ep| endpoint_object = Endpoint.new ep[:method], ep[:location].to_s, ep[:authenticated], ep[:api_key_required], ep[:name], ep[:return_type], ep[:encode_authorization], ep[:headers] new_endpoints[endpoint_object.get_key_string] = endpoint_object end @endpoints = new_endpoints # Define all of the endpoints as methods on RestEnvironment @endpoints.values.each do |endpoint| if endpoint.name != nil endpoint_name_as_sym = endpoint.name.to_sym else endpoint_name_as_sym = endpoint.get_location_string.to_sym end if Bubbles::RestEnvironment.instance_methods(false).include?(endpoint_name_as_sym) Bubbles::RestEnvironment.class_exec do remove_method endpoint_name_as_sym end end if endpoint.method == :get if endpoint.authenticated? Bubbles::RestEnvironment.class_exec do if endpoint.has_uri_params? define_method(endpoint_name_as_sym) do |auth_token, uri_params| RestClientResources.execute_get_authenticated self, endpoint, auth_token, uri_params, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end else define_method(endpoint_name_as_sym) do |auth_token| RestClientResources.execute_get_authenticated self, endpoint, auth_token, {}, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end else Bubbles::RestEnvironment.class_exec do if endpoint.has_uri_params? define_method(endpoint_name_as_sym) do |uri_params| RestClientResources.execute_get_unauthenticated self, endpoint, uri_params, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end else define_method(endpoint_name_as_sym) do RestClientResources.execute_get_unauthenticated self, endpoint, {}, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end end elsif endpoint.method == :post if endpoint.authenticated? Bubbles::RestEnvironment.class_exec do define_method(endpoint_name_as_sym) do |auth_token, data| RestClientResources.execute_post_authenticated self, endpoint, auth_token, data, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end else Bubbles::RestEnvironment.class_exec do define_method(endpoint_name_as_sym) do |data| composite_headers = endpoint.additional_headers if endpoint.encode_authorization_header? auth_value = RestClientResources.get_encoded_authorization(endpoint, data) composite_headers = RestClientResources.build_composite_headers(endpoint.additional_headers, { Authorization: 'Basic ' + Base64.strict_encode64(auth_value) }) end RestClientResources.execute_post_unauthenticated self, endpoint, data, composite_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end elsif endpoint.method == :delete if endpoint.has_uri_params? if endpoint.authenticated? Bubbles::RestEnvironment.class_exec do define_method(endpoint_name_as_sym) do |auth_token, uri_params| RestClientResources.execute_delete_authenticated self, endpoint, auth_token, uri_params, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end else Bubbles::RestEnvironment.class_exec do define_method(endpoint_name_as_sym) do |uri_params| RestClientResources.execute_delete_unauthenticated self, endpoint, uri_params, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end else # XXX_jwir3: While MDN states that DELETE requests with a body are allowed, it seems that a number of # documentation sites discourage its use. Thus, it's possible that, depending on the server API # framework, the DELETE request could be rejected. In addition, RestClient doesn't seem to support DELETE # requests with a body, so we're a bit stuck on this one, even if we wanted to support it. raise 'DELETE requests without URI parameters are not allowed' end elsif endpoint.method == :patch if endpoint.authenticated? Bubbles::RestEnvironment.class_exec do if endpoint.has_uri_params? define_method(endpoint_name_as_sym) do |auth_token, uri_params, data| RestClientResources.execute_patch_authenticated self, endpoint, auth_token, uri_params, data, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end else define_method(endpoint_name_as_sym) do |auth_token, data| RestClientResources.execute_patch_authenticated self, endpoint, auth_token, {}, data, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end else Bubbles::RestEnvironment.class_exec do if endpoint.has_uri_params? define_method(endpoint_name_as_sym) do |uri_params, data| RestClientResources.execute_patch_unauthenticated self, endpoint, uri_params, data, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end else define_method(endpoint_name_as_sym) do |data| RestClientResources.execute_patch_unauthenticated self, endpoint, {}, data, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end end elsif endpoint.method == :put if endpoint.authenticated? Bubbles::RestEnvironment.class_exec do if endpoint.has_uri_params? define_method(endpoint_name_as_sym) do |auth_token, uri_params, data| RestClientResources.execute_put_authenticated self, endpoint, auth_token, uri_params, data, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end else define_method(endpoint_name_as_sym) do |auth_token, data| RestClientResources.execute_put_authenticated self, endpoint, auth_token, {}, data, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end else Bubbles::RestEnvironment.class_exec do if endpoint.has_uri_params? define_method(endpoint_name_as_sym) do |uri_params, data| RestClientResources.execute_put_unauthenticated self, endpoint, uri_params, data, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end else define_method(endpoint_name_as_sym) do |data| RestClientResources.execute_put_unauthenticated self, endpoint, {}, data, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end end elsif endpoint.method == :head if endpoint.authenticated? Bubbles::RestEnvironment.class_exec do if endpoint.has_uri_params? define_method(endpoint_name_as_sym) do |auth_token, uri_params| RestClientResources.execute_head_authenticated self, endpoint, auth_token, uri_params, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end else define_method(endpoint_name_as_sym) do |auth_token| RestClientResources.execute_head_authenticated self, endpoint, auth_token, {}, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end else Bubbles::RestEnvironment.class_exec do if endpoint.has_uri_params? define_method(endpoint_name_as_sym) do |uri_params| RestClientResources.execute_head_unauthenticated self, endpoint, uri_params, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end else define_method(endpoint_name_as_sym) do RestClientResources.execute_head_unauthenticated self, endpoint, {}, endpoint.additional_headers, self.get_api_key_if_needed(endpoint), self.api_key_name end end end end end end end
Retrieve the {RestEnvironment} object defined as part of this Configuration
having a specified name.
@param [String] environment_name The name of the {RestEnvironment} to retrieve.
The environment_name
is nil
by default, which will return the default configuration, if only one exists.
@return [RestEnvironment] A new RestEnvironment
having the configuration that was created with key
+environment_name+. Note that +RestEnvironment+s are essentially immutable once they are created, so an existing object will _never_ be returned.
# File lib/bubbles/config.rb, line 57 def environment(environment_name = nil) if environment_name.nil? if @environments.length > 1 raise 'You must specify an environment_name parameter because more than one environment is defined' end env_hash = @environments[nil] else env_hash = @environments[environment_name] end if env_hash.nil? if environment_name.nil? raise 'No default environment specified' end raise 'No environment specified having name {}', environment_name end RestEnvironment.new(env_hash[:scheme], env_hash[:host], env_hash[:port], env_hash[:api_key], env_hash[:api_key_name]) end
Set the environments that can be used.
@param [Array] environments The environments, as an array with each entry a Hash
.
One or more environments may be specified, but if more than one environment is specified, it is required that each environment have a :environment_name:
parameter to differentiate it from other environments.
@example In app/config/environments/staging.rb:
Bubbles.configure do |config| config.environments = [{ :scheme => 'https', :host => 'stage.api.somehost.com', :port => '443', :api_key => 'something', :api_key_name => 'X-API-Key' # Optional }] end
# File lib/bubbles/config.rb, line 99 def environments=(environments) default = nil environments.each do |environment| if environments.length > 1 && environment[:environment_name].nil? message = 'More than one environment was specified and at least one of the environments does not have an ' \ ':environment_name field. Verify all environments have an :environment_name.' raise message end @environments = {} env_api_key = 'X-API-Key' env_api_key = environment[:api_key_name] if environment.key? :api_key_name @environments[environment[:environment_name]] = { scheme: environment[:scheme], host: environment[:host], port: environment[:port], api_key: environment[:api_key], api_key_name: env_api_key } end end