Forum: Ruby FILE test

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Daf54d45d90f3cfa77f8b2ba778af15a?d=identicon&s=25 raving_ruby_rider (Guest)
on 2006-02-21 15:59
(Received via mailing list)
I noticed that a lot of scripts apply the following coding pattern:

if __FILE__ == $0
....
end

I know what is does but what kind of problems does it solve?

thx,

used-to-be-a-Smalltalker
4299e35bacef054df40583da2d51edea?d=identicon&s=25 James Gray (bbazzarrakk)
on 2006-02-21 16:17
(Received via mailing list)
On Feb 21, 2006, at 8:58 AM, raving_ruby_rider wrote:

> I noticed that a lot of scripts apply the following coding pattern:
>
> if __FILE__ == $0
> ....
> end
>
> I know what is does but what kind of problems does it solve?

It allows the file to be both a library (when required the if
statement will not run) and executable.

Hope that helps.

James Edward Gray II
6d9bf78ca49a017e9e3e6b0357b6c59e?d=identicon&s=25 Peter Hickman (Guest)
on 2006-02-21 16:24
(Received via mailing list)
You will see this sort of thing in other scripting languages. __FILE__
contains the name of the file source file and $0 is the name of the
currently executing script. So a file called hello.rb

class Hello
    def initialize(name)
        @name = name
    end

    def greet
        puts "Hello #{@name}"
    end
end

if __FILE__ == $0 then
    h = Hello.new('World')
    h.greet
end

you can then run this file with ruby hello.rb which will run the code at
the bottom. However with tom.rb

require 'hello'

h = Hello.new('tom')
h.greet

when you run tom.rb the __FILE__ == $0 part of hello does not run as the
file hello.rb but the currently executing script is tom.rb. This allows
you to have a ruby file hold the class for inclusion by other scripts
and also be a utility script in it's own right.
Cfdeff3ac35010e4de8f85d954f24f4a?d=identicon&s=25 Damphyr (Guest)
on 2006-02-21 20:26
(Received via mailing list)
Peter Hickman wrote:
> You will see this sort of thing in other scripting languages. __FILE__
> contains the name of the file source file and $0 is the name of the
> currently executing script. So a file called hello.rb
>
...
> when you run tom.rb the __FILE__ == $0 part of hello does not run as the
> file hello.rb but the currently executing script is tom.rb. This allows
> you to have a ruby file hold the class for inclusion by other scripts
> and also be a utility script in it's own right.
>
Not to mention the fact that it allows you to easily write unit tests
for most of the code in a script.
V.-

--
http://www.braveworld.net/riva
430ea1cba106cc65b7687d66e9df4f06?d=identicon&s=25 David Vallner (Guest)
on 2006-02-22 02:16
(Received via mailing list)
DÅ?a Utorok 21 Február 2006 20:25 Damphyr napísal:
> > and also be a utility script in it's own right.
>
> Not to mention the fact that it allows you to easily write unit tests
> for most of the code in a script.
>

Which I personally can't bear the sight of. Library is script is test?
Nuh-uh.
Just my two cents.

David Vallner
Ddbfebb47432f6599da361df6a135c7c?d=identicon&s=25 Adam Shelly (Guest)
on 2006-02-22 21:01
(Received via mailing list)
On 2/21/06, David Vallner <david@vallner.net> wrote:
> Which I personally can't bear the sight of. Library is script is test? Nuh-uh.

So what is the 'ruby way' to store your unit tests?  A separate
require'd file?
171ea139761951336b844e708d1547ab?d=identicon&s=25 James Byrne (byrnejb)
on 2006-02-22 22:13
Adam Shelly wrote:

> So what is the 'ruby way' to store your unit tests?  A separate
> require'd file?

Well, going by the Pickaxe book you end up with something like this:

./classfilename
->/doc
->/lib
->/test

in ./classfilename/lib you create your ruby source file classfilename.rb
in ./classfilename/test you create your ruby test/unit file
classfilename_tc.rb

In classfilename_tc.rb you put the following lines at the start:

#----------------------------------------------------------------
# The following prefixes ../lib to the active ruby load path
$:.unshift File.join(File.dirname(__FILE__), "..", "lib")

require 'test/unit'
require 'classfilename'

class Test_ClassFileName  < Test::Unit::TestCase
...
#----------------------------------------------------------------

and then write your test cases as methods.  When you run your test suite
you can invoke it from any palce on the system as the #unshift prefixes
the load path with the relative location of the classfilename.rb with
respect to the test case file.

Thus, assuming that for the example given above that ./ = ~/ruby then:

#ruby -w ~/ruby/classfilename/test/classfilename_tc.rb

will work whatever pwd you are in.

I love test/unit...

Regards,
Jim
Cfdeff3ac35010e4de8f85d954f24f4a?d=identicon&s=25 Damphyr (Guest)
on 2006-02-23 16:20
(Received via mailing list)
David Vallner wrote:
>>> and also be a utility script in it's own right.
>> Not to mention the fact that it allows you to easily write unit tests
>> for most of the code in a script.
>>
>
> Which I personally can't bear the sight of. Library is script is test? Nuh-uh.
> Just my two cents.
Well I actually put the unit tests in a different file.
The if $0==__FILE__ check allows me to require the script in the unit
test file.
Following mostly the DRY principle and having a knack for organizing
code allows you to group most of the functionality in objects (at which
point you put them in a 'library' file and forget about it) or methods
to be used by the 'top-level' script. Requiring the 'script' file allows
me to unit test the methods without contriving manual tests.
I found it most valuable when I do parameter parsing and
parameter/configuration validation in my command line scripts.
Cheers,
V.-

--
http://www.braveworld.net/riva
This topic is locked and can not be replied to.