module IRB::ExtendCommandBundle
def self.all_commands_info
def self.all_commands_info return @@commands unless @@commands.empty? user_aliases = IRB.CurrentContext.command_aliases.each_with_object({}) do |(alias_name, target), result| result[target] ||= [] result[target] << alias_name end @EXTEND_COMMANDS.each do |cmd_name, cmd_class, load_file, *aliases| if !defined?(ExtendCommand) || !ExtendCommand.const_defined?(cmd_class, false) require_relative load_file end klass = ExtendCommand.const_get(cmd_class, false) aliases = aliases.map { |a| a.first } if additional_aliases = user_aliases[cmd_name] aliases += additional_aliases end display_name = aliases.shift || cmd_name @@commands << { display_name: display_name, description: klass.description, category: klass.category } end @@commands end
def self.def_extend_command(cmd_name, cmd_class, load_file, *aliases)
The optional +load_file+ parameter will be required within the method
Will also define any given +aliases+ for the method.
Evaluate the given +cmd_name+ on the given +cmd_class+ Class.
def self.def_extend_command(cmd_name, cmd_class, load_file, *aliases) case cmd_class when Symbol cmd_class = cmd_class.id2name when String when Class cmd_class = cmd_class.name end line = __LINE__; eval %[ def #{cmd_name}(*opts, **kwargs, &b) Kernel.require_relative "#{load_file}" ::IRB::ExtendCommand::#{cmd_class}.execute(irb_context, *opts, **kwargs, &b) end ], nil, __FILE__, line for ali, flag in aliases @ALIASES.push [ali, cmd_name, flag] end end
def self.extend_object(obj)
Installs alias methods for the default irb commands on the given object
def self.extend_object(obj) unless (class << obj; ancestors; end).include?(EXCB) super for ali, com, flg in @ALIASES obj.install_alias_method(ali, com, flg) end end end
def self.install_extend_commands
def self.install_extend_commands for args in @EXTEND_COMMANDS def_extend_command(*args) end end
def self.irb_original_method_name(method_name) # :nodoc:
def self.irb_original_method_name(method_name) # :nodoc: "irb_" + method_name + "_org" end
def self.load_command(command)
def self.load_command(command) command = command.to_sym @EXTEND_COMMANDS.each do |cmd_name, cmd_class, load_file, *aliases| next if cmd_name != command && aliases.all? { |alias_name, _| alias_name != command } if !defined?(ExtendCommand) || !ExtendCommand.const_defined?(cmd_class, false) require_relative load_file end return ExtendCommand.const_get(cmd_class, false) end nil end
def install_alias_method(to, from, override = NO_OVERRIDE)
Installs alias methods for the default irb commands, see
def install_alias_method(to, from, override = NO_OVERRIDE) to = to.id2name unless to.kind_of?(String) from = from.id2name unless from.kind_of?(String) if override == OVERRIDE_ALL or (override == OVERRIDE_PRIVATE_ONLY) && !respond_to?(to) or (override == NO_OVERRIDE) && !respond_to?(to, true) target = self (class << self; self; end).instance_eval{ if target.respond_to?(to, true) && !target.respond_to?(EXCB.irb_original_method_name(to), true) alias_method(EXCB.irb_original_method_name(to), to) end alias_method to, from } else Kernel.warn "irb: warn: can't alias #{to} from #{from}.\n" end end
def irb_context
Displays current configuration.
def irb_context IRB.CurrentContext end
def irb_exit(ret = 0)
IRB.CurrentContext.exit
.+ret+ is the optional signal or message to send to Context#exit
Quits the current irb context
def irb_exit(ret = 0) irb_context.exit(ret) end
def irb_load(*opts, &b)
def irb_load(*opts, &b) ExtendCommand::Load.execute(irb_context, *opts, &b) end
def irb_require(*opts, &b)
def irb_require(*opts, &b) ExtendCommand::Require.execute(irb_context, *opts, &b) end