Monkey patches Hash#fetch to also show the entire hash in the error
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib
spec
.gitignore
.rspec
Gemfile
LICENSE.txt
README.md
Rakefile
verbose_hash_fetch.gemspec

README.md

VerboseHashFetch

This gem monkey patches Hash#fetch so that KeyErrors show the contents of the hash in which the key wasn't found.

Example

We are taught to use Hash#fetch instead of Hash#[], so that we don't get unexpected nils floating around in our code. Hash#fetch will raise an exception when the key isn't found, right where you tried to access it. Rather fail early then have a nil pop up somewhere else!

But there is one thing that annoys me. Say you're writing this code:

def hello(options)
  name = options.fetch(:name)
  puts "Hello, #{name}!"
end

Now, you're calling this method, passing in some params that you got from somewhere else:

hello(params)
# => key not found: :name (KeyError)

Blast! Now I have to see why params doesn't have the key :name in it. Did I misspel it somewhere? Was the name parameter a String instead of a Symbol?

What shall I do: put a puts in the code? Should I raise params.inspect, should I launch a debugger, or should I stare at the code long enough to see the mistake?

All these options suck. Just have verbose_hash_fetch loaded, and you'll see the contents of the hash appear in the error itself!

require 'verbose_hash_fetch'

hello(params)
# => key not found: :name in Hash: {:naem=>"Avdi"} (KeyError)

No more guessing, no more retrying. See it when it happens!

Installation

Add this line to your application's Gemfile:

gem 'verbose_hash_fetch'

And then execute:

$ bundle

Or install it yourself as:

$ gem install verbose_hash_fetch

Usage

If you have verbose_hash_fetch in your Gemfile, and you're using Rails, then you don't need to do anything.

If you need to load it manually:

require 'verbose_hash_fetch'

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Credits

I was complaining on Twitter, so Roel van Dijk made it and put it in a Gist. I just converted it into a gem.