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.
