class Gem::ConfigFile

def ==(other) # :nodoc:

:nodoc:
def ==(other) # :nodoc:
  self.class === other and
    @backtrace == other.backtrace and
    @bulk_threshold == other.bulk_threshold and
    @verbose == other.verbose and
    @update_sources == other.update_sources and
    @hash == other.hash
end

def [](key)

Return the configuration information for +key+.
def [](key)
  @hash[key.to_s]
end

def []=(key, value)

Set configuration option +key+ to +value+.
def []=(key, value)
  @hash[key.to_s] = value
end

def backtrace

True if the backtrace option has been specified, or debug is on.
def backtrace
  @backtrace or $DEBUG
end

def config_file_name

The name of the configuration file.
def config_file_name
  @config_file_name || Gem.config_file
end

def credentials_path

def credentials_path
  File.join Gem.user_home, '.gem', 'credentials'
end

def each(&block)

Delegates to @hash
def each(&block)
  hash = @hash.dup
  hash.delete :update_sources
  hash.delete :verbose
  hash.delete :backtrace
  hash.delete :bulk_threshold
  yield :update_sources, @update_sources
  yield :verbose, @verbose
  yield :backtrace, @backtrace
  yield :bulk_threshold, @bulk_threshold
  yield 'config_file_name', @config_file_name if @config_file_name
  hash.each(&block)
end

def handle_arguments(arg_list)

Handle the command arguments.
def handle_arguments(arg_list)
  @args = []
  arg_list.each do |arg|
    case arg
    when /^--(backtrace|traceback)$/ then
      @backtrace = true
    when /^--debug$/ then
      $DEBUG = true
    else
      @args << arg
    end
  end
end

def initialize(args)

def initialize(args)
  @config_file_name = nil
  need_config_file_name = false
  arg_list = []
  args.each do |arg|
    if need_config_file_name then
      @config_file_name = arg
      need_config_file_name = false
    elsif arg =~ /^--config-file=(.*)/ then
      @config_file_name = $1
    elsif arg =~ /^--config-file$/ then
      need_config_file_name = true
    else
      arg_list << arg
    end
  end
  @backtrace = DEFAULT_BACKTRACE
  @bulk_threshold = DEFAULT_BULK_THRESHOLD
  @verbose = DEFAULT_VERBOSITY
  @update_sources = DEFAULT_UPDATE_SOURCES
  operating_system_config = Marshal.load Marshal.dump(OPERATING_SYSTEM_DEFAULTS)
  platform_config = Marshal.load Marshal.dump(PLATFORM_DEFAULTS)
  system_config = load_file SYSTEM_WIDE_CONFIG_FILE
  user_config = load_file config_file_name.dup.untaint
  environment_config = (ENV['GEMRC'] || '').split(/[:;]/).inject({}) do |result, file|
    result.merge load_file file
  end
  @hash = operating_system_config.merge platform_config
  @hash = @hash.merge system_config
  @hash = @hash.merge user_config
  @hash = @hash.merge environment_config
  # HACK these override command-line args, which is bad
  @backtrace                  = @hash[:backtrace]                  if @hash.key? :backtrace
  @bulk_threshold             = @hash[:bulk_threshold]             if @hash.key? :bulk_threshold
  @home                       = @hash[:gemhome]                    if @hash.key? :gemhome
  @path                       = @hash[:gempath]                    if @hash.key? :gempath
  @update_sources             = @hash[:update_sources]             if @hash.key? :update_sources
  @verbose                    = @hash[:verbose]                    if @hash.key? :verbose
  @disable_default_gem_server = @hash[:disable_default_gem_server] if @hash.key? :disable_default_gem_server
  @ssl_verify_mode  = @hash[:ssl_verify_mode]  if @hash.key? :ssl_verify_mode
  @ssl_ca_cert      = @hash[:ssl_ca_cert]      if @hash.key? :ssl_ca_cert
  load_api_keys
  Gem.sources = @hash[:sources] if @hash.key? :sources
  handle_arguments arg_list
end

def load_api_keys

def load_api_keys
  @api_keys = if File.exist? credentials_path then
                load_file(credentials_path)
              else
                @hash
              end
  if @api_keys.key? :rubygems_api_key then
    @rubygems_api_key = @api_keys[:rubygems_api_key]
    @api_keys[:rubygems] = @api_keys.delete :rubygems_api_key unless @api_keys.key? :rubygems
  end
end

def load_file(filename)

def load_file(filename)
  Gem.load_yaml
  return {} unless filename and File.exist? filename
  begin
    content = YAML.load(File.read(filename))
    unless content.kind_of? Hash
      warn "Failed to load #{config_file_name} because it doesn't contain valid YAML hash"
      return {}
    end
    return content
  rescue ArgumentError
    warn "Failed to load #{config_file_name}"
  rescue Errno::EACCES
    warn "Failed to load #{config_file_name} due to permissions problem."
  end
  {}
end

def really_verbose

Really verbose mode gives you extra output.
def really_verbose
  case verbose
  when true, false, nil then
    false
  else
    true
  end
end

def rubygems_api_key=(api_key)

def rubygems_api_key=(api_key)
  config = load_file(credentials_path).merge(:rubygems_api_key => api_key)
  dirname = File.dirname credentials_path
  Dir.mkdir(dirname) unless File.exist? dirname
  Gem.load_yaml
  permissions = 0600 & (~File.umask)
  File.open(credentials_path, 'w', permissions) do |f|
    f.write config.to_yaml
  end
  @rubygems_api_key = api_key
end

def to_yaml # :nodoc:

:nodoc:
to_yaml only overwrites things you can't override on the command line.
def to_yaml # :nodoc:
  yaml_hash = {}
  yaml_hash[:backtrace] = if @hash.key?(:backtrace)
                            @hash[:backtrace]
                          else
                            DEFAULT_BACKTRACE
                          end
  yaml_hash[:bulk_threshold] = if @hash.key?(:bulk_threshold)
                                 @hash[:bulk_threshold]
                               else
                                 DEFAULT_BULK_THRESHOLD
                               end
  yaml_hash[:sources] = Gem.sources.to_a
  yaml_hash[:update_sources] = if @hash.key?(:update_sources)
                                 @hash[:update_sources]
                               else
                                 DEFAULT_UPDATE_SOURCES
                               end
  yaml_hash[:verbose] = if @hash.key?(:verbose)
                          @hash[:verbose]
                        else
                          DEFAULT_VERBOSITY
                        end
  keys = yaml_hash.keys.map { |key| key.to_s }
  keys << 'debug'
  re = Regexp.union(*keys)
  @hash.each do |key, value|
    key = key.to_s
    next if key =~ re
    yaml_hash[key.to_s] = value
  end
  yaml_hash.to_yaml
end

def write

Writes out this config file, replacing its source.
def write
  open config_file_name, 'w' do |io|
    io.write to_yaml
  end
end