Configuration Block Pattern with Ruby

We recently enhanced Clearance with a configuration block that could be used in config/initializers/clearance.rb.

I liked the way Airbrake did it and wanted to implement the same pattern:

Airbrake.configure do |config|
  config.api_key = "your_key_here"
end

Here's the implementation:

module Clearance
  class << self
    attr_accessor :configuration
  end

  def self.configure
    self.configuration ||= Configuration.new
    yield(configuration)
  end

  class Configuration
    attr_accessor :mailer_sender

    def initialize
      @mailer_sender = "donotreply@example.com"
    end
  end
end

The configure class method stores a Configuration object inside the Clearance module.

Anything set from the configure block is an attr_accessor on the Configuration class.

So now config/initializers/clearance.rb is possible:

Clearance.configure do |config|
  config.mailer_sender = "hello@example.com"
end

Each configuration setting can be accessed like this:

Clearance.configuration.mailer_sender

In the library's tests, set configuration attributes without worrying about undefining constants:

Clearance.configuration.mailer_sender = "updated@example.com"