Module: Sinatra::Browse

Defined in:
lib/sinatra/browse/parameter_types/integer.rb,
lib/sinatra/browse/parameter_types/boolean.rb,
lib/sinatra/browse/parameter_types/string.rb,
lib/sinatra/browse/parameter_types/float.rb,
lib/sinatra/browse/parameter_type.rb,
lib/sinatra/browse/validator.rb,
lib/sinatra/browse/format.rb,
lib/sinatra/browse/errors.rb,
lib/sinatra/browse/route.rb,
lib/sinatra/browse.rb

Defined Under Namespace

Modules: Errors Classes: BrowseFormat, ErbTemplate, JSON, ParameterType, Route, Validator, YAML

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.format(f, browse_routes) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/sinatra/browse/format.rb', line 7

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

.parameter_type(name, &blk) ⇒ Object



4
5
6
# File 'lib/sinatra/browse/parameter_type.rb', line 4

def self.parameter_type(name, &blk)
  const_set "#{name}Type", Class.new(ParameterType, &blk)
end

.registered(app) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/sinatra/browse.rb', line 74

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) ⇒ Object



124
125
126
127
128
129
# File 'lib/sinatra/browse.rb', line 124

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

Instance Method Details

#browse_descriptionObject



48
49
50
# File 'lib/sinatra/browse.rb', line 48

def browse_description
  @_browse_description ||= ""
end

#browse_routesObject



44
45
46
# File 'lib/sinatra/browse.rb', line 44

def browse_routes
  @_browse_routes ||= {}
end

#browse_routes_for(request_method, path_info) ⇒ Object



52
53
54
# File 'lib/sinatra/browse.rb', line 52

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) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/sinatra/browse.rb', line 56

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) ⇒ Object



69
70
71
72
# File 'lib/sinatra/browse.rb', line 69

def default_on_error(&blk)
  @default_on_error = blk if block_given?
  @default_on_error
end

#describe(description) ⇒ Object Also known as: desc



28
29
30
# File 'lib/sinatra/browse.rb', line 28

def describe(description)
  @_browse_description = description
end

#param(name, type, options = {}) ⇒ Object

Main DSL methods



14
15
16
# File 'lib/sinatra/browse.rb', line 14

def param(name, type, options = {})
  temp_browse_params[name] = options.merge({ type: type })
end

#parameter_options(parameter, options) ⇒ Object Also known as: param_options



18
19
20
21
22
23
24
25
# File 'lib/sinatra/browse.rb', line 18

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

#reset_temp_paramsObject



40
41
42
# File 'lib/sinatra/browse.rb', line 40

def reset_temp_params
  @_temp_browse_params = {}
end

#temp_browse_paramsObject

Internal stuff



36
37
38
# File 'lib/sinatra/browse.rb', line 36

def temp_browse_params
  @_temp_browse_params ||= reset_temp_params
end