[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Using configuration files (replacing shellscripts

Karl Voit

10/6/2006 7:47:00 AM

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
6 Answers

Jim Crossley

10/6/2006 11:38:00 AM

0

Hi...

Karl Voit <devnull@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

10/6/2006 12:03:00 PM

0

* Jim Crossley <jim@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

10/6/2006 12:47:00 PM

0

Karl Voit <devnull@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

10/6/2006 1:37:00 PM

0


Karl Voit wrote:
> * Jim Crossley <jim@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.

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

10/6/2006 2:05:00 PM

0

poopdeville

10/10/2006 7:57:00 PM

0

Jim Crossley wrote:
> Hi...
>
> Karl Voit <devnull@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

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