module Signaling::Base::Http::ClassMethods

Public Instance Methods

define_action(action_name, options) click to toggle source
# File lib/signaling/base/http.rb, line 29
def define_action(action_name, options)
  unless options[:method] && options[:path]
    raise ArgumentError, ':method and :path options are required'
  end

  actions = self._defined_actions || {}
  self._defined_actions = actions.merge(action_name.to_sym => options)
end
request(action, params = {}, &block) click to toggle source
# File lib/signaling/base/http.rb, line 17
def request(action, params = {}, &block)
  params = params.with_indifferent_access

  http_method = http_method_for(action)
  path_params, body_params = split_params(action, params)
  path = path_for(action, path_params)

  response = connection.send(http_method, path, body_params)

  block ? block.call(response.body) : response.body
end
to_params(value, set_param_names_first = false) click to toggle source

convert value to params-friendly hash/array this also sets parameter names for Signaling models

# File lib/signaling/base/http.rb, line 40
def to_params(value, set_param_names_first = false)
  case value
  when Signaling::Base
    value.class.set_param_names(value.to_params)
  when Array
    value.map {|e| to_params(e, set_param_names_first) }
  when Hash
    value = set_param_names(value) if set_param_names_first
    Hash[value.map {|k,v| [k, to_params(v)]}]
  else
    value
  end
end

Protected Instance Methods

defined_action(action) click to toggle source
# File lib/signaling/base/http.rb, line 56
def defined_action(action)
  _defined_actions.try(:[], action) or raise(UndefinedAction, action)
end
http_method_for(action) click to toggle source
# File lib/signaling/base/http.rb, line 85
def http_method_for(action)
  method = _defined_actions.try(:[], action).try(:[], :method)

  method || raise(UndefinedAction, action)
end
path_for(action, parameters = {}) click to toggle source
# File lib/signaling/base/http.rb, line 73
def path_for(action, parameters = {})
  path = defined_action(action)[:path]

  parameters = parameters.merge(route_key: route_key)

  path_parameters(path).each do |parameter|
    path = path.gsub(":#{parameter}", parameters[parameter].to_s)
  end

  path
end
path_parameters(path) click to toggle source
# File lib/signaling/base/http.rb, line 69
def path_parameters(path)
  path.scan(/:([^\/.]*)/).flatten
end
route_key() click to toggle source
# File lib/signaling/base/http.rb, line 91
def route_key
  ActiveModel::Naming.route_key(self).pluralize
end
set_param_names(params) click to toggle source

changes attribtue names to param names (defined by “:param_name”)

# File lib/signaling/base/http.rb, line 96
def set_param_names(params)
  HashWithIndifferentAccess.new.tap do |result|
    params.each do |k, v|
      attribute = attribute_set[k.to_sym]
      name = attribute.try(:options).try(:[], :param_name) || k
      result[name] = v
    end
  end
end
split_params(action, params) click to toggle source
# File lib/signaling/base/http.rb, line 60
def split_params(action, params)
  path = defined_action(action)[:path]

  path_params = params.slice(*path_parameters(path))
  body_params = params.except(*path_parameters(path))

  return path_params, body_params
end