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 84
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 448
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 91
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 153
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 283
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 293
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 176
def credentials_for(uri)
  self[uri.to_s] || self[uri.host]
end
gem_mirrors() click to toggle source
# File lib/bundler/settings.rb, line 180
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 289
def ignore_config?
  ENV["BUNDLE_IGNORE_CONFIG"]
end
key_for(key) click to toggle source
# File lib/bundler/settings.rb, line 306
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 163
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 187
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 171
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 225
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 198
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 104
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 2,\
      "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 125
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 149
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 130
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 136
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 297
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 352
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 379
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 393
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 343
def is_array(key)
  ARRAY_KEYS.include?(key.to_s)
end
is_bool(name) click to toggle source
# File lib/bundler/settings.rb, line 326
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 339
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 423
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 405
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 314
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 358
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 318
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 322
def split_specific_setting_for(name)
  name.split(".")
end
to_array(value) click to toggle source
# File lib/bundler/settings.rb, line 347
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 330
def to_bool(value)
  case value
  when nil, /\A(false|f|no|n|0|)\z/i, false
    false
  else
    true
  end
end