Module: Sinatra::Browse

Defined in:
lib/sinatra/browse/parameter_types/date_time.rb,
lib/sinatra/browse/parameter_types/min_max.rb,
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/route.rb,
lib/sinatra/browse.rb

Defined Under Namespace

Modules: ParameterTypes 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

.registered(app) ⇒ Object



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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/sinatra/browse.rb', line 94

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



144
145
146
147
148
149
# File 'lib/sinatra/browse.rb', line 144

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



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

def browse_description
  @_browse_description ||= ""
end

#browse_routesObject



64
65
66
# File 'lib/sinatra/browse.rb', line 64

def browse_routes
  @_browse_routes ||= {}
end

#browse_routes_for(request_method, path_info) ⇒ Object



72
73
74
# File 'lib/sinatra/browse.rb', line 72

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



76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/sinatra/browse.rb', line 76

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



89
90
91
92
# File 'lib/sinatra/browse.rb', line 89

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

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



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

def describe(description)
  @_browse_description = description
end

#parameter(name, type, options = {}) ⇒ Object Also known as: param

Main DSL methods



33
34
35
# File 'lib/sinatra/browse.rb', line 33

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

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



38
39
40
41
42
43
44
45
# File 'lib/sinatra/browse.rb', line 38

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



60
61
62
# File 'lib/sinatra/browse.rb', line 60

def reset_temp_params
  @_temp_browse_params = {}
end

#temp_browse_paramsObject

Internal stuff



56
57
58
# File 'lib/sinatra/browse.rb', line 56

def temp_browse_params
  @_temp_browse_params ||= reset_temp_params
end