FILE test

R

raving_ruby_rider

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
 
J

James Edward Gray II

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
 
P

Peter Hickman

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.
 
D

Damphyr

Peter said:
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

____________________________________________________________________
http://www.freemail.gr - äùñåÜí õðçñåóßá çëåêôñïíéêïý ôá÷õäñïìåßïõ.
http://www.freemail.gr - free email service for the Greek-speaking.
 
D

David Vallner

D=C5=88a Utorok 21 Febru=C3=A1r 2006 20:25 Damphyr nap=C3=ADsal:
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.=20
Just my two cents.

David Vallner
 
A

Adam Shelly

Which I personally can't bear the sight of. Library is script is test? Nu=
h-uh.

So what is the 'ruby way' to store your unit tests? A separate require'd f=
ile?
 
J

James Byrne

Adam said:
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
 
D

Damphyr

David said:
D=C5=88a Utorok 21 Febru=C3=A1r 2006 20:25 Damphyr nap=C3=ADsal:
=20
Which I personally can't bear the sight of. Library is script is test? = Nuh-uh.=20
Just my two cents.
Well I actually put the unit tests in a different file.
The if $0=3D=3D__FILE__ check allows me to require the script in the unit=
=20
test file.
Following mostly the DRY principle and having a knack for organizing=20
code allows you to group most of the functionality in objects (at which=20
point you put them in a 'library' file and forget about it) or methods=20
to be used by the 'top-level' script. Requiring the 'script' file allows=20
me to unit test the methods without contriving manual tests.
I found it most valuable when I do parameter parsing and=20
parameter/configuration validation in my command line scripts.
Cheers,
V.-

--=20
http://www.braveworld.net/riva

____________________________________________________________________
http://www.freemail.gr - =E4=F9=F1=E5=DC=ED =F5=F0=E7=F1=E5=F3=DF=E1 =E7=EB=
=E5=EA=F4=F1=EF=ED=E9=EA=EF=FD =F4=E1=F7=F5=E4=F1=EF=EC=E5=DF=EF=F5.
http://www.freemail.gr - free email service for the Greek-speaking.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top