How to find where be_success is defined

So this is both a specific and a general question

Specific question: I am trying to find where be_success is defined. In Ubuntu, I used DoubleCmd (a clone of Window’s wonderful Total Commander) to scan for be_success without, uh, success. That’s the specific question.

I can see the following [73, 82] in /home/real-estate-data-mining/spec/controllers/articles_controller_spec.rb 73: # get :new # , params: {}, session: valid_session 74: byebug 75: get :new, params: {}, session: valid_session 76: # get :new, params: {}, session: {valid_session} 77: byebug => 78: expect(response).to be_success 79: end 80: end 81: end 82: (byebug) response.status 302 (byebug) be_success.class RSpec::Matchers::BuiltIn::BePredicate (byebug)

``

In /home/real-estate-data-mining/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-expectations-3.6.0/lib/rspec/matchers/built_in.rb:178 I see [240, 249] in /home/real-estate-data-mining/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rspec-expectations-3.6.0/lib/rspec/matchers/built_in/be.rb 240: method_name = actual.respond_to?(predicate) ? predicate : present_tense_predicate 241: @predicate_matches = actual.send(method_name, *@args, &@block) 242: end 243: 244: def predicate => 245: :“#{@expected}?” 246: end 247: 248: def present_tense_predicate 249: :“#{@expected}s?” (byebug) @expected.class String (byebug) @expected “success”

``

So to partially answer my own question, one can find where successful? is defined here:

[109, 118] in /home/real-estate-data-mining/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rack-2.0.3/lib/rack/response.rb 109: 110: module Helpers 111: def invalid?; status < 100 || status >= 600; end 112: 113: def informational?; status >= 100 && status < 200; end => 114: def successful?; status >= 200 && status < 300; end 115: def redirection?; status >= 300 && status < 400; end 116: def client_error?; status >= 400 && status < 500; end 117: def server_error?; status >= 500 && status < 600; end

``

I’m pretty sure there is a metaprogramming technique for finding where/when an object (in Ruby, a class IS an example of an Object) is created.

So, … How, in Ruby/Rails/Rspec, would one track where be_success comes into existence?

Bonus question: Since a Class is an Object, why does Class.class

``

return Class ?

Similarly, why does BasicObject.class return Class ?

be_* is handled by method_missing in rspec-expectations. When you take a look at BePredicate you can see it tries two variants of the phrase following be_*. For example:

expect(user).to be_registered

is roughly equivalent to:

expect(user.registered?).to be_truthy

Yours