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 api_keys

def api_keys
  load_api_keys unless @api_keys
  @api_keys
end

def backtrace

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

def check_credentials_permissions

def check_credentials_permissions
  return if Gem.win_platform? # windows doesn't write 0600 as 0600
  return unless File.exist? credentials_path
  existing_permissions = File.stat(credentials_path).mode & 0777
  return if existing_permissions == 0600
  alert_error <<-ERROR
ur gem push credentials file located at:
#{credentials_path}
s file permissions of 0#{existing_permissions.to_s 8} but 0600 is required.
 fix this error run:
chmod 0600 #{credentials_path}
u should reset your credentials at:
https://rubygems.org/profile/edit
 you believe they were disclosed to a third party.
  ERROR
  terminate_interaction 1
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
  credentials = File.join Gem.user_home, '.gem', 'credentials'
  if File.exist? credentials
    credentials
  else
    File.join Gem.data_home, "gem", "credentials"
  end
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
      warn 'NOTE:  Debugging mode prints all exceptions even when rescued'
    else
      @args << arg
    end
  end
end

def initialize(args)

def initialize(args)
  set_config_file_name(args)
  @backtrace = DEFAULT_BACKTRACE
  @bulk_threshold = DEFAULT_BULK_THRESHOLD
  @verbose = DEFAULT_VERBOSITY
  @update_sources = DEFAULT_UPDATE_SOURCES
  @concurrent_downloads = DEFAULT_CONCURRENT_DOWNLOADS
  @cert_expiration_length_days = DEFAULT_CERT_EXPIRATION_LENGTH_DAYS
  @ipv4_fallback_enabled = ENV['IPV4_FALLBACK_ENABLED'] == 'true' || DEFAULT_IPV4_FALLBACK_ENABLED
  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.tap(&Gem::UNTAINT)
  environment_config = (ENV['GEMRC'] || '')
    .split(File::PATH_SEPARATOR).inject({}) do |result, file|
      result.merge load_file file
    end
  @hash = operating_system_config.merge platform_config
  unless args.index '--norc'
    @hash = @hash.merge system_config
    @hash = @hash.merge user_config
    @hash = @hash.merge environment_config
  end
  # 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
  @sources                     = @hash[:sources]                     if @hash.key? :sources
  @cert_expiration_length_days = @hash[:cert_expiration_length_days] if @hash.key? :cert_expiration_length_days
  @ipv4_fallback_enabled       = @hash[:ipv4_fallback_enabled]       if @hash.key? :ipv4_fallback_enabled
  @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
  @ssl_client_cert  = @hash[:ssl_client_cert]  if @hash.key? :ssl_client_cert
  @api_keys         = nil
  @rubygems_api_key = nil
  handle_arguments args
end

def load_api_keys

def load_api_keys
  check_credentials_permissions
  @api_keys = if File.exist? credentials_path
    load_file(credentials_path)
  else
    @hash
  end
  if @api_keys.key? :rubygems_api_key
    @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
  yaml_errors = [ArgumentError]
  yaml_errors << Psych::SyntaxError if defined?(Psych::SyntaxError)
  return {} unless filename && !filename.empty? && File.exist?(filename)
  begin
    content = Gem::SafeYAML.load(File.read(filename))
    unless content.kind_of? Hash
      warn "Failed to load #{filename} because it doesn't contain valid YAML hash"
      return {}
    end
    return content
  rescue *yaml_errors => e
    warn "Failed to load #{filename}, #{e}"
  rescue Errno::EACCES
    warn "Failed to load #{filename} 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

def rubygems_api_key
  load_api_keys unless @rubygems_api_key
  @rubygems_api_key
end

def rubygems_api_key=(api_key)

def rubygems_api_key=(api_key)
  set_api_key :rubygems_api_key, api_key
  @rubygems_api_key = api_key
end

def set_api_key(host, api_key)

def set_api_key(host, api_key)
  check_credentials_permissions
  config = load_file(credentials_path).merge(host => api_key)
  dirname = File.dirname credentials_path
  require 'fileutils'
  FileUtils.mkdir_p(dirname)
  Gem.load_yaml
  permissions = 0600 & (~File.umask)
  File.open(credentials_path, 'w', permissions) do |f|
    f.write config.to_yaml
  end
  load_api_keys # reload
end

def set_config_file_name(args)

def set_config_file_name(args)
  @config_file_name = ENV["GEMRC"]
  need_config_file_name = false
  args.each do |arg|
    if need_config_file_name
      @config_file_name = arg
      need_config_file_name = false
    elsif arg =~ /^--config-file=(.*)/
      @config_file_name = $1
    elsif arg =~ /^--config-file$/
      need_config_file_name = true
    end
  end
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] = @hash.fetch(:backtrace, DEFAULT_BACKTRACE)
  yaml_hash[:bulk_threshold] = @hash.fetch(:bulk_threshold, DEFAULT_BULK_THRESHOLD)
  yaml_hash[:sources] = Gem.sources.to_a
  yaml_hash[:update_sources] = @hash.fetch(:update_sources, DEFAULT_UPDATE_SOURCES)
  yaml_hash[:verbose] = @hash.fetch(:verbose, DEFAULT_VERBOSITY)
  yaml_hash[:concurrent_downloads] =
    @hash.fetch(:concurrent_downloads, DEFAULT_CONCURRENT_DOWNLOADS)
  yaml_hash[:ssl_verify_mode] =
    @hash[:ssl_verify_mode] if @hash.key? :ssl_verify_mode
  yaml_hash[:ssl_ca_cert] =
    @hash[:ssl_ca_cert] if @hash.key? :ssl_ca_cert
  yaml_hash[:ssl_client_cert] =
    @hash[:ssl_client_cert] if @hash.key? :ssl_client_cert
  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 unset_api_key!

def unset_api_key!
  return false unless File.exist?(credentials_path)
  File.delete(credentials_path)
end

def write

Writes out this config file, replacing its source.
def write
  require 'fileutils'
  FileUtils.mkdir_p File.dirname(config_file_name)
  File.open config_file_name, 'w' do |io|
    io.write to_yaml
  end
end