module Sinatra::Browse

Public Class Methods

format(f, browse_routes) click to toggle source
# File lib/sinatra/browse/format.rb, line 6
def self.format(f, browse_routes)
  case f
  when "html"
    ErbTemplate.new(browse_routes, "html.erb")
  when "json"
    JSON.new(browse_routes)
  when "yaml", "yml"
    YAML.new(browse_routes)
  when "markdown"
    ErbTemplate.new(browse_routes, "markdown.erb")
  end
end
registered(app) click to toggle source
# File lib/sinatra/browse.rb, line 93
def self.registered(app)
  @app = app

  app.enable :remove_undefined_parameters
  app.set allowed_undefined_parameters: []

  app.disable :show_head_routes

  app.class_eval {
    def _default_on_error(error_hash)
      halt 400, {
        error: "parameter validation failed",
        parameter: error_hash[:parameter],
        value: error_hash[:value],
        reason: error_hash[:reason]
      }.to_json
    end
  }

  app.default_on_error { |error_hash| _default_on_error(error_hash) }

  app.before do
    browse_route = app.browse_routes_for(request.request_method, request.path_info)

    if browse_route
      if settings.remove_undefined_parameters
        browse_route.delete_undefined(params, settings.allowed_undefined_parameters)
      end

      validation_successful, error_hash = browse_route.process(params)

      unless validation_successful
        if error_hash[:on_error].respond_to?(:to_proc)
          error_proc = error_hash.delete(:on_error).to_proc
          instance_exec error_hash, &error_proc
        else
          instance_exec error_hash, &app.default_on_error
        end
      end

    end
  end

  app.describe "Displays this browsable API."
  app.param :format, :String, in: ["html", "json", "yaml", "yml"], default: "html"
  app.get '/browse' do
    Sinatra::Browse.format(params["format"], app.browse_routes).generate
  end
end
route_added(verb, path, block) click to toggle source
# File lib/sinatra/browse.rb, line 143
def self.route_added(verb, path, block)
  return if verb == "HEAD" && !@app.settings.show_head_routes
  @app.create_browse_route(verb, path)
  @app.reset_temp_params
  @app.desc ""
end

Public Instance Methods

_default_on_error(error_hash) click to toggle source
# File lib/sinatra/browse.rb, line 102
def _default_on_error(error_hash)
  halt 400, {
    error: "parameter validation failed",
    parameter: error_hash[:parameter],
    value: error_hash[:value],
    reason: error_hash[:reason]
  }.to_json
end
browse_description() click to toggle source
# File lib/sinatra/browse.rb, line 67
def browse_description
  @_browse_description ||= ""
end
browse_routes() click to toggle source
# File lib/sinatra/browse.rb, line 63
def browse_routes
  @_browse_routes ||= {}
end
browse_routes_for(request_method, path_info) click to toggle source
# File lib/sinatra/browse.rb, line 71
def browse_routes_for(request_method, path_info)
  browse_routes.values.find { |v| v.matches?(request_method, path_info) }
end
create_browse_route(request_method, path_info, description = browse_description, new_params = temp_browse_params) click to toggle source
# File lib/sinatra/browse.rb, line 75
def create_browse_route(request_method,
                        path_info,
                        description = browse_description,
                        new_params = temp_browse_params)

  new_route = Route.new(request_method,
                        path_info,
                        browse_description,
                        new_params)

  browse_routes[new_route.name] = new_route
end
default_on_error(&blk) click to toggle source
# File lib/sinatra/browse.rb, line 88
def default_on_error(&blk)
  @default_on_error = blk if block_given?
  @default_on_error
end
desc(description)
Alias for: describe
describe(description) click to toggle source
# File lib/sinatra/browse.rb, line 47
def describe(description)
  @_browse_description = description
end
Also aliased as: desc
param(name, type, options = {})
Alias for: parameter
param_options(parameter, options)
Alias for: parameter_options
parameter(name, type, options = {}) click to toggle source

Main DSL methods

# File lib/sinatra/browse.rb, line 32
def parameter(name, type, options = {})
  temp_browse_params[name] = options.merge({ type: type })
end
Also aliased as: param
parameter_options(parameter, options) click to toggle source
# File lib/sinatra/browse.rb, line 37
def parameter_options(parameter, options)
  if temp_browse_params[parameter].nil?
    msg = "Tried to override undeclared parameter #{parameter}"
    raise Errors::UnknownParameterError, msg
  end

  temp_browse_params[parameter].merge! options
end
Also aliased as: param_options
reset_temp_params() click to toggle source
# File lib/sinatra/browse.rb, line 59
def reset_temp_params
  @_temp_browse_params = {}
end
temp_browse_params() click to toggle source

Internal stuff

# File lib/sinatra/browse.rb, line 55
def temp_browse_params
  @_temp_browse_params ||= reset_temp_params
end