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

Using configuration files (replacing shellscripts)

4 views
Skip to first unread message

Karl Voit

unread,
Oct 6, 2006, 3:46:55 AM10/6/06
to
Hi!

I want to use configuration files in order to save values, directories,
and files. I did some googeling to find out that the ruby community
often suggests ruby-files (hashes) to save configurations. These
rb-files are read in by interpreting. (btw, anyone suggests a cool
part of code for this with errorhandling and so on?)

But I do have some problems with that method:

,----[ shellscript configuration example ]
| export value1=42
| export value2=23
| export path1=/some/where
| export path2=$path1/else
| export file1=$path1/foo
| export file2=$path2/bar
`----

First, I tried to replace it 1:1 using ruby but failed when it came to
reusing values:

,----[ woun't run ]
| $config = {
| 'value1' => '42',
| 'value2' => '23',
| 'path1' => '/some/where',
| 'path2' => $config['path1']+'/else',
| [...]
| }
`----

Is there a way to accomplish this in another way? (using self or
something like that)

Meanwhile I did a workaround:

,----[ Workaround ]
| $directories = {
| 'path1' => '/some/where',
| 'path2' => '/some/where/else', # redundancy! :-(
| [...]
| }
|
| $files = {
| 'file1' = $directories['path1']+'/foo', # problem!
| [...]
| }
|
| $values = { ... }
`----

This did not work out either. How can I solve my problem?

--
Karl Voit

Jim Crossley

unread,
Oct 6, 2006, 7:37:31 AM10/6/06
to
Hi...

Karl Voit <dev...@Karl-Voit.at> writes:

> I want to use configuration files in order to save values,
> directories, and files. I did some googeling to find out that the
> ruby community often suggests ruby-files (hashes) to save
> configurations. These rb-files are read in by interpreting. (btw,
> anyone suggests a cool part of code for this with errorhandling and
> so on?)

If I understand what you're asking for, you may want to have a look at
YAML. Your config file can look like this:

####
adapter: mysql
database: demodb
username: karl
password: pa$$w0rd
socket: /var/lib/mysql/mysql.sock
####

Turning that file into a ruby hash is a one-liner...

require 'yaml'
dbconfig = YAML::load(IO.read('config.yml'))
assert_equal('karl', dbconfig[:username])

Jim

Karl Voit

unread,
Oct 6, 2006, 8:02:47 AM10/6/06
to
* Jim Crossley <j...@crossleys.org> wrote:
> Hi...

Hi!

> If I understand what you're asking for, you may want to have a look at
> YAML. Your config file can look like this:
>
> ####
> adapter: mysql
> database: demodb
> username: karl
> password: pa$$w0rd
> socket: /var/lib/mysql/mysql.sock
> ####
>
> Turning that file into a ruby hash is a one-liner...

Thanks for the hint.

Is is possible to reduce the redundancy of

,----
| basedir: /this/directory
| logdir: /this/directory/log
`----

to something like that?

,----
| basedir: /this/directory
| logdir: $basedir/log
`----

I have to use this in the configs quite often.

TNX!

--
Karl Voit

Jim Crossley

unread,
Oct 6, 2006, 8:46:43 AM10/6/06
to
Karl Voit <dev...@Karl-Voit.at> writes:

[...]

> Is is possible to reduce the redundancy of
>
> ,----
> | basedir: /this/directory
> | logdir: /this/directory/log
> `----
>
> to something like that?
>
> ,----
> | basedir: /this/directory
> | logdir: $basedir/log
> `----

I'm not sure about that. YAML has the concept of "aliases" and
"anchors" which are close to what you're asking for, but I'm not sure
it would be possible to concatenate an anchor with a plain string.
Perhaps someone more YAML-savvy will chime in.

Sorry,
Jim

Trans

unread,
Oct 6, 2006, 9:36:42 AM10/6/06
to

I've been asking for interpolation in YAML for a while now. Either the
feature or I am being ignored :-(

FYI, though. It's not to hard to create a two-pass filter to add this
functionity if you really need it.

T.

ara.t....@noaa.gov

unread,
Oct 6, 2006, 10:05:05 AM10/6/06
to
On Fri, 6 Oct 2006, Trans wrote:

>> Is is possible to reduce the redundancy of
>>
>> ,----
>> | basedir: /this/directory
>> | logdir: /this/directory/log
>> `----
>>
>> to something like that?
>>
>> ,----
>> | basedir: /this/directory
>> | logdir: $basedir/log
>> `----
>>
>> I have to use this in the configs quite often.

harp:~ > cat a.rb
# this would come from file

conf = <<'conf'

basedir "/this/directory"

logdir "#{ basedir }/log"

conf

require 'traits'
class Config < OpenTraits
def initialize(conf) instance_eval conf end
end

config = Config.new conf

p config.basedir
p config.logdir

harp:~ > ruby a.rb
"/this/directory"
"/this/directory/log"


-a
--
in order to be effective truth must penetrate like an arrow - and that is
likely to hurt. -- wei wu wei

poopd...@gmail.com

unread,
Oct 10, 2006, 3:56:38 PM10/10/06
to

I wrote something a bit more general. It assumes that the yaml file
serializes a Ruby hash. You'd probably want this to be a singleton
class, but my uses don't require that. Perhaps the OP would find it
useful:

class Parameters

require 'yaml'
def initialize(config_file)
@config = YAML.load(File.open(config_file))

# This creates a global variable for each entry in the yaml
configuration file.
# I recommend that this interface be deprecated in favor of using
accessor syntax.
# E.g. creating a Parameters object config = Parameters.new and
calling accessors
# on config.

@config.keys.each do |parameter|
eval('$' + "#{parameter} = @config[parameter]")
end

# This creates an accessor for each of the configuration entries in
the yaml
# configuration file.

@config.keys.each do |parameter|
eval("@#{parameter} = @config[parameter]")
self.class.class_eval {attr_reader parameter}
end
end
end

0 new messages