Class: Gem::Commands::SourcesCommand
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
::Gem::Command
|
|
|
Instance Chain:
|
|
| Inherits: |
Gem::Command
|
| Defined in: | lib/rubygems/commands/sources_command.rb |
Constant Summary
::Gem::Command - Inherited
Class Attribute Summary
::Gem::Command - Inherited
| .build_args | Arguments used when building gems. |
| .build_args=, .extra_args, .extra_args= | |
Class Method Summary
- .new ⇒ SourcesCommand constructor
::Gem::Command - Inherited
| .add_common_option, | |
| .add_specific_extra_args | Add a list of extra arguments for the given command. |
| .common_options, | |
| .new | Initializes a generic gem command named |
| .specific_extra_args | Return an array of extra arguments for the command. |
| .specific_extra_args_hash | Accessor for the specific extra args hash (self initializing). |
Instance Attribute Summary
- #list readonly Internal use only
- #list? ⇒ Boolean readonly Internal use only
::Gem::LocalRemoteOptions - Included
| #both? | Is fetching of local and remote information enabled? |
| #local? | Is local fetching enabled? |
| #remote? | Is remote fetching enabled? |
::Gem::Command - Inherited
| #command | The name of the command. |
| #defaults | The default options for the command. |
| #deprecated?, | |
| #options | The options for the command. |
| #program_name | The name of the command for command-line invocation. |
| #summary | A short description of the command. |
::Gem::DefaultUserInteraction - Included
Instance Method Summary
- #check_typo_squatting(source)
- #execute
- #build_new_source(source_uri) private
- #build_source(source_uri) private
- #config_file_name private
- #configured_sources private
- #default_sources private
- #add_source(source_uri) Internal use only
- #append_source(source_uri) Internal use only
- #check_rubygems_https(source_uri) Internal use only
- #clear_all Internal use only
- #defaults_str Internal use only
- #description Internal use only
- #normalize_source_uri(source_uri) Internal use only
- #prepend_source(source_uri) Internal use only
- #remove_cache_file(desc, path) Internal use only
- #remove_source(source_uri) Internal use only
- #update Internal use only
::Gem::LocalRemoteOptions - Included
| #accept_uri_http | Allows |
| #add_bulk_threshold_option | Add the –bulk-threshold option. |
| #add_clear_sources_option | Add the –clear-sources option. |
| #add_local_remote_options | Add local/remote options to the command line parser. |
| #add_proxy_option | Add the –http-proxy option. |
| #add_source_option | Add the –source option. |
| #add_update_sources_option | Add the –update-sources option. |
::Gem::Command - Inherited
| #add_extra_args | Adds extra args from ~/.gemrc. |
| #add_option | Add a command-line option and handler to the command. |
| #arguments | Override to provide details of the arguments a command takes. |
| #begins? | True if |
| #check_deprecated_options, | |
| #defaults_str | Override to display the default values of the command options. |
| #deprecate_option | Mark a command-line option as deprecated, and optionally specify a deprecation horizon. |
| #description | Override to display a longer description of what this command does. |
| #execute | Override to provide command handling. |
| #get_all_gem_names | Get all gem names from the command line. |
| #get_all_gem_names_and_versions | Get all [gem, version] from the command line. |
| #get_one_gem_name | Get a single gem name from the command line. |
| #get_one_optional_argument | Get a single optional argument from the command line. |
| #handle_options | Handle the given list of arguments by parsing them and recording the results. |
| #handles? | True if the command handles the given argument list. |
| #invoke | Invoke the command with the given list of arguments. |
| #invoke_with_build_args | Invoke the command with the given list of normal arguments and additional build arguments. |
| #merge_options | Merge a set of command options with the set of default options (without modifying the default option hash). |
| #remove_option | Remove previously defined command-line argument |
| #show_help | Display the help message for the command. |
| #show_lookup_failure | Display to the user that a gem couldn’t be found and reasons why –. |
| #usage | Override to display the usage for an individual gem command. |
| #when_invoked | Call the given block when invoked. |
| #add_parser_run_info | Adds a section with |
| #configure_options, | |
| #create_option_parser | Creates an option parser and fills it in with the help info for the command. |
| #option_is_deprecated?, | |
| #parser | Create on demand parser. |
| #wrap | Wraps |
| #extract_gem_name_and_version, #add_parser_description, #add_parser_options, #add_parser_summary | |
::Gem::UserInteraction - Included
| #alert | Displays an alert |
| #alert_error | Displays an error |
| #alert_warning | Displays a warning |
| #ask | Asks a |
| #ask_for_password | Asks for a password with a |
| #ask_yes_no | Asks a yes or no |
| #choose_from_list | Asks the user to answer |
| #say | Displays the given |
| #terminate_interaction | Terminates the RubyGems process with the given |
| #verbose | Calls |
::Gem::DefaultUserInteraction - Included
::Gem::Text - Included
| #clean_text | Remove any non-printable characters and make the text suitable for printing. |
| #format_text | Wraps |
| #levenshtein_distance | Returns a value representing the “cost” of transforming str1 into str2 Vendored version of |
| #truncate_text, #min3 | |
Constructor Details
.new ⇒ SourcesCommand
# File 'lib/rubygems/commands/sources_command.rb', line 11
def initialize require "fileutils" super "sources", "Manage the sources and cache file RubyGems uses to search for gems" add_option "-a", "--add SOURCE_URI", "Add source" do |value, | [:add] = value end add_option "--append SOURCE_URI", "Append source (can be used multiple times)" do |value, | [:append] = value end add_option "-p", "--prepend SOURCE_URI", "Prepend source (can be used multiple times)" do |value, | [:prepend] = value end add_option "-l", "--list", "List sources" do |value, | [:list] = value end add_option "-r", "--remove SOURCE_URI", "Remove source" do |value, | [:remove] = value end add_option "-c", "--clear-all", "Remove all sources (clear the cache)" do |value, | [:clear_all] = value end add_option "-u", "--update", "Update source cache" do |value, | [:update] = value end add_option "-f", "--[no-]force", "Do not show any confirmation prompts and behave as if 'yes' was always answered" do |value, | [:force] = value end add_proxy_option end
Instance Attribute Details
#list (readonly)
# File 'lib/rubygems/commands/sources_command.rb', line 237
def list # :nodoc: if configured_sources header = "*** CURRENT SOURCES ***" list = configured_sources else header = "*** NO CONFIGURED SOURCES, DEFAULT SOURCES LISTED BELOW ***" list = Gem.sources end say header say list.each do |src| say src end end
#list? ⇒ Boolean (readonly)
Instance Method Details
#add_source(source_uri)
# File 'lib/rubygems/commands/sources_command.rb', line 52
def add_source(source_uri) # :nodoc: source = build_new_source(source_uri) source_uri = source.uri.to_s begin if Gem.sources.include? source say "source #{source_uri} already present in the cache" else source.load_specs :released Gem.sources << source Gem.configuration.write say "#{source_uri} added to sources" end rescue Gem::URI::Error, ArgumentError say "#{source_uri} is not a URI" terminate_interaction 1 rescue Gem::RemoteFetcher::FetchError => e say "Error fetching #{Gem::Uri.redact(source.uri)}:\n\t#{e.}" terminate_interaction 1 end end
#append_source(source_uri)
# File 'lib/rubygems/commands/sources_command.rb', line 75
def append_source(source_uri) # :nodoc: source = build_new_source(source_uri) source_uri = source.uri.to_s begin source.load_specs :released was_present = Gem.sources.include?(source) Gem.sources.append source Gem.configuration.write if was_present say "#{source_uri} moved to end of sources" else say "#{source_uri} added to sources" end rescue Gem::URI::Error, ArgumentError say "#{source_uri} is not a URI" terminate_interaction 1 rescue Gem::RemoteFetcher::FetchError => e say "Error fetching #{Gem::Uri.redact(source.uri)}:\n\t#{e.}" terminate_interaction 1 end end
#build_new_source(source_uri) (private)
[ GitHub ]# File 'lib/rubygems/commands/sources_command.rb', line 342
def build_new_source(source_uri) source = build_source(source_uri) check_rubygems_https(source.uri.to_s) check_typo_squatting(source) source end
#build_source(source_uri) (private)
[ GitHub ]# File 'lib/rubygems/commands/sources_command.rb', line 337
def build_source(source_uri) source_uri = normalize_source_uri(source_uri) Gem::Source.new(source_uri) end
#check_rubygems_https(source_uri)
# File 'lib/rubygems/commands/sources_command.rb', line 148
def check_rubygems_https(source_uri) # :nodoc: uri = Gem::URI source_uri if uri.scheme && uri.scheme.casecmp("http").zero? && uri.host.casecmp("rubygems.org").zero? question = <<-QUESTION.chomp https://rubygems.org is recommended for security over #{uri} Do you want to add this insecure source? QUESTION terminate_interaction 1 unless [:force] || ask_yes_no(question) end end
#check_typo_squatting(source)
[ GitHub ]# File 'lib/rubygems/commands/sources_command.rb', line 123
def check_typo_squatting(source) if source.typo_squatting?("rubygems.org") question = <<-QUESTION.chomp #{source.uri} is too similar to https://rubygems.org Do you want to add this source? QUESTION terminate_interaction 1 unless [:force] || ask_yes_no(question) end end
#clear_all
# File 'lib/rubygems/commands/sources_command.rb', line 163
def clear_all # :nodoc: path = Gem.spec_cache_dir FileUtils.rm_rf path if File.exist? path if File.writable? path say "*** Unable to remove source cache ***" else say "*** Unable to remove source cache (write protected) ***" end terminate_interaction 1 else say "*** Removed specs cache ***" end end
#config_file_name (private)
[ GitHub ]# File 'lib/rubygems/commands/sources_command.rb', line 333
def config_file_name Gem.configuration.config_file_name end
#configured_sources (private)
[ GitHub ]# File 'lib/rubygems/commands/sources_command.rb', line 326
def configured_sources return @configured_sources if defined?(@configured_sources) configuration_sources = Gem.configuration.sources @configured_sources = Gem::SourceList.from(configuration_sources) if configuration_sources end
#default_sources (private)
[ GitHub ]# File 'lib/rubygems/commands/sources_command.rb', line 322
def default_sources Gem::SourceList.from(Gem.default_sources) end
#defaults_str
# File 'lib/rubygems/commands/sources_command.rb', line 180
def defaults_str # :nodoc: "--list" end
#description
# File 'lib/rubygems/commands/sources_command.rb', line 184
def description # :nodoc: <<-EOF RubyGems fetches gems from the sources you have configured (stored in your ~/.gemrc). The default source is https://rubygems.org, but you may have other sources configured. This guide will help you update your sources or configure yourself to use your own gem server. Without any arguments the sources lists your currently configured sources: $ gem sources *** NO CONFIGURED SOURCES, DEFAULT SOURCES LISTED BELOW *** https://rubygems.org This may list multiple sources or non-rubygems sources. You probably configured them before or have an old `~/.gemrc`. If you have sources you do not recognize you should remove them. RubyGems has been configured to serve gems via the following URLs through its history: * http://gems.rubyforge.org (RubyGems 1.3.5 and earlier) * http://rubygems.org (RubyGems 1.3.6 through 1.8.30, and 2.0.0) * https://rubygems.org (RubyGems 2.0.1 and newer) Since all of these sources point to the same set of gems you only need one of them in your list. https://rubygems.org is recommended as it brings the protections of an SSL connection to gem downloads. To add a private gem source use the --prepend argument to insert it before the default source. This is usually the best place for private gem sources: $ gem sources --prepend https://my.private.source https://my.private.source added to sources RubyGems will check to see if gems can be installed from the source given before it is added. To add or move a source after all other sources, use --append: $ gem sources --append https://rubygems.org https://rubygems.org moved to end of sources To remove a source use the --remove argument: $ gem sources --remove https://my.private.source/ https://my.private.source/ removed from sources EOF end
#execute
[ GitHub ]# File 'lib/rubygems/commands/sources_command.rb', line 263
def execute clear_all if [:clear_all] add_source [:add] if [:add] prepend_source [:prepend] if [:prepend] append_source [:append] if [:append] remove_source [:remove] if [:remove] update if [:update] list if list? end
#normalize_source_uri(source_uri)
# File 'lib/rubygems/commands/sources_command.rb', line 135
def normalize_source_uri(source_uri) # :nodoc: # Ensure the source URI has a trailing slash for proper RFC 2396 path merging # Without a trailing slash, the last path segment is treated as a file and removed # during relative path resolution (e.g., "/blish" + "gems/foo.gem" = "/gems/foo.gem") # With a trailing slash, it's treated as a directory (e.g., "/blish/" + "gems/foo.gem" = "/blish/gems/foo.gem") uri = Gem::URI.parse(source_uri) uri.path = uri.path.gsub(%r{/+\z}, "") + "/" if uri.path && !uri.path.empty? uri.to_s rescue Gem::URI::Error # If parsing fails, return the original URI and let later validation handle it source_uri end
#prepend_source(source_uri)
# File 'lib/rubygems/commands/sources_command.rb', line 99
def prepend_source(source_uri) # :nodoc: source = build_new_source(source_uri) source_uri = source.uri.to_s begin source.load_specs :released was_present = Gem.sources.include?(source) Gem.sources.prepend source Gem.configuration.write if was_present say "#{source_uri} moved to top of sources" else say "#{source_uri} added to sources" end rescue Gem::URI::Error, ArgumentError say "#{source_uri} is not a URI" terminate_interaction 1 rescue Gem::RemoteFetcher::FetchError => e say "Error fetching #{Gem::Uri.redact(source.uri)}:\n\t#{e.}" terminate_interaction 1 end end
#remove_cache_file(desc, path)
# File 'lib/rubygems/commands/sources_command.rb', line 308
def remove_cache_file(desc, path) # :nodoc: FileUtils.rm_rf path if !File.exist?(path) say "*** Removed #{desc} source cache ***" elsif !File.writable?(path) say "*** Unable to remove #{desc} source cache (write protected) ***" else say "*** Unable to remove #{desc} source cache ***" end end
#remove_source(source_uri)
# File 'lib/rubygems/commands/sources_command.rb', line 279
def remove_source(source_uri) # :nodoc: source = build_source(source_uri) source_uri = source.uri.to_s if configured_sources&.include? source Gem.sources.delete source Gem.configuration.write if default_sources.include?(source) && configured_sources.one? alert_warning "Removing a default source when it is the only source has no effect. Add a different source to #{config_file_name} if you want to stop using it as a source." else say "#{source_uri} removed from sources" end elsif configured_sources say "source #{source_uri} cannot be removed because it's not present in #{config_file_name}" else say "source #{source_uri} cannot be removed because there are no configured sources in #{config_file_name}" end end