diary at Telent Netowrks

Making reload! work in Pry with Rails 3.2#

Mon, 23 Jan 2012 14:08:41 +0000

As of Pry 0.9.7.4 (the current version according to Bundler at the time I write this), the setup instructions for replacing irb with Pry when you run rails console no longer work fully in Rails 3.2. Specifically, the Rails team have changed the way they create irb commands like reload!: where in earlier version they were added to Object, now they are added to IRB::ExtendCommandBundle to avoid polluting the global namespace. Here's the github pull request where the change is described.

(The cynic here will say "Rails? Namespace pollution? Lost cause, mate", but hey, let's not be down on attempts to make it better)

IRB already knows how to look in IRB::ExtendCommandBundle; Pry doesn't, so what will happen if you have installed Pry in the usually recommended way by assigning IRB=Pry is you'll get an error that Pry::ExtendCommandBundle doesn't exist.

(I've seen 'fixes' for this bug that assign Pry::ExtendCommandBundle=Pry. This will make rail console start, but it still doesn't make the commands accessible. Less than entirely useful then)

So, let's make it so. Here's the relevant bit of my config: feel free to use as inspiration, but don't blame me if copy/paste doesn't work

First, in config/environments/development.rb

  silence_warnings do
    begin
      require 'pry'
      IRB = Pry
      module Pry::RailsCommands ;end
      IRB::ExtendCommandBundle = Pry::RailsCommands
    rescue LoadError
    end
  end

and then in $HOME/.pryrc we create commands for the methods in that module

if Kernel.const_defined?("Rails") then
  require File.join(Rails.root,"config","environment")
  require 'rails/console/app'
  require 'rails/console/helpers'
  Pry::RailsCommands.instance_methods.each do |name| 
    Pry::Commands.command name.to_s do 
      Class.new.extend(Pry::RailsCommands).send(name)
    end
  end
end

If you are using a newer version of Pry than me - well, first off, they may have fixed this already and if so you can ignore this whole post. But if they haven't, and if Pry::Commands.command is giving you trouble, note that the unreleased Pry 0.9.8 is set to include a new way of defining custom commands and you may need to rewrite this using the new Pry::Commands.block_command construct instead.

HTH