Trouble using Irb as Ruby Console


#1

Hello all,

I’m attempting to convert a command-line driven application into a
console application using Irb. However, I’m having some trouble right
out of the gate. Here’s what I have so far:

module App
class Framework
def use(plugin)
path = “plugins/#{plugin}”
tree = plugin.split(’/’)
tree.collect! { |x| x.capitalize }
@plugin = Object.const_get(“App::#{tree.join(’::’)}”).new
end

def show_options
  @plugin.show_options
end

def run
  @plugin.run
end

end
end

binding = App::Framework.new

load ‘irb.rb’
IRB.setup(nil)
IRB.conf[:PROMPT][:APP] = IRB.conf[:PROMPT][:SIMPLE]
IRB.conf[:PROMPT][:APP][:PROMPT_I] = 'app > ’
IRB.conf[:PROMPT_MODE] = :APP

irb = IRB::Irb.new(IRB::WorkSpace.new(binding))

IRB.conf[:MAIN_CONTEXT] = irb.context

trap(‘SIGINT’) do
irb.signal_handle
end

catch(:IRB_EXIT) do
irb.eval_input
end

Essentially, I’m setting the App::Framework class to be my Irb context.
When I run this program and try to load a plugin named ‘test’ using the
‘use’ method, I get the following:

antfarm > use test
ArgumentError: wrong number of arguments
from (irb):1:in `test’
from (irb):1
from :0
antfarm >

From this, it looks like ‘test’ might be a keyword in Irb, because when
I use a different plugin name I get the following:

antfarm > use hello
NameError: undefined local variable or method `hello’ for
#Antfarm::Framework:0xb7c4c16c
from (irb):1
from :0
antfarm >

From this, it looks like ‘use’ might be a keyword as well. I’m having
trouble finding good documentation on Irb Contexts, so if there are any
Irb experts out there please help!!!


Thanks!
Bryan


#2

Oops… the console results should say ‘App’ instead of ‘Antfarm’. This
discrepancy has nothing to do with my problem… :slight_smile:


Thanks!
Bryan


#3

Bryan R. wrote:

  tree = plugin.split('/')
end

end
antfarm >

From this, it looks like ‘use’ might be a keyword as well. I’m having
trouble finding good documentation on Irb Contexts, so if there are any
Irb experts out there please help!!!

The string “test” (and also “hello”) is getting evaluated. Try putting
it in quotes, so that it evals to a string and the #use method is passed
the string.