module Roda::RodaPlugins::SinatraHelpers

  1. lib/roda/plugins/sinatra_helpers.rb

The sinatra_helpers plugin ports most of the helper methods defined in Sinatra::Helpers to Roda, other than those helpers that were already covered by other plugins such as caching and streaming.

Unlike Sinatra, the helper methods are added to either the request or response classes instead of directly to the scope of the route block. However, for consistency with Sinatra, delegate methods are added to the scope of the route block that call the methods on the request or response. If you do not want to pollute the namespace of the route block, you should load the plugin with the delegate: false option:

plugin :sinatra_helpers, delegate: false

Class Methods Added

The only class method added by this plugin is mime_type, which is a shortcut for retrieving or setting MIME types in Rack’s MIME database:

Roda.mime_type 'csv' # => 'text/csv'
Roda.mime_type 'foobar', 'application/foobar' # set

Request Methods Added

In addition to adding the following methods, this changes redirect to use a 303 response status code by default for HTTP 1.1 non-GET requests, and to automatically use absolute URIs if the :absolute_redirects Roda class option is true, and to automatically prefix redirect paths with the script name if the :prefixed_redirects Roda class option is true.

When adding delegate methods, a logger method is added to the route block scope that calls the logger method on the request.

back

back is an alias to referrer, so you can do:

redirect back

error

error sets the response status code to 500 (or a status code you provide), and halts the request. It takes an optional body:

error           # 500 response, empty boby
error 501       # 501 response, empty body
error 'b'       # 500 response, 'b' body
error 501, 'b'  # 501 response, 'b' body

not_found

not_found sets the response status code to 404 and halts the request. It takes an optional body:

not_found      # 404 response, empty body
not_found 'b'  # 404 response, 'b' body

uri

uri by default returns absolute URIs that are prefixed by the script name:

request.script_name # => '/foo'
uri '/bar'          # => 'http://example.org/foo/bar'

You can turn of the absolute or script name prefixing if you want:

uri '/bar', false        # => '/foo/bar'
uri '/bar', true, false  # => 'http://example.org/bar'
uri '/bar', false, false # => '/bar'

This method is aliased as url and to.

send_file

This will serve the file with the given path from the file system:

send_file 'path/to/file.txt'

Options:

:disposition

Set the Content-Disposition to the given disposition.

:filename

Set the Content-Disposition to attachment (unless :disposition is set), and set the filename parameter to the value.

:last_modified

Explicitly set the Last-Modified header to the given value, and return a not modified response if there has not been modified since the previous request. This option requires the caching plugin.

:status

Override the status for the response.

:type

Set the Content-Type to use for this response.

Response Methods Added

body

When called with an argument or block, body sets the body, otherwise it returns the body:

body      # => []
body('b') # set body to 'b'
body{'b'} # set body to 'b', but don't call until body is needed

body=

body sets the body to the given value:

response.body = 'v'

This method is not delegated to the scope of the route block, call body with an argument to set the value.

status

When called with an argument, status sets the status, otherwise it returns the status:

status      # => 200
status(301) # sets status to 301

headers

When called with an argument, headers merges the given headers into the current headers, otherwise it returns the headers:

headers['Foo'] = 'Bar'
headers 'Foo' => 'Bar'

mime_type

mime_type just calls the Roda class method to get the mime_type.

content_type

When called with an argument, content_type sets the Content-Type based on the argument, otherwise it returns the Content-Type.

mime_type             # => 'text/html'
mime_type 'csv'       # set Content-Type to 'text/csv'
mime_type :csv        # set Content-Type to 'text/csv'
mime_type '.csv'      # set Content-Type to 'text/csv'
mime_type 'text/csv'  # set Content-Type to 'text/csv'

Options:

:charset

Set the charset for the mime type to the given charset, if the charset is not already set in the mime type.

:default

Uses the given type if the mime type is not known. If this option is not used and the mime type is not known, an exception will be raised.

attachment

When called with no filename, attachment just sets the Content-Disposition to attachment. When called with a filename, this sets the Content-Disposition to attachment with the appropriate filename parameter, and if the filename extension is recognized, this also sets the Content-Type to the appropriate MIME type if not already set.

attachment          # set Content-Disposition to 'attachment'
attachment 'a.csv'  # set Content-Disposition to 'attachment;filename="a.csv"',
                    # also set Content-Type to 'text/csv'

status predicates

This adds the following predicate methods for checking the status:

informational?  # 100-199
success?        # 200-299
redirect?       # 300-399
client_error?   # 400-499
not_found?      # 404
server_error?   # 500-599

If the status has not yet been set for the response, these will return nil.

License

The implementation was originally taken from Sinatra, which is also released under the MIT License:

Copyright © 2007, 2008, 2009 Blake Mizerany Copyright © 2010, 2011, 2012, 2013, 2014 Konstantin Haase

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Methods

Public Class

  1. configure
  2. load_dependencies

Constants

BINARY_ENCODING = Encoding.find('BINARY')  
ISO88591_ENCODING = Encoding.find('ISO-8859-1')  
RACK_FILES = defined?(Rack::Files) ? Rack::Files : Rack::File  
UTF8_ENCODING = Encoding.find('UTF-8')  

Public Class methods

configure(app, opts=OPTS)

Add delegate methods to the route block scope calling request or response methods, unless the :delegate option is false.

[show source]
    # File lib/roda/plugins/sinatra_helpers.rb
236 def self.configure(app, opts=OPTS)
237   app.send(:include, DelegateMethods) unless opts[:delegate] == false
238 end
load_dependencies(app, _opts = nil)

Depend on the status_303 plugin.

[show source]
    # File lib/roda/plugins/sinatra_helpers.rb
229 def self.load_dependencies(app, _opts = nil)
230   app.plugin :status_303
231 end