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
@@ -1,10 +1,10 @@
|
|
1
|
-
require_relative "nop"
|
2
|
-
|
3
1
|
module IRB
|
4
2
|
# :stopdoc:
|
5
3
|
|
6
|
-
module
|
7
|
-
class Measure <
|
4
|
+
module Command
|
5
|
+
class Measure < Base
|
6
|
+
include RubyArgsExtractor
|
7
|
+
|
8
8
|
category "Misc"
|
9
9
|
description "`measure` enables the mode to measure processing time. `measure :off` disables it."
|
10
10
|
|
@@ -12,32 +12,33 @@ module IRB
|
|
12
12
|
super(*args)
|
13
13
|
end
|
14
14
|
|
15
|
-
def execute(
|
15
|
+
def execute(arg)
|
16
|
+
if arg&.match?(/^do$|^do[^\w]|^\{/)
|
17
|
+
warn 'Configure IRB.conf[:MEASURE_PROC] to add custom measure methods.'
|
18
|
+
return
|
19
|
+
end
|
20
|
+
args, kwargs = ruby_args(arg)
|
21
|
+
execute_internal(*args, **kwargs)
|
22
|
+
end
|
23
|
+
|
24
|
+
def execute_internal(type = nil, arg = nil)
|
16
25
|
# Please check IRB.init_config in lib/irb/init.rb that sets
|
17
26
|
# IRB.conf[:MEASURE_PROC] to register default "measure" methods,
|
18
27
|
# "measure :time" (abbreviated as "measure") and "measure :stackprof".
|
28
|
+
|
19
29
|
case type
|
20
30
|
when :off
|
21
|
-
IRB.conf[:MEASURE] = nil
|
22
31
|
IRB.unset_measure_callback(arg)
|
23
32
|
when :list
|
24
33
|
IRB.conf[:MEASURE_CALLBACKS].each do |type_name, _, arg_val|
|
25
34
|
puts "- #{type_name}" + (arg_val ? "(#{arg_val.inspect})" : '')
|
26
35
|
end
|
27
36
|
when :on
|
28
|
-
|
29
|
-
added = IRB.set_measure_callback(type, arg)
|
37
|
+
added = IRB.set_measure_callback(arg)
|
30
38
|
puts "#{added[0]} is added." if added
|
31
39
|
else
|
32
|
-
|
33
|
-
|
34
|
-
added = IRB.set_measure_callback(&block)
|
35
|
-
puts "#{added[0]} is added." if added
|
36
|
-
else
|
37
|
-
IRB.conf[:MEASURE] = true
|
38
|
-
added = IRB.set_measure_callback(type, arg)
|
39
|
-
puts "#{added[0]} is added." if added
|
40
|
-
end
|
40
|
+
added = IRB.set_measure_callback(type, arg)
|
41
|
+
puts "#{added[0]} is added." if added
|
41
42
|
end
|
42
43
|
nil
|
43
44
|
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 Next < DebugCommand
|
10
|
-
def execute(
|
11
|
-
|
10
|
+
def execute(arg)
|
11
|
+
execute_debug_command(do_cmds: "next #{arg}")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# change-ws.rb -
|
4
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
5
|
+
#
|
6
|
+
|
7
|
+
require_relative "../ext/workspaces"
|
8
|
+
|
9
|
+
module IRB
|
10
|
+
# :stopdoc:
|
11
|
+
|
12
|
+
module Command
|
13
|
+
class Workspaces < Base
|
14
|
+
category "Workspace"
|
15
|
+
description "Show workspaces."
|
16
|
+
|
17
|
+
def execute(_arg)
|
18
|
+
inspection_resuls = irb_context.instance_variable_get(:@workspace_stack).map do |ws|
|
19
|
+
truncated_inspect(ws.main)
|
20
|
+
end
|
21
|
+
|
22
|
+
puts "[" + inspection_resuls.join(", ") + "]"
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def truncated_inspect(obj)
|
28
|
+
obj_inspection = obj.inspect
|
29
|
+
|
30
|
+
if obj_inspection.size > 20
|
31
|
+
obj_inspection = obj_inspection[0, 19] + "...>"
|
32
|
+
end
|
33
|
+
|
34
|
+
obj_inspection
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class PushWorkspace < Workspaces
|
39
|
+
category "Workspace"
|
40
|
+
description "Push an object to the workspace stack."
|
41
|
+
|
42
|
+
def execute(arg)
|
43
|
+
if arg.empty?
|
44
|
+
irb_context.push_workspace
|
45
|
+
else
|
46
|
+
obj = eval(arg, irb_context.workspace.binding)
|
47
|
+
irb_context.push_workspace(obj)
|
48
|
+
end
|
49
|
+
super
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class PopWorkspace < Workspaces
|
54
|
+
category "Workspace"
|
55
|
+
description "Pop a workspace from the workspace stack."
|
56
|
+
|
57
|
+
def execute(_arg)
|
58
|
+
irb_context.pop_workspace
|
59
|
+
super
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# :startdoc:
|
65
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
module Command
|
5
|
+
class ShowDoc < Base
|
6
|
+
include RubyArgsExtractor
|
7
|
+
|
8
|
+
category "Context"
|
9
|
+
description "Look up documentation with RI."
|
10
|
+
|
11
|
+
help_message <<~HELP_MESSAGE
|
12
|
+
Usage: show_doc [name]
|
13
|
+
|
14
|
+
When name is provided, IRB will look up the documentation for the given name.
|
15
|
+
When no name is provided, a RI session will be started.
|
16
|
+
|
17
|
+
Examples:
|
18
|
+
|
19
|
+
show_doc
|
20
|
+
show_doc Array
|
21
|
+
show_doc Array#each
|
22
|
+
|
23
|
+
HELP_MESSAGE
|
24
|
+
|
25
|
+
def execute(arg)
|
26
|
+
# Accept string literal for backward compatibility
|
27
|
+
name = unwrap_string_literal(arg)
|
28
|
+
require 'rdoc/ri/driver'
|
29
|
+
|
30
|
+
unless ShowDoc.const_defined?(:Ri)
|
31
|
+
opts = RDoc::RI::Driver.process_args([])
|
32
|
+
ShowDoc.const_set(:Ri, RDoc::RI::Driver.new(opts))
|
33
|
+
end
|
34
|
+
|
35
|
+
if name.nil?
|
36
|
+
Ri.interactive
|
37
|
+
else
|
38
|
+
begin
|
39
|
+
Ri.display_name(name)
|
40
|
+
rescue RDoc::RI::Error
|
41
|
+
puts $!.message
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
nil
|
46
|
+
rescue LoadError, SystemExit
|
47
|
+
warn "Can't display document because `rdoc` is not installed."
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../source_finder"
|
4
|
+
require_relative "../pager"
|
5
|
+
require_relative "../color"
|
6
|
+
|
7
|
+
module IRB
|
8
|
+
module Command
|
9
|
+
class ShowSource < Base
|
10
|
+
include RubyArgsExtractor
|
11
|
+
|
12
|
+
category "Context"
|
13
|
+
description "Show the source code of a given method, class/module, or constant."
|
14
|
+
|
15
|
+
help_message <<~HELP_MESSAGE
|
16
|
+
Usage: show_source [target] [-s]
|
17
|
+
|
18
|
+
-s Show the super method. You can stack it like `-ss` to show the super of the super, etc.
|
19
|
+
|
20
|
+
Examples:
|
21
|
+
|
22
|
+
show_source Foo
|
23
|
+
show_source Foo#bar
|
24
|
+
show_source Foo#bar -s
|
25
|
+
show_source Foo.baz
|
26
|
+
show_source Foo::BAR
|
27
|
+
HELP_MESSAGE
|
28
|
+
|
29
|
+
def execute(arg)
|
30
|
+
# Accept string literal for backward compatibility
|
31
|
+
str = unwrap_string_literal(arg)
|
32
|
+
unless str.is_a?(String)
|
33
|
+
puts "Error: Expected a string but got #{str.inspect}"
|
34
|
+
return
|
35
|
+
end
|
36
|
+
|
37
|
+
str, esses = str.split(" -")
|
38
|
+
super_level = esses ? esses.count("s") : 0
|
39
|
+
source = SourceFinder.new(@irb_context).find_source(str, super_level)
|
40
|
+
|
41
|
+
if source
|
42
|
+
show_source(source)
|
43
|
+
elsif super_level > 0
|
44
|
+
puts "Error: Couldn't locate a super definition for #{str}"
|
45
|
+
else
|
46
|
+
puts "Error: Couldn't locate a definition for #{str}"
|
47
|
+
end
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def show_source(source)
|
54
|
+
if source.binary_file?
|
55
|
+
content = "\n#{bold('Defined in binary file')}: #{source.file}\n\n"
|
56
|
+
else
|
57
|
+
code = source.colorized_content || 'Source not available'
|
58
|
+
content = <<~CONTENT
|
59
|
+
|
60
|
+
#{bold("From")}: #{source.file}:#{source.line}
|
61
|
+
|
62
|
+
#{code.chomp}
|
63
|
+
|
64
|
+
CONTENT
|
65
|
+
end
|
66
|
+
Pager.page_content(content)
|
67
|
+
end
|
68
|
+
|
69
|
+
def bold(str)
|
70
|
+
Color.colorize(str, [:BOLD])
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
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 Step < DebugCommand
|
10
|
-
def execute(
|
11
|
-
|
10
|
+
def execute(arg)
|
11
|
+
execute_debug_command(do_cmds: "step #{arg}")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# multi.rb -
|
4
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
5
|
+
#
|
6
|
+
|
7
|
+
module IRB
|
8
|
+
# :stopdoc:
|
9
|
+
|
10
|
+
module Command
|
11
|
+
class MultiIRBCommand < Base
|
12
|
+
include RubyArgsExtractor
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def print_deprecated_warning
|
17
|
+
warn <<~MSG
|
18
|
+
Multi-irb commands are deprecated and will be removed in IRB 2.0.0. Please use workspace commands instead.
|
19
|
+
If you have any use case for multi-irb, please leave a comment at https://github.com/ruby/irb/issues/653
|
20
|
+
MSG
|
21
|
+
end
|
22
|
+
|
23
|
+
def extend_irb_context
|
24
|
+
# this extension patches IRB context like IRB.CurrentContext
|
25
|
+
require_relative "../ext/multi-irb"
|
26
|
+
end
|
27
|
+
|
28
|
+
def print_debugger_warning
|
29
|
+
warn "Multi-IRB commands are not available when the debugger is enabled."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class IrbCommand < MultiIRBCommand
|
34
|
+
category "Multi-irb (DEPRECATED)"
|
35
|
+
description "Start a child IRB."
|
36
|
+
|
37
|
+
def execute(arg)
|
38
|
+
args, kwargs = ruby_args(arg)
|
39
|
+
execute_internal(*args, **kwargs)
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute_internal(*obj)
|
43
|
+
print_deprecated_warning
|
44
|
+
|
45
|
+
if irb_context.with_debugger
|
46
|
+
print_debugger_warning
|
47
|
+
return
|
48
|
+
end
|
49
|
+
|
50
|
+
extend_irb_context
|
51
|
+
IRB.irb(nil, *obj)
|
52
|
+
puts IRB.JobManager.inspect
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class Jobs < MultiIRBCommand
|
57
|
+
category "Multi-irb (DEPRECATED)"
|
58
|
+
description "List of current sessions."
|
59
|
+
|
60
|
+
def execute(_arg)
|
61
|
+
print_deprecated_warning
|
62
|
+
|
63
|
+
if irb_context.with_debugger
|
64
|
+
print_debugger_warning
|
65
|
+
return
|
66
|
+
end
|
67
|
+
|
68
|
+
extend_irb_context
|
69
|
+
puts IRB.JobManager.inspect
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class Foreground < MultiIRBCommand
|
74
|
+
category "Multi-irb (DEPRECATED)"
|
75
|
+
description "Switches to the session of the given number."
|
76
|
+
|
77
|
+
def execute(arg)
|
78
|
+
args, kwargs = ruby_args(arg)
|
79
|
+
execute_internal(*args, **kwargs)
|
80
|
+
end
|
81
|
+
|
82
|
+
def execute_internal(key = nil)
|
83
|
+
print_deprecated_warning
|
84
|
+
|
85
|
+
if irb_context.with_debugger
|
86
|
+
print_debugger_warning
|
87
|
+
return
|
88
|
+
end
|
89
|
+
|
90
|
+
extend_irb_context
|
91
|
+
|
92
|
+
raise CommandArgumentError.new("Please specify the id of target IRB job (listed in the `jobs` command).") unless key
|
93
|
+
IRB.JobManager.switch(key)
|
94
|
+
puts IRB.JobManager.inspect
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Kill < MultiIRBCommand
|
99
|
+
category "Multi-irb (DEPRECATED)"
|
100
|
+
description "Kills the session with the given number."
|
101
|
+
|
102
|
+
def execute(arg)
|
103
|
+
args, kwargs = ruby_args(arg)
|
104
|
+
execute_internal(*args, **kwargs)
|
105
|
+
end
|
106
|
+
|
107
|
+
def execute_internal(*keys)
|
108
|
+
print_deprecated_warning
|
109
|
+
|
110
|
+
if irb_context.with_debugger
|
111
|
+
print_debugger_warning
|
112
|
+
return
|
113
|
+
end
|
114
|
+
|
115
|
+
extend_irb_context
|
116
|
+
IRB.JobManager.kill(*keys)
|
117
|
+
puts IRB.JobManager.inspect
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# :startdoc:
|
123
|
+
end
|
@@ -1,16 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "nop"
|
4
|
-
|
5
3
|
module IRB
|
6
4
|
# :stopdoc:
|
7
5
|
|
8
|
-
module
|
9
|
-
class Whereami <
|
6
|
+
module Command
|
7
|
+
class Whereami < Base
|
10
8
|
category "Context"
|
11
9
|
description "Show the source code around binding.irb again."
|
12
10
|
|
13
|
-
def execute(
|
11
|
+
def execute(_arg)
|
14
12
|
code = irb_context.workspace.code_around_binding
|
15
13
|
if code
|
16
14
|
puts code
|
data/lib/irb/command.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# irb/command.rb - irb command
|
4
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
5
|
+
#
|
6
|
+
|
7
|
+
require_relative "command/base"
|
8
|
+
|
9
|
+
module IRB # :nodoc:
|
10
|
+
module Command
|
11
|
+
@commands = {}
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_reader :commands
|
15
|
+
|
16
|
+
# Registers a command with the given name.
|
17
|
+
# Aliasing is intentionally not supported at the moment.
|
18
|
+
def register(name, command_class)
|
19
|
+
@commands[name.to_sym] = [command_class, []]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|