I’m evaluating a ruby script against a testing DSL that I wrote. Now I
would have loved to run the scripts at the toplevel, but the
contamination of the Object class makes that infeasible. So I run them
within a Scope object. Basically:
class Scope < Module
def initialize
extend self
end
def execute(script, filename)
eval(script, binding, filename)
end
end
My problem arises when a script uses a constant that isn’t defined and
the error message looks like this:
ERROR: NameError uninitialized constant #Scope:0x7f3cc21e5630::Foo
I’m trying to find a way to get rid of the #<Scope:...>::
part. To
the end user it should at least look like things are running at
toplevel.
I tried adding to Scope:
def inspect; “”; end
But that did not work. Any ideas?
I ran into this same problem today myself, although attempting something
different. I wanted to stylize a constant name with a bang! Our
company’s
name happens to be stylized with a bang, so I thought I’d be silly and
try
to translate that into Ruby itself (I was inspired by Rainbows!)
So I tried this:
http://gist.github.com/653850Which is fine, but when I created classes
within the namespace of my bangmodule, they still inspect without the
bang!
I want the bang! Bring on the bang!
Why not add a const_missing() to your Scope class and explicitly lookup
the constant on Object there, which will fail, and so the error will be
as if a top-level constant wasn’t found:
class Scope
def const_missing(const)
Object.const_get(const)
end
end
test:
class Scope
Hello
end
#=> NameError: uninitialized constant Hello
Also, why don’t you run the script like follows:
load "myscript.rb", true
So that top-level is replaced by an anonymous module. This should
obviate the need for your Scope hack, i think.
err, that should be:
class Scope
def self.const_missing(const)
Object.const_get(const)
end
end
John
On Sat, Oct 30, 2010 at 12:06 AM, Intransition [email protected]
wrote:
yup
def execute( script, filename )
eval(script, Module.new.send(:binding), filename)
end
execute( “Foo”, “here” )
which gives
here:1:in `execute’: uninitialized constant Object::Foo (NameError)
does this suit your needs better?
If this still causes the conflicts you were talking about, I like John’s
idea.
HTH
R
On Oct 31, 12:28am, John M. [email protected] wrote:
err, that should be:
class Scope
def self.const_missing(const)
Object.const_get(const)
end
end
Nice. I removed self.
b/c Scope is a self extended module, and it
looks good.
Thanks.