Where to place/access config file in gem? Where to place/access config file in gem? ruby ruby

Where to place/access config file in gem?


I'm jumping on this one a little late but I'll leave an example implementation of how I generally handle this, for future reference.

As it was mentioned, you'll normally want to allow configuration through both files and hashes. It's pretty easy and light to include both ways, so you should do it.

Something like this works for me in most scenarios:

require 'yaml'module MyGem  # Configuration defaults  @config = {              :log_level => "verbose",              :min => 0,              :max => 99             }  @valid_config_keys = @config.keys  # Configure through hash  def self.configure(opts = {})    opts.each {|k,v| @config[k.to_sym] = v if @valid_config_keys.include? k.to_sym}  end  # Configure through yaml file  def self.configure_with(path_to_yaml_file)    begin      config = YAML::load(IO.read(path_to_yaml_file))    rescue Errno::ENOENT      log(:warning, "YAML configuration file couldn't be found. Using defaults."); return    rescue Psych::SyntaxError      log(:warning, "YAML configuration file contains invalid syntax. Using defaults."); return    end    configure(config)  end  def self.config    @config  endend

An added best practice would be to have defaults for all your configuration keys(as in the example above). That way, you are giving the user ultimate freedom in how they can configure your library.


If your gem includes a command which can be run interactively by the user it would be best to prompt for any necessary details on the first run. A good place to save the configuration would be in the user's home directory as a dot-file.

If your gem is purely for use in other code as a library then configuration should be allowed to be passed in as a hash or suchlike.


Another pattern without using config files:

YourGem.configure do |config|  config.api_key = 'your_key_here'end

https://robots.thoughtbot.com/mygem-configure-block