Class: Gem::Command
Overview
Base class for all ::Gem commands.  When creating a new gem command, define #initialize, #execute, #arguments, #defaults_str, #description and #usage (as appropriate).  See the above mentioned methods for details.
A very good example to look at is Commands::ContentsCommand
Constant Summary
- 
    HELP =
    Internal use only
    
 # File 'lib/rubygems/command.rb', line 627<<-HELP RubyGems is a package manager for Ruby. Usage: gem -h/--help gem -v/--version gem [global options...] command [arguments...] [options...] Global options: -C PATH run as if gem was started in <PATH> instead of the current working directory Examples: gem install rake gem list --local gem build package.gemspec gem push package-0.0.1.gem gem help install Further help: gem help commands list all 'gem' commands gem help examples show some examples of usage gem help gem_dependencies gem dependencies file guide gem help platforms gem platforms guide gem help <COMMAND> show help on COMMAND (e.g. 'gem help install') Further information: https://guides.rubygems.org HELP 
Class Attribute Summary
- 
    
      .build_args  
    
    rw
    Arguments used when building gems. 
- .build_args=(value) rw
- .extra_args rw
- .extra_args=(value) rw
Class Method Summary
- .add_common_option(*args, &handler)
- 
    
      .add_specific_extra_args(cmd, args)  
    
    Add a list of extra arguments for the given command. 
- .common_options
- 
    
      .new(command, summary = nil, defaults = {})  ⇒ Command 
    
    constructor
    Initializes a generic gem command named #command. 
- 
    
      .specific_extra_args(cmd)  
    
    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
- 
    
      #command  
    
    readonly
    The name of the command. 
- 
    
      #defaults  
    
    rw
    The default options for the command. 
- #deprecated? ⇒ Boolean readonly
- 
    
      #options  
    
    readonly
    The options for the command. 
- 
    
      #program_name  
    
    rw
    The name of the command for command-line invocation. 
- 
    
      #summary  
    
    rw
    A short description of the command. 
DefaultUserInteraction - Included
Instance Method Summary
- 
    
      #add_extra_args(args)  
    
    Adds extra args from ~/.gemrc. 
- 
    
      #add_option(*opts, &handler)  
    
    Add a command-line option and handler to the command. 
- 
    
      #arguments  
    
    Override to provide details of the arguments a command takes. 
- 
    
      #begins?(long, short)  ⇒ Boolean 
    
    True if longbegins with the characters fromshort.
- #check_deprecated_options(options)
- 
    
      #defaults_str  
    
    Override to display the default values of the command options. 
- 
    
      #deprecate_option(name, version: nil, extra_msg: nil)  
    
    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(args)  
    
    Handle the given list of arguments by parsing them and recording the results. 
- 
    
      #handles?(args)  ⇒ Boolean 
    
    True if the command handles the given argument list. 
- 
    
      #invoke(*args)  
    
    Invoke the command with the given list of arguments. 
- 
    
      #invoke_with_build_args(args, build_args)  
    
    Invoke the command with the given list of normal arguments and additional build arguments. 
- 
    
      #merge_options(new_options)  
    
    Merge a set of command options with the set of default options (without modifying the default option hash). 
- 
    
      #remove_option(name)  
    
    Remove previously defined command-line argument name.
- 
    
      #show_help  
    
    Display the help message for the command. 
- 
    
      #show_lookup_failure(gem_name, version, errors, suppress_suggestions = false, required_by = nil)  
    
    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(&block)  
    
    Call the given block when invoked. 
- 
    
      #add_parser_run_info(title, content)  
    
    private
    Adds a section with titleandcontentto the parser help view.
- #configure_options(header, option_list) private
- 
    
      #create_option_parser  
    
    private
    Creates an option parser and fills it in with the help info for the command. 
- #option_is_deprecated?(option) ⇒ Boolean private
- 
    
      #parser  
    
    private
    Create on demand parser. 
- 
    
      #wrap(text, width)  
    
    private
    Wraps texttowidth
- #extract_gem_name_and_version(name) Internal use only
- #add_parser_description private Internal use only
- #add_parser_options private Internal use only
- #add_parser_summary private Internal use only
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  | 
DefaultUserInteraction - Included
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(command, summary = nil, defaults = {})  ⇒ Command 
  
Initializes a generic gem command named #command.  #summary is a short description displayed in gem help commands.  #defaults are the default options.  Defaults should be mirrored in #defaults_str, unless there are none.
When defining a new command subclass, use add_option to add command-line switches.
Unhandled arguments (gem names, files, etc.) are left in options[:args].
# File 'lib/rubygems/command.rb', line 120
def initialize(command, summary=nil, defaults={}) @command = command @summary = summary @program_name = "gem #{command}" @defaults = defaults @options = defaults.dup @option_groups = Hash.new {|h,k| h[k] = [] } @deprecated_options = { command => {} } @parser = nil @when_invoked = nil end
Class Attribute Details
.build_args (rw)
Arguments used when building gems
# File 'lib/rubygems/command.rb', line 53
def self.build_args @build_args ||= [] end
.build_args=(value) (rw)
[ GitHub ]# File 'lib/rubygems/command.rb', line 57
def self.build_args=(value) @build_args = value end
.extra_args (rw)
[ GitHub ]# File 'lib/rubygems/command.rb', line 69
def self.extra_args @extra_args ||= [] end
.extra_args=(value) (rw)
[ GitHub ]# File 'lib/rubygems/command.rb', line 73
def self.extra_args=(value) case value when Array @extra_args = value when String @extra_args = value.split(" ") end end
Class Method Details
.add_common_option(*args, &handler)
[ GitHub ]# File 'lib/rubygems/command.rb', line 65
def self.add_common_option(*args, &handler) Gem::Command. << [args, handler] end
.add_specific_extra_args(cmd, args)
Add a list of extra arguments for the given command.  args may be an array or a string to be split on white space.
# File 'lib/rubygems/command.rb', line 94
def self.add_specific_extra_args(cmd,args) args = args.split(/\s+/) if args.is_a? String specific_extra_args_hash[cmd] = args end
.common_options
[ GitHub ]# File 'lib/rubygems/command.rb', line 61
def self. @common_options ||= [] end
.specific_extra_args(cmd)
Return an array of extra arguments for the command. The extra arguments come from the gem configuration file read at program startup.
# File 'lib/rubygems/command.rb', line 86
def self.specific_extra_args(cmd) specific_extra_args_hash[cmd] end
.specific_extra_args_hash
Accessor for the specific extra args hash (self initializing).
Instance Attribute Details
#command (readonly)
The name of the command.
# File 'lib/rubygems/command.rb', line 28
attr_reader :command
#defaults (rw)
The default options for the command.
# File 'lib/rubygems/command.rb', line 38
attr_accessor :defaults
    #deprecated?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'lib/rubygems/command.rb', line 469
def deprecated? false end
#options (readonly)
The options for the command.
# File 'lib/rubygems/command.rb', line 33
attr_reader :
#program_name (rw)
The name of the command for command-line invocation.
# File 'lib/rubygems/command.rb', line 43
attr_accessor :program_name
#summary (rw)
A short description of the command.
# File 'lib/rubygems/command.rb', line 48
attr_accessor :summary
Instance Method Details
#add_extra_args(args)
Adds extra args from ~/.gemrc
# File 'lib/rubygems/command.rb', line 451
def add_extra_args(args) result = [] s_extra = Gem::Command.specific_extra_args(@command) extra = Gem::Command.extra_args + s_extra until extra.empty? do ex = [] ex << extra.shift ex << extra.shift if /^[^-]/.match?(extra.first.to_s) result << ex if handles?(ex) end result.flatten! result.concat(args) result end
#add_option(*opts, &handler)
Add a command-line option and handler to the command.
See OptionParser#make_switch for an explanation of opts.
handler will be called with two values, the value of the argument and the options hash.
If the first argument of add_option is a Symbol, it’s used to group options in output.  See gem help list for an example.
# File 'lib/rubygems/command.rb', line 358
def add_option(*opts, &handler) # :yields: value, options group_name = Symbol === opts.first ? opts.shift : : raise "Do not pass an empty string in opts" if opts.include?("") @option_groups[group_name] << [opts, handler] end
#add_parser_description (private)
# File 'lib/rubygems/command.rb', line 479
def add_parser_description # :nodoc: return unless description formatted = description.split("\n\n").map do |chunk| wrap chunk, 80 - 4 end.join "\n" @parser.separator nil @parser.separator " Description:" formatted.each_line do |line| @parser.separator " #{line.rstrip}" end end
#add_parser_options (private)
# File 'lib/rubygems/command.rb', line 493
def # :nodoc: @parser.separator nil = @option_groups.delete : "", @option_groups.sort_by {|n,_| n.to_s }.each do |group_name, option_list| @parser.separator nil group_name, option_list end end
#add_parser_run_info(title, content) (private)
Adds a section with title and content to the parser help view.  Used for adding command arguments and default arguments.
# File 'lib/rubygems/command.rb', line 510
def add_parser_run_info(title, content) return if content.empty? @parser.separator nil @parser.separator " #{title}:" content.each_line do |line| @parser.separator " #{line.rstrip}" end end
#add_parser_summary (private)
# File 'lib/rubygems/command.rb', line 520
def add_parser_summary # :nodoc: return unless @summary @parser.separator nil @parser.separator " Summary:" wrap(@summary, 80 - 4).each_line do |line| @parser.separator " #{line.strip}" end end
#arguments
Override to provide details of the arguments a command takes. It should return a left-justified string, one argument per line.
For example:
def usage
  "#{program_name} FILE [FILE ...]"
end
def arguments
  "FILE          name of file to find"
end# File 'lib/rubygems/command.rb', line 258
def arguments "" end
    #begins?(long, short)  ⇒ Boolean 
  
True if long begins with the characters from short.
# File 'lib/rubygems/command.rb', line 135
def begins?(long, short) return false if short.nil? long[0, short.length] == short end
#check_deprecated_options(options)
[ GitHub ]# File 'lib/rubygems/command.rb', line 397
def () .each do |option| next unless option_is_deprecated?(option) deprecation = @deprecated_options[command][option] version_to_expire = deprecation["rg_version_to_expire"] deprecate_option_msg = if version_to_expire "The \"#{option}\" option has been deprecated and will be removed in Rubygems #{version_to_expire}." else "The \"#{option}\" option has been deprecated and will be removed in future versions of Rubygems." end extra_msg = deprecation["extra_msg"] deprecate_option_msg += " #{extra_msg}" if extra_msg alert_warning(deprecate_option_msg) end end
#configure_options(header, option_list) (private)
[ GitHub ]# File 'lib/rubygems/command.rb', line 556
def (header, option_list) return if option_list.nil? || option_list.empty? header = header.to_s.empty? ? "" : "#{header} " @parser.separator " #{header}Options:" option_list.each do |args, handler| @parser.on(*args) do |value| handler.call(value, @options) end end @parser.separator "" end
#create_option_parser (private)
Creates an option parser and fills it in with the help info for the command.
# File 'lib/rubygems/command.rb', line 542
def create_option_parser @parser = Gem::OptionParser.new @parser.separator nil "Common", Gem::Command. add_parser_run_info "Arguments", arguments add_parser_summary add_parser_description add_parser_run_info "Defaults", defaults_str end
#defaults_str
Override to display the default values of the command options. (similar to #arguments, but displays the default values).
For example:
def defaults_str
  --no-gems-first --no-all
end# File 'lib/rubygems/command.rb', line 272
def defaults_str "" end
#deprecate_option(name, version: nil, extra_msg: nil)
Mark a command-line option as deprecated, and optionally specify a deprecation horizon.
Note that with the current implementation, every version of the option needs to be explicitly deprecated, so to deprecate an option defined as
add_option('-t', '--[no-]test', 'Set test mode') do |value, |
  # ... stuff ...
endyou would need to explicitly add a call to deprecate_option for every version of the option you want to deprecate, like
deprecate_option('-t')
deprecate_option('--test')
deprecate_option('--no-test')# File 'lib/rubygems/command.rb', line 393
def deprecate_option(name, version: nil, extra_msg: nil) @deprecated_options[command].merge!({ name => { "rg_version_to_expire" => version, "extra_msg" => extra_msg } }) end
#description
Override to display a longer description of what this command does.
# File 'lib/rubygems/command.rb', line 279
def description nil end
#execute
Override to provide command handling.
#options will be filled in with your parsed options, unparsed options will be left in options[:args].
See also: #get_all_gem_names, #get_one_gem_name, #get_one_optional_argument
#extract_gem_name_and_version(name)
# File 'lib/rubygems/command.rb', line 207
def extract_gem_name_and_version(name) # :nodoc: if /\A(.*):(#{Gem::Requirement::PATTERN_RAW})\z/ =~ name [$1, $2] else [name] end end
#get_all_gem_names
Get all gem names from the command line.
# File 'lib/rubygems/command.rb', line 185
def get_all_gem_names args = [:args] if args.nil? || args.empty? raise Gem::CommandLineError, "Please specify at least one gem name (e.g. gem build GEMNAME)" end args.reject {|arg| arg.start_with?("-") } end
#get_all_gem_names_and_versions
Get all [gem, version] from the command line.
An argument in the form gem:ver is pull apart into the gen name and version, respectively.
# File 'lib/rubygems/command.rb', line 201
def get_all_gem_names_and_versions get_all_gem_names.map do |name| extract_gem_name_and_version(name) end end
#get_one_gem_name
Get a single gem name from the command line. Fail if there is no gem name or if there is more than one gem name given.
# File 'lib/rubygems/command.rb', line 219
def get_one_gem_name args = [:args] if args.nil? || args.empty? raise Gem::CommandLineError, "Please specify a gem name on the command line (e.g. gem build GEMNAME)" end if args.size > 1 raise Gem::CommandLineError, "Too many gem names (#{args.join(", ")}); please specify only one" end args.first end
#get_one_optional_argument
Get a single optional argument from the command line. If more than one argument is given, return only the first. Return nil if none are given.
# File 'lib/rubygems/command.rb', line 239
def get_one_optional_argument args = [:args] || [] args.first end
#handle_options(args)
Handle the given list of arguments by parsing them and recording the results.
# File 'lib/rubygems/command.rb', line 440
def (args) args = add_extra_args(args) (args) @options = Marshal.load Marshal.dump @defaults # deep copy parser.parse!(args) @options[:args] = args end
    #handles?(args)  ⇒ Boolean 
  
True if the command handles the given argument list.
# File 'lib/rubygems/command.rb', line 429
def handles?(args) parser.parse!(args.dup) true rescue StandardError false end
#invoke(*args)
Invoke the command with the given list of arguments.
# File 'lib/rubygems/command.rb', line 303
def invoke(*args) invoke_with_build_args args, nil end
#invoke_with_build_args(args, build_args)
Invoke the command with the given list of normal arguments and additional build arguments.
# File 'lib/rubygems/command.rb', line 311
def invoke_with_build_args(args, build_args) args [:build_args] = build_args if [:silent] old_ui = ui self.ui = ui = Gem::SilentUI.new end if [:help] show_help elsif @when_invoked @when_invoked.call else execute end ensure if ui self.ui = old_ui ui.close end end
#merge_options(new_options)
Merge a set of command options with the set of default options (without modifying the default option hash).
# File 'lib/rubygems/command.rb', line 421
def () @options = @defaults.clone .each {|k,v| @options[k] = v } end
    #option_is_deprecated?(option)  ⇒ Boolean  (private)
  
# File 'lib/rubygems/command.rb', line 475
def option_is_deprecated?(option) @deprecated_options[command].key?(option) end
#parser (private)
Create on demand parser.
# File 'lib/rubygems/command.rb', line 533
def parser create_option_parser if @parser.nil? @parser end
#remove_option(name)
Remove previously defined command-line argument name.
# File 'lib/rubygems/command.rb', line 369
def remove_option(name) @option_groups.each do |_, option_list| option_list.reject! {|args, _| args.any? {|x| x.is_a?(String) && x =~ /^#{name}/ } } end end
#show_help
Display the help message for the command.
# File 'lib/rubygems/command.rb', line 295
def show_help parser.program_name = usage say parser end
#show_lookup_failure(gem_name, version, errors, suppress_suggestions = false, required_by = nil)
Display to the user that a gem couldn’t be found and reasons why –
# File 'lib/rubygems/command.rb', line 157
def show_lookup_failure(gem_name, version, errors, suppress_suggestions = false, required_by = nil) gem = "'#{gem_name}' (#{version})" msg = String.new "Could not find a valid gem #{gem}" if errors && !errors.empty? msg << ", here is why:\n" errors.each {|x| msg << " #{x.wordy}\n" } else if required_by && gem != required_by msg << " (required by #{required_by}) in any repository" else msg << " in any repository" end end alert_error msg unless suppress_suggestions suggestions = Gem::SpecFetcher.fetcher.suggest_gems_from_name(gem_name, :latest, 10) unless suggestions.empty? alert_error "Possible alternatives: #{suggestions.join(", ")}" end end end
#usage
Override to display the usage for an individual gem command.
The text “[options]” is automatically appended to the usage text.
# File 'lib/rubygems/command.rb', line 288
def usage program_name end
#when_invoked(&block)
Call the given block when invoked.
Normal command invocations just executes the #execute method of the command. Specifying an invocation block allows the test methods to override the normal action of a command to determine that it has been invoked correctly.
# File 'lib/rubygems/command.rb', line 343
def when_invoked(&block) @when_invoked = block end
#wrap(text, width) (private)
Wraps text to width
# File 'lib/rubygems/command.rb', line 574
def wrap(text, width) # :doc: text.gsub(/(.{1,#{width}})( +|$\n?)|(.{1,#{width}})/, "\\1\\3\n") end