module GridRest::GridRestExtensions

Public Instance Methods

add_parameters_to_uri(uri, params) click to toggle source
# File lib/grid_rest.rb, line 244
def add_parameters_to_uri(uri, params)
  uri << '?' unless uri.include?('?')
  uri << '&' unless ['?', '&'].include?(uri.last)
  uri_params = params.reject{|k, v| RESERVED_REQUEST_PARAMETERS.include?(k.to_s)}
  uri << uri_params.map{|k, v| URI.encode("#{k}=#{v}")}.join('&')
  uri_params.each{|k, v| params.delete(k)} # Remove added get parameters from the header params
  uri
end
additional_grid_rest_parameters() click to toggle source

Getter of additional parameters. Contains defaults and namespace specific versions

# File lib/grid_rest.rb, line 136
def additional_grid_rest_parameters
  GridRest.additional_parameters
end
current_namespace() click to toggle source

This will get the current namespace or nil during grid_rest_request processing

# File lib/grid_rest.rb, line 100
def current_namespace
  @current_namespace
end
default_grid_rest_parameters(params, request_types = :global) click to toggle source

Global setter valid for all request/namespaces

# File lib/grid_rest.rb, line 105
def default_grid_rest_parameters(params, request_types = :global)
  set_namespaced_default_grid_rest_parameters(:default, params, request_types)
end
generate_url(url, rparams = {}) click to toggle source
# File lib/grid_rest.rb, line 253
def generate_url(url, rparams = {})
  host = GridRest.grid_config.namespaces[rparams[:grid_rest_namespace]].try('[]', 'host') || GridRest.grid_config['host']
  port = GridRest.grid_config.namespaces[rparams[:grid_rest_namespace]].try('[]', 'port') || GridRest.grid_config['port'] || 80
  url_prefix = GridRest.grid_config.namespaces[rparams[:grid_rest_namespace]].try('[]', 'url_prefix') || GridRest.grid_config['url_prefix'] || ''
  raise "No host specified for GridRest" unless host
  gurl = File.join( "#{host}:#{port}", url_prefix, URI.encode(url) )
  gurl = "http://#{gurl}" unless gurl =~ /^http/
  gurl
end
get_accept_header(f) click to toggle source
# File lib/grid_rest.rb, line 277
def get_accept_header(f)
  case f
  when :json then :json #'application/json'
  when :xml then :xml #'application/xml'
  else :json #'application/json'
  end
end
get_additional_grid_rest_parameters() click to toggle source

Return an array of additional parameters. This request is namespace aware It will return an array given the additional default parameters for:

ALL, GET, POST, PUT and DELETE

requests in that order

# File lib/grid_rest.rb, line 114
def get_additional_grid_rest_parameters
  globals = get_request_specific_additional_grid_rest_parameters(:global)
  return [
    globals,
    globals.merge(get_request_specific_additional_grid_rest_parameters(:get)),
    globals.merge(get_request_specific_additional_grid_rest_parameters(:post)),
    globals.merge(get_request_specific_additional_grid_rest_parameters(:put)),
    globals.merge(get_request_specific_additional_grid_rest_parameters(:delete))
  ]
end
get_request_specific_additional_grid_rest_parameters(request = :global) click to toggle source

Get all the global parameters. The defaults, extended/overwritten by the namespace specific ones

# File lib/grid_rest.rb, line 127
def get_request_specific_additional_grid_rest_parameters(request = :global)
  if current_namespace
    additional_grid_rest_parameters[:default][request].merge(additional_grid_rest_parameters[current_namespace.to_sym][request] || {})
  else
    additional_grid_rest_parameters[:default][request]
  end
end
grid_rest?(rparams = {}) click to toggle source

This one is on the deprication list

# File lib/grid_rest.rb, line 92
def grid_rest?(rparams = {})
  ns = rparams[:grid_rest_namespace].present? ? "grid_rest_#{rparams[:grid_rest_namespace]}" : 'grid_rest'
  raise "APP_CONFIG not available, make sure that config/config.yml and config/initializers/load_config.rb are available" unless defined?(APP_CONFIG)
  raise "Namespace #{ns} not available in config/config.yml" unless APP_CONFIG[ns]
  @grid_rest_active ||= Net::HTTP.new(APP_CONFIG[ns]['host'], APP_CONFIG[ns]['port']).start rescue nil
end
grid_rest_delete(url, rparams = {}) click to toggle source
# File lib/grid_rest.rb, line 271
def grid_rest_delete(url, rparams = {})
  grid_rest_request(:delete, url, rparams)
end
grid_rest_get(url, rparams = {}) click to toggle source
# File lib/grid_rest.rb, line 263
def grid_rest_get(url, rparams = {})
  return grid_rest_request(:get, url, rparams)
end
grid_rest_log(method, url, rparams = {}, emsg = "") click to toggle source

Wrapper for grid_rest_log_message to write a log message in a consitant manner given the request parameters

# File lib/grid_rest.rb, line 149
def grid_rest_log(method, url, rparams = {}, emsg = "")
  if current_namespace
    return unless GridRest.grid_config.namespaces[current_namespace]['logging']
  else
    return unless GridRest.grid_config['logging']
  end
  grid_rest_log_message(rparams.any? ? "#{Time.now.to_s(:db)} #{method.to_s.upcase} #{url} with #{rparams.inspect} #{emsg}" : "#{Time.now.to_s(:db)} #{method.to_s.upcase} #{url} #{emsg}")
end
grid_rest_log_message(msg) click to toggle source

Write msg to the log file. Should only be called from grid_rest_log unless you know what you are doing

# File lib/grid_rest.rb, line 159
def grid_rest_log_message(msg)
  GridRest.log_file ||= File.open(File.join(Rails.root, 'log', "#{Rails.env}_grid_rest.log"), 'a+')
  GridRest.log_file.puts msg
  GridRest.log_file.flush unless Rails.env == 'production'
end
grid_rest_post(url, rparams={}) click to toggle source
# File lib/grid_rest.rb, line 274
def grid_rest_post(url, rparams={})
  return grid_rest_request(:post, url, rparams)
end
grid_rest_put(url, rparams = {}) click to toggle source
# File lib/grid_rest.rb, line 267
def grid_rest_put(url, rparams = {})
  grid_rest_request(:put, url, rparams)
end
grid_rest_request(method, relative_url, rparams = {}) click to toggle source
# File lib/grid_rest.rb, line 165
def grid_rest_request(method, relative_url, rparams = {})
  #return DummyResponse.new # test return
  rest_url = generate_url(relative_url, rparams) 
  #return Error.new('unavailable', :url => rest_url) unless grid_rest?(rparams)
  # Specify defaults per method for format
  format = rparams.delete(:format) || {:get => :json, :post => :json, :put => :json}[method]
  accept = get_accept_header(format)
  @current_namespace = rparams.delete(:grid_rest_namespace) # Remove this setting from request parameters
  additional_get_parameters, additional_post_parameters, additional_put_parameters, additional_delete_parameters = get_additional_grid_rest_parameters
  begin
    r = benchmark "Fetching #{method.to_s.upcase} #{relative_url} #{rparams.inspect}", :level => :debug do
      case method
        when :get then RestClient.get rest_url, :params => rparams.update(additional_get_parameters), :accept => accept
        when :post then
          if rparams[:json_data]
            rparams[:json_data] = rparams[:json_data].merge(additional_post_parameters).to_json if rparams[:json_data].is_a?(Hash)
            rparams[:json_data] = rparams[:json_data].to_json if rparams[:json_data].is_a?(Array)
            RestClient.post rest_url, rparams[:json_data], :content_type => :json, :accept => :json
          elsif rparams[:xml_data]
            rparams[:xml_data] = rparams[:xml_data].merge(additional_post_parameters).to_xml if rparams[:xml_data].is_a?(Hash)
            rparams[:xml_data] = rparams[:xml_data].to_xml if rparams[:xml_data].is_a?(Array)
            RestClient.post rest_url, rparams[:xml_data], :content_type => :xml, :accept => :xml
          elsif rparams[:binary]
            RestClient.post rest_url, rparams[:binary], :content_type => 'binary/octet-stream'
          else
            rparams[:headers] ||= {}
            rparams[:headers][:accept] = accept
            rparams[:multipart] = true
            RestClient.post rest_url, rparams.update(additional_post_parameters)
          end
        when :put then
          if rparams[:json_data]
            rparams[:json_data] = rparams[:json_data].merge(additional_put_parameters).to_json if rparams[:json_data].is_a?(Hash)
            rparams[:json_data] = rparams[:json_data].to_json if rparams[:json_data].is_a?(Array)
            RestClient.put rest_url, rparams[:json_data], :content_type => :json, :accept => :json
          elsif rparams[:xml_data]
            rparams[:xml_data] = rparams[:xml_data].merge(additional_put_parameters).to_xml if rparams[:xml_data].is_a?(Hash)
            rparams[:xml_data] = rparams[:xml_data].to_xml if rparams[:xml_data].is_a?(Array)
            RestClient.put rest_url, rparams[:xml_data], :content_type => :xml, :accept => :xml
          elsif rparams[:binary]
            RestClient.put rest_url, rparams[:binary], :content_type => 'binary/octet-stream'
          else
            rparams[:headers] ||= {}
            rparams[:headers][:accept] = accept
            rparams[:multipart] = true
            RestClient.put rest_url, rparams.update(additional_put_parameters)
          end
        when :delete then
          rparams[:headers] ||= {}
          rparams[:headers][:accept] = accept
          new_uri = add_parameters_to_uri(rest_url, rparams.update(additional_delete_parameters))
          RestClient.delete(new_uri, rparams)
        else
          raise "No proper method (#{method}) for a grid_rest_request call"
        end
      end
    grid_rest_log method, rest_url, rparams, "response code: #{r.code}"
    if format == :json
      #r = benchmark("decoding response JSON", :level => :debug ){ ActiveSupport::JSON.decode(r.body) rescue r } # Slow
      r = benchmark("decoding response JSON", :level => :debug ){ JSON.parse(r.body) rescue r }
    end
    # Singleton class extensions
    r = "" if r == false # RestClient problem giving false on empty 204
    def r.valid?
      true
    end
  rescue RestClient::ResourceNotFound => e
    r = Error.new(e, :url => rest_url, :method => method)
    grid_rest_log method, rest_url, rparams, "resource not found response"
  rescue Errno::ECONNREFUSED => e
    r = Error.new(e, :url => rest_url, :method => method)
    grid_rest_log method, rest_url, rparams, "connection refused response"
  rescue => e
    r = Error.new e, :url => rest_url, :method => method 
    grid_rest_log method, rest_url, rparams, "error in request"
  end
  r
end
logger() click to toggle source
# File lib/grid_rest.rb, line 87
def logger
  Rails.logger
end
set_default_grid_rest_parameters(params, request_types = :global)
set_namespaced_default_grid_rest_parameters(ns, params, request_types = :global) click to toggle source
# File lib/grid_rest.rb, line 140
def set_namespaced_default_grid_rest_parameters(ns, params, request_types = :global)
  additional_grid_rest_parameters[ns] ||= {}
  for request_type in Array.wrap(request_types).map(&:to_sym)
    additional_grid_rest_parameters[ns][request_type] ||= {}
    additional_grid_rest_parameters[ns][request_type].update(params)
  end
end