[Bioperl-l] hardcoded paths in test scripts (II)
Hilmar Lapp
lapp@gnf.org
Tue, 27 Feb 2001 19:04:02 -0800
Todd Richmond wrote:
>
> Rooting around in the Root::IO.pm ...
>
> eval {
> require File::Spec;
> $FILESPECLOADED = 1;
> $TEMPDIR = File::Spec->tmpdir();
> $ROOTDIR = File::Spec->rootdir();
> require File::Temp; # tempfile creation
> };
>
> This is a bad idea for now. File::Spec works just fine on MacOS so $TEMPDIR
> and $ROOTDIR are set properly. File::Temp on the other hand, doesn't work
> and so probably shouldn't be lumped into this eval.
Shouldn't be a problem because exceptions are caught afterwards. So,
if the last require fails, the settings obtained from File::Spec
should be active and fine. The exception catch code checks what
actually failed. It's like a try {} catch, but maybe I was erroneously
assuming that it works the same way in perl as it does in C++ or Java.
>
> Meanwhile the fix for cross-compatibility completely broke things on a Mac
> :)
>
> Here's a fix for Bio::Root::IO->catfile
>
> sub catfile {
> my ($self, @args) = @_;
>
> if ($^O =~ /macos/i) {
> my $file = ':'. File::Spec->catfile(@args);
So this means that even File::Spec is doing it wrong. What's the
meaning of the initial ':'? The root dir? (I somewhere read that there
is no such thing as a root dir on Macs ... :o )
> return $file;
> }
> return File::Spec->catfile(@args) if(exists($INC{"File/Spec.pm"}));
> # this is clumsy and not very appealing, but how do we specify the
> # root directory?
> if($args[0] eq '/') {
> $args[0] = $ROOTDIR;
> }
> return join($PATHSEP, @args);
> }
>
> By the way, does if(exists($INC{"File/Spec.pm"})) actually work on Unix? In
It does. I actually took this from the Perl POD for 'require'. The
claim there was that this is what 'require' internally does. Maybe not
on Macs ...
> certainly doesn't work on Macs - even if you change the '/' to ':' or '::'
> I didn't worry about it because I'm pretty sure File::Spec is standard on
> MacOS.
Well, then we simply add a second variable ($FILETEMPLOADED) to
Bio::Root::IO.pm. I thought $FILESPECLOADED was already redundant, but
now I see that it's not on Macs.
Man, this beast is reluctant, but not much longer.
The nice thing about all this is that now we have a single place in
the code where all this is done. So, it should be fairly safe to even
change the code for catfile() completely (provided it works :)
As for your second mail, your code sample there actually suggests that
IO::File might be the better bet for creating tempfiles than
File::Temp. An issue might be the specification of parameters, like in
which directory to create the tempfile; and does IO::File also have a
method for creating a tempdir?
Hilmar
--
-------------------------------------------------------------
Hilmar Lapp email: lapp@gnf.org
GNF, San Diego, Ca. 92121 phone: +1-858-812-1757
-------------------------------------------------------------