ruby/lib/irb/cmd/load.rb
Stan Lo 12b7c129bf [ruby/irb] Gracefully handle missing command argument
(https://github.com/ruby/irb/pull/473)

* Handle file loading commands' argument error gracefully

Currently, if users don't provide an argument to `source`,
`irb_load`, and `irb_require`, IRB raises `ArgumentError` with full
stacktrace. This is confusing because it looks similar to when IRB has
internal issues. The message also isn't helpful on helping users avoid
the error.

So in this commit, I add a new `CommandArgumentError` for commands to
raise explicitly when users' input doesn't satisfy a command's argument
requirement.

* Gracefully handle `fg` command's argument requirement
2022-12-08 21:05:37 +00:00

82 lines
1.7 KiB
Ruby

# frozen_string_literal: false
#
# load.rb -
# $Release Version: 0.9.6$
# $Revision$
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
#
# --
#
#
#
require_relative "nop"
require_relative "../ext/loader"
module IRB
# :stopdoc:
module ExtendCommand
class LoaderCommand < Nop
include IrbLoader
def raise_cmd_argument_error
raise CommandArgumentError.new("Please specify the file name.")
end
end
class Load < LoaderCommand
category "IRB"
description "Load a Ruby file."
def execute(file_name = nil, priv = nil)
raise_cmd_argument_error unless file_name
irb_load(file_name, priv)
end
end
class Require < LoaderCommand
category "IRB"
description "Require a Ruby file."
def execute(file_name = nil)
raise_cmd_argument_error unless file_name
rex = Regexp.new("#{Regexp.quote(file_name)}(\.o|\.rb)?")
return false if $".find{|f| f =~ rex}
case file_name
when /\.rb$/
begin
if irb_load(file_name)
$".push file_name
return true
end
rescue LoadError
end
when /\.(so|o|sl)$/
return ruby_require(file_name)
end
begin
irb_load(f = file_name + ".rb")
$".push f
return true
rescue LoadError
return ruby_require(file_name)
end
end
end
class Source < LoaderCommand
category "IRB"
description "Loads a given file in the current session."
def execute(file_name = nil)
raise_cmd_argument_error unless file_name
source_file(file_name)
end
end
end
# :startdoc:
end