MyGem.configure Block

Dan Croak

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 = 'donotreply@example.com'
end

Easy for the application developer to understand. Clean internal implementation:

Clearance.configuration.mailer_sender

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

Clearance.configuration.mailer_sender= 'new.email@example.com'

Yay.