---
title: This Week in Open Source
teaser:
tags: news,open source
author: Joe Ferris
published_on: 2011-11-18
---

## The great bundler cleanup

We’ve been slowly transitioning all our gems to use Gemfiles and bundler’s gem tasks, but Gabe Berke-Williams ([gabebw](http://github.com/gabebw)) is finally laying down the law. Welcome to the New Order: [limerick\_rake](http://github.com/thoughtbot/limerick_rake/commit/85aa0f21c6c120f77bc45e7df6ee32e0085030cf "Use Bundler gem conventions."), [paul\_revere](http://github.com/thoughtbot/paul_revere/commit/164349dbd0d084042e80d7e98a11ad1e8e0569e4 "Use Bundler gem conventions. This also introduces PaulRevere::VERSION."), [cocaine](http://github.com/thoughtbot/cocaine/commit/c74077cc23234ae1d35ead4d4708579528c90fba "Use Bundler gem conventions."), [suspenders](http://github.com/thoughtbot/suspenders/commit/921485f0c0a20f269a3bf6deec211cf27dce0457 "bundler/gem_tasks is easier."), [pacecar](http://github.com/thoughtbot/pacecar/commit/ebf24bd6df71d8b3ccffbe7101fd755bc682092e "Use Bundler gem conventions."), [appraisal](http://github.com/thoughtbot/appraisal/commit/1137175b766c6ec5a36419c27118d8cca64d4604 "Obey bundler convensions in gemspec, Gemfile, and Rakefile"), [shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers/compare/26fb35aae9929c7250aa8cb75570bf0ea18e02c6%5E...ad570cc06c4a7a377870247d97761679f1ce381a), [bourne](http://github.com/thoughtbot/bourne/commit/b3e97452f4d6917a3882b6eec512f2647294695d "Use Bundler gem conventions."), [shoulda](http://github.com/thoughtbot/shoulda/commit/0341449c788668f79ab60a228fd06a61996c63e1 "Use Bundler gem conventions."), [high\_voltage](https://github.com/thoughtbot/high_voltage/commit/63187dd85c97881805bdce62c82e), [flutie](https://github.com/thoughtbot/flutie/commit/ffdc672bbe9687ba134560e379121efbbf992ba9), [paperclip](https://github.com/thoughtbot/paperclip/commit/1cee13eb7804cf781e71b59ac7b3e1e4861b3e0e%5E), [shoulda-context](https://github.com/thoughtbot/shoulda-context/commit/9a00eb03dadca3b46ad10f012ed7639d8d35f659%5E), and [factory\_bot\_rails](https://github.com/thoughtbot/factory_bot_rails/compare/bf6acea8...9cee2e5baa) are now in line.

This provides a reliable and unified way for developers to check out, test, and release our gems:

bundle install && bundle exec rake && bundle exec rake release

Among other things, this keeps our CI clean and means we can’t forget to add Git tags for each release.

## kumade

Bryan Ash ([bryan-ash](http://github.com/bryan-ash)) fixed a [kumade](https://github.com/thoughtbot/kumade) bug when trying to push to non-existent remotes: [397604d](http://github.com/thoughtbot/kumade/commit/397604d2a9478473568a47f5bfb5a3798b9e7bdd "Git#push when remote does not exist returns silently").

## suspenders

Vasiliy Ermolovich ([nashby](https://github.com/nashby)) fixed [suspenders](https://github.com/thoughtbot/suspenders) to correctly create the database in the context of the bundle: [da63a014](https://github.com/thoughtbot/suspenders/commit/da63a014e5dc6d4b52f96aed1df1f3824180abca "use bundle exec").

## shoulda

Tom Milewski ([tmilewski](http://github.com/tmilewski)) added a new matcher to [shoulda’s matcher collection](https://github.com/thoughtbot/shoulda-matchers): [`should serialize`](https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_record/serialize_matcher.rb), allowing you to quickly test serialized ActiveRecord fields. This was introduced in [a3fa2f9](http://github.com/thoughtbot/shoulda-matchers/commit/a3fa2f9bacc75942a2bbb5019935257569b2bdce "Adds the serialize matcher to ActiveRecord matchers.").

Blake Thomson, Mike Burns ([mike-burns](http://github.com/mike-burns)), and Gabe Berke-Williams ([gabebw](http://github.com/gabebw)) fixed some development and testing issues to get the [shoulda](https://github.com/thoughtbot/shoulda) builds passing in [7660061](http://github.com/thoughtbot/shoulda-matchers/commit/76600615dda6417eb1a687a5108a9cb51d326c29 "Remove uglifier and coffee-rails from the 3.1 gemfile, and modify spec_helper.rb to respect a BUNDLE_GEMFILE set on the command line."), [d38edbd](http://github.com/thoughtbot/shoulda-matchers/commit/d38edbd7a16d670dc71ee5156b636224640669e1 "Depend on a specific version of bundler locally."), and [f9d5c63](http://github.com/thoughtbot/shoulda/commit/f9d5c63bb2bdf0b4b8d1205996ec0ec0ec384cb0 "Use sqlite3 instead of sqlite3-ruby.").

## high\_voltage

Gabe Berke-Williams ([gabebw](http://github.com/gabebw)) cleaned up [high\_voltage](https://github.com/thoughtbot/high_voltage) a bit by removing some extra comments in [505f98a](http://github.com/thoughtbot/high_voltage/commit/505f98a5f6b08985f877bc0ec9bbdffa13f3a34d "Remove comments.").

## bourbon

Gabe Berke-Williams ([gabebw](http://github.com/gabebw)) updated the [bourbon](https://github.com/thoughtbot/bourbon) documentation ([aaabf77](http://github.com/thoughtbot/bourbon/commit/aaabf77e3e3844d5c973f540548c23a7ad330854 "Fix up README.")) and switched from plain Ruby to Rake for generation: [a647cff](http://github.com/thoughtbot/bourbon/commit/a647cff5235c3526a2419cef984fffaeb2d8eb71 "Use Rake to generate Bourbon for non-Rails use.").

Matthias Schmidt ([MSchmidt](http://github.com/MSchmidt)) removed font families from buttons to let the application’s fonts shine through ([3d18d51](http://github.com/thoughtbot/bourbon/commit/3d18d513ea32b5782230c19c4cb8badb02c008aa "Remove font families from button addon")) and Mark Sonnabaum ([msonnabaum](http://github.com/msonnabaum)) restored a missing import to make column mixins available ([9b826ac](http://github.com/thoughtbot/bourbon/commit/9b826acf141c4dbce48010c4aaba20e981a8c601 "Added missing css3 columns to _bourbon.scss.")).

## flutie

Gabe Berke-Williams ([gabebw](http://github.com/gabebw)) fixed [flutie](https://github.com/thoughtbot/flutie) to expose the running version: [7151672](http://github.com/thoughtbot/flutie/commit/71516721173ecc352d7ea6c4ad63ed6388489e88 "Require flutie version.").

## pacecar

Gabe Berke-Williams ([gabebw](http://github.com/gabebw)) updated the [pacecar](https://github.com/thoughtbot/pacecar) documentation: [84e1fe7](http://github.com/thoughtbot/pacecar/commit/84e1fe76ed2ff2013893dd8ff185f1354f1725bb "README formatting.").

## paperclip

Shinya Kasatani ([kasatani](http://github.com/kasatani)) fixed [paperclip](https://github.com/thoughtbot/paperclip) to support more options in the styles hash: [b66833e](http://github.com/thoughtbot/paperclip/commit/b66833e66b4eaf6202eabf9c2bb971076a76912c "respect :convert_options and :source_file_options in :styles hash").

Mike Burns ([mike-burns](http://github.com/mike-burns)) merged mpd’s ([xxx](http://github.com/xxx)) fixes for handling files with question marks ([ff48f68](http://github.com/thoughtbot/paperclip/commit/ff48f6886343ed13db904722145946c6a619f5a2 "Merge branch ")) and Daniel Vartanov’s ([DanielVartanov](http://github.com/DanielVartanov)) style optimizations: [b09b05b](http://github.com/thoughtbot/paperclip/commit/b09b05b4ca0d84aeaf7be12f4a82317f10194db0 "Merge branch ").

Prem Sichanugrist ([sikachu](http://github.com/sikachu)) fixed Paperclip rake tasks to ignore default\_scope in ActiveRecord: [0e8b874](http://github.com/thoughtbot/paperclip/commit/0e8b874c3599e9314d7d0622a35b89465ce58deb "Use #unscoped or #with_exclusive_scope when selecting records for the rake task").

Jon Yurek ([jyurek](http://github.com/jyurek)) fixed an expiring URL bug ([75a5dbc](http://github.com/thoughtbot/paperclip/commit/75a5dbcc2fb8a327c29c3691f516c06b9e7c5c86 "#expiring_url doesn")).

## factory\_bot[^1]

Mike Burns ([mike-burns](http://github.com/mike-burns)) merged Wojciech Wnętrzak’s ([morgoth](http://github.com/morgoth)) [factory\_bot](https://github.com/thoughtbot/factory_bot) fixes for factory names with uppercase letters: [463028d](http://github.com/thoughtbot/factory_bot/commit/463028d82ec3f874f135e70e3d924122235d3046 "Merge branch ")

Joshua Clayton ([joshuaclayton](http://github.com/joshuaclayton)) fixed a bug concerning build classes: [845a76a](http://github.com/thoughtbot/factory_bot/commit/845a76a59522b116065203e167be66ae771fb73a "Don")

Harold ([hgimenez](https://github.com/hgmnz)) forgot to take his medicine and submitted [218d7bed](https://github.com/thoughtbot/factory_bot/commit/218d7bedfe41c400c804f1994983d3eabe1977a2) but he stopped himself in time.

## fake\_braintree

Gabe Berke-Williams ([gabebw](http://github.com/gabebw)) and Joe Ferris ([jferris](http://github.com/jferris)) added support to our [braintree fake](https://github.com/thoughtbot/fake_braintree) for more of the Braintree <abbr title="Application Programming Interface">API</abbr> and changed behavior to be more realistic in [0dd6471](http://github.com/thoughtbot/fake_braintree/commit/0dd647170f600d5632bd17047353d2798cf71952 "Format subscription.next_billing_date appropriately."), [3d758a1](http://github.com/thoughtbot/fake_braintree/commit/3d758a1fb76d3b119c6fe816308df43e68596bfa "Only check for existing customer if we have an ID."), [c57cde3](http://github.com/thoughtbot/fake_braintree/commit/c57cde3339d24f085b707d4a0ec635c75121f613 "Support Braintree::Customer.update."), [45b5e62](http://github.com/thoughtbot/fake_braintree/commit/45b5e62601e8b62f82bf4bb2c70f3e2a49de7836 "failure_response can be called with no arguments."), [bab770a](http://github.com/thoughtbot/fake_braintree/commit/bab770a94fa0816263162a4d896842837992ab9d "Customers can be created with an empty credit card hash."), [0c02a8e](http://github.com/thoughtbot/fake_braintree/commit/0c02a8e236c19e3dc3fb1d1b41491d4cb1283227 "Include the plan ID in subscription hashes so we can verify subscriptions have the right plan"), [707b336](http://github.com/thoughtbot/fake_braintree/commit/707b336ddc773070d4d1882ca6e0e7a75b643621 "Return the payment method token like Braintree does, so customers/subscriptions can be cross-referenced"), and [36f2b5e](http://github.com/thoughtbot/fake_braintree/commit/36f2b5e785a500fbf7d1ed7606b2918757a1606a "Allow credit cards to be specified as month/year instead of date"). They also cleaned up fake\_braintree internals with a number of improvements in [1811656](http://github.com/thoughtbot/fake_braintree/commit/181165635e7be2489ee8d384684dfca539ede3e7 "Cleanup."), [e055191](http://github.com/thoughtbot/fake_braintree/commit/e055191511155f083bbcc1fbe917d99df966a578 "Formatting."), [3ada7a3](http://github.com/thoughtbot/fake_braintree/commit/3ada7a377fe3621b7738e0644f969aa648c165a9 "Clarify."), [9304ea0](http://github.com/thoughtbot/fake_braintree/commit/9304ea042f46a33b848a7e3c8fde1f9954379da3 "Enforce bundled versions of gems."), [210835c](http://github.com/thoughtbot/fake_braintree/commit/210835c5bc911b6871f8b95520a30fa5ee5bd819 "Turn off card verification in specs."), [0a647db](http://github.com/thoughtbot/fake_braintree/commit/0a647db1b0d5ff2de37cbd089476bc2624fe934d "Clean up specs."), [ad3c6ab](http://github.com/thoughtbot/fake_braintree/commit/ad3c6abf272949ae7fd4775083e6ab48bf8be117 "Whitespace."), [6c284b5](http://github.com/thoughtbot/fake_braintree/commit/6c284b5ec17cad086baa1e03af228cb1ac29e125 "Remove 1.9-isms from test suite."), [eab8d78](http://github.com/thoughtbot/fake_braintree/commit/eab8d78066898450c0bd609241aa76daa8514ae2 "Privatize method."), [7a7e153](http://github.com/thoughtbot/fake_braintree/commit/7a7e15386e0fd781e244115475e345a340690365 "We use Capybara::Server, not sham_rack."), [5970f68](http://github.com/thoughtbot/fake_braintree/commit/5970f68cf83eb15a27422cafff05f8fd8f78014e "Move some logic into methods. Remove that weird __content__ line."), [ebab395](http://github.com/thoughtbot/fake_braintree/commit/ebab395253b2044d64396cb18069710fe25df50d "Clean up specs."), [58a1e89](http://github.com/thoughtbot/fake_braintree/commit/58a1e8969b105f41b3b4d05d55b0a32bec04ac94 "Clean up specs."), [d3097c5](http://github.com/thoughtbot/fake_braintree/commit/d3097c5b3cbe065e7bf9c84798a9623f8fa2654e "Test the unhappy path."), [1 transaction.">638a38b](http://github.com/thoughtbot/fake_braintree/commit/638a38b47cbbf5a025d007d94e1fee68ce50223b "Add Braintree::Transaction spec. Allow finding "), [ebeab46](http://github.com/thoughtbot/fake_braintree/commit/ebeab467e5a070636adb338797e7fe879c13ccf7 "Sporkify."), and [47d00aa](http://github.com/thoughtbot/fake_braintree/commit/47d00aaf5056adad5440562ee016d4ccf0bb020a "Use mongrel instead of thin so we can run more than one server at once").

Ben Orenstein ([r00k](http://github.com/r00k)) came through with a documentation update: [b6befa2](http://github.com/thoughtbot/fake_braintree/commit/b6befa22ca88fd179f77a3cb8f145ee6c611e7ce "Tell people about .decline_all_cards!").

## Congratulations

This week, Gabe Berke-Williams ([gabebw](http://github.com/gabebw)) earned the prestigious “Committed more than is reasonably plausible in a forty-hour work week” award for getting his name in this post more often than the word “the.”

Kudos to Mike Burns ([mike-burns](http://github.com/mike-burns)) for earning the “Pull Request Vacuum” award. How many merged pull requests does it take to get to the center of the Earth? Mike is well on his way to finding out.

[^1]: Looking for FactoryGirl? The library was renamed in 2017.
[Project name history can be found here.](https://github.com/thoughtbot/factory_bot/blob/master/NAME.md)
