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
-
ARRAY_KEYS =
# File 'lib/bundler/settings.rb', line 56%w[ only prune with without ].freeze
-
BOOL_KEYS =
# File 'lib/bundler/settings.rb', line 9%w[ auto_install cache_all cache_all_platforms clean deployment disable_checksum_validation disable_exec_load disable_local_branch_check disable_local_revision_check disable_shared_gems disable_version_check force_ruby_platform frozen gem.changelog gem.coc gem.mit gem.bundle git.allow_insecure global_gem_cache ignore_messages init_gems_rb inline keep_outdated_cache lockfile_checksums no_build_extension no_install no_install_plugin no_prune path.system plugins prefer_patch silence_deprecations silence_root_warning update_requires_all_flag verbose ].freeze
-
CREDENTIAL_HOST_KEY =
# File 'lib/bundler/settings.rb', line 613/\A[a-z0-9-](\.[a-z0-9-])(:\d)?\z/i -
CREDENTIAL_STORE_SERVICE =
# File 'lib/bundler/settings.rb', line 553
Kept separate from RubyGems so gem signout does not remove Bundler's host credentials.
"bundler" -
CREDENTIAL_URL_KEY =
# File 'lib/bundler/settings.rb', line 612%r{\Ahttps?://}i -
DEFAULT_CONFIG =
# File 'lib/bundler/settings.rb', line 84{ "BUNDLE_SILENCE_DEPRECATIONS" => false, "BUNDLE_DISABLE_VERSION_CHECK" => true, "BUNDLE_PREFER_PATCH" => false, "BUNDLE_REDIRECT" => 5, "BUNDLE_RETRY" => 3, "BUNDLE_TIMEOUT" => 10, "BUNDLE_VERSION" => "lockfile", "BUNDLE_LOCKFILE_CHECKSUMS" => true, "BUNDLE_CACHE_ALL" => true, "BUNDLE_PLUGINS" => true, "BUNDLE_GLOBAL_GEM_CACHE" => false, "BUNDLE_UPDATE_REQUIRES_ALL_FLAG" => false, }.freeze -
FALLBACK_TIMEOUT_URI_OPTION =
# File 'lib/bundler/settings.rb', line 835"fallback_timeout" -
NORMALIZE_URI_OPTIONS_PATTERN =
# File 'lib/bundler/settings.rb', line 837/ \A (\w+\.)? # optional prefix key (https?.*?) # URI (\.#{FALLBACK_TIMEOUT_URI_OPTION})? # optional suffix key \z /ix -
NUMBER_KEYS =
# File 'lib/bundler/settings.rb', line 47%w[ cooldown jobs redirect retry ssl_verify_mode timeout ].freeze
-
RENAMED_KEYS =
# File 'lib/bundler/settings.rb', line 103
{ "keep_outdated_cache" => "no_prune", }.freeze -
STRING_KEYS =
# File 'lib/bundler/settings.rb', line 63%w[ bin cache_path console credential_store default_cli_command gem.ci gem.github_username gem.linter gem.rubocop gem.test gemfile lockfile path shebang simulate_version system_bindir trust-policy version ].freeze
Class Method Summary
- .new(root = nil) ⇒ Settings constructor
- .key_for(key) private
-
.key_to_s(key)
private
See additional method definition at line 901.
-
.normalize_uri(uri)
private
TODO: duplicates
Rubygems#normalize_uriTODO: is this the correct place to validate mirror URIs? - .remove_userinfo(key) private
- .to_bool(value) private
Instance Attribute Summary
- #ignore_config? ⇒ Boolean readonly
Instance Method Summary
- #[](name)
- #all
-
#all_including_stored_credentials
#all plus the keys whose credential lives in the credential store.
- #app_cache_path
-
#cooldown_for(source_cooldown = nil)
The cooldown that applies to a source whose Gemfile declaration asks for
source_cooldowndays. -
#credential_stored?(name) ⇒ Boolean
True when
name's credential lives in the credential store. - #credentials_for(uri)
- #gem_mirrors
- #installation_parallelization
- #key_for(key)
- #local_overrides
- #locations(key)
- #mirror_for(uri)
-
#path
for legacy reasons, in
::Bundler2, we do not respect:disable_shared_gems. - #pretty_values_for(exposed_key)
- #processor_count
-
#rubygems_cooldown
RubyGems'
:cooldown:gemrc setting, read from the loaded gemrc rather than fromGem.configuration.cooldown, which only exists on RubyGems versions that know the setting. - #set_command_option(key, value)
- #set_command_option_if_given(key, value)
- #set_global(key, value)
- #set_local(key, value)
-
#stored_credential_keys
The keys credentials are stored under, in the same encoding the config hashes use, so #all can fold them in.
-
#stored_outside_config_files?(name) ⇒ Boolean
True when
namehas a configured value #[] cannot see. - #temporary(update)
- #validate!
-
#active_credential_store(host = nil)
private
The
Gem::CredentialStorefor the spec #credential_store_spec returns, or nil when the setting is off or this RubyGems has no credential store. - #array_to_s(array) private
- #configs private
-
#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.
- #converted_value(value, key) private
- #cooldown_settings private
-
#credential_account(raw_key)
private
See
Gem::ConfigFile.credential_store_accountfor why userinfo is dropped. - #credential_host(raw_key) private
- #credential_store_class private
-
#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. -
#credential_store_spec(host = nil)
private
A
credential_store.setting overrides the global one for that host only. -
#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.
- #credentials_from_store(uri) private
-
#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. -
#gemrc_cooldown_days
private
The gemrc cooldown as a usable number of days, or nil.
- #global_config_file private
- #is_array(key) private
- #is_bool(name) private
- #is_credential(key) private
- #is_num(key) private
- #is_string(name) private
- #is_userinfo(value) private
- #load_config(config_file) private
- #local_config_file private
- #parent_setting_for(name) private
- #printable_value(value, key) private
- #remove_from_store(store, key) private
- #serializer_class private
- #set_key(raw_key, value, hash, file) private
- #split_specific_setting_for(name) private
- #to_array(value) private
- #to_bool(value) private
- #value_for(name, config) private
-
#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.
- #warn_unremoved_credential(raw_key) private
Constructor Details
.new(root = nil) ⇒ Settings
# 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"). @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.
# 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?
# 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.
# 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
# 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.
# 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 ]#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.
# 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 ]#credential_account(raw_key) (private)
See Gem::ConfigFile.credential_store_account for why userinfo is dropped.
# File 'lib/bundler/settings.rb', line 664
def credential_account(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 = ->() { Bundler.ui.warn() } 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.
# 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.
# 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.
# 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(credential_account(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.
#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(credential_account(uri.to_s)) || store.get(credential_account(uri.host)) end
#gem_mirrors
[ GitHub ]#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.
# 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.
# 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 ]#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
# 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 ]#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.
# 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.(@rubygems_cooldown, "the gemrc file") end @rubygems_cooldown end
#serializer_class (private)
[ GitHub ]#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) account = credential_account(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, account) elsif value.is_a?(String) && is_userinfo(value) if store.set(account, value) value = nil warn_plaintext_in_other_scope(raw_key, key, hash) else warn_unremoved_credential(raw_key) if store.available? && !store.delete(account) 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, account) 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.
# 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.
# 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 ]#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 ]#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.
# 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