Project

configure

0.0
No commit activity in last 3 years
No release in over 3 years
It provides a single-method interface that receives a block and returns well-structured configuration values.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 1.2
>= 2
 Project Readme

Configure¶ ↑

Configure offers an easy way for configure your application using a DSL. It provides a single-method interface that receives a block and returns well-structured configuration values.

Usage¶ ↑

The most simple way configure can be used is to pass a block to the Configure.process method and receive back a hash with the configuration values.

laser = Configure.process {
  label "red laser"
  wave_length 700
}

laser == {
  :label => "red laser",
  :wave_length => 700
} # => true

Nested configurations¶ ↑

It is also possible to pass blocks to configuration keys and combine multiple values to an array.

laser = Configure.process {
  label "red and violet pulse laser"
  pulse {
    wave_length 700
    duration 20
  }
  pulse {
    wave_length 400
    duration 20
  }
}

laser == {
  :label => "red and violet pulse laser",
  :pulse => [
    { :wave_length => 700, :duration => 20 },
    { :wave_length => 400, :duration => 20 }
  ]
} # => true

If arguments and a block is passed to a configuration key, the arguments are stored at the :arguments key inside the nested configuration.

laser = Configure.process {
  label "red pulse laser"
  pulse "test" {
    wave_length 700
    duration 20
  }
}

laser = {
  :label => "red pulse laser",
  :pulse => {
    :wave_length => 700,
    :duration => 20,
    :arguments => [ "test" ]
  }

} # => true

Schema¶ ↑

In order receive a more structured configuration, a schema can be passed to the Configure.process method. This schema is a simple hash, that can be created - off course - using the configure syntax ;-) (Guess how the schema-structure is defined internally ;-) )

Defaults¶ ↑

schema = Configure::Schema.build {
  defaults {
    wave_length 700
    duration 20
  }
}

laser = Configure.process(schema) {
  label "violet pulse laser"
  wave_length 400
}

laser = {
  :label => "violet pulse laser",
  :wave_length => 400,
  :duration => 20
} # => true

Nested schemas¶ ↑

Nested schema have to go to the nested section.

schema = Configure::Schema.build {
  nested {
    pulse {
      defaults {
        wave_length 700
        duration 20
      }
    }
  }
}

If a nested schema provides the key argument_keys, the arguments that have been passed along with the nested configuration, are stored to these keys. The rest will be assigned to the :arguments key as before.

schema = Configure::Schema.build {
  nested {
    pulse {
      argument_keys :wave_length, :duration
    }
  }
}

laser = Configure.process(schema) {
  pulse(700, 20, :extra) {
    label "red pulse"
  }
}

laser == {
  :pulse => {
    :wave_length => 700,
    :duration => 20,
    :arguments => [ :extra ]
    :label => "red pulse"
  }
} # => true

The :nested_default attribute can be used to define a default schema for all nested blocks.

Configuration class¶ ↑

Sometimes, a hash may not be the best data structure to store the configuration. If a more strict structure is needed, the attribute :configuration_class can be set the schema. When the configuration is processed, the class is instantiated and the values are set via key= or the []= methods. If both is not possible, an exception is raised.

class Laser

  attr_accessor :label
  attr_accessor :wave_length
  attr_accessor :duration

end

schema = Configure::Schema.build {
  configuration_class Laser
  defaults {
    duration 20
  }
}

laser = Configure.process(schema) {
  label "red laser"
  wave_length 700
}

laser.is_a? Laser          # => true
laser.label == "red laser" # => true
laser.wave_length == 700   # => true
laser.duration == 20       # => true

Configure.process(schema) {
  invalid_key "value"
} # => raises Configure::InvalidKeyError

The Only list¶ ↑

If the :only attribute is defined in a schema, only the values of the given keys are allowed to be set.

schema = Configure::Schema.build {
  only :duration
}

laser = Configure.process(schema) {
  wave_length 700
} # => raises Configure::InvalidKeyError

The Not-Nil list¶ ↑

If the :not_nil attribute is defined in a schema, an error will be raised if one of the values of the given keys remains nil.

schema = Configure::Schema.build {
  only :wave_length, :duration
  not_nil :duration
}

laser = Configure.process(schema) {
  wave_length 700
} # => raises Configure::NilValueError

Development¶ ↑

Development has been done test-driven and the code follows at most the Clean Code paradigms. Code smells has been removed by using the reek code smell detector.

This project is still under development. Any bug report and contribution is welcome!

Support¶ ↑

Apart from contribution, support via Flattr is welcome.