[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Who required that!?

Trans

11/2/2007 12:18:00 AM

Is there any way to ask a file what other file require/load 'd it? I
imagine this has been asked before but I couldnt seem to find good
terms to search for it.

The reason I ask is b/c I am getting the freakiest error. I'm running
my test, right. Now when I run them one at a time by hand they all
work fine. But if I run them via a script that in turn runs them one
at time for me, eg:

test_files.each do |file|
sh %{ruby -e 'puts "\n\n#{file}"; load "#{file}"' >> #{output}}
end

Then I get a very very very strange error where, test_autoarray.rb
seems to somehow cause text_infinity.rb to load even though they have
no connection whatsoever, but worse, it's not the test_infinity.rb
that is supposed to load about 70 test files later, but rather the
test file in my pkg/ staging folder! I have no idea how it picks that
up. The one thing that strikes me is that the pkg/ file it hard linked
to the real file, but I don't see how Ruby could possibly know that.

Below is a snip of the output. I added a 'p __FILE__' and a 'p caller'
to the top of test_infinity.rb to show the file it's coming from. As
you can see it's running right along fine but when it hits
test_autoarray.rb that's when it goes wack. But then it goes right
back to normal and finishes without issue.

T.

...

test/unit/hash/test_at.rb
Loaded suite -e
Started
14 Answers

ara.t.howard

11/2/2007 2:38:00 AM

0


On Nov 1, 2007, at 6:18 PM, Trans wrote:

> Is there any way to ask a file what other file require/load 'd it? I
> imagine this has been asked before but I couldnt seem to find good
> terms to search for it.
>

cfp:~ > cat a.rb
p Kernel.requiree('main')

require 'b'

p Kernel.requiree('main')




BEGIN {
module Kernel
h = Hash.new
define_method(:requiree) do |of|
h[of]
end

r = method :require
define_method(:require) do |*a|
r.call *a
h[a.first] = caller
end
end
}


cfp:~ > cat b.rb
require 'main'


cfp:~ > ruby a.rb
nil
["./b.rb:1", "a.rb:20:in `require'", "a.rb:20:in `call'", "a.rb:20:in
`require'", "a.rb:4"]




a @ http://codeforp...
--
share your knowledge. it's a way to achieve immortality.
h.h. the 14th dalai lama



Trans

11/2/2007 3:40:00 AM

0



On Nov 1, 10:38 pm, "ara.t.howard" <ara.t.how...@gmail.com> wrote:
> On Nov 1, 2007, at 6:18 PM, Trans wrote:
>
> > Is there any way to ask a file what other file require/load 'd it? I
> > imagine this has been asked before but I couldnt seem to find good
> > terms to search for it.
>
> cfp:~ > cat a.rb
> p Kernel.requiree('main')
>
> require 'b'
>
> p Kernel.requiree('main')
>
> BEGIN {
> module Kernel
> h = Hash.new
> define_method(:requiree) do |of|
> h[of]
> end
>
> r = method :require
> define_method(:require) do |*a|
> r.call *a
> h[a.first] = caller
> end
> end
>
> }

Doh! Of course!

Thanks Ara, that allowed me to figure it out.

Turns out using 'load' to load the test rather then passing it
straight to the ruby command, for some reason, gives test/unit the
idea that it should go out and hunt for every file it can find with a
test in it, including the copies in pkg/. That seems nuts me, but now
I recall having to specify some parameter to reign test/unit in before
--don't recall off hand what it was though. I'll have to track that
down. In any case

test_files.each do |file|
sh %{ruby -e #{file} >> #{output}}
end

works, and that's good enough.

Thanks!
T.


Alex Gutteridge

11/2/2007 4:41:00 AM

0

On 2 Nov 2007, at 11:38, ara.t.howard wrote:

>
> On Nov 1, 2007, at 6:18 PM, Trans wrote:
>
>> Is there any way to ask a file what other file require/load 'd it? I
>> imagine this has been asked before but I couldnt seem to find good
>> terms to search for it.
>>
>
> cfp:~ > cat a.rb
> p Kernel.requiree('main')
>
> require 'b'
>
> p Kernel.requiree('main')
>
> BEGIN {
> module Kernel
> h = Hash.new
> define_method(:requiree) do |of|
> h[of]
> end
>
> r = method :require
> define_method(:require) do |*a|
> r.call *a
> h[a.first] = caller
> end
> end
> }
>
>
> cfp:~ > cat b.rb
> require 'main'
>
>
> cfp:~ > ruby a.rb
> nil
> ["./b.rb:1", "a.rb:20:in `require'", "a.rb:20:in `call'", "a.rb:
> 20:in `require'", "a.rb:4"]


Ara, out of curiosity, is there any reason why you don't write the
Kernel modification code as:

module Kernel
H = {}
def requiree(of)
H[of]
end

alias :old_require :require
def require(*a)
old_require(*a)
H[a.first] = caller
end
end

Is there any difference between the two versions, or is it just a
style preference?

Alex Gutteridge

Bioinformatics Center
Kyoto University



Joel VanderWerf

11/2/2007 6:36:00 AM

0

Alex Gutteridge wrote:
> Is there any difference between the two versions, or is it just a style
> preference?

Maybe to avoid exposing the constant, H?

But unfortunately it breaks gems... Maybe because it references
Kernel#require before gem does its thing with it? Not sure why the same
doesn't happen with alias, though.

Anyway, combining your approach with Ara's seems to take the best of each:


p Kernel.requiree('main')

require 'b'

p Kernel.requiree('main')

require 'fox16' # or your favorite gem

BEGIN {
module Kernel
h = Hash.new
define_method(:requiree) do |of|
h[of]
end

alias :old_require :require
define_method(:require) do |*a|
old_require(*a)
h[a.first] = caller
end
end
}


--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Robert Klemme

11/2/2007 9:40:00 AM

0

2007/11/2, Trans <transfire@gmail.com>:
>
>
> On Nov 1, 10:38 pm, "ara.t.howard" <ara.t.how...@gmail.com> wrote:
> > On Nov 1, 2007, at 6:18 PM, Trans wrote:
> >
> > > Is there any way to ask a file what other file require/load 'd it? I
> > > imagine this has been asked before but I couldnt seem to find good
> > > terms to search for it.
> >
> > cfp:~ > cat a.rb
> > p Kernel.requiree('main')
> >
> > require 'b'
> >
> > p Kernel.requiree('main')
> >
> > BEGIN {
> > module Kernel
> > h = Hash.new
> > define_method(:requiree) do |of|
> > h[of]
> > end
> >
> > r = method :require
> > define_method(:require) do |*a|
> > r.call *a
> > h[a.first] = caller
> > end
> > end
> >
> > }
>
> Doh! Of course!
>
> Thanks Ara, that allowed me to figure it out.
>
> Turns out using 'load' to load the test rather then passing it
> straight to the ruby command, for some reason, gives test/unit the
> idea that it should go out and hunt for every file it can find with a
> test in it, including the copies in pkg/. That seems nuts me, but now
> I recall having to specify some parameter to reign test/unit in before
> --don't recall off hand what it was though. I'll have to track that
> down. In any case
>
> test_files.each do |file|
> sh %{ruby -e #{file} >> #{output}}
> end
>
> works, and that's good enough.

Just out of curiosity: why don't you use the test packages mechanisms
to run multiple tests (TestSuite)?

Kind regards

robert

--
use.inject do |as, often| as.you_can - without end

Trans

11/2/2007 2:22:00 PM

0



On Nov 2, 5:40 am, "Robert Klemme" <shortcut...@googlemail.com> wrote:
> 2007/11/2, Trans <transf...@gmail.com>:
>
>
>
>
>
> > On Nov 1, 10:38 pm, "ara.t.howard" <ara.t.how...@gmail.com> wrote:
> > > On Nov 1, 2007, at 6:18 PM, Trans wrote:
>
> > > > Is there any way to ask a file what other file require/load 'd it? I
> > > > imagine this has been asked before but I couldnt seem to find good
> > > > terms to search for it.
>
> > > cfp:~ > cat a.rb
> > > p Kernel.requiree('main')
>
> > > require 'b'
>
> > > p Kernel.requiree('main')
>
> > > BEGIN {
> > > module Kernel
> > > h = Hash.new
> > > define_method(:requiree) do |of|
> > > h[of]
> > > end
>
> > > r = method :require
> > > define_method(:require) do |*a|
> > > r.call *a
> > > h[a.first] = caller
> > > end
> > > end
>
> > > }
>
> > Doh! Of course!
>
> > Thanks Ara, that allowed me to figure it out.
>
> > Turns out using 'load' to load the test rather then passing it
> > straight to the ruby command, for some reason, gives test/unit the
> > idea that it should go out and hunt for every file it can find with a
> > test in it, including the copies in pkg/. That seems nuts me, but now
> > I recall having to specify some parameter to reign test/unit in before
> > --don't recall off hand what it was though. I'll have to track that
> > down. In any case
>
> > test_files.each do |file|
> > sh %{ruby -e #{file} >> #{output}}
> > end
>
> > works, and that's good enough.
>
> Just out of curiosity: why don't you use the test packages mechanisms
> to run multiple tests (TestSuite)?

I need to keep them isolated to make sure they all work on their own.
How would you use the test/unit mechanisms to do that?

Thanks,
T.


ara.t.howard

11/2/2007 3:17:00 PM

0


On Nov 2, 2007, at 12:35 AM, Joel VanderWerf wrote:

> Maybe to avoid exposing the constant, H?

yes that's it - holding the state via closure saves namespace.
sometimes it's not possible, but it seems like a good idea to try it
first.

cheers.

a @ http://codeforp...
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama




Robert Klemme

11/2/2007 5:26:00 PM

0

On 02.11.2007 15:21, transfire@gmail.com wrote:
>
> On Nov 2, 5:40 am, "Robert Klemme" <shortcut...@googlemail.com> wrote:
>> 2007/11/2, Trans <transf...@gmail.com>:
>>
>>
>>
>>
>>
>>> On Nov 1, 10:38 pm, "ara.t.howard" <ara.t.how...@gmail.com> wrote:
>>>> On Nov 1, 2007, at 6:18 PM, Trans wrote:
>>>>> Is there any way to ask a file what other file require/load 'd it? I
>>>>> imagine this has been asked before but I couldnt seem to find good
>>>>> terms to search for it.
>>>> cfp:~ > cat a.rb
>>>> p Kernel.requiree('main')
>>>> require 'b'
>>>> p Kernel.requiree('main')
>>>> BEGIN {
>>>> module Kernel
>>>> h = Hash.new
>>>> define_method(:requiree) do |of|
>>>> h[of]
>>>> end
>>>> r = method :require
>>>> define_method(:require) do |*a|
>>>> r.call *a
>>>> h[a.first] = caller
>>>> end
>>>> end
>>>> }
>>> Doh! Of course!
>>> Thanks Ara, that allowed me to figure it out.
>>> Turns out using 'load' to load the test rather then passing it
>>> straight to the ruby command, for some reason, gives test/unit the
>>> idea that it should go out and hunt for every file it can find with a
>>> test in it, including the copies in pkg/. That seems nuts me, but now
>>> I recall having to specify some parameter to reign test/unit in before
>>> --don't recall off hand what it was though. I'll have to track that
>>> down. In any case
>>> test_files.each do |file|
>>> sh %{ruby -e #{file} >> #{output}}
>>> end
>>> works, and that's good enough.
>> Just out of curiosity: why don't you use the test packages mechanisms
>> to run multiple tests (TestSuite)?
>
> I need to keep them isolated to make sure they all work on their own.
> How would you use the test/unit mechanisms to do that?

I am not sure what you mean by "on their own". Do you expect side
effects from test executions? From what I understand a TestCase should
ideally be independent and probably also side effect free. Then you
could easily lump them into a single TestSuite. The only issue I can
think of off the top of my head would be class instance variables and
required files which might yield different results - but then again,
relying on a specific require order is probably not a good idea in its own.

Kind regards

robert

Trans

11/2/2007 6:45:00 PM

0



On Nov 2, 1:30 pm, Robert Klemme <shortcut...@googlemail.com> wrote:
> On 02.11.2007 15:21, transf...@gmail.com wrote:
>
>
>
>
>
> > On Nov 2, 5:40 am, "Robert Klemme" <shortcut...@googlemail.com> wrote:
> >> 2007/11/2, Trans <transf...@gmail.com>:
>
> >>> On Nov 1, 10:38 pm, "ara.t.howard" <ara.t.how...@gmail.com> wrote:
> >>>> On Nov 1, 2007, at 6:18 PM, Trans wrote:
> >>>>> Is there any way to ask a file what other file require/load 'd it? I
> >>>>> imagine this has been asked before but I couldnt seem to find good
> >>>>> terms to search for it.
> >>>> cfp:~ > cat a.rb
> >>>> p Kernel.requiree('main')
> >>>> require 'b'
> >>>> p Kernel.requiree('main')
> >>>> BEGIN {
> >>>> module Kernel
> >>>> h = Hash.new
> >>>> define_method(:requiree) do |of|
> >>>> h[of]
> >>>> end
> >>>> r = method :require
> >>>> define_method(:require) do |*a|
> >>>> r.call *a
> >>>> h[a.first] = caller
> >>>> end
> >>>> end
> >>>> }
> >>> Doh! Of course!
> >>> Thanks Ara, that allowed me to figure it out.
> >>> Turns out using 'load' to load the test rather then passing it
> >>> straight to the ruby command, for some reason, gives test/unit the
> >>> idea that it should go out and hunt for every file it can find with a
> >>> test in it, including the copies in pkg/. That seems nuts me, but now
> >>> I recall having to specify some parameter to reign test/unit in before
> >>> --don't recall off hand what it was though. I'll have to track that
> >>> down. In any case
> >>> test_files.each do |file|
> >>> sh %{ruby -e #{file} >> #{output}}
> >>> end
> >>> works, and that's good enough.
> >> Just out of curiosity: why don't you use the test packages mechanisms
> >> to run multiple tests (TestSuite)?
>
> > I need to keep them isolated to make sure they all work on their own.
> > How would you use the test/unit mechanisms to do that?
>
> I am not sure what you mean by "on their own". Do you expect side
> effects from test executions? From what I understand a TestCase should
> ideally be independent and probably also side effect free. Then you
> could easily lump them into a single TestSuite. The only issue I can
> think of off the top of my head would be class instance variables and
> required files which might yield different results - but then again,
> relying on a specific require order is probably not a good idea in its own.

There are a couple of aspects to isolating the tests. The main one is
just making sure that a lib requires all the libs it needs to operate.
Sometimes one lib gets loaded that requires something that another
will use, so if they are both loaded you can't tell if they can act
independently. Also, it is possible that some libs are meant as
options, ie you use one or the other, but not both. I imagine there
may well be other reasons. To be thorough, I run tests in isolation,
in pairs, and as a whole. Really this has more to do with the nature
of Facets. Facets isn't just a single library, it's a (lightly
integrated) collection of them.

T.


Robert Klemme

11/2/2007 11:21:00 PM

0

On 02.11.2007 19:45, transfire@gmail.com wrote:
>
> On Nov 2, 1:30 pm, Robert Klemme <shortcut...@googlemail.com> wrote:
>> On 02.11.2007 15:21, transf...@gmail.com wrote:
>>
>>
>>
>>
>>
>>> On Nov 2, 5:40 am, "Robert Klemme" <shortcut...@googlemail.com> wrote:
>>>> 2007/11/2, Trans <transf...@gmail.com>:
>>>>> On Nov 1, 10:38 pm, "ara.t.howard" <ara.t.how...@gmail.com> wrote:
>>>>>> On Nov 1, 2007, at 6:18 PM, Trans wrote:
>>>>>>> Is there any way to ask a file what other file require/load 'd it? I
>>>>>>> imagine this has been asked before but I couldnt seem to find good
>>>>>>> terms to search for it.
>>>>>> cfp:~ > cat a.rb
>>>>>> p Kernel.requiree('main')
>>>>>> require 'b'
>>>>>> p Kernel.requiree('main')
>>>>>> BEGIN {
>>>>>> module Kernel
>>>>>> h = Hash.new
>>>>>> define_method(:requiree) do |of|
>>>>>> h[of]
>>>>>> end
>>>>>> r = method :require
>>>>>> define_method(:require) do |*a|
>>>>>> r.call *a
>>>>>> h[a.first] = caller
>>>>>> end
>>>>>> end
>>>>>> }
>>>>> Doh! Of course!
>>>>> Thanks Ara, that allowed me to figure it out.
>>>>> Turns out using 'load' to load the test rather then passing it
>>>>> straight to the ruby command, for some reason, gives test/unit the
>>>>> idea that it should go out and hunt for every file it can find with a
>>>>> test in it, including the copies in pkg/. That seems nuts me, but now
>>>>> I recall having to specify some parameter to reign test/unit in before
>>>>> --don't recall off hand what it was though. I'll have to track that
>>>>> down. In any case
>>>>> test_files.each do |file|
>>>>> sh %{ruby -e #{file} >> #{output}}
>>>>> end
>>>>> works, and that's good enough.
>>>> Just out of curiosity: why don't you use the test packages mechanisms
>>>> to run multiple tests (TestSuite)?
>>> I need to keep them isolated to make sure they all work on their own.
>>> How would you use the test/unit mechanisms to do that?
>> I am not sure what you mean by "on their own". Do you expect side
>> effects from test executions? From what I understand a TestCase should
>> ideally be independent and probably also side effect free. Then you
>> could easily lump them into a single TestSuite. The only issue I can
>> think of off the top of my head would be class instance variables and
>> required files which might yield different results - but then again,
>> relying on a specific require order is probably not a good idea in its own.
>
> There are a couple of aspects to isolating the tests. The main one is
> just making sure that a lib requires all the libs it needs to operate.
> Sometimes one lib gets loaded that requires something that another
> will use, so if they are both loaded you can't tell if they can act
> independently. Also, it is possible that some libs are meant as
> options, ie you use one or the other, but not both. I imagine there
> may well be other reasons. To be thorough, I run tests in isolation,
> in pairs, and as a whole. Really this has more to do with the nature
> of Facets. Facets isn't just a single library, it's a (lightly
> integrated) collection of them.

Makes perfectly sense to me. Thanks for the explanation. This would
make it interesting to have something like transactions built into the
interpreter - that way you could undefine stuff without having to
execute a new interpreter. I should go to bed now before I come up with
more silly ideas.

Kind regards

robert