O, a configuration gem for Ruby
====================================
**Homepage**: [https://github.com/GutenYe/o](https://github.com/GutenYe/o)
**Author**: Guten
**License**: MIT-LICENSE
**Documentation**: [http://rubydoc.info/gems/o/frames](http://rubydoc.info/gems/o/frames)
**Issue Tracker**: [https://github.com/GutenYe/o/issues](https://github.com/GutenYe/o/issues)
The name `o` comes from option/setting, short and handy, eh-ah~
Features
--------
* Variable and computed attribute support
* Pure Ruby DSL syntax
* Multiple configuration levels including system, user, and command-line.
* Hash compatibility
Introduction
-------------
The three levels of configuration include system, user, and cmdline:
APP/lib/guten/rc.rb # system level
~/.gutenrc # user level
$ guten --list or ENV[GEMFILE]=x guten # cmdline level
module Guten
Rc = O.require("guten/rc") + O.require("~/.gutenrc") # require use $:
Rc.list = true or Rc.gemfile = ENV[GEMFILE] # from cmdline.
end
a constant works very well in many places, but you are free to use any variable.
### An example ###
Rc = O do
host "localhost"
port 8080
mail.stmp.address "stmp.gmail.com"
my.development do # namespace
adapter "postgresql"
database "hello_development"
username "guten"
end
time proc{|offset| Time.now} # computed attribute
end
### An example using alternative syntax ###
Rc = O do |c|
c.host = "localhost"
c.port = 8080
c.mail.stmp.address "stmp.gmail.com"
my.development do |c|
c.adapter = "mysql2"
c.database = "hello"
c.username = "guten"
end
c.time = proc{|offset| Time.now}
end
### An example of some sugar syntax. _works in a file only_ ###
# file: guten/rc.rb
development:
adapter "mysql2"
database "hello"
username "guten"
#=>
development do
adapter "mysql2"
database "hello"
username "guten"
end
**NOTE**: This is not pure ruby syntax, but it works.
In order for this to work, a tab ("\t") must be used for indention.
### Initialize ###
In order to initialize the configuration object either of the two ways can be used.
Rc = O.new
Rc = O.require "guten/rc" # from file
Rc = O do
a 1
end
Rc = O[a: 1] # from a hash data
Rc._merge!(a: 1)
file: "guten/rc.rb"
a 1
Initalize with a default value
Rc = O.new
p Rc[:hello] #=> nil
Rc = O.new 1
p Rc[:hello] #=> 1
p Rc.hello #=> <#O> be careful here
### Assignment & Access ###
Flexibility has been built in to allow for various ways to assign configuration
data values and access the same values within your application. Here are some
examples of how this can be done:
Assignment:
Rc.age 1
Rc.age = 1
Rc[:age] = 1
Rc["age"] = 1
Access:
Rc.age #=> 1
Rc.age? #=> true
Rc[:age] #=> 1
Rc["age"] #=> 1
---
O do |c|
age 2
c.age = 2
c[:age] = 2
end
### Node ###
Rc = O.new
Rc.a.b.c = 1
p Rc.a.b.c #=> <#Fixnum 1>
p Rc.a.b #=> <#O>
p Rc.a #=> <#O>
p Rc.i.dont.exists #=> <#O>
Rc = O.new
p Rc.a._empty? #=> true # if a node is empty?
Rc.a.b = 1
p Rc.a._empty? #=> false
p O===Rc.a #=> true # if it is a node?
p O===Rc.a.b #=> false
### Variable & Path ###
O do
age 1
p age #=> 1
my do
age 2
friend do
age 3
p age #=> 3
p __.age #=> 2 __ is relative up to 1 times
p ___.age #=> 1 ___ and so on is relative up to 2 and so on times
p _.age #=> 1 _ is root
end
end
end
### Namespace ###
Either way is fine:
O do
mail.stmp.address "stmp.gmail.com"
mail.stmp do
address "stmp.gmail.com"
end
end
Another namespace example:
O do
age 1
my do
age 2
end
my.friend do
age 3
end
end
### Group ###
Use namespace or use some separate files like rails.
config/
applications.rb
environments/
development.rb
test.rb
production.rb
### Computed attribute ###
Rc = O do
time proc{|n| Time.now}
end
p Rc.time # print current time. no need Rc.time.call()
p Rc.time(2) # call time
Rc.time = 2 # assign new value
p Rc[:time] #=> <#Proc>
### Semantic ###
O do
is_started no # yes ...
end
Note: for a list of semantic methods, see O::Semantics
### Hash compatibility ###
Internal, datas are stored as a Hash. You can access all hash methods via `_method`
Rc = O.new
Rc.a = 1
Rc._child #=> {:a=>1}
Rc._keys #=> [:a]
### Temporarily change ###
Rc.a = 1
Rc._temp do
Rc.a = 2
end
p Rc.a #=> 1
### Access built-in method inside block ###
Rc = O do
sleep 10 # is a data. Rc.sleep #=> 10
O.sleep 10 # call builtin 'sleep' method
end
Note: for a list of blocked methods, see O::BUILTIN_METHODS
### Additional examples ###
O do
name do
first "Guten"
last "Ye"
is "#{first} #{last}"
end
end
\# file: a.rb
c = self
c.host = "localhost"
c.port = 8080
c.name do |c|
c.first = "Guten"
end
Contributing
-------------
* Feel free to join the project and make contributions (by submitting a pull request)
* Submit any bugs/features/ideas to github issue tracker
* Codeing style: https://gist.github.com/1105334
Install
----------
gem install o
Resources
---------
* [konfigurator](https://github.com/nu7hatch/konfigurator) Small and flexible configuration toolkit inspired i.a. by Sinatra settings
* [configatron](https://github.com/markbates/configatron) A super cool, simple, and feature rich configuration system for Ruby apps
* [simpleconfig](https://github.com/lukeredpath/simpleconfig) make application-wide configuration settings easy to set and access in an object-oriented fashion
* [configuration](https://github.com/ahoward/configuration) pure ruby scoped configuration files
Copyright
---------
Copyright © 2011 by Guten. this library released under MIT-LICENSE, See {file:LICENSE} for futher details.