Monthly Downloads: 162,414
Programming language: Ruby
License: BSD 2-clause "Simplified" License

contracts.ruby alternatives and similar gems

Based on the "Coding Style Guides" category.
Alternatively, view contracts.ruby alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of contracts.ruby or a related project?

Add another 'Coding Style Guides' Gem


This project is looking for a new maintainer! More details here

contracts.ruby GitHub Build Status Join the chat at https://gitter.im/egonSchiele/contracts.ruby

Contracts let you clearly – even beautifully – express how your code behaves, and free you from writing tons of boilerplate, defensive code.

You can think of contracts as assert on steroids.


gem install contracts

Hello World

A contract is one line of code that you write above a method definition. It validates the arguments to the method, and validates the return value of the method.

Here is a simple contract:

  Contract Num => Num
  def double(x)

This says that double expects a number and returns a number. Here's the full code:

require 'contracts'

class Example
  include Contracts::Core
  include Contracts::Builtin

  Contract Num => Num
  def double(x)
    x * 2

puts Example.new.double("oops")

Save this in a file and run it. Notice we are calling double with "oops", which is not a number. The contract fails with a detailed error message:

ParamContractError: Contract violation for argument 1 of 1:
        Expected: Num,
        Actual: "oops"
        Value guarded in: Example::double
        With Contract: Num => Num
        At: main.rb:8
        ...stack trace...

Instead of throwing an exception, you could log it, print a clean error message for your user...whatever you want. contracts.ruby is here to help you handle bugs better, not to get in your way.


Check out this awesome tutorial.

Use Cases

Check out this screencast.


To get started do the following:

  1. Install required gems for development

bundle install

  1. Run our test suite

bundle exec rspec

  1. Run our code style checks

bundle exec rubocop


Using contracts.ruby results in very little slowdown. Check out this blog post for more info.

Q. What Rubies can I use this with?

A. It's been tested with 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 and 2.7.

If you're using the library, please let me know what project you're using it on :)


Contracts literally saves us hours of pain at Snowplow every day

Alexander Dean, creator of Snowplow

Contracts caught a bug that saved us several hundred dollars. It took less than 30 seconds to add the contract.

Michael Tomer


Inspired by contracts.coffee.

Copyright 2012-2015 Aditya Bhargava. Major improvements by Alexey Fedorov.

BSD Licensed.

*Note that all licence references and agreements mentioned in the contracts.ruby README section above are relevant to that project's source code only.