Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where to place/access config file in gem?

I am writing my first gem and I'd like specific options to be retrieved and set by the user through a config.yml file.

Where should this file be placed within my gem file structure and how does someone modify the file when installing my gem? I'm guessing they can pass in specific options when installing the gem, and those options can be mapped to the config.yml file, but how is this possible?

Also, is the best way to retrieve the file through YAML.load_file?

I've watched Ryan's railcasts on creating a gem via Bundler, but he doesn't cover this topic.

like image 643
webren Avatar asked Jun 03 '11 22:06

webren


People also ask

Where is the Gemrc file?

gem looks for a configuration file . gemrc in your home directory, although you can specify another file on the command-line if you wish (with the --config-file modifier). There are three things you can specify in the configuration file: command-line arguments to be used every time gem runs.

What is .gemrc file?

gemrc is a YAML file that uses strings to match gem command arguments and symbols to match RubyGems options.


1 Answers

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   end end 

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.

like image 115
Nicholas B. Avatar answered Sep 22 '22 02:09

Nicholas B.