class Bundler::Settings

Constants

ARRAY_KEYS
BOOL_KEYS
CONFIG_REGEX
DEFAULT_CONFIG
NORMALIZE_URI_OPTIONS_PATTERN
NUMBER_KEYS
PER_URI_OPTIONS
Path

Public Class Methods

new(root = nil) click to toggle source
# File lib/bundler/settings.rb, line 85
def initialize(root = nil)
  @root            = root
  @local_config    = load_config(local_config_file)
  @global_config   = load_config(global_config_file)
  @temporary       = {}
end

Private Class Methods

normalize_uri(uri) click to toggle source

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

# File lib/bundler/settings.rb, line 449
def self.normalize_uri(uri)
  uri = uri.to_s
  if uri =~ NORMALIZE_URI_OPTIONS_PATTERN
    prefix = $1
    uri = $2
    suffix = $3
  end
  uri = "#{uri}/" unless uri.end_with?("/")
  uri = URI(uri)
  unless uri.absolute?
    raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
  end
  "#{prefix}#{uri}#{suffix}"
end

Public Instance Methods

[](name) click to toggle source
# File lib/bundler/settings.rb, line 92
def [](name)
  key = key_for(name)
  value = @temporary.fetch(key) do
          @local_config.fetch(key) do
          ENV.fetch(key) do
          @global_config.fetch(key) do
          DEFAULT_CONFIG.fetch(name) do
            nil
          end end end end end

  converted_value(value, name)
end
all() click to toggle source
# File lib/bundler/settings.rb, line 154
def all
  env_keys = ENV.keys.grep(/\ABUNDLE_.+/)

  keys = @temporary.keys | @global_config.keys | @local_config.keys | env_keys

  keys.map do |key|
    key.sub(/^BUNDLE_/, "").gsub(/__/, ".").downcase
  end
end
allow_sudo?() click to toggle source
# File lib/bundler/settings.rb, line 284
def allow_sudo?
  key = key_for(:path)
  path_configured = @temporary.key?(key) || @local_config.key?(key)
  !path_configured
end
app_cache_path() click to toggle source
# File lib/bundler/settings.rb, line 294
def app_cache_path
  @app_cache_path ||= self[:cache_path] || "vendor/cache"
end
credentials_for(uri) click to toggle source
# File lib/bundler/settings.rb, line 177
def credentials_for(uri)
  self[uri.to_s] || self[uri.host]
end
gem_mirrors() click to toggle source
# File lib/bundler/settings.rb, line 181
def gem_mirrors
  all.inject(Mirrors.new) do |mirrors, k|
    mirrors.parse(k, self[k]) if k.start_with?("mirror.")
    mirrors
  end
end
ignore_config?() click to toggle source
# File lib/bundler/settings.rb, line 290
def ignore_config?
  ENV["BUNDLE_IGNORE_CONFIG"]
end
key_for(key) click to toggle source
# File lib/bundler/settings.rb, line 307
def key_for(key)
  key = Settings.normalize_uri(key).to_s if key.is_a?(String) && /https?:/ =~ key
  key = key.to_s.gsub(".", "__").upcase
  "BUNDLE_#{key}"
end
local_overrides() click to toggle source
# File lib/bundler/settings.rb, line 164
def local_overrides
  repos = {}
  all.each do |k|
    repos[$'] = self[k] if k =~ /^local\./
  end
  repos
end
locations(key) click to toggle source
# File lib/bundler/settings.rb, line 188
def locations(key)
  key = key_for(key)
  locations = {}
  locations[:temporary] = @temporary[key] if @temporary.key?(key)
  locations[:local]  = @local_config[key] if @local_config.key?(key)
  locations[:env]    = ENV[key] if ENV[key]
  locations[:global] = @global_config[key] if @global_config.key?(key)
  locations[:default] = DEFAULT_CONFIG[key] if DEFAULT_CONFIG.key?(key)
  locations
end
mirror_for(uri) click to toggle source
# File lib/bundler/settings.rb, line 172
def mirror_for(uri)
  uri = URI(uri.to_s) unless uri.is_a?(URI)
  gem_mirrors.for(uri.to_s).uri
end
path() click to toggle source

for legacy reasons, in Bundler 1, the ruby scope isnt appended when the setting comes from ENV or the global config, nor do we respect :disable_shared_gems

# File lib/bundler/settings.rb, line 226
def path
  key  = key_for(:path)
  path = ENV[key] || @global_config[key]
  if path && !@temporary.key?(key) && !@local_config.key?(key)
    return Path.new(path, Bundler.feature_flag.global_path_appends_ruby_scope?, false, false)
  end

  system_path = self["path.system"] || (self[:disable_shared_gems] == false)
  Path.new(self[:path], true, system_path, Bundler.feature_flag.default_install_uses_path?)
end
pretty_values_for(exposed_key) click to toggle source
# File lib/bundler/settings.rb, line 199
def pretty_values_for(exposed_key)
  key = key_for(exposed_key)

  locations = []

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

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

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

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

  return ["You have not configured a value for `#{exposed_key}`"] if locations.empty?
  locations
end
set_command_option(key, value) click to toggle source
# File lib/bundler/settings.rb, line 105
def set_command_option(key, value)
  if Bundler.feature_flag.forget_cli_options?
    temporary(key => value)
    value
  else
    command = if value.nil?
      "bundle config --delete #{key}"
    else
      "bundle config #{key} #{Array(value).join(":")}"
    end

    Bundler::SharedHelpers.major_deprecation 3,\
      "flags passed to commands " \
      "will no longer be automatically remembered. Instead please set flags " \
      "you want remembered between commands using `bundle config " \
      "<setting name> <setting value>`, i.e. `#{command}`"

    set_local(key, value)
  end
end
set_command_option_if_given(key, value) click to toggle source
# File lib/bundler/settings.rb, line 126
def set_command_option_if_given(key, value)
  return if value.nil?
  set_command_option(key, value)
end
set_global(key, value) click to toggle source
# File lib/bundler/settings.rb, line 150
def set_global(key, value)
  set_key(key, value, @global_config, global_config_file)
end
set_local(key, value) click to toggle source
# File lib/bundler/settings.rb, line 131
def set_local(key, value)
  local_config_file || raise(GemfileNotFound, "Could not locate Gemfile")

  set_key(key, value, @local_config, local_config_file)
end
temporary(update) { || ... } click to toggle source
# File lib/bundler/settings.rb, line 137
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
validate!() click to toggle source
# File lib/bundler/settings.rb, line 298
def validate!
  all.each do |raw_key|
    [@local_config, ENV, @global_config].each do |settings|
      value = converted_value(settings[key_for(raw_key)], raw_key)
      Validator.validate!(raw_key, value, settings.to_hash.dup)
    end
  end
end

Private Instance Methods

array_to_s(array) click to toggle source
# File lib/bundler/settings.rb, line 353
def array_to_s(array)
  array = Array(array)
  return nil if array.empty?
  array.join(":").tr(" ", ":")
end
converted_value(value, key) click to toggle source
# File lib/bundler/settings.rb, line 380
def converted_value(value, 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
global_config_file() click to toggle source
# File lib/bundler/settings.rb, line 394
def global_config_file
  if ENV["BUNDLE_CONFIG"] && !ENV["BUNDLE_CONFIG"].empty?
    Pathname.new(ENV["BUNDLE_CONFIG"])
  else
    begin
      Bundler.user_bundle_path("config")
    rescue PermissionError, GenericSystemCallError
      nil
    end
  end
end
is_array(key) click to toggle source
# File lib/bundler/settings.rb, line 344
def is_array(key)
  ARRAY_KEYS.include?(key.to_s)
end
is_bool(name) click to toggle source
# File lib/bundler/settings.rb, line 327
def is_bool(name)
  BOOL_KEYS.include?(name.to_s) || BOOL_KEYS.include?(parent_setting_for(name.to_s))
end
is_num(key) click to toggle source
# File lib/bundler/settings.rb, line 340
def is_num(key)
  NUMBER_KEYS.include?(key.to_s)
end
load_config(config_file) click to toggle source
# File lib/bundler/settings.rb, line 424
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
    require "bundler/yaml_serializer"
    YAMLSerializer.load file.read
  end
end
local_config_file() click to toggle source
# File lib/bundler/settings.rb, line 406
def local_config_file
  Pathname.new(@root).join("config") if @root
end
parent_setting_for(name) click to toggle source
# File lib/bundler/settings.rb, line 315
def parent_setting_for(name)
  split_specific_setting_for(name)[0]
end
set_key(raw_key, value, hash, file) click to toggle source
# File lib/bundler/settings.rb, line 359
def set_key(raw_key, value, hash, file)
  raw_key = raw_key.to_s
  value = array_to_s(value) if is_array(raw_key)

  key = key_for(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) do |p|
    FileUtils.mkdir_p(p.dirname)
    require "bundler/yaml_serializer"
    p.open("w") {|f| f.write(YAMLSerializer.dump(hash)) }
  end
end
specific_gem_for(name) click to toggle source
# File lib/bundler/settings.rb, line 319
def specific_gem_for(name)
  split_specific_setting_for(name)[1]
end
split_specific_setting_for(name) click to toggle source
# File lib/bundler/settings.rb, line 323
def split_specific_setting_for(name)
  name.split(".")
end
to_array(value) click to toggle source
# File lib/bundler/settings.rb, line 348
def to_array(value)
  return [] unless value
  value.split(":").map(&:to_sym)
end
to_bool(value) click to toggle source
# File lib/bundler/settings.rb, line 331
def to_bool(value)
  case value
  when nil, /\A(false|f|no|n|0|)\z/i, false
    false
  else
    true
  end
end