command.rb
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· RB 代码 · 共 281 行
RB
281 行
#--# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.# All rights reserved.# See LICENSE.txt for permissions.#++require 'rubygems/user_interaction'module Gem #################################################################### # Base class for all Gem commands. class Command include UserInteraction Option = Struct.new(:short, :long, :description, :handler) attr_reader :command, :options attr_accessor :summary, :defaults, :program_name # Initialize a generic gem command. def initialize(command, summary=nil, defaults={}) @command = command @summary = summary @program_name = "gem #{command}" @defaults = defaults @options = defaults.dup @option_list = [] @parser = nil end # Override to provide command handling. def execute fail "Generic command has no actions" end # Override to display the usage for an individual gem command. def usage "#{program_name}" end # Override to provide details of the arguments a command takes. # It should return a left-justified string, one argument per line. def arguments "" end # Override to display the default values of the command # options. (similar to +arguments+, but displays the default # values). def defaults_str "" end # Display the help message for this command. def show_help parser.program_name = usage say parser end # Invoke the command with the given list of arguments. def invoke(*args) handle_options(args) if options[:help] show_help elsif @when_invoked @when_invoked.call(options) else execute end end # 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. def when_invoked(&block) @when_invoked = block end # Add a option (and a handler) to this command. def add_option(*args, &handler) @option_list << [args, handler] end # Remove a previously defined command option. def remove_option(name) @option_list.reject! { |args, handler| args.any? { |x| x =~ /^#{name}/ } } end # Merge a set of command options with the set of default options # (without modifying the default option hash). def merge_options(new_options) @options = @defaults.clone new_options.each do |k,v| @options[k] = v end end # True if the command handles the given argument list. def handles?(args) begin parser.parse!(args.dup) return true rescue return false end end private # Return the command manager instance. def command_manager Gem::CommandManager.instance end # Handle the given list of arguments by parsing them and recording # the results. def handle_options(args) args = add_extra_args(args) @options = @defaults.clone parser.parse!(args) @options[:args] = args end def add_extra_args(args) result = [] s_extra = Command.specific_extra_args(@command) extra = Command.extra_args + s_extra while ! extra.empty? ex = [] ex << extra.shift ex << extra.shift if extra.first.to_s =~ /^[^-]/ result << ex if handles?(ex) end result.flatten! result.concat(args) result end # Create on demand parser. def parser create_option_parser if @parser.nil? @parser end def create_option_parser require 'optparse' @parser = OptionParser.new option_names = {} @parser.separator("") unless @option_list.empty? @parser.separator(" Options:") configure_options(@option_list, option_names) @parser.separator("") end @parser.separator(" Common Options:") configure_options(Command.common_options, option_names) @parser.separator("") unless arguments.empty? @parser.separator(" Arguments:") arguments.split(/\n/).each do |arg_desc| @parser.separator(" #{arg_desc}") end @parser.separator("") end @parser.separator(" Summary:") @parser.separator(" #@summary") unless defaults_str.empty? @parser.separator("") @parser.separator(" Defaults:") defaults_str.split(/\n/).each do |line| @parser.separator(" #{line}") end end end def configure_options(option_list, option_names) option_list.each do |args, handler| dashes = args.select { |arg| arg =~ /^-/ } next if dashes.any? { |arg| option_names[arg] } @parser.on(*args) do |value| handler.call(value, @options) end dashes.each do |arg| option_names[arg] = true end end end ################################################################## # Class methods for Command. class << self def common_options @common_options ||= [] end def add_common_option(*args, &handler) Gem::Command.common_options << [args, handler] end def extra_args @extra_args ||= [] end def extra_args=(value) case value when Array @extra_args = value when String @extra_args = value.split end end # Return an array of extra arguments for the command. The extra # arguments come from the gem configuration file read at program # startup. def specific_extra_args(cmd) specific_extra_args_hash[cmd] end # Add a list of extra arguments for the given command. +args+ # may be an array or a string to be split on white space. def add_specific_extra_args(cmd,args) args = args.split(/\s+/) if args.kind_of? String specific_extra_args_hash[cmd] = args end # Accessor for the specific extra args hash (self initializing). def specific_extra_args_hash @specific_extra_args_hash ||= Hash.new do |h,k| h[k] = Array.new end end end # ---------------------------------------------------------------- # Add the options common to all commands. add_common_option('--source URL', 'Use URL as the remote source for gems') do |value, options| require_gem("sources") Gem.sources.clear Gem.sources << value end add_common_option('-p', '--[no-]http-proxy [URL]', 'Use HTTP proxy for remote operations') do |value, options| options[:http_proxy] = (value == false) ? :no_proxy : value end add_common_option('-h', '--help', 'Get help on this command') do |value, options| options[:help] = true end add_common_option('-v', '--verbose', 'Set the verbose level of output') do |value, options| Gem.configuration.verbose = value end # Backtrace and config-file are added so they show up in the help # commands. Both options are actually handled before the other # options get parsed. add_common_option('--config-file FILE', "Use this config file instead of default") do end add_common_option('--backtrace', 'Show stack backtrace on errors') do end add_common_option('--debug', 'Turn on Ruby debugging') do end end # classend # module
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?