[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

[ANN] configuration.rb

ara.t.howard

2/9/2008 4:25:00 PM



NAME
configuration.rb

SYNOPSIS
pure ruby scoped configuration files

DESCRIPTION
configuration.rb provides a mechanism for configuring ruby programs
with
ruby configuration files. a configuration.rb file, for example
'config/app.rb', can be written simply as

Configuration.for('app'){
key 'value'
foo 'bar'
port 42
}

and loaded via the normal ruby require/load mechanism

Kernel.load 'config/app.rb'

or with a slightly augmented loading mechnanism which simply
searches an
extra set of paths in *addition* to the standard ones

Configuration.path = %w( config configuration )

Configuration.load 'app'

configurations are completely open

Configuration.for('app'){
object_id 'very open'
}

support arbitrarily nested values

Configuration.for('app'){
a { b { c { d 42 } } }
}

c = Configuration.for 'app'

p c.a.b.c.d #=> 42

allow POLS scoped lookup of vars

Configuration.for('config'){
outer 'bar'

inner {
value 42
}
}

c = Configuration.for 'config'

p c.outer #=> 'bar'
p c.inner.value #=> 42
p c.inner.outer #=> 'bar'


and not a whole lot else - configuration.rb is s very small library
consisting of one file and < 150 loc

SAMPLES

<========< samples/a.rb >========>

~ > cat samples/a.rb

#
# basic usage is quite, simple, load the config and use it's
values. the
# config syntax is fairly obvious, i think, but note that it *is*
ruby and any
# ruby can be included. also note that each config is named,
allowing
# multiple configs to be places in one file
#
require 'configuration'

c = Configuration.load 'a'

p c.a + c.b - c.c

~ > cat config/a.rb

Configuration.for('a'){
a 40
b 4
c 2
}

~ > ruby samples/a.rb

42


<========< samples/b.rb >========>

~ > cat samples/b.rb

#
# configuration.rb supports a very natural nesting syntax. note
how values
# are scoped in a POLS fashion
#
require 'configuration'

c = Configuration.for 'b'

p c.www.url
p c.db.url
p c.mail.url

~ > cat config/b.rb

Configuration.for('b'){
host "codeforpeople.com"

www {
port 80
url "http://#{ host }:#{ port }"
}

db {
port 5342
url "db://#{ host }:#{ port }"
}

mail {
host "gmail.com"
port 25
url "mail://#{ host }:#{ port }"
}
}

~ > ruby samples/b.rb

"http://codeforpeople.co...
"db://codeforpeople.com:5342"
"mail://gmail.com:25"


<========< samples/c.rb >========>

~ > cat samples/c.rb

#
# configuration.rb let's you keep code very dry.
#

require 'configuration'

Configuration.load 'c'

p Configuration.for('development').db
p Configuration.for('production').db
p Configuration.for('testing').db

~ > cat config/c.rb

%w( development production testing ).each do |environment|

Configuration.for(environment){
adapter "sqlite3"
db "db/#{ environment }"
}

end

~ > ruby samples/c.rb

"db/development"
"db/production"
"db/testing"


<========< samples/d.rb >========>

~ > cat samples/d.rb

#
# configuration.rb makes use of an external blank slate dsl, this
means that
# you Configuration objects do, in fact, have all built-in ruby
methods such
# as #inspect, etc, *unless* you configure over the top of them.
the effect
# is a configuration object that behaves like a nice ruby object,
but which
# allows *any* key to be configured
#
require 'configuration'

c = Configuration.for 'd'

p c.object_id
p c.inspect

~ > cat config/d.rb

Configuration.for('d'){
object_id 42
inspect 'forty-two'
}

~ > ruby samples/d.rb

42
"forty-two"


AUTHOR
ara.t.howard@gmail.com



enjoy.

a @ http://draw...
--
sleep is the best meditation.
h.h. the 14th dalai lama