Using configuration files (replacing shellscripts)

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! :frowning:
| […]
| }
|
| $files = {
| ‘file1’ = $directories[‘path1’]+’/foo’, # problem!
| […]
| }
|
| $values = { … }
`----

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

Hi…

Karl V. [email protected] 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

Hi…

Hi!

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 V. [email protected] writes:

[…]

| 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

Karl V. wrote:

database: demodb

`----

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 :frowning:

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

T.

On Fri, 6 Oct 2006, Trans wrote:

| 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

Jim C. wrote:

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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs