irb 1.0.0
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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +6 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +55 -0
- data/Rakefile +10 -0
- data/bin/console +6 -0
- data/bin/setup +6 -0
- data/exe/irb +11 -0
- data/irb.gemspec +26 -0
- data/lib/irb.rb +798 -0
- data/lib/irb/cmd/chws.rb +34 -0
- data/lib/irb/cmd/fork.rb +39 -0
- data/lib/irb/cmd/help.rb +42 -0
- data/lib/irb/cmd/load.rb +67 -0
- data/lib/irb/cmd/nop.rb +39 -0
- data/lib/irb/cmd/pushws.rb +41 -0
- data/lib/irb/cmd/subirb.rb +43 -0
- data/lib/irb/completion.rb +244 -0
- data/lib/irb/context.rb +425 -0
- data/lib/irb/ext/change-ws.rb +46 -0
- data/lib/irb/ext/history.rb +119 -0
- data/lib/irb/ext/loader.rb +129 -0
- data/lib/irb/ext/multi-irb.rb +265 -0
- data/lib/irb/ext/save-history.rb +105 -0
- data/lib/irb/ext/tracer.rb +72 -0
- data/lib/irb/ext/use-loader.rb +74 -0
- data/lib/irb/ext/workspaces.rb +67 -0
- data/lib/irb/extend-command.rb +306 -0
- data/lib/irb/frame.rb +81 -0
- data/lib/irb/help.rb +37 -0
- data/lib/irb/init.rb +302 -0
- data/lib/irb/input-method.rb +192 -0
- data/lib/irb/inspector.rb +132 -0
- data/lib/irb/lc/.document +4 -0
- data/lib/irb/lc/error.rb +32 -0
- data/lib/irb/lc/help-message +49 -0
- data/lib/irb/lc/ja/encoding_aliases.rb +11 -0
- data/lib/irb/lc/ja/error.rb +31 -0
- data/lib/irb/lc/ja/help-message +52 -0
- data/lib/irb/locale.rb +182 -0
- data/lib/irb/magic-file.rb +38 -0
- data/lib/irb/notifier.rb +232 -0
- data/lib/irb/output-method.rb +92 -0
- data/lib/irb/ruby-lex.rb +1180 -0
- data/lib/irb/ruby-token.rb +267 -0
- data/lib/irb/slex.rb +282 -0
- data/lib/irb/src_encoding.rb +7 -0
- data/lib/irb/version.rb +17 -0
- data/lib/irb/workspace.rb +143 -0
- data/lib/irb/ws-for-case-2.rb +15 -0
- data/lib/irb/xmp.rb +170 -0
- metadata +125 -0
data/lib/irb/version.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
#
|
3
|
+
# irb/version.rb - irb version definition file
|
4
|
+
# $Release Version: 0.9.6$
|
5
|
+
# $Revision$
|
6
|
+
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
|
13
|
+
module IRB # :nodoc:
|
14
|
+
VERSION = "1.0.0"
|
15
|
+
@RELEASE_VERSION = VERSION
|
16
|
+
@LAST_UPDATE_DATE = "2018-12-18"
|
17
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
#
|
3
|
+
# irb/workspace-binding.rb -
|
4
|
+
# $Release Version: 0.9.6$
|
5
|
+
# $Revision$
|
6
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
module IRB # :nodoc:
|
13
|
+
class WorkSpace
|
14
|
+
# Creates a new workspace.
|
15
|
+
#
|
16
|
+
# set self to main if specified, otherwise
|
17
|
+
# inherit main from TOPLEVEL_BINDING.
|
18
|
+
def initialize(*main)
|
19
|
+
if main[0].kind_of?(Binding)
|
20
|
+
@binding = main.shift
|
21
|
+
elsif IRB.conf[:SINGLE_IRB]
|
22
|
+
@binding = TOPLEVEL_BINDING
|
23
|
+
else
|
24
|
+
case IRB.conf[:CONTEXT_MODE]
|
25
|
+
when 0 # binding in proc on TOPLEVEL_BINDING
|
26
|
+
@binding = eval("proc{binding}.call",
|
27
|
+
TOPLEVEL_BINDING,
|
28
|
+
__FILE__,
|
29
|
+
__LINE__)
|
30
|
+
when 1 # binding in loaded file
|
31
|
+
require "tempfile"
|
32
|
+
f = Tempfile.open("irb-binding")
|
33
|
+
f.print <<EOF
|
34
|
+
$binding = binding
|
35
|
+
EOF
|
36
|
+
f.close
|
37
|
+
load f.path
|
38
|
+
@binding = $binding
|
39
|
+
|
40
|
+
when 2 # binding in loaded file(thread use)
|
41
|
+
unless defined? BINDING_QUEUE
|
42
|
+
IRB.const_set(:BINDING_QUEUE, Thread::SizedQueue.new(1))
|
43
|
+
Thread.abort_on_exception = true
|
44
|
+
Thread.start do
|
45
|
+
eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__
|
46
|
+
end
|
47
|
+
Thread.pass
|
48
|
+
end
|
49
|
+
@binding = BINDING_QUEUE.pop
|
50
|
+
|
51
|
+
when 3 # binding in function on TOPLEVEL_BINDING(default)
|
52
|
+
@binding = eval("def irb_binding; private; binding; end; irb_binding",
|
53
|
+
TOPLEVEL_BINDING,
|
54
|
+
__FILE__,
|
55
|
+
__LINE__ - 3)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
if main.empty?
|
59
|
+
@main = eval("self", @binding)
|
60
|
+
else
|
61
|
+
@main = main[0]
|
62
|
+
IRB.conf[:__MAIN__] = @main
|
63
|
+
case @main
|
64
|
+
when Module
|
65
|
+
@binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
|
66
|
+
else
|
67
|
+
begin
|
68
|
+
@binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
|
69
|
+
rescue TypeError
|
70
|
+
IRB.fail CantChangeBinding, @main.inspect
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
@binding.local_variable_set(:_, nil)
|
75
|
+
end
|
76
|
+
|
77
|
+
# The Binding of this workspace
|
78
|
+
attr_reader :binding
|
79
|
+
# The top-level workspace of this context, also available as
|
80
|
+
# <code>IRB.conf[:__MAIN__]</code>
|
81
|
+
attr_reader :main
|
82
|
+
|
83
|
+
# Evaluate the given +statements+ within the context of this workspace.
|
84
|
+
def evaluate(context, statements, file = __FILE__, line = __LINE__)
|
85
|
+
eval(statements, @binding, file, line)
|
86
|
+
end
|
87
|
+
|
88
|
+
def local_variable_set(name, value)
|
89
|
+
@binding.local_variable_set(name, value)
|
90
|
+
end
|
91
|
+
|
92
|
+
def local_variable_get(name)
|
93
|
+
@binding.local_variable_get(name)
|
94
|
+
end
|
95
|
+
|
96
|
+
# error message manipulator
|
97
|
+
def filter_backtrace(bt)
|
98
|
+
case IRB.conf[:CONTEXT_MODE]
|
99
|
+
when 0
|
100
|
+
return nil if bt =~ /\(irb_local_binding\)/
|
101
|
+
when 1
|
102
|
+
if(bt =~ %r!/tmp/irb-binding! or
|
103
|
+
bt =~ %r!irb/.*\.rb! or
|
104
|
+
bt =~ /irb\.rb/)
|
105
|
+
return nil
|
106
|
+
end
|
107
|
+
when 2
|
108
|
+
return nil if bt =~ /irb\/.*\.rb/
|
109
|
+
return nil if bt =~ /irb\.rb/
|
110
|
+
when 3
|
111
|
+
return nil if bt =~ /irb\/.*\.rb/
|
112
|
+
return nil if bt =~ /irb\.rb/
|
113
|
+
bt = bt.sub(/:\s*in `irb_binding'/, '')
|
114
|
+
end
|
115
|
+
bt
|
116
|
+
end
|
117
|
+
|
118
|
+
def code_around_binding
|
119
|
+
file, pos = @binding.source_location
|
120
|
+
|
121
|
+
unless defined?(::SCRIPT_LINES__[file]) && lines = ::SCRIPT_LINES__[file]
|
122
|
+
begin
|
123
|
+
lines = File.readlines(file)
|
124
|
+
rescue SystemCallError
|
125
|
+
return
|
126
|
+
end
|
127
|
+
end
|
128
|
+
pos -= 1
|
129
|
+
|
130
|
+
start_pos = [pos - 5, 0].max
|
131
|
+
end_pos = [pos + 5, lines.size - 1].min
|
132
|
+
|
133
|
+
fmt = " %2s %#{end_pos.to_s.length}d: %s"
|
134
|
+
body = (start_pos..end_pos).map do |current_pos|
|
135
|
+
sprintf(fmt, pos == current_pos ? '=>' : '', current_pos + 1, lines[current_pos])
|
136
|
+
end.join("")
|
137
|
+
"\nFrom: #{file} @ line #{pos + 1} :\n\n#{body}\n"
|
138
|
+
end
|
139
|
+
|
140
|
+
def IRB.delete_caller
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
data/lib/irb/xmp.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
#
|
3
|
+
# xmp.rb - irb version of gotoken xmp
|
4
|
+
# $Release Version: 0.9$
|
5
|
+
# $Revision$
|
6
|
+
# by Keiju ISHITSUKA(Nippon Rational Inc.)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
require_relative "frame"
|
15
|
+
|
16
|
+
# An example printer for irb.
|
17
|
+
#
|
18
|
+
# It's much like the standard library PrettyPrint, that shows the value of each
|
19
|
+
# expression as it runs.
|
20
|
+
#
|
21
|
+
# In order to use this library, you must first require it:
|
22
|
+
#
|
23
|
+
# require 'irb/xmp'
|
24
|
+
#
|
25
|
+
# Now, you can take advantage of the Object#xmp convenience method.
|
26
|
+
#
|
27
|
+
# xmp <<END
|
28
|
+
# foo = "bar"
|
29
|
+
# baz = 42
|
30
|
+
# END
|
31
|
+
# #=> foo = "bar"
|
32
|
+
# #==>"bar"
|
33
|
+
# #=> baz = 42
|
34
|
+
# #==>42
|
35
|
+
#
|
36
|
+
# You can also create an XMP object, with an optional binding to print
|
37
|
+
# expressions in the given binding:
|
38
|
+
#
|
39
|
+
# ctx = binding
|
40
|
+
# x = XMP.new ctx
|
41
|
+
# x.puts
|
42
|
+
# #=> today = "a good day"
|
43
|
+
# #==>"a good day"
|
44
|
+
# ctx.eval 'today # is what?'
|
45
|
+
# #=> "a good day"
|
46
|
+
class XMP
|
47
|
+
|
48
|
+
# Creates a new XMP object.
|
49
|
+
#
|
50
|
+
# The top-level binding or, optional +bind+ parameter will be used when
|
51
|
+
# creating the workspace. See WorkSpace.new for more information.
|
52
|
+
#
|
53
|
+
# This uses the +:XMP+ prompt mode, see IRB@Customizing+the+IRB+Prompt for
|
54
|
+
# full detail.
|
55
|
+
def initialize(bind = nil)
|
56
|
+
IRB.init_config(nil)
|
57
|
+
|
58
|
+
IRB.conf[:PROMPT_MODE] = :XMP
|
59
|
+
|
60
|
+
bind = IRB::Frame.top(1) unless bind
|
61
|
+
ws = IRB::WorkSpace.new(bind)
|
62
|
+
@io = StringInputMethod.new
|
63
|
+
@irb = IRB::Irb.new(ws, @io)
|
64
|
+
@irb.context.ignore_sigint = false
|
65
|
+
|
66
|
+
IRB.conf[:MAIN_CONTEXT] = @irb.context
|
67
|
+
end
|
68
|
+
|
69
|
+
# Evaluates the given +exps+, for example:
|
70
|
+
#
|
71
|
+
# require 'irb/xmp'
|
72
|
+
# x = XMP.new
|
73
|
+
#
|
74
|
+
# x.puts '{:a => 1, :b => 2, :c => 3}'
|
75
|
+
# #=> {:a => 1, :b => 2, :c => 3}
|
76
|
+
# # ==>{:a=>1, :b=>2, :c=>3}
|
77
|
+
# x.puts 'foo = "bar"'
|
78
|
+
# # => foo = "bar"
|
79
|
+
# # ==>"bar"
|
80
|
+
def puts(exps)
|
81
|
+
@io.puts exps
|
82
|
+
|
83
|
+
if @irb.context.ignore_sigint
|
84
|
+
begin
|
85
|
+
trap_proc_b = trap("SIGINT"){@irb.signal_handle}
|
86
|
+
catch(:IRB_EXIT) do
|
87
|
+
@irb.eval_input
|
88
|
+
end
|
89
|
+
ensure
|
90
|
+
trap("SIGINT", trap_proc_b)
|
91
|
+
end
|
92
|
+
else
|
93
|
+
catch(:IRB_EXIT) do
|
94
|
+
@irb.eval_input
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# A custom InputMethod class used by XMP for evaluating string io.
|
100
|
+
class StringInputMethod < IRB::InputMethod
|
101
|
+
# Creates a new StringInputMethod object
|
102
|
+
def initialize
|
103
|
+
super
|
104
|
+
@exps = []
|
105
|
+
end
|
106
|
+
|
107
|
+
# Whether there are any expressions left in this printer.
|
108
|
+
def eof?
|
109
|
+
@exps.empty?
|
110
|
+
end
|
111
|
+
|
112
|
+
# Reads the next expression from this printer.
|
113
|
+
#
|
114
|
+
# See IO#gets for more information.
|
115
|
+
def gets
|
116
|
+
while l = @exps.shift
|
117
|
+
next if /^\s+$/ =~ l
|
118
|
+
l.concat "\n"
|
119
|
+
print @prompt, l
|
120
|
+
break
|
121
|
+
end
|
122
|
+
l
|
123
|
+
end
|
124
|
+
|
125
|
+
# Concatenates all expressions in this printer, separated by newlines.
|
126
|
+
#
|
127
|
+
# An Encoding::CompatibilityError is raised of the given +exps+'s encoding
|
128
|
+
# doesn't match the previous expression evaluated.
|
129
|
+
def puts(exps)
|
130
|
+
if @encoding and exps.encoding != @encoding
|
131
|
+
enc = Encoding.compatible?(@exps.join("\n"), exps)
|
132
|
+
if enc.nil?
|
133
|
+
raise Encoding::CompatibilityError, "Encoding in which the passed expression is encoded is not compatible to the preceding's one"
|
134
|
+
else
|
135
|
+
@encoding = enc
|
136
|
+
end
|
137
|
+
else
|
138
|
+
@encoding = exps.encoding
|
139
|
+
end
|
140
|
+
@exps.concat exps.split(/\n/)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Returns the encoding of last expression printed by #puts.
|
144
|
+
attr_reader :encoding
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# A convenience method that's only available when the you require the IRB::XMP standard library.
|
149
|
+
#
|
150
|
+
# Creates a new XMP object, using the given expressions as the +exps+
|
151
|
+
# parameter, and optional binding as +bind+ or uses the top-level binding. Then
|
152
|
+
# evaluates the given expressions using the +:XMP+ prompt mode.
|
153
|
+
#
|
154
|
+
# For example:
|
155
|
+
#
|
156
|
+
# require 'irb/xmp'
|
157
|
+
# ctx = binding
|
158
|
+
# xmp 'foo = "bar"', ctx
|
159
|
+
# #=> foo = "bar"
|
160
|
+
# #==>"bar"
|
161
|
+
# ctx.eval 'foo'
|
162
|
+
# #=> "bar"
|
163
|
+
#
|
164
|
+
# See XMP.new for more information.
|
165
|
+
def xmp(exps, bind = nil)
|
166
|
+
bind = IRB::Frame.top(1) unless bind
|
167
|
+
xmp = XMP.new(bind)
|
168
|
+
xmp.puts exps
|
169
|
+
xmp
|
170
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: irb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Keiju ISHITSUKA
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-12-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Interactive Ruby command-line tool for REPL (Read Eval Print Loop).
|
42
|
+
email:
|
43
|
+
- keiju@ruby-lang.org
|
44
|
+
executables:
|
45
|
+
- irb
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- ".gitignore"
|
50
|
+
- ".travis.yml"
|
51
|
+
- Gemfile
|
52
|
+
- LICENSE.txt
|
53
|
+
- README.md
|
54
|
+
- Rakefile
|
55
|
+
- bin/console
|
56
|
+
- bin/setup
|
57
|
+
- exe/irb
|
58
|
+
- irb.gemspec
|
59
|
+
- lib/irb.rb
|
60
|
+
- lib/irb/cmd/chws.rb
|
61
|
+
- lib/irb/cmd/fork.rb
|
62
|
+
- lib/irb/cmd/help.rb
|
63
|
+
- lib/irb/cmd/load.rb
|
64
|
+
- lib/irb/cmd/nop.rb
|
65
|
+
- lib/irb/cmd/pushws.rb
|
66
|
+
- lib/irb/cmd/subirb.rb
|
67
|
+
- lib/irb/completion.rb
|
68
|
+
- lib/irb/context.rb
|
69
|
+
- lib/irb/ext/change-ws.rb
|
70
|
+
- lib/irb/ext/history.rb
|
71
|
+
- lib/irb/ext/loader.rb
|
72
|
+
- lib/irb/ext/multi-irb.rb
|
73
|
+
- lib/irb/ext/save-history.rb
|
74
|
+
- lib/irb/ext/tracer.rb
|
75
|
+
- lib/irb/ext/use-loader.rb
|
76
|
+
- lib/irb/ext/workspaces.rb
|
77
|
+
- lib/irb/extend-command.rb
|
78
|
+
- lib/irb/frame.rb
|
79
|
+
- lib/irb/help.rb
|
80
|
+
- lib/irb/init.rb
|
81
|
+
- lib/irb/input-method.rb
|
82
|
+
- lib/irb/inspector.rb
|
83
|
+
- lib/irb/lc/.document
|
84
|
+
- lib/irb/lc/error.rb
|
85
|
+
- lib/irb/lc/help-message
|
86
|
+
- lib/irb/lc/ja/encoding_aliases.rb
|
87
|
+
- lib/irb/lc/ja/error.rb
|
88
|
+
- lib/irb/lc/ja/help-message
|
89
|
+
- lib/irb/locale.rb
|
90
|
+
- lib/irb/magic-file.rb
|
91
|
+
- lib/irb/notifier.rb
|
92
|
+
- lib/irb/output-method.rb
|
93
|
+
- lib/irb/ruby-lex.rb
|
94
|
+
- lib/irb/ruby-token.rb
|
95
|
+
- lib/irb/slex.rb
|
96
|
+
- lib/irb/src_encoding.rb
|
97
|
+
- lib/irb/version.rb
|
98
|
+
- lib/irb/workspace.rb
|
99
|
+
- lib/irb/ws-for-case-2.rb
|
100
|
+
- lib/irb/xmp.rb
|
101
|
+
homepage: https://github.com/ruby/irb
|
102
|
+
licenses:
|
103
|
+
- BSD-2-Clause
|
104
|
+
metadata: {}
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
requirements: []
|
120
|
+
rubyforge_project:
|
121
|
+
rubygems_version: 2.7.6
|
122
|
+
signing_key:
|
123
|
+
specification_version: 4
|
124
|
+
summary: Interactive Ruby command-line tool for REPL (Read Eval Print Loop).
|
125
|
+
test_files: []
|