Sinatra::DryParam

This sinatra extension provides easy interfaces for validating params. It serves both schema validation and strong-params feature.

Validation is processed by dry-schema, provides robust type and schema validation.

Installation

Add this line to your application's Gemfile:

gem 'sinatra-dry_param'

And then execute:

$ bundle

Or install it yourself as:

$ gem install sinatra-dry_param

Usage

Register and use the extension in your sinatra app, for classic style sinatra app:

require 'sinatra'
require 'sinatra/dry_param'

params do
  required(:name).filled(:string)
end

get '/hello' do
  data = validate_params
  h "Hello #{data[:name]}!"
end

Or for modular style sinatra app:

require 'sinatra/base'
require 'sinatra/dry_param'

class App < Sinatra::Base
  register Sinatra::DryParam

  params do
    required(:name).filled(:string)
  end

  get '/hello' do
    data = validate_params
    h "Hello #{data[:name]}!"
  end
end

Define params schemas

One or more schemas can be defined using method ::params, distinguised by names:

class App < Sinatra::Base
  register Sinatra::DryParam

  params do
    # dry-schema definitions
  end

  params :paging do
    # different name as :paging
  end

  params do
    # Override the previous schema in whole class scope.
    # Should only override parent class' schemas.
  end

  get '/' do
    validate_params                          # Use the default schema to validate params
    validate_params :dry, params             # Same with above line, the default schema name is :dry
    validate_params :paging, params[:paging] # Use the :paging schema to validate one param
  end

Schema definition

The block passed in ::params is the block passed to Dry::Schema.Params of dry-schema.

For syntax of schema definition, please refer to dry-schema documentation.

Reusing param schemas

Defined params can be retrieved as app settings, using the schema name with "_params" suffix.

  settings.dry_params
  settings.paging_params

And we can reuse schemas as how dry-schema is reused

  params :address do
    required(:city).filled(:string)
    required(:street).filled(:string)
    required(:zipcode).filled(:string)
  end

  params do
    required(:email).filled(:string)
    required(:name).filled(:string)
    required(:address).hash(settings.address_params)
  end

  post '/users' do
    input = validate_params
    User.create_with_address(input)
  end

Render response

By default, if validate_params failed, the action is halted with status 400 and render errors.

params do
  required(:page).filled(:integer, gt?: 0)
  required(:per_page).filled(:integer, gt?: 0)
end

get '/' do
  validate_params
end

#client
get '/', page: 0
#> Response body: { "page": ['must be greater than 0'], "per_page": ['is missing'] }

You can customize the behavior with this enable setting raise_dry_param_exceptions and catch the exception:

class App < Sinatra::Base
  register Sinatra::DryParam

  enable :raise_dry_param_exceptions

  error Sinatra::DryParam::InvalidParamsError do
    "Your params is not valid: " + env['sinatra.error'].results.to_h.to_s
  end
end

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/tiev/sinatra-dry_param. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the Sinatra::DryParam project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.