Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Ruby

This branch is 2 commits ahead, 312 commits behind master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
spec
.gitignore
LICENSE
README.md
SIMILAR_PROJECTS.md
TODO.markdown
TUTORIAL.md
VERSION
contracts.gemspec

README.md

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.

Installation

gem install contracts

Running Tests

rspec spec/*.rb

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'
include Contracts

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

puts 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:

./contracts.rb:34:in `failure_callback': Contract violation: (RuntimeError)
    Expected: Contracts::Num,
    Actual: "oops"
    Value guarded in: Object::double
    With Contract: Contracts::Num, Contracts::Num
    At: main.rb:6 
    ...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.

Tutorial

Check out this awesome tutorial.

Gotchas

Contracts don't work on top level functions. Any function with a contract should be in a class. In our example we just stuck the double function in the Object class.

Q. Is this compatible with Ruby 1.9?

A. Yes.

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

Credits

Inspired by contracts.coffee.

Copyright 2012 Aditya Bhargava.

BSD Licensed.

Something went wrong with that request. Please try again.