irb 1.7.1 → 1.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.document +1 -1
- data/Gemfile +10 -1
- data/README.md +265 -20
- data/Rakefile +13 -10
- data/doc/irb/irb.rd.ja +1 -3
- data/irb.gemspec +2 -1
- data/lib/irb/cmd/nop.rb +3 -52
- data/lib/irb/color.rb +4 -2
- data/lib/irb/command/backtrace.rb +17 -0
- data/lib/irb/command/base.rb +62 -0
- data/lib/irb/command/break.rb +17 -0
- data/lib/irb/command/catch.rb +17 -0
- data/lib/irb/command/chws.rb +40 -0
- data/lib/irb/command/context.rb +16 -0
- data/lib/irb/{cmd → command}/continue.rb +3 -3
- data/lib/irb/command/debug.rb +71 -0
- data/lib/irb/{cmd → command}/delete.rb +3 -3
- data/lib/irb/command/disable_irb.rb +19 -0
- data/lib/irb/command/edit.rb +63 -0
- data/lib/irb/command/exit.rb +18 -0
- data/lib/irb/{cmd → command}/finish.rb +3 -3
- data/lib/irb/command/force_exit.rb +18 -0
- data/lib/irb/command/help.rb +83 -0
- data/lib/irb/command/history.rb +45 -0
- data/lib/irb/command/info.rb +17 -0
- data/lib/irb/command/internal_helpers.rb +27 -0
- data/lib/irb/{cmd → command}/irb_info.rb +7 -7
- data/lib/irb/{cmd → command}/load.rb +23 -8
- data/lib/irb/{cmd → command}/ls.rb +42 -19
- data/lib/irb/{cmd → command}/measure.rb +18 -17
- data/lib/irb/{cmd → command}/next.rb +3 -3
- data/lib/irb/command/pushws.rb +65 -0
- data/lib/irb/command/show_doc.rb +51 -0
- data/lib/irb/command/show_source.rb +74 -0
- data/lib/irb/{cmd → command}/step.rb +3 -3
- data/lib/irb/command/subirb.rb +123 -0
- data/lib/irb/{cmd → command}/whereami.rb +3 -5
- data/lib/irb/command.rb +23 -0
- data/lib/irb/completion.rb +133 -102
- data/lib/irb/context.rb +182 -66
- data/lib/irb/debug/ui.rb +103 -0
- data/lib/irb/{cmd/debug.rb → debug.rb} +53 -59
- data/lib/irb/default_commands.rb +265 -0
- data/lib/irb/easter-egg.rb +16 -6
- data/lib/irb/ext/change-ws.rb +6 -8
- data/lib/irb/ext/{history.rb → eval_history.rb} +7 -7
- data/lib/irb/ext/loader.rb +4 -4
- data/lib/irb/ext/multi-irb.rb +5 -5
- data/lib/irb/ext/tracer.rb +12 -51
- data/lib/irb/ext/use-loader.rb +6 -8
- data/lib/irb/ext/workspaces.rb +10 -34
- data/lib/irb/frame.rb +1 -1
- data/lib/irb/help.rb +3 -3
- data/lib/irb/helper_method/base.rb +16 -0
- data/lib/irb/helper_method/conf.rb +11 -0
- data/lib/irb/helper_method.rb +29 -0
- data/lib/irb/{ext/save-history.rb → history.rb} +20 -58
- data/lib/irb/init.rb +154 -58
- data/lib/irb/input-method.rb +238 -203
- data/lib/irb/inspector.rb +3 -3
- data/lib/irb/lc/error.rb +1 -11
- data/lib/irb/lc/help-message +4 -0
- data/lib/irb/lc/ja/error.rb +1 -11
- data/lib/irb/lc/ja/help-message +13 -0
- data/lib/irb/locale.rb +2 -2
- data/lib/irb/nesting_parser.rb +13 -3
- data/lib/irb/notifier.rb +1 -1
- data/lib/irb/output-method.rb +2 -8
- data/lib/irb/pager.rb +91 -0
- data/lib/irb/ruby-lex.rb +391 -471
- data/lib/irb/ruby_logo.aa +43 -0
- data/lib/irb/source_finder.rb +139 -0
- data/lib/irb/statement.rb +80 -0
- data/lib/irb/version.rb +3 -3
- data/lib/irb/workspace.rb +24 -4
- data/lib/irb/ws-for-case-2.rb +1 -1
- data/lib/irb/xmp.rb +3 -3
- data/lib/irb.rb +1232 -604
- data/man/irb.1 +7 -0
- metadata +60 -32
- data/lib/irb/cmd/backtrace.rb +0 -21
- data/lib/irb/cmd/break.rb +0 -21
- data/lib/irb/cmd/catch.rb +0 -21
- data/lib/irb/cmd/chws.rb +0 -36
- data/lib/irb/cmd/edit.rb +0 -61
- data/lib/irb/cmd/help.rb +0 -23
- data/lib/irb/cmd/info.rb +0 -21
- data/lib/irb/cmd/pushws.rb +0 -45
- data/lib/irb/cmd/show_cmds.rb +0 -39
- data/lib/irb/cmd/show_doc.rb +0 -48
- data/lib/irb/cmd/show_source.rb +0 -113
- data/lib/irb/cmd/subirb.rb +0 -66
- data/lib/irb/extend-command.rb +0 -356
- data/lib/irb/src_encoding.rb +0 -7
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# change-ws.rb -
|
4
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
5
|
+
#
|
6
|
+
require_relative "../ext/change-ws"
|
7
|
+
|
8
|
+
module IRB
|
9
|
+
# :stopdoc:
|
10
|
+
|
11
|
+
module Command
|
12
|
+
|
13
|
+
class CurrentWorkingWorkspace < Base
|
14
|
+
category "Workspace"
|
15
|
+
description "Show the current workspace."
|
16
|
+
|
17
|
+
def execute(_arg)
|
18
|
+
puts "Current workspace: #{irb_context.main}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class ChangeWorkspace < Base
|
23
|
+
category "Workspace"
|
24
|
+
description "Change the current workspace to an object."
|
25
|
+
|
26
|
+
def execute(arg)
|
27
|
+
if arg.empty?
|
28
|
+
irb_context.change_workspace
|
29
|
+
else
|
30
|
+
obj = eval(arg, irb_context.workspace.binding)
|
31
|
+
irb_context.change_workspace(obj)
|
32
|
+
end
|
33
|
+
|
34
|
+
puts "Current workspace: #{irb_context.main}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# :startdoc:
|
40
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
module Command
|
5
|
+
class Context < Base
|
6
|
+
category "IRB"
|
7
|
+
description "Displays current configuration."
|
8
|
+
|
9
|
+
def execute(_arg)
|
10
|
+
# This command just displays the configuration.
|
11
|
+
# Modifying the configuration is achieved by sending a message to IRB.conf.
|
12
|
+
Pager.page_content(IRB.CurrentContext.inspect)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -5,10 +5,10 @@ require_relative "debug"
|
|
5
5
|
module IRB
|
6
6
|
# :stopdoc:
|
7
7
|
|
8
|
-
module
|
8
|
+
module Command
|
9
9
|
class Continue < DebugCommand
|
10
|
-
def execute(
|
11
|
-
|
10
|
+
def execute(arg)
|
11
|
+
execute_debug_command(do_cmds: "continue #{arg}")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative "../debug"
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
# :stopdoc:
|
5
|
+
|
6
|
+
module Command
|
7
|
+
class Debug < Base
|
8
|
+
category "Debugging"
|
9
|
+
description "Start the debugger of debug.gem."
|
10
|
+
|
11
|
+
def execute(_arg)
|
12
|
+
execute_debug_command
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute_debug_command(pre_cmds: nil, do_cmds: nil)
|
16
|
+
pre_cmds = pre_cmds&.rstrip
|
17
|
+
do_cmds = do_cmds&.rstrip
|
18
|
+
|
19
|
+
if irb_context.with_debugger
|
20
|
+
# If IRB is already running with a debug session, throw the command and IRB.debug_readline will pass it to the debugger.
|
21
|
+
if cmd = pre_cmds || do_cmds
|
22
|
+
throw :IRB_EXIT, cmd
|
23
|
+
else
|
24
|
+
puts "IRB is already running with a debug session."
|
25
|
+
return
|
26
|
+
end
|
27
|
+
else
|
28
|
+
# If IRB is not running with a debug session yet, then:
|
29
|
+
# 1. Check if the debugging command is run from a `binding.irb` call.
|
30
|
+
# 2. If so, try setting up the debug gem.
|
31
|
+
# 3. Insert a debug breakpoint at `Irb#debug_break` with the intended command.
|
32
|
+
# 4. Exit the current Irb#run call via `throw :IRB_EXIT`.
|
33
|
+
# 5. `Irb#debug_break` will be called and trigger the breakpoint, which will run the intended command.
|
34
|
+
unless irb_context.from_binding?
|
35
|
+
puts "Debugging commands are only available when IRB is started with binding.irb"
|
36
|
+
return
|
37
|
+
end
|
38
|
+
|
39
|
+
if IRB.respond_to?(:JobManager)
|
40
|
+
warn "Can't start the debugger when IRB is running in a multi-IRB session."
|
41
|
+
return
|
42
|
+
end
|
43
|
+
|
44
|
+
unless IRB::Debug.setup(irb_context.irb)
|
45
|
+
puts <<~MSG
|
46
|
+
You need to install the debug gem before using this command.
|
47
|
+
If you use `bundle exec`, please add `gem "debug"` into your Gemfile.
|
48
|
+
MSG
|
49
|
+
return
|
50
|
+
end
|
51
|
+
|
52
|
+
IRB::Debug.insert_debug_break(pre_cmds: pre_cmds, do_cmds: do_cmds)
|
53
|
+
|
54
|
+
# exit current Irb#run call
|
55
|
+
throw :IRB_EXIT
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class DebugCommand < Debug
|
61
|
+
def self.category
|
62
|
+
"Debugging"
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.description
|
66
|
+
command_name = self.name.split("::").last.downcase
|
67
|
+
"Start the debugger of debug.gem and run its `#{command_name}` command."
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -5,10 +5,10 @@ require_relative "debug"
|
|
5
5
|
module IRB
|
6
6
|
# :stopdoc:
|
7
7
|
|
8
|
-
module
|
8
|
+
module Command
|
9
9
|
class Delete < DebugCommand
|
10
|
-
def execute(
|
11
|
-
|
10
|
+
def execute(arg)
|
11
|
+
execute_debug_command(pre_cmds: "delete #{arg}")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
# :stopdoc:
|
5
|
+
|
6
|
+
module Command
|
7
|
+
class DisableIrb < Base
|
8
|
+
category "IRB"
|
9
|
+
description "Disable binding.irb."
|
10
|
+
|
11
|
+
def execute(*)
|
12
|
+
::Binding.define_method(:irb) {}
|
13
|
+
IRB.irb_exit
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# :startdoc:
|
19
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
require_relative "../color"
|
4
|
+
require_relative "../source_finder"
|
5
|
+
|
6
|
+
module IRB
|
7
|
+
# :stopdoc:
|
8
|
+
|
9
|
+
module Command
|
10
|
+
class Edit < Base
|
11
|
+
include RubyArgsExtractor
|
12
|
+
|
13
|
+
category "Misc"
|
14
|
+
description 'Open a file or source location.'
|
15
|
+
help_message <<~HELP_MESSAGE
|
16
|
+
Usage: edit [FILE or constant or method signature]
|
17
|
+
|
18
|
+
Open a file in the editor specified in #{highlight('ENV["VISUAL"]')} or #{highlight('ENV["EDITOR"]')}
|
19
|
+
|
20
|
+
- If no arguments are provided, IRB will attempt to open the file the current context was defined in.
|
21
|
+
- If FILE is provided, IRB will open the file.
|
22
|
+
- If a constant or method signature is provided, IRB will attempt to locate the source file and open it.
|
23
|
+
|
24
|
+
Examples:
|
25
|
+
|
26
|
+
edit
|
27
|
+
edit foo.rb
|
28
|
+
edit Foo
|
29
|
+
edit Foo#bar
|
30
|
+
HELP_MESSAGE
|
31
|
+
|
32
|
+
def execute(arg)
|
33
|
+
# Accept string literal for backward compatibility
|
34
|
+
path = unwrap_string_literal(arg)
|
35
|
+
|
36
|
+
if path.nil?
|
37
|
+
path = @irb_context.irb_path
|
38
|
+
elsif !File.exist?(path)
|
39
|
+
source = SourceFinder.new(@irb_context).find_source(path)
|
40
|
+
|
41
|
+
if source&.file_exist? && !source.binary_file?
|
42
|
+
path = source.file
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
unless File.exist?(path)
|
47
|
+
puts "Can not find file: #{path}"
|
48
|
+
return
|
49
|
+
end
|
50
|
+
|
51
|
+
if editor = (ENV['VISUAL'] || ENV['EDITOR'])
|
52
|
+
puts "command: '#{editor}'"
|
53
|
+
puts " path: #{path}"
|
54
|
+
system(*Shellwords.split(editor), path)
|
55
|
+
else
|
56
|
+
puts "Can not find editor setting: ENV['VISUAL'] or ENV['EDITOR']"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# :startdoc:
|
63
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
# :stopdoc:
|
5
|
+
|
6
|
+
module Command
|
7
|
+
class Exit < Base
|
8
|
+
category "IRB"
|
9
|
+
description "Exit the current irb session."
|
10
|
+
|
11
|
+
def execute(_arg)
|
12
|
+
IRB.irb_exit
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# :startdoc:
|
18
|
+
end
|
@@ -5,10 +5,10 @@ require_relative "debug"
|
|
5
5
|
module IRB
|
6
6
|
# :stopdoc:
|
7
7
|
|
8
|
-
module
|
8
|
+
module Command
|
9
9
|
class Finish < DebugCommand
|
10
|
-
def execute(
|
11
|
-
|
10
|
+
def execute(arg)
|
11
|
+
execute_debug_command(do_cmds: "finish #{arg}")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
# :stopdoc:
|
5
|
+
|
6
|
+
module Command
|
7
|
+
class ForceExit < Base
|
8
|
+
category "IRB"
|
9
|
+
description "Exit the current process."
|
10
|
+
|
11
|
+
def execute(_arg)
|
12
|
+
throw :IRB_EXIT, true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# :startdoc:
|
18
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
module Command
|
5
|
+
class Help < Base
|
6
|
+
category "Help"
|
7
|
+
description "List all available commands. Use `help <command>` to get information about a specific command."
|
8
|
+
|
9
|
+
def execute(command_name)
|
10
|
+
content =
|
11
|
+
if command_name.empty?
|
12
|
+
help_message
|
13
|
+
else
|
14
|
+
if command_class = Command.load_command(command_name)
|
15
|
+
command_class.help_message || command_class.description
|
16
|
+
else
|
17
|
+
"Can't find command `#{command_name}`. Please check the command name and try again.\n\n"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
Pager.page_content(content)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def help_message
|
26
|
+
commands_info = IRB::Command.all_commands_info
|
27
|
+
helper_methods_info = IRB::HelperMethod.all_helper_methods_info
|
28
|
+
commands_grouped_by_categories = commands_info.group_by { |cmd| cmd[:category] }
|
29
|
+
commands_grouped_by_categories["Helper methods"] = helper_methods_info
|
30
|
+
|
31
|
+
if irb_context.with_debugger
|
32
|
+
# Remove the original "Debugging" category
|
33
|
+
commands_grouped_by_categories.delete("Debugging")
|
34
|
+
end
|
35
|
+
|
36
|
+
longest_cmd_name_length = commands_info.map { |c| c[:display_name].length }.max
|
37
|
+
|
38
|
+
output = StringIO.new
|
39
|
+
|
40
|
+
help_cmds = commands_grouped_by_categories.delete("Help")
|
41
|
+
no_category_cmds = commands_grouped_by_categories.delete("No category")
|
42
|
+
aliases = irb_context.instance_variable_get(:@user_aliases).map do |alias_name, target|
|
43
|
+
{ display_name: alias_name, description: "Alias for `#{target}`" }
|
44
|
+
end
|
45
|
+
|
46
|
+
# Display help commands first
|
47
|
+
add_category_to_output("Help", help_cmds, output, longest_cmd_name_length)
|
48
|
+
|
49
|
+
# Display the rest of the commands grouped by categories
|
50
|
+
commands_grouped_by_categories.each do |category, cmds|
|
51
|
+
add_category_to_output(category, cmds, output, longest_cmd_name_length)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Display commands without a category
|
55
|
+
if no_category_cmds
|
56
|
+
add_category_to_output("No category", no_category_cmds, output, longest_cmd_name_length)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Display aliases
|
60
|
+
add_category_to_output("Aliases", aliases, output, longest_cmd_name_length)
|
61
|
+
|
62
|
+
# Append the debugger help at the end
|
63
|
+
if irb_context.with_debugger
|
64
|
+
# Add "Debugging (from debug.gem)" category as title
|
65
|
+
add_category_to_output("Debugging (from debug.gem)", [], output, longest_cmd_name_length)
|
66
|
+
output.puts DEBUGGER__.help
|
67
|
+
end
|
68
|
+
|
69
|
+
output.string
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_category_to_output(category, cmds, output, longest_cmd_name_length)
|
73
|
+
output.puts Color.colorize(category, [:BOLD])
|
74
|
+
|
75
|
+
cmds.each do |cmd|
|
76
|
+
output.puts " #{cmd[:display_name].to_s.ljust(longest_cmd_name_length)} #{cmd[:description]}"
|
77
|
+
end
|
78
|
+
|
79
|
+
output.puts
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "stringio"
|
4
|
+
|
5
|
+
require_relative "../pager"
|
6
|
+
|
7
|
+
module IRB
|
8
|
+
# :stopdoc:
|
9
|
+
|
10
|
+
module Command
|
11
|
+
class History < Base
|
12
|
+
category "IRB"
|
13
|
+
description "Shows the input history. `-g [query]` or `-G [query]` allows you to filter the output."
|
14
|
+
|
15
|
+
def execute(arg)
|
16
|
+
|
17
|
+
if (match = arg&.match(/(-g|-G)\s+(?<grep>.+)\s*\n\z/))
|
18
|
+
grep = Regexp.new(match[:grep])
|
19
|
+
end
|
20
|
+
|
21
|
+
formatted_inputs = irb_context.io.class::HISTORY.each_with_index.reverse_each.filter_map do |input, index|
|
22
|
+
next if grep && !input.match?(grep)
|
23
|
+
|
24
|
+
header = "#{index}: "
|
25
|
+
|
26
|
+
first_line, *other_lines = input.split("\n")
|
27
|
+
first_line = "#{header}#{first_line}"
|
28
|
+
|
29
|
+
truncated_lines = other_lines.slice!(1..) # Show 1 additional line (2 total)
|
30
|
+
other_lines << "..." if truncated_lines&.any?
|
31
|
+
|
32
|
+
other_lines.map! do |line|
|
33
|
+
" " * header.length + line
|
34
|
+
end
|
35
|
+
|
36
|
+
[first_line, *other_lines].join("\n") + "\n"
|
37
|
+
end
|
38
|
+
|
39
|
+
Pager.page_content(formatted_inputs.join)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# :startdoc:
|
45
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "debug"
|
4
|
+
|
5
|
+
module IRB
|
6
|
+
# :stopdoc:
|
7
|
+
|
8
|
+
module Command
|
9
|
+
class Info < DebugCommand
|
10
|
+
def execute(arg)
|
11
|
+
execute_debug_command(pre_cmds: "info #{arg}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# :startdoc:
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
module Command
|
5
|
+
# Internal use only, for default command's backward compatibility.
|
6
|
+
module RubyArgsExtractor # :nodoc:
|
7
|
+
def unwrap_string_literal(str)
|
8
|
+
return if str.empty?
|
9
|
+
|
10
|
+
sexp = Ripper.sexp(str)
|
11
|
+
if sexp && sexp.size == 2 && sexp.last&.first&.first == :string_literal
|
12
|
+
@irb_context.workspace.binding.eval(str).to_s
|
13
|
+
else
|
14
|
+
str
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def ruby_args(arg)
|
19
|
+
# Use throw and catch to handle arg that includes `;`
|
20
|
+
# For example: "1, kw: (2; 3); 4" will be parsed to [[1], { kw: 3 }]
|
21
|
+
catch(:EXTRACT_RUBY_ARGS) do
|
22
|
+
@irb_context.workspace.binding.eval "IRB::Command.extract_ruby_args #{arg}"
|
23
|
+
end || [[], {}]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,20 +1,20 @@
|
|
1
|
-
# frozen_string_literal:
|
2
|
-
|
3
|
-
require_relative "nop"
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
3
|
module IRB
|
6
4
|
# :stopdoc:
|
7
5
|
|
8
|
-
module
|
9
|
-
class IrbInfo <
|
6
|
+
module Command
|
7
|
+
class IrbInfo < Base
|
10
8
|
category "IRB"
|
11
9
|
description "Show information about IRB."
|
12
10
|
|
13
|
-
def execute
|
11
|
+
def execute(_arg)
|
14
12
|
str = "Ruby version: #{RUBY_VERSION}\n"
|
15
13
|
str += "IRB version: #{IRB.version}\n"
|
16
14
|
str += "InputMethod: #{IRB.CurrentContext.io.inspect}\n"
|
17
|
-
str += "
|
15
|
+
str += "Completion: #{IRB.CurrentContext.io.respond_to?(:completion_info) ? IRB.CurrentContext.io.completion_info : 'off'}\n"
|
16
|
+
rc_files = IRB.irbrc_files
|
17
|
+
str += ".irbrc paths: #{rc_files.join(", ")}\n" if rc_files.any?
|
18
18
|
str += "RUBY_PLATFORM: #{RUBY_PLATFORM}\n"
|
19
19
|
str += "LANG env: #{ENV["LANG"]}\n" if ENV["LANG"] && !ENV["LANG"].empty?
|
20
20
|
str += "LC_ALL env: #{ENV["LC_ALL"]}\n" if ENV["LC_ALL"] && !ENV["LC_ALL"].empty?
|
@@ -1,17 +1,16 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# load.rb -
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
5
5
|
#
|
6
|
-
|
7
|
-
require_relative "nop"
|
8
6
|
require_relative "../ext/loader"
|
9
7
|
|
10
8
|
module IRB
|
11
9
|
# :stopdoc:
|
12
10
|
|
13
|
-
module
|
14
|
-
class LoaderCommand <
|
11
|
+
module Command
|
12
|
+
class LoaderCommand < Base
|
13
|
+
include RubyArgsExtractor
|
15
14
|
include IrbLoader
|
16
15
|
|
17
16
|
def raise_cmd_argument_error
|
@@ -23,7 +22,12 @@ module IRB
|
|
23
22
|
category "IRB"
|
24
23
|
description "Load a Ruby file."
|
25
24
|
|
26
|
-
def execute(
|
25
|
+
def execute(arg)
|
26
|
+
args, kwargs = ruby_args(arg)
|
27
|
+
execute_internal(*args, **kwargs)
|
28
|
+
end
|
29
|
+
|
30
|
+
def execute_internal(file_name = nil, priv = nil)
|
27
31
|
raise_cmd_argument_error unless file_name
|
28
32
|
irb_load(file_name, priv)
|
29
33
|
end
|
@@ -32,7 +36,13 @@ module IRB
|
|
32
36
|
class Require < LoaderCommand
|
33
37
|
category "IRB"
|
34
38
|
description "Require a Ruby file."
|
35
|
-
|
39
|
+
|
40
|
+
def execute(arg)
|
41
|
+
args, kwargs = ruby_args(arg)
|
42
|
+
execute_internal(*args, **kwargs)
|
43
|
+
end
|
44
|
+
|
45
|
+
def execute_internal(file_name = nil)
|
36
46
|
raise_cmd_argument_error unless file_name
|
37
47
|
|
38
48
|
rex = Regexp.new("#{Regexp.quote(file_name)}(\.o|\.rb)?")
|
@@ -65,7 +75,12 @@ module IRB
|
|
65
75
|
category "IRB"
|
66
76
|
description "Loads a given file in the current session."
|
67
77
|
|
68
|
-
def execute(
|
78
|
+
def execute(arg)
|
79
|
+
args, kwargs = ruby_args(arg)
|
80
|
+
execute_internal(*args, **kwargs)
|
81
|
+
end
|
82
|
+
|
83
|
+
def execute_internal(file_name = nil)
|
69
84
|
raise_cmd_argument_error unless file_name
|
70
85
|
|
71
86
|
source_file(file_name)
|
@@ -1,39 +1,57 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "reline"
|
4
|
-
|
4
|
+
require "stringio"
|
5
|
+
|
6
|
+
require_relative "../pager"
|
5
7
|
require_relative "../color"
|
6
8
|
|
7
9
|
module IRB
|
8
10
|
# :stopdoc:
|
9
11
|
|
10
|
-
module
|
11
|
-
class Ls <
|
12
|
+
module Command
|
13
|
+
class Ls < Base
|
14
|
+
include RubyArgsExtractor
|
15
|
+
|
12
16
|
category "Context"
|
13
|
-
description "Show methods, constants, and variables.
|
17
|
+
description "Show methods, constants, and variables."
|
18
|
+
|
19
|
+
help_message <<~HELP_MESSAGE
|
20
|
+
Usage: ls [obj] [-g [query]]
|
14
21
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
22
|
+
-g [query] Filter the output with a query.
|
23
|
+
HELP_MESSAGE
|
24
|
+
|
25
|
+
def execute(arg)
|
26
|
+
if match = arg.match(/\A(?<target>.+\s|)(-g|-G)\s+(?<grep>.+)$/)
|
27
|
+
if match[:target].empty?
|
28
|
+
use_main = true
|
29
|
+
else
|
30
|
+
obj = @irb_context.workspace.binding.eval(match[:target])
|
31
|
+
end
|
32
|
+
grep = Regexp.new(match[:grep])
|
19
33
|
else
|
20
|
-
args
|
34
|
+
args, kwargs = ruby_args(arg)
|
35
|
+
use_main = args.empty?
|
36
|
+
obj = args.first
|
37
|
+
grep = kwargs[:grep]
|
38
|
+
end
|
39
|
+
|
40
|
+
if use_main
|
41
|
+
obj = irb_context.workspace.main
|
42
|
+
locals = irb_context.workspace.binding.local_variables
|
21
43
|
end
|
22
|
-
end
|
23
44
|
|
24
|
-
def execute(*arg, grep: nil)
|
25
45
|
o = Output.new(grep: grep)
|
26
46
|
|
27
|
-
obj = arg.empty? ? irb_context.workspace.main : arg.first
|
28
|
-
locals = arg.empty? ? irb_context.workspace.binding.local_variables : []
|
29
47
|
klass = (obj.class == Class || obj.class == Module ? obj : obj.class)
|
30
48
|
|
31
49
|
o.dump("constants", obj.constants) if obj.respond_to?(:constants)
|
32
50
|
dump_methods(o, klass, obj)
|
33
51
|
o.dump("instance variables", obj.instance_variables)
|
34
52
|
o.dump("class variables", klass.class_variables)
|
35
|
-
o.dump("locals", locals)
|
36
|
-
|
53
|
+
o.dump("locals", locals) if locals
|
54
|
+
o.print_result
|
37
55
|
end
|
38
56
|
|
39
57
|
def dump_methods(o, klass, obj)
|
@@ -77,6 +95,11 @@ module IRB
|
|
77
95
|
def initialize(grep: nil)
|
78
96
|
@grep = grep
|
79
97
|
@line_width = screen_width - MARGIN.length # right padding
|
98
|
+
@io = StringIO.new
|
99
|
+
end
|
100
|
+
|
101
|
+
def print_result
|
102
|
+
Pager.page_content(@io.string)
|
80
103
|
end
|
81
104
|
|
82
105
|
def dump(name, strs)
|
@@ -85,12 +108,12 @@ module IRB
|
|
85
108
|
return if strs.empty?
|
86
109
|
|
87
110
|
# Attempt a single line
|
88
|
-
print "#{Color.colorize(name, [:BOLD, :BLUE])}: "
|
111
|
+
@io.print "#{Color.colorize(name, [:BOLD, :BLUE])}: "
|
89
112
|
if fits_on_line?(strs, cols: strs.size, offset: "#{name}: ".length)
|
90
|
-
puts strs.join(MARGIN)
|
113
|
+
@io.puts strs.join(MARGIN)
|
91
114
|
return
|
92
115
|
end
|
93
|
-
puts
|
116
|
+
@io.puts
|
94
117
|
|
95
118
|
# Dump with the largest # of columns that fits on a line
|
96
119
|
cols = strs.size
|
@@ -99,7 +122,7 @@ module IRB
|
|
99
122
|
end
|
100
123
|
widths = col_widths(strs, cols: cols)
|
101
124
|
strs.each_slice(cols) do |ss|
|
102
|
-
puts ss.map.with_index { |s, i| "#{MARGIN}%-#{widths[i]}s" % s }.join
|
125
|
+
@io.puts ss.map.with_index { |s, i| "#{MARGIN}%-#{widths[i]}s" % s }.join
|
103
126
|
end
|
104
127
|
end
|
105
128
|
|