123456789_123456789_123456789_123456789_123456789_

Class: Bundler::Settings

Relationships & Source Files
Namespace Children
Classes:
Inherits: Object
Defined in: lib/bundler/mirror.rb,
lib/bundler/settings.rb,
lib/bundler/settings/validator.rb

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(root = nil) ⇒ Settings

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 107

def initialize(root = nil)
  @root            = root
  @local_config    = load_config(local_config_file)
  @local_root      = root || Pathname.new(".bundle").expand_path

  @env_config      = ENV.to_h
  @env_config.select! {|key, _value| key.start_with?("BUNDLE_") }
  @env_config.delete("BUNDLE_")

  @global_config   = load_config(global_config_file)
  @temporary       = {}

  @key_cache = {}
end

Class Method Details

.key_for(key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 857

def self.key_for(key)
  key = key_to_s(key)
  key = normalize_uri(key) if key.start_with?("http", "mirror.http")
  key = key.gsub(".", "__")
  key.gsub!("-", "___")
  key.upcase!

  key.gsub(/\A([ #]*)/, '\1BUNDLE_')
end

.key_to_s(key) (private)

See additional method definition at line 901.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 914

def self.key_to_s(key)
  case key
  when String
    key
  when Symbol
    key.name
  when Gem::URI::HTTP
    key.to_s
  else
    raise ArgumentError, "Invalid key: #{key.inspect}"
  end
end

.normalize_uri(uri) (private)

TODO: duplicates Rubygems#normalize_uri TODO: is this the correct place to validate mirror URIs?

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 883

def self.normalize_uri(uri)
  uri = uri.to_s
  if uri =~ NORMALIZE_URI_OPTIONS_PATTERN
    prefix = $1
    uri = $2
    suffix = $3
  end
  uri = URINormalizer.normalize_suffix(uri)
  require_relative "vendored_uri"
  uri = Gem::URI(uri)
  unless uri.absolute?
    raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
  end
  "#{prefix}#{uri}#{suffix}"
end

.remove_userinfo(key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 867

def self.remove_userinfo(key)
  return key unless CREDENTIAL_URL_KEY.match?(key)

  require_relative "vendored_uri"
  uri = Gem::URI(key)
  return key unless uri.userinfo

  uri = uri.dup
  uri.user = uri.password = nil
  uri.to_s
rescue Gem::URI::Error
  key
end

.to_bool(value) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 846

def self.to_bool(value)
  case value
  when String
    value.match?(/\A(false|f|no|n|0|)\z/i) ? false : true
  when nil, false
    false
  else
    true
  end
end

Instance Attribute Details

#ignore_config?Boolean (readonly)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 378

def ignore_config?
  ENV["BUNDLE_IGNORE_CONFIG"]
end

Instance Method Details

#[](name)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 122

def [](name)
  converted_value(configured_value(name), name)
end

#active_credential_store(host = nil) (private)

The Gem::CredentialStore for the spec #credential_store_spec returns, or nil when the setting is off or this RubyGems has no credential store. Guarded by a cheap lookup so reading and writing settings costs nothing extra when the setting is disabled.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 561

def active_credential_store(host = nil)
  spec = credential_store_spec(host)
  return nil unless spec

  store_class = credential_store_class
  return nil unless store_class

  store_class.for(spec, service: CREDENTIAL_STORE_SERVICE)
end

#all

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 159

def all
  keys = @temporary.keys.union(@global_config.keys, @local_config.keys, @env_config.keys)

  keys.map! do |key|
    key = key.delete_prefix("BUNDLE_")
    key.gsub!("___", "-")
    key.gsub!("__", ".")
    key.downcase!
    key
  end.sort!
  keys
end

#all_including_stored_credentials

#all plus the keys whose credential lives in the credential store. Kept apart from #all because that one is on the hot path (it is read per gem source and per download, and its keys are advertised in the User-Agent), while this one is for the commands that display settings.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 178

def all_including_stored_credentials
  keys = stored_credential_keys.map do |key|
    key = key.delete_prefix("BUNDLE_")
    key.gsub!("___", "-")
    key.gsub!("__", ".")
    key.downcase!
    key
  end

  # The listing comes from the globally selected store, but a host can name
  # its own, so keep only the keys the per-host lookup agrees are set.
  keys.select! {|key| credential_stored?(key) }
  keys << "cooldown" if gemrc_cooldown_days

  all.union(keys).sort
end

#app_cache_path

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 382

def app_cache_path
  @app_cache_path ||= self[:cache_path] || "vendor/cache"
end

#array_to_s(array) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 695

def array_to_s(array)
  array = Array(array)
  return nil if array.empty?
  array.join(":").tr(" ", ":")
end

#configs (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 470

def configs
  @configs ||= {
    temporary: @temporary,
    local: @local_config,
    env: @env_config,
    global: @global_config,
    default: DEFAULT_CONFIG,
  }
end

#configured_value(name) (private)

A renamed setting is resolved one level at a time rather than by looking for the current name everywhere first, so that the old name keeps the documented priority order: an old name set locally still beats a current name set globally.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 490

def configured_value(name)
  key = key_for(name)
  old_name = RENAMED_KEYS[self.class.key_to_s(name)]
  old_key = key_for(old_name) if old_name

  configs.each do |_, config|
    value = config[key]
    return value unless value.nil?

    next if old_key.nil?

    value = config[old_key]
    next if value.nil?

    SharedHelpers.feature_deprecated! "The `#{old_name}` setting has been renamed to `#{name}` and will be " \
                                      "removed in Bundler 5. Use `#{name}` instead."

    return value
  end

  nil
end

#converted_value(value, key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 745

def converted_value(value, key)
  key = self.class.key_to_s(key)

  if is_array(key)
    to_array(value)
  elsif value.nil?
    nil
  elsif is_bool(key) || value == "false"
    to_bool(value)
  elsif is_num(key)
    value.to_i
  else
    value.to_s
  end
end

#cooldown_for(source_cooldown = nil)

The cooldown that applies to a source whose Gemfile declaration asks for source_cooldown days.

--cooldown is set as a command line option, and it wins outright so that --cooldown 0 bypasses the cooldown however the two tools are configured. Otherwise this setting, or the per-source value when this setting is unset, is raised to RubyGems' own :cooldown: setting, so a cooldown configured for only one of the two tools covers both.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 400

def cooldown_for(source_cooldown = nil)
  command_line = @temporary[key_for(:cooldown)]
  return converted_value(command_line, :cooldown) unless command_line.nil?

  # Read raw rather than through #[], whose `to_i` would turn a value that
  # is not a number into a 0 that suppresses `source_cooldown`.
  configured = cooldown_settings.days(configured_value(:cooldown))

  cooldown_settings.combine(configured || source_cooldown, rubygems_cooldown)
end

#cooldown_settings (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 449

def cooldown_settings
  require "rubygems/cooldown_settings"
  Gem::CooldownSettings
end

#credential_account(raw_key) (private)

See Gem::ConfigFile.credential_store_account for why userinfo is dropped.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 664

def (raw_key)
  key_for(self.class.remove_userinfo(raw_key))
end

#credential_host(raw_key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 668

def credential_host(raw_key)
  return raw_key unless CREDENTIAL_URL_KEY.match?(raw_key)

  require_relative "vendored_uri"
  Gem::URI(raw_key).host || raw_key
rescue Gem::URI::Error
  raw_key
end

#credential_store_class (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 590

def credential_store_class
  return @credential_store_class if defined?(@credential_store_class)

  @credential_store_class =
    begin
      require "rubygems/credential_store"
      Gem::CredentialStore if Gem::CredentialStore.respond_to?(:for)
    rescue LoadError
      nil
    end

  if @credential_store_class.nil?
    Bundler.ui.warn "The `credential_store` setting is set but this RubyGems does not provide a credential store. Falling back to the Bundler config file."
  elsif @credential_store_class.respond_to?(:warn_handler=)
    # Bundler replaces Gem.ui with a Gem::SilentUI subclass, which drops
    # alert_warning, so every store warning would be lost.
    @credential_store_class.warn_handler = ->(message) { Bundler.ui.warn(message) }
  end

  @credential_store_class
end

#credential_store_key?(raw_key) ⇒ Boolean (private)

True for keys that name a host and can therefore hold a credential, like the ones set via bundle config set gems.example.com user:pass. Deliberately a positive test: a key this version does not recognize stays in the config file, where #[] can read it back. Matching everything not on the known-settings lists would send values such as ssl_client_cert to the credential store, and they would then read back as nil because only #credentials_for consults the store.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 624

def credential_store_key?(raw_key)
  return false if is_bool(raw_key) || is_num(raw_key) || is_array(raw_key) || is_string(raw_key) || is_credential(raw_key)

  CREDENTIAL_URL_KEY.match?(raw_key) || CREDENTIAL_HOST_KEY.match?(raw_key)
end

#credential_store_spec(host = nil) (private)

A credential_store. setting overrides the global one for that host only. There is no chain between backends.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 573

def credential_store_spec(host = nil)
  value = self["credential_store.#{host}"] if host
  value = self[:credential_store] if value.nil?

  # An environment variable can carry bytes String#downcase would reject.
  normalized = value.to_s.b.downcase

  # Tri-state, unlike a BOOL_KEYS setting, so #to_bool is only consulted
  # for the false half.
  return nil unless to_bool(normalized)

  case normalized
  when "true", "1", "yes", "on", "t", "y" then true
  else value.to_s
  end
end

#credential_stored?(name) ⇒ Boolean

True when name's credential lives in the credential store. The secret itself is never returned: callers only need to know the setting exists, since #[] cannot see past the config files.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 288

def credential_stored?(name)
  raw_key = self.class.key_to_s(name)
  return false unless credential_store_key?(raw_key)
  return false unless store = active_credential_store(credential_host(raw_key))

  !store.get((raw_key)).nil?
end

#credentials_for(uri)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 212

def credentials_for(uri)
  stored = credentials_from_store(uri)
  return credentials_from_env(uri) || stored if stored

  self[uri.to_s] || self[uri.host]
end

#credentials_from_env(uri) (private)

The store stands in for the config file, so it must not override the environment, which already overrides that file. Consulted only when the store answered, so the layer order without a store is unchanged.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 680

def credentials_from_env(uri)
  @env_config[key_for(uri.to_s)] || @env_config[key_for(uri.host)]
end

#credentials_from_store(uri) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 684

def credentials_from_store(uri)
  return nil unless store = active_credential_store(uri.host)

  store.get((uri.to_s)) || store.get((uri.host))
end

#gem_mirrors

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 219

def gem_mirrors
  all.inject(Mirrors.new) do |mirrors, k|
    mirrors.parse(k, self[k]) if k.start_with?("mirror.")
    mirrors
  end
end

#gemrc_cooldown (private)

Scanned rather than looked up, because ConfigFile#[] stringifies the key on RubyGems 3.4 and a :cooldown: gemrc entry is stored under a Symbol.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 457

def gemrc_cooldown
  Gem.configuration.each {|key, value| return value if key.to_s == "cooldown" }
  nil
end

#gemrc_cooldown_days (private)

The gemrc cooldown as a usable number of days, or nil. A value that is not one takes no part in the resolution, so nothing reports it as configured either.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 466

def gemrc_cooldown_days
  cooldown_settings.days(rubygems_cooldown)
end

#global_config_file (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 784

def global_config_file
  if ENV["BUNDLE_CONFIG"] && !ENV["BUNDLE_CONFIG"].empty?
    Pathname.new(ENV["BUNDLE_CONFIG"])
  elsif ENV["BUNDLE_USER_CONFIG"] && !ENV["BUNDLE_USER_CONFIG"].empty?
    Pathname.new(ENV["BUNDLE_USER_CONFIG"])
  elsif ENV["BUNDLE_USER_HOME"] && !ENV["BUNDLE_USER_HOME"].empty?
    Pathname.new(ENV["BUNDLE_USER_HOME"]).join("config")
  elsif Bundler.rubygems.user_home && !Bundler.rubygems.user_home.empty?
    Pathname.new(Bundler.rubygems.user_home).join(".bundle/config")
  end
end

#installation_parallelization

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 386

def installation_parallelization
  self[:jobs] || processor_count
end

#is_array(key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 539

def is_array(key)
  ARRAY_KEYS.include?(self.class.key_to_s(key))
end

#is_bool(name) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 521

def is_bool(name)
  name = self.class.key_to_s(name)
  BOOL_KEYS.include?(name) || BOOL_KEYS.include?(parent_setting_for(name))
end

#is_credential(key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 543

def is_credential(key)
  key == "gem.push_key"
end

#is_num(key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 535

def is_num(key)
  NUMBER_KEYS.include?(self.class.key_to_s(key))
end

#is_string(name) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 526

def is_string(name)
  name = self.class.key_to_s(name)
  STRING_KEYS.include?(name) || name.start_with?("local.") || name.start_with?("mirror.") || name.start_with?("build.") || name.start_with?("credential_store.")
end

#is_userinfo(value) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 547

def is_userinfo(value)
  value.include?(":")
end

#key_for(key)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 443

def key_for(key)
  @key_cache[key] ||= self.class.key_for(key)
end

#load_config(config_file) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 800

def load_config(config_file)
  return {} if !config_file || ignore_config?
  SharedHelpers.filesystem_access(config_file, :read) do |file|
    valid_file = file.exist? && !file.size.zero?
    return {} unless valid_file
    (serializer_class.load(file.read) || {}).inject({}) do |config, (k, v)|
      k = k.dup
      k << "/" if /https?:/i.match?(k) && !k.end_with?("/", "__#{FALLBACK_TIMEOUT_URI_OPTION.upcase}")
      k.gsub!(".", "__")

      unless k.start_with?("#")
        if k.include?("-")
          Bundler.ui.warn "Your #{file} config includes `#{k}`, which contains the dash character (`-`).\n" \
            "This is deprecated, because configuration through `ENV` should be possible, but `ENV` keys cannot include dashes.\n" \
            "Please edit #{file} and replace any dashes in configuration keys with a triple underscore (`___`)."

          # string hash keys are frozen
          k = k.gsub("-", "___")
        end

        config[k] = v
      end

      config
    end
  end
end

#local_config_file (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 796

def local_config_file
  Pathname.new(@root).join("config") if @root
end

#local_overrides

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 195

def local_overrides
  repos = {}
  all.each do |k|
    repos[k.delete_prefix("local.")] = self[k] if k.start_with?("local.")
  end
  repos
end

#locations(key)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 226

def locations(key)
  key = key_for(key)
  configs.keys.inject({}) do |partial_locations, level|
    value_on_level = configs[level][key]
    partial_locations[level] = value_on_level unless value_on_level.nil?
    partial_locations
  end
end

#mirror_for(uri)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 203

def mirror_for(uri)
  if uri.is_a?(String)
    require_relative "vendored_uri"
    uri = Gem::URI(uri)
  end

  gem_mirrors.for(uri.to_s).uri
end

#parent_setting_for(name) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 513

def parent_setting_for(name)
  split_specific_setting_for(name)[0]
end

#path

for legacy reasons, in ::Bundler 2, we do not respect :disable_shared_gems

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 316

def path
  configs.each do |_level, settings|
    path = value_for("path", settings)
    path_system = value_for("path.system", settings)
    disabled_shared_gems = value_for("disable_shared_gems", settings)
    next if path.nil? && path_system.nil? && disabled_shared_gems.nil?
    system_path = path_system || (disabled_shared_gems == false)
    return Path.new(path, system_path)
  end

  path = "vendor/bundle" if self[:deployment]

  Path.new(path, false)
end

#pretty_values_for(exposed_key)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 235

def pretty_values_for(exposed_key)
  key = key_for(exposed_key)

  locations = []

  if value = @temporary[key]
    locations << "Set for the current command: #{printable_value(value, exposed_key).inspect}"
  end

  if value = @local_config[key]
    locations << "Set for your local app (#{local_config_file}): #{printable_value(value, exposed_key).inspect}"
  end

  if value = @env_config[key]
    locations << "Set via #{key}: #{printable_value(value, exposed_key).inspect}"
  end

  if credential_stored?(exposed_key)
    # The heading calls this a priority order, but a stored credential sits
    # outside it and is used ahead of every config file.
    locations << "Set in the credential store, which is used ahead of the config files"
  end

  if value = @global_config[key]
    locations << "Set for the current user (#{global_config_file}): #{printable_value(value, exposed_key).inspect}"
  end

  # The gemrc cooldown sits outside the priority order too. It is not one
  # of the layers, it raises whatever they resolve to. See #cooldown_for.
  if key == key_for(:cooldown) && (days = gemrc_cooldown_days)
    line = "Set in the RubyGems configuration as `:cooldown:`: #{days}"
    line += ". The longer of that and the top value applies" unless locations.empty?
    locations << line
  end

  return ["You have not configured a value for `#{exposed_key}`"] if locations.empty?
  locations
end

#printable_value(value, key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 761

def printable_value(value, key)
  converted = converted_value(value, key)
  return converted unless converted.is_a?(String)

  if is_string(key)
    converted
  elsif is_credential(key)
    "[REDACTED]"
  elsif is_userinfo(converted)
    username, pass = converted.split(":", 2)

    if pass == "x-oauth-basic"
      username = "[REDACTED]"
    else
      pass = "[REDACTED]"
    end

    [username, pass].join(":")
  else
    converted
  end
end

#processor_count

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 308

def processor_count
  require "etc"
  Etc.nprocessors
rescue StandardError
  1
end

#remove_from_store(store, key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 630

def remove_from_store(store, key)
  unless store.available?
    Bundler.ui.warn "The credential store is enabled but unavailable, so any credential it holds was left in place."
    return true
  end

  store.delete(key)
end

#rubygems_cooldown

RubyGems' :cooldown: gemrc setting, read from the loaded gemrc rather than from Gem.configuration.cooldown, which only exists on RubyGems versions that know the setting. A value assigned to that accessor from Ruby after startup is therefore not seen here.

Reading it builds Gem::ConfigFile, which costs a command that never resolves against a remote around 30ms it has no use for, so the setting is validated here, at the point of use, rather than when the command starts.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 422

def rubygems_cooldown
  return @rubygems_cooldown if defined?(@rubygems_cooldown)

  @rubygems_cooldown = gemrc_cooldown

  if cooldown_settings.invalid?(@rubygems_cooldown)
    Bundler.ui.warn cooldown_settings.invalid_message(@rubygems_cooldown, "the gemrc file")
  end

  @rubygems_cooldown
end

#serializer_class (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 828

def serializer_class
  # The Bundler gem ships its own copy of Gem::YAMLSerializer, so this
  # resolves even on RubyGems versions that predate it.
  require "rubygems/yaml_serializer"
  Gem::YAMLSerializer
end

#set_command_option(key, value)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 126

def set_command_option(key, value)
  temporary(key => value)
  value
end

#set_command_option_if_given(key, value)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 131

def set_command_option_if_given(key, value)
  return if value.nil?
  set_command_option(key, value)
end

#set_global(key, value)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 155

def set_global(key, value)
  set_key(key, value, @global_config, global_config_file)
end

#set_key(raw_key, value, hash, file) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 701

def set_key(raw_key, value, hash, file)
  raw_key = self.class.key_to_s(raw_key)
  key = key_for(raw_key)
   = (raw_key)

  # #temporary passes a nil file, and storing its value would outlive the
  # block while its restore pass deleted the real entry.
  if file && credential_store_key?(raw_key) && (store = active_credential_store(credential_host(raw_key)))
    if value.nil?
      warn_unremoved_credential(raw_key) unless remove_from_store(store, )
    elsif value.is_a?(String) && is_userinfo(value)
      if store.set(, value)
        value = nil
        warn_plaintext_in_other_scope(raw_key, key, hash)
      else
        warn_unremoved_credential(raw_key) if store.available? && !store.delete()
        Bundler.ui.warn "Could not write the credential for #{self.class.remove_userinfo(raw_key)} to the credential store," \
                        " so it was written to #{file} in plain text."
      end
    else
      warn_unremoved_credential(raw_key) unless remove_from_store(store, )
    end
  end

  value = array_to_s(value) if is_array(raw_key)

  return if hash[key] == value

  hash[key] = value
  hash.delete(key) if value.nil?

  Validator.validate!(raw_key, converted_value(value, raw_key), hash)

  return unless file

  SharedHelpers.filesystem_access(file.dirname, :create) do |p|
    FileUtils.mkdir_p(p)
  end

  SharedHelpers.filesystem_access(file) do |p|
    p.open("w") {|f| f.write(serializer_class.dump(hash)) }
  end
end

#set_local(key, value)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 136

def set_local(key, value)
  local_config_file = @local_root.join("config")

  set_key(key, value, @local_config, local_config_file)
end

#split_specific_setting_for(name) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 517

def split_specific_setting_for(name)
  name.split(".")
end

#stored_credential_keys

The keys credentials are stored under, in the same encoding the config hashes use, so #all can fold them in. Empty when no store is enabled or when the backend cannot enumerate its entries, which is why bundle-config(1) warns that a third-party backend may not list.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 302

def stored_credential_keys
  return [] unless store = active_credential_store

  Array(store.list)
end

#stored_outside_config_files?(name) ⇒ Boolean

True when name has a configured value #[] cannot see. A credential in the store is one, and so is the RubyGems :cooldown: setting that #cooldown_for raises the config layers to.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 279

def stored_outside_config_files?(name)
  credential_stored?(name) || (key_for(name) == key_for(:cooldown) && !gemrc_cooldown_days.nil?)
end

#temporary(update)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 142

def temporary(update)
  existing = Hash[update.map {|k, _| [k, @temporary[key_for(k)]] }]
  update.each do |k, v|
    set_key(k, v, @temporary, nil)
  end
  return unless block_given?
  begin
    yield
  ensure
    existing.each {|k, v| set_key(k, v, @temporary, nil) }
  end
end

#to_array(value) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 690

def to_array(value)
  return [] unless value
  value.tr(" ", ":").split(":").map(&:to_sym)
end

#to_bool(value) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 531

def to_bool(value)
  self.class.to_bool(value)
end

#validate!

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 434

def validate!
  all.each do |raw_key|
    [@local_config, @env_config, @global_config].each do |settings|
      value = value_for(raw_key, settings)
      Validator.validate!(raw_key, value, settings.dup)
    end
  end
end

#value_for(name, config) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 480

def value_for(name, config)
  converted_value(config[key_for(name)], name)
end

#warn_plaintext_in_other_scope(raw_key, key, hash) (private)

A write clears the plaintext only from the config file it targets, so a copy in the other scope comes back into use once the setting is off.

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 641

def warn_plaintext_in_other_scope(raw_key, key, hash)
  other, other_file =
    if hash.equal?(@local_config)
      [@global_config, global_config_file]
    else
      [@local_config, @local_root.join("config")]
    end

  return unless other.key?(key)

  # Deliberately not `bundle config unset`, which would clear the store as
  # well and throw away the credential this write moved into it.
  safe_key = self.class.remove_userinfo(raw_key)
  Bundler.ui.warn "The credential for #{safe_key} moved into the credential store, but a plain text copy" \
                  " remains in #{other_file}. Delete the #{key_for(safe_key)} entry from that file to finish the move."
end

#warn_unremoved_credential(raw_key) (private)

[ GitHub ]

  
# File 'lib/bundler/settings.rb', line 658

def warn_unremoved_credential(raw_key)
  Bundler.ui.warn "Could not remove the credential for #{self.class.remove_userinfo(raw_key)} from the credential store." \
                  " It is still there. Remove it with your platform's credential manager."
end