irb 1.11.1 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/README.md +11 -9
- data/Rakefile +1 -1
- data/lib/irb/cmd/nop.rb +3 -52
- data/lib/irb/{cmd → command}/backtrace.rb +1 -1
- data/lib/irb/command/base.rb +64 -0
- data/lib/irb/{cmd → command}/break.rb +1 -1
- data/lib/irb/{cmd → command}/catch.rb +1 -1
- data/lib/irb/{cmd → command}/chws.rb +4 -6
- data/lib/irb/{cmd → command}/continue.rb +1 -1
- data/lib/irb/{cmd → command}/debug.rb +3 -4
- data/lib/irb/{cmd → command}/delete.rb +1 -1
- data/lib/irb/command/edit.rb +70 -0
- data/lib/irb/{cmd → command}/exit.rb +2 -4
- data/lib/irb/{cmd → command}/finish.rb +1 -1
- data/lib/irb/command/force_exit.rb +20 -0
- data/lib/irb/command/help.rb +84 -0
- data/lib/irb/{cmd → command}/history.rb +3 -3
- data/lib/irb/{cmd → command}/info.rb +1 -1
- data/lib/irb/{cmd → command}/irb_info.rb +5 -6
- data/lib/irb/{cmd → command}/load.rb +3 -5
- data/lib/irb/{cmd → command}/ls.rb +10 -4
- data/lib/irb/{cmd → command}/measure.rb +2 -4
- data/lib/irb/{cmd → command}/next.rb +1 -1
- data/lib/irb/{cmd → command}/pushws.rb +20 -5
- data/lib/irb/{cmd → command}/show_doc.rb +17 -5
- data/lib/irb/{cmd → command}/show_source.rb +26 -10
- data/lib/irb/{cmd → command}/step.rb +1 -1
- data/lib/irb/{cmd → command}/subirb.rb +3 -5
- data/lib/irb/{cmd → command}/whereami.rb +2 -4
- data/lib/irb/{extend-command.rb → command.rb} +50 -86
- data/lib/irb/completion.rb +1 -1
- data/lib/irb/context.rb +63 -20
- data/lib/irb/ext/change-ws.rb +4 -4
- data/lib/irb/ext/eval_history.rb +3 -3
- data/lib/irb/ext/loader.rb +4 -4
- data/lib/irb/ext/multi-irb.rb +1 -1
- data/lib/irb/ext/tracer.rb +12 -51
- data/lib/irb/ext/use-loader.rb +6 -8
- data/lib/irb/ext/workspaces.rb +11 -34
- data/lib/irb/frame.rb +1 -1
- data/lib/irb/help.rb +1 -1
- data/lib/irb/history.rb +12 -4
- data/lib/irb/init.rb +28 -17
- data/lib/irb/input-method.rb +18 -2
- data/lib/irb/inspector.rb +3 -3
- data/lib/irb/lc/error.rb +1 -6
- data/lib/irb/lc/ja/error.rb +1 -6
- 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/ruby-lex.rb +2 -2
- data/lib/irb/source_finder.rb +98 -38
- data/lib/irb/statement.rb +25 -3
- data/lib/irb/version.rb +3 -3
- data/lib/irb/workspace.rb +4 -4
- data/lib/irb/ws-for-case-2.rb +1 -1
- data/lib/irb/xmp.rb +1 -1
- data/lib/irb.rb +38 -32
- metadata +30 -29
- data/lib/irb/cmd/edit.rb +0 -60
- data/lib/irb/cmd/help.rb +0 -23
- data/lib/irb/cmd/show_cmds.rb +0 -59
data/lib/irb/source_finder.rb
CHANGED
@@ -4,12 +4,63 @@ require_relative "ruby-lex"
|
|
4
4
|
|
5
5
|
module IRB
|
6
6
|
class SourceFinder
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
:
|
11
|
-
|
12
|
-
|
7
|
+
class EvaluationError < StandardError; end
|
8
|
+
|
9
|
+
class Source
|
10
|
+
attr_reader :file, :line
|
11
|
+
def initialize(file, line, ast_source = nil)
|
12
|
+
@file = file
|
13
|
+
@line = line
|
14
|
+
@ast_source = ast_source
|
15
|
+
end
|
16
|
+
|
17
|
+
def file_exist?
|
18
|
+
File.exist?(@file)
|
19
|
+
end
|
20
|
+
|
21
|
+
def binary_file?
|
22
|
+
# If the line is zero, it means that the target's source is probably in a binary file.
|
23
|
+
@line.zero?
|
24
|
+
end
|
25
|
+
|
26
|
+
def file_content
|
27
|
+
@file_content ||= File.read(@file)
|
28
|
+
end
|
29
|
+
|
30
|
+
def colorized_content
|
31
|
+
if !binary_file? && file_exist?
|
32
|
+
end_line = find_end
|
33
|
+
# To correctly colorize, we need to colorize full content and extract the relevant lines.
|
34
|
+
colored = IRB::Color.colorize_code(file_content)
|
35
|
+
colored.lines[@line - 1...end_line].join
|
36
|
+
elsif @ast_source
|
37
|
+
IRB::Color.colorize_code(@ast_source)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def find_end
|
44
|
+
lex = RubyLex.new
|
45
|
+
code = file_content
|
46
|
+
lines = code.lines[(@line - 1)..-1]
|
47
|
+
tokens = RubyLex.ripper_lex_without_warning(lines.join)
|
48
|
+
prev_tokens = []
|
49
|
+
|
50
|
+
# chunk with line number
|
51
|
+
tokens.chunk { |tok| tok.pos[0] }.each do |lnum, chunk|
|
52
|
+
code = lines[0..lnum].join
|
53
|
+
prev_tokens.concat chunk
|
54
|
+
continue = lex.should_continue?(prev_tokens)
|
55
|
+
syntax = lex.check_code_syntax(code, local_variables: [])
|
56
|
+
if !continue && syntax == :valid
|
57
|
+
return @line + lnum
|
58
|
+
end
|
59
|
+
end
|
60
|
+
@line
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
13
64
|
private_constant :Source
|
14
65
|
|
15
66
|
def initialize(irb_context)
|
@@ -17,50 +68,47 @@ module IRB
|
|
17
68
|
end
|
18
69
|
|
19
70
|
def find_source(signature, super_level = 0)
|
20
|
-
context_binding = @irb_context.workspace.binding
|
21
71
|
case signature
|
22
|
-
when /\A(::)?[A-Z]\w*(::[A-Z]\w*)*\z/ #
|
23
|
-
|
24
|
-
|
25
|
-
|
72
|
+
when /\A(::)?[A-Z]\w*(::[A-Z]\w*)*\z/ # ConstName, ::ConstName, ConstPath::ConstName
|
73
|
+
eval_receiver_or_owner(signature) # trigger autoload
|
74
|
+
*parts, name = signature.split('::', -1)
|
75
|
+
base =
|
76
|
+
if parts.empty? # ConstName
|
77
|
+
find_const_owner(name)
|
78
|
+
elsif parts == [''] # ::ConstName
|
79
|
+
Object
|
80
|
+
else # ConstPath::ConstName
|
81
|
+
eval_receiver_or_owner(parts.join('::'))
|
82
|
+
end
|
83
|
+
file, line = base.const_source_location(name)
|
26
84
|
when /\A(?<owner>[A-Z]\w*(::[A-Z]\w*)*)#(?<method>[^ :.]+)\z/ # Class#method
|
27
|
-
owner =
|
85
|
+
owner = eval_receiver_or_owner(Regexp.last_match[:owner])
|
28
86
|
method = Regexp.last_match[:method]
|
29
87
|
return unless owner.respond_to?(:instance_method)
|
30
|
-
|
88
|
+
method = method_target(owner, super_level, method, "owner")
|
89
|
+
file, line = method&.source_location
|
31
90
|
when /\A((?<receiver>.+)(\.|::))?(?<method>[^ :.]+)\z/ # method, receiver.method, receiver::method
|
32
|
-
receiver =
|
91
|
+
receiver = eval_receiver_or_owner(Regexp.last_match[:receiver] || 'self')
|
33
92
|
method = Regexp.last_match[:method]
|
34
93
|
return unless receiver.respond_to?(method, true)
|
35
|
-
|
94
|
+
method = method_target(receiver, super_level, method, "receiver")
|
95
|
+
file, line = method&.source_location
|
36
96
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
97
|
+
return unless file && line
|
98
|
+
|
99
|
+
if File.exist?(file)
|
100
|
+
Source.new(file, line)
|
101
|
+
elsif method
|
102
|
+
# Method defined with eval, probably in IRB session
|
103
|
+
source = RubyVM::AbstractSyntaxTree.of(method)&.source rescue nil
|
104
|
+
Source.new(file, line, source)
|
40
105
|
end
|
106
|
+
rescue EvaluationError
|
107
|
+
nil
|
41
108
|
end
|
42
109
|
|
43
110
|
private
|
44
111
|
|
45
|
-
def find_end(file, first_line)
|
46
|
-
lex = RubyLex.new
|
47
|
-
lines = File.read(file).lines[(first_line - 1)..-1]
|
48
|
-
tokens = RubyLex.ripper_lex_without_warning(lines.join)
|
49
|
-
prev_tokens = []
|
50
|
-
|
51
|
-
# chunk with line number
|
52
|
-
tokens.chunk { |tok| tok.pos[0] }.each do |lnum, chunk|
|
53
|
-
code = lines[0..lnum].join
|
54
|
-
prev_tokens.concat chunk
|
55
|
-
continue = lex.should_continue?(prev_tokens)
|
56
|
-
syntax = lex.check_code_syntax(code, local_variables: [])
|
57
|
-
if !continue && syntax == :valid
|
58
|
-
return first_line + lnum
|
59
|
-
end
|
60
|
-
end
|
61
|
-
first_line
|
62
|
-
end
|
63
|
-
|
64
112
|
def method_target(owner_receiver, super_level, method, type)
|
65
113
|
case type
|
66
114
|
when "owner"
|
@@ -71,9 +119,21 @@ module IRB
|
|
71
119
|
super_level.times do |s|
|
72
120
|
target_method = target_method.super_method if target_method
|
73
121
|
end
|
74
|
-
target_method
|
122
|
+
target_method
|
75
123
|
rescue NameError
|
76
124
|
nil
|
77
125
|
end
|
126
|
+
|
127
|
+
def eval_receiver_or_owner(code)
|
128
|
+
context_binding = @irb_context.workspace.binding
|
129
|
+
eval(code, context_binding)
|
130
|
+
rescue NameError
|
131
|
+
raise EvaluationError
|
132
|
+
end
|
133
|
+
|
134
|
+
def find_const_owner(name)
|
135
|
+
module_nesting = @irb_context.workspace.binding.eval('::Module.nesting')
|
136
|
+
module_nesting.find { |mod| mod.const_defined?(name, false) } || module_nesting.find { |mod| mod.const_defined?(name) } || Object
|
137
|
+
end
|
78
138
|
end
|
79
139
|
end
|
data/lib/irb/statement.rb
CHANGED
@@ -20,6 +20,29 @@ module IRB
|
|
20
20
|
raise NotImplementedError
|
21
21
|
end
|
22
22
|
|
23
|
+
class EmptyInput < Statement
|
24
|
+
def is_assignment?
|
25
|
+
false
|
26
|
+
end
|
27
|
+
|
28
|
+
def suppresses_echo?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
# Debugger takes empty input to repeat the last command
|
33
|
+
def should_be_handled_by_debugger?
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def code
|
38
|
+
""
|
39
|
+
end
|
40
|
+
|
41
|
+
def evaluable_code
|
42
|
+
code
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
23
46
|
class Expression < Statement
|
24
47
|
def initialize(code, is_assignment)
|
25
48
|
@code = code
|
@@ -60,9 +83,8 @@ module IRB
|
|
60
83
|
end
|
61
84
|
|
62
85
|
def should_be_handled_by_debugger?
|
63
|
-
require_relative '
|
64
|
-
|
65
|
-
IRB::ExtendCommand::DebugCommand > @command_class || IRB::ExtendCommand::Help == @command_class
|
86
|
+
require_relative 'command/debug'
|
87
|
+
IRB::Command::DebugCommand > @command_class
|
66
88
|
end
|
67
89
|
|
68
90
|
def evaluable_code
|
data/lib/irb/version.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/version.rb - irb version definition file
|
4
4
|
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
|
5
5
|
#
|
6
6
|
|
7
7
|
module IRB # :nodoc:
|
8
|
-
VERSION = "1.
|
8
|
+
VERSION = "1.12.0"
|
9
9
|
@RELEASE_VERSION = VERSION
|
10
|
-
@LAST_UPDATE_DATE = "2024-
|
10
|
+
@LAST_UPDATE_DATE = "2024-03-06"
|
11
11
|
end
|
data/lib/irb/workspace.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/workspace-binding.rb -
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -90,11 +90,11 @@ EOF
|
|
90
90
|
IRB.conf[:__MAIN__] = @main
|
91
91
|
@main.singleton_class.class_eval do
|
92
92
|
private
|
93
|
-
define_method(:exit) do |*a, &b|
|
94
|
-
# Do nothing, will be overridden
|
95
|
-
end
|
96
93
|
define_method(:binding, Kernel.instance_method(:binding))
|
97
94
|
define_method(:local_variables, Kernel.instance_method(:local_variables))
|
95
|
+
# Define empty method to avoid delegator warning, will be overridden.
|
96
|
+
define_method(:exit) {|*a, &b| }
|
97
|
+
define_method(:exit!) {|*a, &b| }
|
98
98
|
end
|
99
99
|
@binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, *@binding.source_location)
|
100
100
|
end
|
data/lib/irb/ws-for-case-2.rb
CHANGED
data/lib/irb/xmp.rb
CHANGED
data/lib/irb.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb.rb - irb main module
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
@@ -9,7 +9,7 @@ require "reline"
|
|
9
9
|
|
10
10
|
require_relative "irb/init"
|
11
11
|
require_relative "irb/context"
|
12
|
-
require_relative "irb/
|
12
|
+
require_relative "irb/command"
|
13
13
|
|
14
14
|
require_relative "irb/ruby-lex"
|
15
15
|
require_relative "irb/statement"
|
@@ -203,11 +203,10 @@ require_relative "irb/pager"
|
|
203
203
|
#
|
204
204
|
# === Input Command History
|
205
205
|
#
|
206
|
-
# By default, \IRB stores a history of up to 1000 input commands
|
207
|
-
#
|
208
|
-
#
|
209
|
-
#
|
210
|
-
# inin the same directory as that file).
|
206
|
+
# By default, \IRB stores a history of up to 1000 input commands in a
|
207
|
+
# file named <tt>.irb_history</tt>. The history file will be in the same directory
|
208
|
+
# as the {configuration file}[rdoc-ref:IRB@Configuration+File] if one is found, or
|
209
|
+
# in <tt>~/</tt> otherwise.
|
211
210
|
#
|
212
211
|
# A new \IRB session creates the history file if it does not exist,
|
213
212
|
# and appends to the file if it does exist.
|
@@ -365,7 +364,7 @@ require_relative "irb/pager"
|
|
365
364
|
# You can change the initial behavior and suppress all echoing by:
|
366
365
|
#
|
367
366
|
# - Adding to the configuration file: <tt>IRB.conf[:ECHO] = false</tt>.
|
368
|
-
# (The default value for this entry is +
|
367
|
+
# (The default value for this entry is +nil+, which means the same as +true+.)
|
369
368
|
# - Giving command-line option <tt>--noecho</tt>.
|
370
369
|
# (The default is <tt>--echo</tt>.)
|
371
370
|
#
|
@@ -392,7 +391,7 @@ require_relative "irb/pager"
|
|
392
391
|
# (The default value for this entry is +niL+, which means the same as +:truncate+.)
|
393
392
|
# - Giving command-line option <tt>--noecho-on-assignment</tt>
|
394
393
|
# or <tt>--echo-on-assignment</tt>.
|
395
|
-
# (The default is <tt>--truncate-echo-on-
|
394
|
+
# (The default is <tt>--truncate-echo-on-assignment</tt>.)
|
396
395
|
#
|
397
396
|
# During the session, you can change the current setting
|
398
397
|
# with configuration method <tt>conf.echo_on_assignment=</tt>
|
@@ -413,7 +412,7 @@ require_relative "irb/pager"
|
|
413
412
|
#
|
414
413
|
# By default, \IRB prefixes a newline to a multiline response.
|
415
414
|
#
|
416
|
-
# You can change the initial default value by adding to the
|
415
|
+
# You can change the initial default value by adding to the configuration file:
|
417
416
|
#
|
418
417
|
# IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT] = false
|
419
418
|
#
|
@@ -812,7 +811,7 @@ require_relative "irb/pager"
|
|
812
811
|
#
|
813
812
|
# === Commands
|
814
813
|
#
|
815
|
-
# Please use the `
|
814
|
+
# Please use the `help` command to see the list of available commands.
|
816
815
|
#
|
817
816
|
# === IRB Sessions
|
818
817
|
#
|
@@ -887,7 +886,7 @@ module IRB
|
|
887
886
|
|
888
887
|
# Quits irb
|
889
888
|
def IRB.irb_exit(*)
|
890
|
-
throw :IRB_EXIT
|
889
|
+
throw :IRB_EXIT, false
|
891
890
|
end
|
892
891
|
|
893
892
|
# Aborts then interrupts irb.
|
@@ -904,8 +903,8 @@ module IRB
|
|
904
903
|
# parsed as a :method_add_arg and the output won't be suppressed
|
905
904
|
|
906
905
|
PROMPT_MAIN_TRUNCATE_LENGTH = 32
|
907
|
-
PROMPT_MAIN_TRUNCATE_OMISSION = '...'
|
908
|
-
CONTROL_CHARACTERS_PATTERN = "\x00-\x1F"
|
906
|
+
PROMPT_MAIN_TRUNCATE_OMISSION = '...'
|
907
|
+
CONTROL_CHARACTERS_PATTERN = "\x00-\x1F"
|
909
908
|
|
910
909
|
# Returns the current context of this irb session
|
911
910
|
attr_reader :context
|
@@ -934,7 +933,7 @@ module IRB
|
|
934
933
|
|
935
934
|
def debug_readline(binding)
|
936
935
|
workspace = IRB::WorkSpace.new(binding)
|
937
|
-
context.workspace
|
936
|
+
context.replace_workspace(workspace)
|
938
937
|
context.workspace.load_commands_to_main
|
939
938
|
@line_no += 1
|
940
939
|
|
@@ -945,7 +944,7 @@ module IRB
|
|
945
944
|
# Irb#eval_input will simply return the input, and we need to pass it to the debugger.
|
946
945
|
input = if IRB.conf[:SAVE_HISTORY] && context.io.support_history_saving?
|
947
946
|
# Previous IRB session's history has been saved when `Irb#run` is exited
|
948
|
-
# We need to make sure the saved history is not saved again by
|
947
|
+
# We need to make sure the saved history is not saved again by resetting the counter
|
949
948
|
context.io.reset_history_counter
|
950
949
|
|
951
950
|
begin
|
@@ -980,13 +979,21 @@ module IRB
|
|
980
979
|
end
|
981
980
|
|
982
981
|
begin
|
983
|
-
|
982
|
+
if defined?(RubyVM.keep_script_lines)
|
983
|
+
keep_script_lines_backup = RubyVM.keep_script_lines
|
984
|
+
RubyVM.keep_script_lines = true
|
985
|
+
end
|
986
|
+
|
987
|
+
forced_exit = catch(:IRB_EXIT) do
|
984
988
|
eval_input
|
985
989
|
end
|
986
990
|
ensure
|
991
|
+
RubyVM.keep_script_lines = keep_script_lines_backup if defined?(RubyVM.keep_script_lines)
|
987
992
|
trap("SIGINT", prev_trap)
|
988
993
|
conf[:AT_EXIT].each{|hook| hook.call}
|
994
|
+
|
989
995
|
context.io.save_history if save_history
|
996
|
+
Kernel.exit if forced_exit
|
990
997
|
end
|
991
998
|
end
|
992
999
|
|
@@ -1049,7 +1056,7 @@ module IRB
|
|
1049
1056
|
return read_input(prompt) if @context.io.respond_to?(:check_termination)
|
1050
1057
|
|
1051
1058
|
# nomultiline
|
1052
|
-
code = ''
|
1059
|
+
code = +''
|
1053
1060
|
line_offset = 0
|
1054
1061
|
loop do
|
1055
1062
|
line = read_input(prompt)
|
@@ -1075,16 +1082,17 @@ module IRB
|
|
1075
1082
|
loop do
|
1076
1083
|
code = readmultiline
|
1077
1084
|
break unless code
|
1078
|
-
|
1079
|
-
if code != "\n"
|
1080
|
-
yield build_statement(code), @line_no
|
1081
|
-
end
|
1085
|
+
yield build_statement(code), @line_no
|
1082
1086
|
@line_no += code.count("\n")
|
1083
1087
|
rescue RubyLex::TerminateLineInput
|
1084
1088
|
end
|
1085
1089
|
end
|
1086
1090
|
|
1087
1091
|
def build_statement(code)
|
1092
|
+
if code.match?(/\A\n*\z/)
|
1093
|
+
return Statement::EmptyInput.new
|
1094
|
+
end
|
1095
|
+
|
1088
1096
|
code.force_encoding(@context.io.encoding)
|
1089
1097
|
command_or_alias, arg = code.split(/\s/, 2)
|
1090
1098
|
# Transform a non-identifier alias (@, $) or keywords (next, break)
|
@@ -1130,7 +1138,6 @@ module IRB
|
|
1130
1138
|
end
|
1131
1139
|
if @context.io.respond_to?(:dynamic_prompt)
|
1132
1140
|
@context.io.dynamic_prompt do |lines|
|
1133
|
-
lines << '' if lines.empty?
|
1134
1141
|
tokens = RubyLex.ripper_lex_without_warning(lines.map{ |l| l + "\n" }.join, local_variables: @context.local_variables)
|
1135
1142
|
line_results = IRB::NestingParser.parse_by_line(tokens)
|
1136
1143
|
tokens_until_line = []
|
@@ -1228,7 +1235,7 @@ module IRB
|
|
1228
1235
|
lines.map{ |l| l + "\n" }.join
|
1229
1236
|
}
|
1230
1237
|
# The "<top (required)>" in "(irb)" may be the top level of IRB so imitate the main object.
|
1231
|
-
message = message.gsub(/\(irb\):(?<num>\d+):in
|
1238
|
+
message = message.gsub(/\(irb\):(?<num>\d+):in (?<open_quote>[`'])<(?<frame>top \(required\))>'/) { "(irb):#{$~[:num]}:in #{$~[:open_quote]}<main>'" }
|
1232
1239
|
puts message
|
1233
1240
|
puts 'Maybe IRB bug!' if irb_bug
|
1234
1241
|
rescue Exception => handler_exc
|
@@ -1262,12 +1269,11 @@ module IRB
|
|
1262
1269
|
# Used by the irb command +irb_load+, see IRB@IRB+Sessions for more
|
1263
1270
|
# information.
|
1264
1271
|
def suspend_workspace(workspace)
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
end
|
1272
|
+
current_workspace = @context.workspace
|
1273
|
+
@context.replace_workspace(workspace)
|
1274
|
+
yield
|
1275
|
+
ensure
|
1276
|
+
@context.replace_workspace current_workspace
|
1271
1277
|
end
|
1272
1278
|
|
1273
1279
|
# Evaluates the given block using the given +input_method+ as the
|
@@ -1515,7 +1521,7 @@ class Binding
|
|
1515
1521
|
# See IRB for more information.
|
1516
1522
|
def irb(show_code: true)
|
1517
1523
|
# Setup IRB with the current file's path and no command line arguments
|
1518
|
-
IRB.setup(source_location[0], argv: [])
|
1524
|
+
IRB.setup(source_location[0], argv: []) unless IRB.initialized?
|
1519
1525
|
# Create a new workspace using the current binding
|
1520
1526
|
workspace = IRB::WorkSpace.new(self)
|
1521
1527
|
# Print the code around the binding if show_code is true
|
@@ -1527,7 +1533,7 @@ class Binding
|
|
1527
1533
|
|
1528
1534
|
if debugger_irb
|
1529
1535
|
# If we're already in a debugger session, set the workspace and irb_path for the original IRB instance
|
1530
|
-
debugger_irb.context.workspace
|
1536
|
+
debugger_irb.context.replace_workspace(workspace)
|
1531
1537
|
debugger_irb.context.irb_path = irb_path
|
1532
1538
|
# If we've started a debugger session and hit another binding.irb, we don't want to start an IRB session
|
1533
1539
|
# instead, we want to resume the irb:rdbg session.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: irb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- aycabta
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-
|
12
|
+
date: 2024-03-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: reline
|
@@ -60,34 +60,36 @@ files:
|
|
60
60
|
- exe/irb
|
61
61
|
- irb.gemspec
|
62
62
|
- lib/irb.rb
|
63
|
-
- lib/irb/cmd/backtrace.rb
|
64
|
-
- lib/irb/cmd/break.rb
|
65
|
-
- lib/irb/cmd/catch.rb
|
66
|
-
- lib/irb/cmd/chws.rb
|
67
|
-
- lib/irb/cmd/continue.rb
|
68
|
-
- lib/irb/cmd/debug.rb
|
69
|
-
- lib/irb/cmd/delete.rb
|
70
|
-
- lib/irb/cmd/edit.rb
|
71
|
-
- lib/irb/cmd/exit.rb
|
72
|
-
- lib/irb/cmd/finish.rb
|
73
|
-
- lib/irb/cmd/help.rb
|
74
|
-
- lib/irb/cmd/history.rb
|
75
|
-
- lib/irb/cmd/info.rb
|
76
|
-
- lib/irb/cmd/irb_info.rb
|
77
|
-
- lib/irb/cmd/load.rb
|
78
|
-
- lib/irb/cmd/ls.rb
|
79
|
-
- lib/irb/cmd/measure.rb
|
80
|
-
- lib/irb/cmd/next.rb
|
81
63
|
- lib/irb/cmd/nop.rb
|
82
|
-
- lib/irb/cmd/pushws.rb
|
83
|
-
- lib/irb/cmd/show_cmds.rb
|
84
|
-
- lib/irb/cmd/show_doc.rb
|
85
|
-
- lib/irb/cmd/show_source.rb
|
86
|
-
- lib/irb/cmd/step.rb
|
87
|
-
- lib/irb/cmd/subirb.rb
|
88
|
-
- lib/irb/cmd/whereami.rb
|
89
64
|
- lib/irb/color.rb
|
90
65
|
- lib/irb/color_printer.rb
|
66
|
+
- lib/irb/command.rb
|
67
|
+
- lib/irb/command/backtrace.rb
|
68
|
+
- lib/irb/command/base.rb
|
69
|
+
- lib/irb/command/break.rb
|
70
|
+
- lib/irb/command/catch.rb
|
71
|
+
- lib/irb/command/chws.rb
|
72
|
+
- lib/irb/command/continue.rb
|
73
|
+
- lib/irb/command/debug.rb
|
74
|
+
- lib/irb/command/delete.rb
|
75
|
+
- lib/irb/command/edit.rb
|
76
|
+
- lib/irb/command/exit.rb
|
77
|
+
- lib/irb/command/finish.rb
|
78
|
+
- lib/irb/command/force_exit.rb
|
79
|
+
- lib/irb/command/help.rb
|
80
|
+
- lib/irb/command/history.rb
|
81
|
+
- lib/irb/command/info.rb
|
82
|
+
- lib/irb/command/irb_info.rb
|
83
|
+
- lib/irb/command/load.rb
|
84
|
+
- lib/irb/command/ls.rb
|
85
|
+
- lib/irb/command/measure.rb
|
86
|
+
- lib/irb/command/next.rb
|
87
|
+
- lib/irb/command/pushws.rb
|
88
|
+
- lib/irb/command/show_doc.rb
|
89
|
+
- lib/irb/command/show_source.rb
|
90
|
+
- lib/irb/command/step.rb
|
91
|
+
- lib/irb/command/subirb.rb
|
92
|
+
- lib/irb/command/whereami.rb
|
91
93
|
- lib/irb/completion.rb
|
92
94
|
- lib/irb/context.rb
|
93
95
|
- lib/irb/debug.rb
|
@@ -100,7 +102,6 @@ files:
|
|
100
102
|
- lib/irb/ext/tracer.rb
|
101
103
|
- lib/irb/ext/use-loader.rb
|
102
104
|
- lib/irb/ext/workspaces.rb
|
103
|
-
- lib/irb/extend-command.rb
|
104
105
|
- lib/irb/frame.rb
|
105
106
|
- lib/irb/help.rb
|
106
107
|
- lib/irb/history.rb
|
@@ -149,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
150
|
- !ruby/object:Gem::Version
|
150
151
|
version: '0'
|
151
152
|
requirements: []
|
152
|
-
rubygems_version: 3.5.
|
153
|
+
rubygems_version: 3.5.1
|
153
154
|
signing_key:
|
154
155
|
specification_version: 4
|
155
156
|
summary: Interactive Ruby command-line tool for REPL (Read Eval Print Loop).
|
data/lib/irb/cmd/edit.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'shellwords'
|
2
|
-
require_relative "nop"
|
3
|
-
require_relative "../source_finder"
|
4
|
-
|
5
|
-
module IRB
|
6
|
-
# :stopdoc:
|
7
|
-
|
8
|
-
module ExtendCommand
|
9
|
-
class Edit < Nop
|
10
|
-
category "Misc"
|
11
|
-
description 'Open a file with the editor command defined with `ENV["VISUAL"]` or `ENV["EDITOR"]`.'
|
12
|
-
|
13
|
-
class << self
|
14
|
-
def transform_args(args)
|
15
|
-
# Return a string literal as is for backward compatibility
|
16
|
-
if args.nil? || args.empty? || string_literal?(args)
|
17
|
-
args
|
18
|
-
else # Otherwise, consider the input as a String for convenience
|
19
|
-
args.strip.dump
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def execute(*args)
|
25
|
-
path = args.first
|
26
|
-
|
27
|
-
if path.nil? && (irb_path = @irb_context.irb_path)
|
28
|
-
path = irb_path
|
29
|
-
end
|
30
|
-
|
31
|
-
if !File.exist?(path)
|
32
|
-
source =
|
33
|
-
begin
|
34
|
-
SourceFinder.new(@irb_context).find_source(path)
|
35
|
-
rescue NameError
|
36
|
-
# if user enters a path that doesn't exist, it'll cause NameError when passed here because find_source would try to evaluate it as well
|
37
|
-
# in this case, we should just ignore the error
|
38
|
-
end
|
39
|
-
|
40
|
-
if source
|
41
|
-
path = source.file
|
42
|
-
else
|
43
|
-
puts "Can not find file: #{path}"
|
44
|
-
return
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
if editor = (ENV['VISUAL'] || ENV['EDITOR'])
|
49
|
-
puts "command: '#{editor}'"
|
50
|
-
puts " path: #{path}"
|
51
|
-
system(*Shellwords.split(editor), path)
|
52
|
-
else
|
53
|
-
puts "Can not find editor setting: ENV['VISUAL'] or ENV['EDITOR']"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# :startdoc:
|
60
|
-
end
|
data/lib/irb/cmd/help.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "show_doc"
|
4
|
-
|
5
|
-
module IRB
|
6
|
-
module ExtendCommand
|
7
|
-
class Help < ShowDoc
|
8
|
-
category "Context"
|
9
|
-
description "[DEPRECATED] Enter the mode to look up RI documents."
|
10
|
-
|
11
|
-
DEPRECATION_MESSAGE = <<~MSG
|
12
|
-
[Deprecation] The `help` command will be repurposed to display command help in the future.
|
13
|
-
For RI document lookup, please use the `show_doc` command instead.
|
14
|
-
For command help, please use `show_cmds` for now.
|
15
|
-
MSG
|
16
|
-
|
17
|
-
def execute(*names)
|
18
|
-
warn DEPRECATION_MESSAGE
|
19
|
-
super
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|