Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Getting a file location and name...

0 views
Skip to first unread message

Joe Van Dyk

unread,
Oct 21, 2005, 4:37:52 PM10/21/05
to
Hi,

Say I have /joe/configuration/config.rb:
==============================
puts "this configuration file is located in this directory: " +
File.dirname( ????? )
eval File.read(File.dirname( ?????? ) + "/common.rb")
# other stuff
==============================

common.rb is located in /joe/configuration. It also contains some Ruby code.


The main program looks something like this:
==============================
config_file = ARGV.shift
eval File.read config_file
==============================

And I'd start the program via 'ruby main.rb /joe/configuration.rb'.

So, I have a main program that reads in a Ruby configuration file that
can also read other configuration files that are in a relative
directory. I'm having problems with the relative directory part. If
I hardcode the directory paths, everything's ok. But I don't want
/joe/configuration/config.rb to know that it's in /joe/configuration.
I just want that configuration file to be able to read
/joe/configuration/common.rb.

Sorry if this is confusing, let me know if I can clarify the question.

Joe


Ryan Leavengood

unread,
Oct 21, 2005, 5:12:25 PM10/21/05
to
On 10/21/05, Joe Van Dyk <joev...@gmail.com> wrote:
>
> So, I have a main program that reads in a Ruby configuration file that
> can also read other configuration files that are in a relative
> directory. I'm having problems with the relative directory part. If
> I hardcode the directory paths, everything's ok. But I don't want
> /joe/configuration/config.rb to know that it's in /joe/configuration.
> I just want that configuration file to be able to read
> /joe/configuration/common.rb.
>
> Sorry if this is confusing, let me know if I can clarify the question.

Don't worry Joe, this is a common problem, and fairly easily solved.
All you have to do is use Ruby's built-in library search path code,
with a special addition:

config.rb:

# Adds the directory containing this code to the search path
$:.unshift File.dirname(File.expand_path(__FILE__))
# Now require will work
require 'common'

Ryan


Joel VanderWerf

unread,
Oct 21, 2005, 5:18:16 PM10/21/05
to

What about something like

def with_load_path(path)
$LOAD_PATH.unshift path
yield
ensure
$LOAD_PATH.shift
end

Then use that around your #eval call in the main program, with the
'/joe/configuration' as the argument. Then require should work relative
to the path you gave. (But note that $LOADED_FEATURES will prevent files
with the same name from being loaded again, even if in a different
config dir.)

Not thread safe, but oh well.

Another option: my "script" lib (see RAA). That makes sure that the
global $LOADED_FEATURES doesn't get affected.

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


Robert Klemme

unread,
Oct 22, 2005, 8:00:33 AM10/22/05
to
Joe Van Dyk <joev...@gmail.com> wrote:
> Hi,
>
> Say I have /joe/configuration/config.rb:
> ==============================
> puts "this configuration file is located in this directory: " +
> File.dirname( ????? )
> eval File.read(File.dirname( ?????? ) + "/common.rb")
> # other stuff
> ==============================
>
> common.rb is located in /joe/configuration. It also contains some
> Ruby code.
>
>
> The main program looks something like this:
> ==============================
> config_file = ARGV.shift
> eval File.read config_file

IMHO eval is completely superfluous here: just do

load config_file


> ==============================
>
> And I'd start the program via 'ruby main.rb /joe/configuration.rb'.
>
> So, I have a main program that reads in a Ruby configuration file that
> can also read other configuration files that are in a relative
> directory. I'm having problems with the relative directory part. If
> I hardcode the directory paths, everything's ok. But I don't want
> /joe/configuration/config.rb to know that it's in /joe/configuration.
> I just want that configuration file to be able to read
> /joe/configuration/common.rb.

If those other files do only belong to your config.rb (and are no files that
you wish to require) then you can do this in config.rb

base = File.basename __FILE__

load File.join(base, "common.rb")

File.open(File.join(base, "common.rb") do |io|
...
end

File.open(File.join(base, "etc", "lib", "whatever.conf") do |io|
...
end

Kind regards

robert

itsme213

unread,
Oct 22, 2005, 12:17:48 PM10/22/05
to
From http://extensions.rubyforge.org/rdoc/classes/Kernel.html
# File lib/extensions/kernel.rb, line 38
def require_relative(path)
require File.join(File.dirname(caller[0]), path.to_str)
end

Then simply:
require_relative "common"
or
require_relative "../../foo/bar/common"

"Joe Van Dyk" <joev...@gmail.com> wrote in message

0 new messages