Class: Gem::ConfigFile (Ruby 2.4.2)
Description: Class : Gem::ConfigFile - Ruby 2.4.2

Support for the Ruby 2.4 series has ended. See here for reference.

### Home Classes Methods

### In Files

- rubygems/config_file.rb

### Parent

Object

### Methods

- ::new
- #[]
- #[]=
- #api_keys
- #backtrace
- #check_credentials_permissions
- #config_file_name
- #credentials_path
- #each
- #handle_arguments
- #load_api_keys
- #load_file
- #really_verbose
- #rubygems_api_key
- #rubygems_api_key=
- #set_api_key
- #write

### Included Modules

- Gem::UserInteraction

### Class/Module Index

Quicksearch

- Gem::AvailableSet
- Gem::BasicSpecification
- Gem::Command
- Gem::CommandLineError
- Gem::CommandManager
- Gem::Commands
- Gem::Commands::BuildCommand
- Gem::Commands::CertCommand
- Gem::Commands::CheckCommand
- Gem::Commands::CleanupCommand
- Gem::Commands::ContentsCommand
- Gem::Commands::DependencyCommand
- Gem::Commands::EnvironmentCommand
- Gem::Commands::FetchCommand
- Gem::Commands::GenerateIndexCommand
- Gem::Commands::HelpCommand
- Gem::Commands::InstallCommand
- Gem::Commands::ListCommand
- Gem::Commands::LockCommand
- Gem::Commands::MirrorCommand
- Gem::Commands::OpenCommand
- Gem::Commands::OutdatedCommand
- Gem::Commands::OwnerCommand
- Gem::Commands::PristineCommand
- Gem::Commands::PushCommand
- Gem::Commands::QueryCommand
- Gem::Commands::RdocCommand
- Gem::Commands::SearchCommand
- Gem::Commands::ServerCommand
- Gem::Commands::SetupCommand
- Gem::Commands::SourcesCommand
- Gem::Commands::SpecificationCommand
- Gem::Commands::StaleCommand
- Gem::Commands::UninstallCommand
- Gem::Commands::UnpackCommand
- Gem::Commands::UpdateCommand
- Gem::Commands::WhichCommand
- Gem::Commands::YankCommand
- Gem::ConfigFile
- Gem::ConflictError
- Gem::ConsoleUI
- Gem::DefaultUserInteraction
- Gem::Dependency
- Gem::DependencyError
- Gem::DependencyInstaller
- Gem::DependencyList
- Gem::DependencyRemovalException
- Gem::DependencyResolutionError
- Gem::Deprecate
- Gem::Doctor
- Gem::DocumentError
- Gem::EndOfYAMLException
- Gem::ErrorReason
- Gem::Exception
- Gem::Ext
- Gem::Ext::BuildError
- Gem::Ext::Builder
- Gem::Ext::CmakeBuilder
- Gem::Ext::ConfigureBuilder
- Gem::Ext::ExtConfBuilder
- Gem::Ext::RakeBuilder
- Gem::FakeFetcher
- Gem::FilePermissionError
- Gem::FormatException
- Gem::GemNotFoundException
- Gem::GemNotInHomeException
- Gem::GemRunner
- Gem::GemcutterUtilities
- Gem::ImpossibleDependenciesError
- Gem::Indexer
- Gem::InstallError
- Gem::InstallUpdateOptions
- Gem::Installer
- Gem::Installer::FakePackage
- Gem::InstallerTestCase
- Gem::InvalidSpecificationException
- Gem::Licenses
- Gem::List
- Gem::LoadError
- Gem::LocalRemoteOptions
- Gem::MissingSpecError
- Gem::MissingSpecVersionError
- Gem::MockGemUi
- Gem::MockGemUi::InputEOFError
- Gem::MockGemUi::SystemExitException
- Gem::MockGemUi::TTY
- Gem::MockGemUi::TermError
- Gem::NameTuple
- Gem::NoAliasYAMLTree
- Gem::OperationNotSupportedError
- Gem::Package::DigestIO
- Gem::Package::Error
- Gem::Package::FormatError
- Gem::Package::NonSeekableIO
- Gem::Package::Old
- Gem::Package::PathError
- Gem::Package::TarHeader
- Gem::Package::TarInvalidError
- Gem::Package::TarReader
- Gem::Package::TarReader::Entry
- Gem::Package::TarReader::UnexpectedEOF
- Gem::Package::TarTestCase
- Gem::Package::TarWriter
- Gem::Package::TarWriter::BoundedStream
- Gem::Package::TarWriter::FileOverflow
- Gem::Package::TarWriter::RestrictedStream
- Gem::Package::TooLongFileName
- Gem::PackageTask
- Gem::PathSupport
- Gem::Platform
- Gem::PlatformMismatch
- Gem::RemoteError
- Gem::RemoteFetcher
- Gem::RemoteFetcher::FetchError
- Gem::RemoteFetcher::UnknownHostError
- Gem::RemoteInstallationCancelled
- Gem::RemoteInstallationSkipped
- Gem::RemoteSourceException
- Gem::RequestSet
- Gem::RequestSet::GemDependencyAPI
- Gem::RequestSet::Lockfile
- Gem::RequestSet::Lockfile::ParseError
- Gem::RequestSet::Lockfile::Parser
- Gem::RequestSet::Lockfile::Tokenizer
- Gem::Requirement
- Gem::Requirement::BadRequirementError
- Gem::Resolver
- Gem::Resolver::APISet
- Gem::Resolver::APISpecification
- Gem::Resolver::ActivationRequest
- Gem::Resolver::BestSet
- Gem::Resolver::ComposedSet
- Gem::Resolver::Conflict
- Gem::Resolver::CurrentSet
- Gem::Resolver::DependencyRequest
- Gem::Resolver::GitSet
- Gem::Resolver::GitSpecification
- Gem::Resolver::IndexSet
- Gem::Resolver::IndexSpecification
- Gem::Resolver::InstalledSpecification
- Gem::Resolver::InstallerSet
- Gem::Resolver::LocalSpecification
- Gem::Resolver::LockSet
- Gem::Resolver::LockSpecification
- Gem::Resolver::Molinillo
- Gem::Resolver::Molinillo::CircularDependencyError
- Gem::Resolver::Molinillo::Delegates
- Gem::Resolver::Molinillo::Delegates::ResolutionState
- Gem::Resolver::Molinillo::Delegates::SpecificationProvider
- Gem::Resolver::Molinillo::DependencyGraph
- Gem::Resolver::Molinillo::DependencyGraph::Action
- Gem::Resolver::Molinillo::DependencyGraph::AddEdgeNoCircular
- Gem::Resolver::Molinillo::DependencyGraph::DeleteEdge
- Gem::Resolver::Molinillo::DependencyGraph::DetachVertexNamed
- Gem::Resolver::Molinillo::DependencyGraph::Log
- Gem::Resolver::Molinillo::DependencyGraph::Tag
- Gem::Resolver::Molinillo::DependencyGraph::Vertex
- Gem::Resolver::Molinillo::DependencyState
- Gem::Resolver::Molinillo::NoSuchDependencyError
- Gem::Resolver::Molinillo::PossibilityState
- Gem::Resolver::Molinillo::ResolutionState
- Gem::Resolver::Molinillo::Resolver
- Gem::Resolver::Molinillo::Resolver::Resolution
- Gem::Resolver::Molinillo::ResolverError
- Gem::Resolver::Molinillo::SpecificationProvider
- Gem::Resolver::Molinillo::UI
- Gem::Resolver::Molinillo::VersionConflict
- Gem::Resolver::RequirementList
- Gem::Resolver::Set
- Gem::Resolver::SourceSet
- Gem::Resolver::SpecSpecification
- Gem::Resolver::Specification
- Gem::Resolver::Stats
- Gem::Resolver::VendorSet
- Gem::Resolver::VendorSpecification
- Gem::RubyVersionMismatch
- Gem::Security
- Gem::Security::Exception
- Gem::Security::Policy
- Gem::Security::Signer
- Gem::Security::TrustDir
- Gem::Server
- Gem::SilentUI
- Gem::Source
- Gem::Source::Git
- Gem::Source::Installed
- Gem::Source::Local
- Gem::Source::Lock
- Gem::Source::SpecificFile
- Gem::Source::Vendor
- Gem::SourceFetchProblem
- Gem::SourceList
- Gem::SpecFetcher
- Gem::SpecificGemNotFoundException
- Gem::Specification
- Gem::StreamUI
- Gem::StreamUI::SilentDownloadReporter
- Gem::StreamUI::SilentProgressReporter
- Gem::StreamUI::SimpleProgressReporter
- Gem::StreamUI::VerboseDownloadReporter
- Gem::StreamUI::VerboseProgressReporter
- Gem::StubSpecification
- Gem::SystemExitException
- Gem::TestCase
- Gem::TestCase::SpecFetcherSetup
- Gem::TestCase::StaticSet
- Gem::Text
- Gem::Uninstaller
- Gem::UnsatisfiableDependencyError
- Gem::UriFormatter
- Gem::UserInteraction
- Gem::Util
- Gem::Validator
- Gem::VerificationError
- Gem::Version
- Gem::VersionOption
- Kernel
- Object
- TempIO
- YAML::Syck
- YAML::Syck

No matching classes.

# Gem::ConfigFile

`Gem::ConfigFile` RubyGems options and gem command options from gemrc.

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

Gem command arguments use a String key that matches the command name and allow you to specify default arguments:

    install: --no-rdoc --no-ri
    update: --no-rdoc --no-ri

You can use `gem:` to set default arguments for all commands.

RubyGems options use symbol keys. Valid options are:

`:backtrace`

  See `backtrace`

`:sources`

  Sets `Gem::sources`

`:verbose`

  See `verbose`

gemrc files may exist in various locations and are read and merged in the following order:

- system wide (/etc/gemrc)

- per user (~/.gemrc)

- per environment (gemrc files listed in the GEMRC environment variable)

### Constants

DEFAULT_BACKTRACE
DEFAULT_BULK_THRESHOLD
DEFAULT_UPDATE_SOURCES
DEFAULT_VERBOSITY
OPERATING_SYSTEM_DEFAULTS

  For Ruby packagers to set configuration defaults. Set in rubygems/defaults/operating_system.rb

PLATFORM_DEFAULTS

  For Ruby implementers to set configuration defaults. Set in rubygems/defaults/#{RUBY_ENGINE}.rb

SYSTEM_WIDE_CONFIG_FILE

### Attributes

args[R]

List of arguments supplied to the config file object.

backtrace[W]

True if we print backtraces on errors.

bulk_threshold[RW]

Bulk threshold value. If the number of missing gems are above this threshold value, then a bulk download technique is used. (deprecated)

disable_default_gem_server[RW]

True if we want to force specification of gem server when pushing a gem

hash[R]
home[RW]

Where to install gems (deprecated)

path[RW]

Where to look for gems (deprecated)

sources[RW]

sources to look for gems

ssl_ca_cert[RW]

Path name of directory or file of openssl CA certificate, used for remote https connection

ssl_client_cert[R]

Path name of directory or file of openssl client certificate, used for remote https connection with client authentication

ssl_verify_mode[R]

openssl verify mode value, used for remote https connection

update_sources[RW]

True if we want to update the SourceInfoCache every time, false otherwise

verbose[RW]

Verbose level of output:

- false – No output

- true – Normal output

- :loud – Extra output

### Public Class Methods

new(args) click to toggle source

Create the config file object. `args` is the list of arguments from the command line.

The following command line options are handled early here rather than later at the time most command options are processed.

`--config-file`, `--config-file==NAME`

  Obviously these need to be handled by the `ConfigFile` object to ensure we get the right config file.

`--backtrace`

  Backtrace needs to be turned on early so that errors before normal option parsing can be properly handled.

`--debug`

  Enable Ruby level debug messages. Handled early for the same reason as –backtrace.

                   # File rubygems/config_file.rb, line 176
    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
      unless arg_list.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

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

### Public Instance Methods

[](key) click to toggle source

Return the configuration information for `key`.

                   # File rubygems/config_file.rb, line 478
    def [](key)
      @hash[key.to_s]
    end

[]=(key, value) click to toggle source

Set configuration option `key` to `value`.

                   # File rubygems/config_file.rb, line 483
    def []=(key, value)
      @hash[key.to_s] = value
    end

api_keys() click to toggle source

Hash of RubyGems.org and alternate API keys

                   # File rubygems/config_file.rb, line 238
    def api_keys
      load_api_keys unless @api_keys

      @api_keys
    end

backtrace() click to toggle source

True if the backtrace option has been specified, or debug is on.

                   # File rubygems/config_file.rb, line 364
    def backtrace
      @backtrace or $DEBUG
    end

check_credentials_permissions() click to toggle source

Checks the permissions of the credentials file. If they are not 0600 an error message is displayed and RubyGems aborts.

                   # File rubygems/config_file.rb, line 248
      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
    Your gem push credentials file located at:

    \t#{credentials_path}

    has file permissions of 0#{existing_permissions.to_s 8} but 0600 is required.

    To fix this error run:

    \tchmod 0600 #{credentials_path}

    You should reset your credentials at:

    \thttps://rubygems.org/profile/edit

    if you believe they were disclosed to a third party.
        ERROR

        terminate_interaction 1
      end

config_file_name() click to toggle source

The name of the configuration file.

                   # File rubygems/config_file.rb, line 369
    def config_file_name
      @config_file_name || Gem.config_file
    end

credentials_path() click to toggle source

Location of RubyGems.org credentials

                   # File rubygems/config_file.rb, line 280
    def credentials_path
      File.join Gem.user_home, '.gem', 'credentials'
    end

each(&block) click to toggle source

Delegates to @hash

                   # File rubygems/config_file.rb, line 374
    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

handle_arguments(arg_list) click to toggle source

Handle the command arguments.

                   # File rubygems/config_file.rb, line 392
    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

load_api_keys() click to toggle source

                   # File rubygems/config_file.rb, line 284
    def load_api_keys
      check_credentials_permissions

      @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

load_file(filename) click to toggle source

                   # File rubygems/config_file.rb, line 339
    def load_file(filename)
      Gem.load_yaml

      yaml_errors = [ArgumentError]
      yaml_errors << Psych::SyntaxError if defined?(Psych::SyntaxError)

      return {} unless filename and File.exist? filename

      begin
        content = YAML.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

really_verbose() click to toggle source

Really verbose mode gives you extra output.

                   # File rubygems/config_file.rb, line 410
    def really_verbose
      case verbose
      when true, false, nil then
        false
      else
        true
      end
    end

rubygems_api_key() click to toggle source

Returns the RubyGems.org API key

                   # File rubygems/config_file.rb, line 303
    def rubygems_api_key
      load_api_keys unless @rubygems_api_key

      @rubygems_api_key
    end

rubygems_api_key=(api_key) click to toggle source

Sets the RubyGems.org API key to `api_key`

                   # File rubygems/config_file.rb, line 312
    def rubygems_api_key= api_key
      set_api_key :rubygems_api_key, api_key

      @rubygems_api_key = api_key
    end

set_api_key(host, api_key) click to toggle source

Set a specific host's API key to `api_key`

                   # File rubygems/config_file.rb, line 321
    def set_api_key host, api_key
      check_credentials_permissions

      config = load_file(credentials_path).merge(host => 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

      load_api_keys # reload
    end

write() click to toggle source

Writes out this config file, replacing its source.

                   # File rubygems/config_file.rb, line 471
    def write
      open config_file_name, 'w' do |io|
        io.write to_yaml
      end
    end