Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use Pry in gems without modifying the Gemfile or using `require`

I am trying to debug a gem that's used by a Rails app.

I cloned the Gem locally to go prying around (and also allows me to do nice things such as git bisect, etc.)

# Gemfile
gem "active_admin", path: "~/dev-forks/active_admin"

However, I am often stuck with adding Pry to a Gemfile somewhere to be able to use it, or calling require "pry" live in the code even though I don't want it in there. For example, I will sometimes forget about it, fix the bug, and then commit to the project with Pry in the Gemfile.

Should I not do that, a LoadError will arise, cannot load such file -- pry (LoadError).

I have to admin I'm a bit lost between the different contexts (Rails project, Gem, local Ruby) and actual gems (Gemfile, require, installed).

How can I use binding.pry in a Gem within Rails, without intervention of the Gemfiles?

like image 953
Jonathan Allard Avatar asked Aug 07 '13 17:08

Jonathan Allard


People also ask

How do I add pry to Gemfile?

To start pry, simply type pry after the gem is installed. You can also make it part of your application's dependencies by adding gem "pry" to your application's Gemfile. Installing pry from within the application has its own benefits. In fact, there is a pry-rails gem that replaces the Rails console with Pry.

What is gem require false?

You use :require => false when you want the gem to be installed but not "required". So in the example you gave: gem 'whenever', :require => false when someone runs bundle install the whenever gem would be installed as with gem install whenever .

What is a gem Gemfile?

A Gemfile is a file that is created to describe the gem dependencies required to run a Ruby program. A Gemfile should always be placed in the root of the project directory.


2 Answers

if you want to use and debug a gem in your rails app, then it should be in the development and test group of the Gemfile in your app.

you can use tools like pry-debugger https://github.com/nixme/pry-debugger to set breakpoints in your pry session break SomeClass#run.

i think it's valid to add pry to every project that i fork to fix a bug or contribute stuff. just don't put it in the .gemspec files.

if you are pushing binding.pry changes to your repo, you should add commit hooks like Jim pointed out. i don't think that this is a pry related issue, it's dependent on how much care you take when reviewing your diff before pushing it out.

like image 84
phoet Avatar answered Oct 14 '22 16:10

phoet


Jon from the past! As you know, I have the answers to (almost) all your problems.

In this case, you're actually describing two problems: (a) you can't require 'pry' when Pry is not in the Gemfile, (b) you can't use Pry if you don't require it.

What Bundler does, as Conrad Irwin writes:

Bundler is an awesome gem that gives you a good degree of confidence that "if it works in development, it works in production". It can do this by being vicious about gem dependencies: if it's not in the Gemfile, it's not getting required. It also ensures that everyone's development environment is identical, no more does "it works on my machine" cut it as an excuse.

There are circumstances when this dogmatic dedication to duty can get in the way. In particular all good developers have set up their development environment very personally. Obviously, it's not important that my local tools work in production, and it's positively bad for productivity if everyone is forced to have an identicial development setup.

So in doing all the good things Bundler does for us Ruby developers, it comes by design with a caveat: "what's outside the bundle/Gemfile (eg system gems) doesn't exist anymore." How it does that is by redefining the require process and changes your PATH so that it only sees what's in the bundle.

That means you can't use Pry at all without polluting the Gemfile, you say, right? Not so fast. Conrad Irwin being the smart little cookie that he is, came up with a solution and made Pry Debundle, a gem that temporarily reverses the patches Bundler made to our require.

So all you have to do is just require 'pry-debundle' then, right? Oh... wait. Yep, Debundle is probably not in the Gemfile.

The monkey fix is to hard copy the source of pry-debundle.rb to ~/debundle.rb, and then load that. (For now, you'll need Pry loaded to run that source file, but you can run only the debundle! method to get there, require Pry, and go prying around. A little monkeypatching is needed, but I'm working on a PR.)

like image 37
Jonathan Allard Avatar answered Oct 14 '22 18:10

Jonathan Allard