class Racli::CLI

Public Class Methods

new(config:, rcfile:) click to toggle source
# File lib/racli/cli.rb, line 11
def initialize(config:, rcfile:)
  config_ruby_string = File.read(config)
  eval_string = "::Racli::Rack.new { #{config_ruby_string} }.to_app"
  @rackapp = TOPLEVEL_BINDING.eval eval_string, '(racli)', 0
  @default_handler = Racli::Handlers::DefaultHandler.new(self)
  @handlers = []
  @aliases = {}
  @default_headers = {}

  eval(File.read(rcfile)) if File.exist?(rcfile)
end

Public Instance Methods

add_alias(alias_name, method = 'GET', path = '/', headers = {}) click to toggle source
# File lib/racli/cli.rb, line 51
def add_alias(alias_name, method = 'GET', path = '/', headers = {})
  @aliases[alias_name] = { method: method, path: path, headers: headers }
end
add_handler(handler_klass) click to toggle source
# File lib/racli/cli.rb, line 46
def add_handler(handler_klass)
  handler = handler_klass.new(self)
  @handlers.push handler
end
call(method:, path:, params:, headers: @default_headers) click to toggle source
# File lib/racli/cli.rb, line 23
def call(method:, path:, params:, headers: @default_headers)
  if @aliases.include?(method.to_sym)
    alias_setting = @aliases[method.to_sym]
    method = alias_setting[:method]
    path = alias_setting[:path]
    headers.merge!(alias_setting[:headers])
  end

  request_params = request_params(
    method: method,
    path: path,
    params: params,
    headers: headers
  )
  status, headers, body = @rackapp.call(request_params)
  handle_response(
    status: status,
    headers: headers,
    body: body,
    original_args: { method: method, path: path, params: params }
  )
end
default_headers(headers) click to toggle source
# File lib/racli/cli.rb, line 55
def default_headers(headers)
  @default_headers = headers
end

Private Instance Methods

handle_response(status:, headers:, body:, original_args:) click to toggle source
# File lib/racli/cli.rb, line 61
def handle_response(status:, headers:, body:, original_args:)
  catch(:abort) do
    response_handlers = @handlers + [@default_handler]
    response_handlers.each do |handler|
      status, headers, body = handler.call(status, headers, body, original_args)
    end
  end
end
request_params(method:, path:, params:, headers:) click to toggle source
# File lib/racli/cli.rb, line 70
def request_params(method:, path:, params:, headers:)
  query_string = to_query_string(params)
  request_params = {
    'PATH_INFO' => path || '/',
    'REQUEST_METHOD' => method || 'GET'
  }.merge(headers)

  if method == 'GET'
    request_params['QUERY_STRING'] = query_string
    request_params['rack.input'] = StringIO.new('')
  else
    request_params['QUERY_STRING'] = ''
    request_params['rack.input'] = StringIO.new(query_string)
  end
  request_params
end
to_query_string(params) click to toggle source
# File lib/racli/cli.rb, line 87
def to_query_string(params)
  params.map { |k, v| "#{k}=#{CGI.escape(v)}" }.join('&')
end