irb 1.14.0 → 1.14.1
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/Gemfile +1 -1
- data/README.md +8 -2
- data/lib/irb/command/base.rb +10 -8
- data/lib/irb/command/debug.rb +8 -6
- data/lib/irb/command/help.rb +1 -1
- data/lib/irb/context.rb +42 -13
- data/lib/irb/debug.rb +6 -10
- data/lib/irb/default_commands.rb +15 -7
- data/lib/irb/easter-egg.rb +8 -5
- data/lib/irb/input-method.rb +10 -17
- data/lib/irb/inspector.rb +31 -30
- data/lib/irb/nesting_parser.rb +196 -194
- data/lib/irb/pager.rb +5 -1
- data/lib/irb/ruby-lex.rb +84 -82
- data/lib/irb/ruby_logo.aa +75 -37
- data/lib/irb/source_finder.rb +1 -1
- data/lib/irb/version.rb +2 -2
- data/lib/irb/workspace.rb +7 -5
- data/lib/irb.rb +32 -57
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b71e88a4dbaabac4d4a40667f3bd763bd05dfda12832919e44072f04f85ceb4
|
4
|
+
data.tar.gz: 213f59cc1bc59c61ea2013e81a098d0cb1c95f9972233cb8886bb7b353884fe8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ed2dd4b075b7e54ca58bf206c9dca68163564f5bbdbd8bacb24479af62a2b0bbef9d612ae0af0075bda787e189c6020b953c1858e5faecfbab7e9e441d83952
|
7
|
+
data.tar.gz: 6a81b55c3f04253913c0c1adcc118d61c03cb0b7a5a64410bbfe5495b2fc6d08e0a451eb21302327454f73ef83ed54d74c23ef065139fedbd3a685b1c5562c63
|
data/Gemfile
CHANGED
@@ -7,7 +7,7 @@ is_truffleruby = RUBY_DESCRIPTION =~ /truffleruby/
|
|
7
7
|
|
8
8
|
if is_unix && ENV['WITH_VTERM']
|
9
9
|
gem "vterm", github: "ruby/vterm-gem"
|
10
|
-
gem "yamatanooroti", github: "ruby/yamatanooroti"
|
10
|
+
gem "yamatanooroti", github: "ruby/yamatanooroti", ref: "f6e47192100d6089f70cf64c1de540dcaadf005a"
|
11
11
|
end
|
12
12
|
|
13
13
|
gem "stackprof" if is_unix && !is_truffleruby
|
data/README.md
CHANGED
@@ -114,6 +114,7 @@ Help
|
|
114
114
|
help List all available commands. Use `help <command>` to get information about a specific command.
|
115
115
|
|
116
116
|
IRB
|
117
|
+
context Displays current configuration.
|
117
118
|
exit Exit the current irb session.
|
118
119
|
exit! Exit the current process.
|
119
120
|
irb_load Load a Ruby file.
|
@@ -121,6 +122,7 @@ IRB
|
|
121
122
|
source Loads a given file in the current session.
|
122
123
|
irb_info Show information about IRB.
|
123
124
|
history Shows the input history. `-g [query]` or `-G [query]` allows you to filter the output.
|
125
|
+
disable_irb Disable binding.irb.
|
124
126
|
|
125
127
|
Workspace
|
126
128
|
cwws Show the current workspace.
|
@@ -128,6 +130,7 @@ Workspace
|
|
128
130
|
workspaces Show workspaces.
|
129
131
|
pushws Push an object to the workspace stack.
|
130
132
|
popws Pop a workspace from the workspace stack.
|
133
|
+
cd Move into the given object or leave the current context.
|
131
134
|
|
132
135
|
Multi-irb (DEPRECATED)
|
133
136
|
irb Start a child IRB.
|
@@ -152,11 +155,14 @@ Misc
|
|
152
155
|
measure `measure` enables the mode to measure processing time. `measure :off` disables it.
|
153
156
|
|
154
157
|
Context
|
155
|
-
show_doc
|
158
|
+
show_doc Look up documentation with RI.
|
156
159
|
ls Show methods, constants, and variables.
|
157
|
-
show_source Show the source code of a given method or constant.
|
160
|
+
show_source Show the source code of a given method, class/module, or constant.
|
158
161
|
whereami Show the source code around binding.irb again.
|
159
162
|
|
163
|
+
Helper methods
|
164
|
+
conf Returns the current IRB context.
|
165
|
+
|
160
166
|
Aliases
|
161
167
|
$ Alias for `show_source`
|
162
168
|
@ Alias for `whereami`
|
data/lib/irb/command/base.rb
CHANGED
@@ -10,8 +10,10 @@ module IRB
|
|
10
10
|
module Command
|
11
11
|
class CommandArgumentError < StandardError; end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
class << self
|
14
|
+
def extract_ruby_args(*args, **kwargs)
|
15
|
+
throw :EXTRACT_RUBY_ARGS, [args, kwargs]
|
16
|
+
end
|
15
17
|
end
|
16
18
|
|
17
19
|
class Base
|
@@ -31,6 +33,12 @@ module IRB
|
|
31
33
|
@help_message
|
32
34
|
end
|
33
35
|
|
36
|
+
def execute(irb_context, arg)
|
37
|
+
new(irb_context).execute(arg)
|
38
|
+
rescue CommandArgumentError => e
|
39
|
+
puts e.message
|
40
|
+
end
|
41
|
+
|
34
42
|
private
|
35
43
|
|
36
44
|
def highlight(text)
|
@@ -38,12 +46,6 @@ module IRB
|
|
38
46
|
end
|
39
47
|
end
|
40
48
|
|
41
|
-
def self.execute(irb_context, arg)
|
42
|
-
new(irb_context).execute(arg)
|
43
|
-
rescue CommandArgumentError => e
|
44
|
-
puts e.message
|
45
|
-
end
|
46
|
-
|
47
49
|
def initialize(irb_context)
|
48
50
|
@irb_context = irb_context
|
49
51
|
end
|
data/lib/irb/command/debug.rb
CHANGED
@@ -58,13 +58,15 @@ module IRB
|
|
58
58
|
end
|
59
59
|
|
60
60
|
class DebugCommand < Debug
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
class << self
|
62
|
+
def category
|
63
|
+
"Debugging"
|
64
|
+
end
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
def description
|
67
|
+
command_name = self.name.split("::").last.downcase
|
68
|
+
"Start the debugger of debug.gem and run its `#{command_name}` command."
|
69
|
+
end
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
data/lib/irb/command/help.rb
CHANGED
@@ -39,7 +39,7 @@ module IRB
|
|
39
39
|
|
40
40
|
help_cmds = commands_grouped_by_categories.delete("Help")
|
41
41
|
no_category_cmds = commands_grouped_by_categories.delete("No category")
|
42
|
-
aliases = irb_context.instance_variable_get(:@
|
42
|
+
aliases = irb_context.instance_variable_get(:@command_aliases).map do |alias_name, target|
|
43
43
|
{ display_name: alias_name, description: "Alias for `#{target}`" }
|
44
44
|
end
|
45
45
|
|
data/lib/irb/context.rb
CHANGED
@@ -13,6 +13,7 @@ module IRB
|
|
13
13
|
# A class that wraps the current state of the irb session, including the
|
14
14
|
# configuration of IRB.conf.
|
15
15
|
class Context
|
16
|
+
ASSIGN_OPERATORS_REGEXP = Regexp.union(%w[= += -= *= /= %= **= &= |= &&= ||= ^= <<= >>=])
|
16
17
|
# Creates a new IRB context.
|
17
18
|
#
|
18
19
|
# The optional +input_method+ argument:
|
@@ -148,8 +149,7 @@ module IRB
|
|
148
149
|
@newline_before_multiline_output = true
|
149
150
|
end
|
150
151
|
|
151
|
-
@
|
152
|
-
@command_aliases = @user_aliases.merge(KEYWORD_ALIASES)
|
152
|
+
@command_aliases = IRB.conf[:COMMAND_ALIASES].dup
|
153
153
|
end
|
154
154
|
|
155
155
|
private def term_interactive?
|
@@ -157,17 +157,6 @@ module IRB
|
|
157
157
|
STDIN.tty? && ENV['TERM'] != 'dumb'
|
158
158
|
end
|
159
159
|
|
160
|
-
# because all input will eventually be evaluated as Ruby code,
|
161
|
-
# command names that conflict with Ruby keywords need special workaround
|
162
|
-
# we can remove them once we implemented a better command system for IRB
|
163
|
-
KEYWORD_ALIASES = {
|
164
|
-
:break => :irb_break,
|
165
|
-
:catch => :irb_catch,
|
166
|
-
:next => :irb_next,
|
167
|
-
}.freeze
|
168
|
-
|
169
|
-
private_constant :KEYWORD_ALIASES
|
170
|
-
|
171
160
|
def use_tracer=(val)
|
172
161
|
require_relative "ext/tracer" if val
|
173
162
|
IRB.conf[:USE_TRACER] = val
|
@@ -635,6 +624,46 @@ module IRB
|
|
635
624
|
result
|
636
625
|
end
|
637
626
|
|
627
|
+
def parse_command(code)
|
628
|
+
command_name, arg = code.strip.split(/\s+/, 2)
|
629
|
+
return unless code.lines.size == 1 && command_name
|
630
|
+
|
631
|
+
arg ||= ''
|
632
|
+
command = command_name.to_sym
|
633
|
+
# Command aliases are always command. example: $, @
|
634
|
+
if (alias_name = command_aliases[command])
|
635
|
+
return [alias_name, arg]
|
636
|
+
end
|
637
|
+
|
638
|
+
# Assignment-like expression is not a command
|
639
|
+
return if arg.start_with?(ASSIGN_OPERATORS_REGEXP) && !arg.start_with?(/==|=~/)
|
640
|
+
|
641
|
+
# Local variable have precedence over command
|
642
|
+
return if local_variables.include?(command)
|
643
|
+
|
644
|
+
# Check visibility
|
645
|
+
public_method = !!Kernel.instance_method(:public_method).bind_call(main, command) rescue false
|
646
|
+
private_method = !public_method && !!Kernel.instance_method(:method).bind_call(main, command) rescue false
|
647
|
+
if Command.execute_as_command?(command, public_method: public_method, private_method: private_method)
|
648
|
+
[command, arg]
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
652
|
+
def colorize_input(input, complete:)
|
653
|
+
if IRB.conf[:USE_COLORIZE] && IRB::Color.colorable?
|
654
|
+
lvars = local_variables || []
|
655
|
+
if parse_command(input)
|
656
|
+
name, sep, arg = input.split(/(\s+)/, 2)
|
657
|
+
arg = IRB::Color.colorize_code(arg, complete: complete, local_variables: lvars)
|
658
|
+
"#{IRB::Color.colorize(name, [:BOLD])}\e[m#{sep}#{arg}"
|
659
|
+
else
|
660
|
+
IRB::Color.colorize_code(input, complete: complete, local_variables: lvars)
|
661
|
+
end
|
662
|
+
else
|
663
|
+
Reline::Unicode.escape_for_print(input)
|
664
|
+
end
|
665
|
+
end
|
666
|
+
|
638
667
|
def inspect_last_value # :nodoc:
|
639
668
|
@inspect_method.inspect_value(@last_value)
|
640
669
|
end
|
data/lib/irb/debug.rb
CHANGED
@@ -57,22 +57,18 @@ module IRB
|
|
57
57
|
DEBUGGER__::ThreadClient.prepend(SkipPathHelperForIRB)
|
58
58
|
end
|
59
59
|
|
60
|
-
if
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
unless output.strip.empty?
|
65
|
-
cmd = output.split(/\s/, 2).first
|
60
|
+
if !DEBUGGER__::CONFIG[:no_hint] && irb.context.io.is_a?(RelineInputMethod)
|
61
|
+
Reline.output_modifier_proc = proc do |input, complete:|
|
62
|
+
unless input.strip.empty?
|
63
|
+
cmd = input.split(/\s/, 2).first
|
66
64
|
|
67
65
|
if !complete && DEBUGGER__.commands.key?(cmd)
|
68
|
-
|
66
|
+
input = input.sub(/\n$/, " # debug command\n")
|
69
67
|
end
|
70
68
|
end
|
71
69
|
|
72
|
-
|
70
|
+
irb.context.colorize_input(input, complete: complete)
|
73
71
|
end
|
74
|
-
|
75
|
-
@output_modifier_defined = true
|
76
72
|
end
|
77
73
|
|
78
74
|
true
|
data/lib/irb/default_commands.rb
CHANGED
@@ -181,9 +181,15 @@ module IRB
|
|
181
181
|
[:edit, NO_OVERRIDE]
|
182
182
|
)
|
183
183
|
|
184
|
-
_register_with_aliases(:irb_break, Command::Break
|
185
|
-
|
186
|
-
|
184
|
+
_register_with_aliases(:irb_break, Command::Break,
|
185
|
+
[:break, OVERRIDE_ALL]
|
186
|
+
)
|
187
|
+
_register_with_aliases(:irb_catch, Command::Catch,
|
188
|
+
[:catch, OVERRIDE_PRIVATE_ONLY]
|
189
|
+
)
|
190
|
+
_register_with_aliases(:irb_next, Command::Next,
|
191
|
+
[:next, OVERRIDE_ALL]
|
192
|
+
)
|
187
193
|
_register_with_aliases(:irb_delete, Command::Delete,
|
188
194
|
[:delete, NO_OVERRIDE]
|
189
195
|
)
|
@@ -259,10 +265,12 @@ module IRB
|
|
259
265
|
# Deprecated. Doesn't have any effect.
|
260
266
|
@EXTEND_COMMANDS = []
|
261
267
|
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
268
|
+
class << self
|
269
|
+
# Drepcated. Use Command.regiser instead.
|
270
|
+
def def_extend_command(cmd_name, cmd_class, _, *aliases)
|
271
|
+
Command._register_with_aliases(cmd_name, cmd_class, *aliases)
|
272
|
+
Command.class_variable_set(:@@command_override_policies, nil)
|
273
|
+
end
|
266
274
|
end
|
267
275
|
end
|
268
276
|
end
|
data/lib/irb/easter-egg.rb
CHANGED
@@ -100,19 +100,21 @@ module IRB
|
|
100
100
|
|
101
101
|
private def easter_egg_logo(type)
|
102
102
|
@easter_egg_logos ||= File.read(File.join(__dir__, 'ruby_logo.aa'), encoding: 'UTF-8:UTF-8')
|
103
|
-
.split(/TYPE: ([A-
|
103
|
+
.split(/TYPE: ([A-Z_]+)\n/)[1..]
|
104
104
|
.each_slice(2)
|
105
105
|
.to_h
|
106
106
|
@easter_egg_logos[type.to_s.upcase]
|
107
107
|
end
|
108
108
|
|
109
109
|
private def easter_egg(type = nil)
|
110
|
+
print "\e[?1049h"
|
110
111
|
type ||= [:logo, :dancing].sample
|
111
112
|
case type
|
112
113
|
when :logo
|
113
|
-
|
114
|
-
|
115
|
-
io.write easter_egg_logo(
|
114
|
+
Pager.page do |io|
|
115
|
+
logo_type = STDOUT.external_encoding == Encoding::UTF_8 ? :unicode_large : :ascii_large
|
116
|
+
io.write easter_egg_logo(logo_type)
|
117
|
+
STDIN.raw { STDIN.getc } if io == STDOUT
|
116
118
|
end
|
117
119
|
when :dancing
|
118
120
|
STDOUT.cooked do
|
@@ -137,10 +139,11 @@ module IRB
|
|
137
139
|
end
|
138
140
|
rescue Interrupt
|
139
141
|
ensure
|
140
|
-
print "\e[0m\e[?1049l"
|
141
142
|
trap("SIGINT", prev_trap)
|
142
143
|
end
|
143
144
|
end
|
145
|
+
ensure
|
146
|
+
print "\e[0m\e[?1049l"
|
144
147
|
end
|
145
148
|
end
|
146
149
|
end
|
data/lib/irb/input-method.rb
CHANGED
@@ -171,11 +171,13 @@ module IRB
|
|
171
171
|
end
|
172
172
|
|
173
173
|
class ReadlineInputMethod < StdioInputMethod
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
174
|
+
class << self
|
175
|
+
def initialize_readline
|
176
|
+
require "readline"
|
177
|
+
rescue LoadError
|
178
|
+
else
|
179
|
+
include ::Readline
|
180
|
+
end
|
179
181
|
end
|
180
182
|
|
181
183
|
include HistorySavingAbility
|
@@ -263,18 +265,9 @@ module IRB
|
|
263
265
|
@completion_params = [preposing, target, postposing, bind]
|
264
266
|
@completor.completion_candidates(preposing, target, postposing, bind: bind)
|
265
267
|
}
|
266
|
-
Reline.output_modifier_proc =
|
267
|
-
|
268
|
-
|
269
|
-
next unless IRB::Color.colorable?
|
270
|
-
lvars = IRB.CurrentContext&.local_variables || []
|
271
|
-
IRB::Color.colorize_code(output, complete: complete, local_variables: lvars)
|
272
|
-
end
|
273
|
-
else
|
274
|
-
proc do |output|
|
275
|
-
Reline::Unicode.escape_for_print(output)
|
276
|
-
end
|
277
|
-
end
|
268
|
+
Reline.output_modifier_proc = proc do |input, complete:|
|
269
|
+
IRB.CurrentContext.colorize_input(input, complete: complete)
|
270
|
+
end
|
278
271
|
Reline.dig_perfect_match_proc = ->(matched) { display_document(matched) }
|
279
272
|
Reline.autocompletion = IRB.conf[:USE_AUTOCOMPLETE]
|
280
273
|
|
data/lib/irb/inspector.rb
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
|
7
7
|
module IRB # :nodoc:
|
8
8
|
|
9
|
-
|
10
9
|
# Convenience method to create a new Inspector, using the given +inspect+
|
11
10
|
# proc, and optional +init+ proc and passes them to Inspector.new
|
12
11
|
#
|
@@ -43,38 +42,40 @@ module IRB # :nodoc:
|
|
43
42
|
# +:marshal+:: Using Marshal.dump
|
44
43
|
INSPECTORS = {}
|
45
44
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
# Example
|
53
|
-
#
|
54
|
-
# Inspector.def_inspector(key, init_p=nil){|v| v.inspect}
|
55
|
-
# Inspector.def_inspector([key1,..], init_p=nil){|v| v.inspect}
|
56
|
-
# Inspector.def_inspector(key, inspector)
|
57
|
-
# Inspector.def_inspector([key1,...], inspector)
|
58
|
-
def self.def_inspector(key, arg=nil, &block)
|
59
|
-
if block_given?
|
60
|
-
inspector = IRB::Inspector(block, arg)
|
61
|
-
else
|
62
|
-
inspector = arg
|
45
|
+
class << self
|
46
|
+
# Determines the inspector to use where +inspector+ is one of the keys passed
|
47
|
+
# during inspector definition.
|
48
|
+
def keys_with_inspector(inspector)
|
49
|
+
INSPECTORS.select{|k, v| v == inspector}.collect{|k, v| k}
|
63
50
|
end
|
64
51
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
52
|
+
# Example
|
53
|
+
#
|
54
|
+
# Inspector.def_inspector(key, init_p=nil){|v| v.inspect}
|
55
|
+
# Inspector.def_inspector([key1,..], init_p=nil){|v| v.inspect}
|
56
|
+
# Inspector.def_inspector(key, inspector)
|
57
|
+
# Inspector.def_inspector([key1,...], inspector)
|
58
|
+
def def_inspector(key, arg=nil, &block)
|
59
|
+
if block_given?
|
60
|
+
inspector = IRB::Inspector(block, arg)
|
61
|
+
else
|
62
|
+
inspector = arg
|
63
|
+
end
|
64
|
+
|
65
|
+
case key
|
66
|
+
when Array
|
67
|
+
for k in key
|
68
|
+
def_inspector(k, inspector)
|
69
|
+
end
|
70
|
+
when Symbol
|
71
|
+
INSPECTORS[key] = inspector
|
72
|
+
INSPECTORS[key.to_s] = inspector
|
73
|
+
when String
|
74
|
+
INSPECTORS[key] = inspector
|
75
|
+
INSPECTORS[key.intern] = inspector
|
76
|
+
else
|
77
|
+
INSPECTORS[key] = inspector
|
69
78
|
end
|
70
|
-
when Symbol
|
71
|
-
INSPECTORS[key] = inspector
|
72
|
-
INSPECTORS[key.to_s] = inspector
|
73
|
-
when String
|
74
|
-
INSPECTORS[key] = inspector
|
75
|
-
INSPECTORS[key.intern] = inspector
|
76
|
-
else
|
77
|
-
INSPECTORS[key] = inspector
|
78
79
|
end
|
79
80
|
end
|
80
81
|
|