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.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +6 -0
  4. data/Gemfile +5 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +55 -0
  7. data/Rakefile +10 -0
  8. data/bin/console +6 -0
  9. data/bin/setup +6 -0
  10. data/exe/irb +11 -0
  11. data/irb.gemspec +26 -0
  12. data/lib/irb.rb +798 -0
  13. data/lib/irb/cmd/chws.rb +34 -0
  14. data/lib/irb/cmd/fork.rb +39 -0
  15. data/lib/irb/cmd/help.rb +42 -0
  16. data/lib/irb/cmd/load.rb +67 -0
  17. data/lib/irb/cmd/nop.rb +39 -0
  18. data/lib/irb/cmd/pushws.rb +41 -0
  19. data/lib/irb/cmd/subirb.rb +43 -0
  20. data/lib/irb/completion.rb +244 -0
  21. data/lib/irb/context.rb +425 -0
  22. data/lib/irb/ext/change-ws.rb +46 -0
  23. data/lib/irb/ext/history.rb +119 -0
  24. data/lib/irb/ext/loader.rb +129 -0
  25. data/lib/irb/ext/multi-irb.rb +265 -0
  26. data/lib/irb/ext/save-history.rb +105 -0
  27. data/lib/irb/ext/tracer.rb +72 -0
  28. data/lib/irb/ext/use-loader.rb +74 -0
  29. data/lib/irb/ext/workspaces.rb +67 -0
  30. data/lib/irb/extend-command.rb +306 -0
  31. data/lib/irb/frame.rb +81 -0
  32. data/lib/irb/help.rb +37 -0
  33. data/lib/irb/init.rb +302 -0
  34. data/lib/irb/input-method.rb +192 -0
  35. data/lib/irb/inspector.rb +132 -0
  36. data/lib/irb/lc/.document +4 -0
  37. data/lib/irb/lc/error.rb +32 -0
  38. data/lib/irb/lc/help-message +49 -0
  39. data/lib/irb/lc/ja/encoding_aliases.rb +11 -0
  40. data/lib/irb/lc/ja/error.rb +31 -0
  41. data/lib/irb/lc/ja/help-message +52 -0
  42. data/lib/irb/locale.rb +182 -0
  43. data/lib/irb/magic-file.rb +38 -0
  44. data/lib/irb/notifier.rb +232 -0
  45. data/lib/irb/output-method.rb +92 -0
  46. data/lib/irb/ruby-lex.rb +1180 -0
  47. data/lib/irb/ruby-token.rb +267 -0
  48. data/lib/irb/slex.rb +282 -0
  49. data/lib/irb/src_encoding.rb +7 -0
  50. data/lib/irb/version.rb +17 -0
  51. data/lib/irb/workspace.rb +143 -0
  52. data/lib/irb/ws-for-case-2.rb +15 -0
  53. data/lib/irb/xmp.rb +170 -0
  54. metadata +125 -0
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: false
2
+ # DO NOT WRITE ANY MAGIC COMMENT HERE.
3
+ module IRB
4
+ def self.default_src_encoding
5
+ return __ENCODING__
6
+ end
7
+ end
@@ -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
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: false
2
+ #
3
+ # irb/ws-for-case-2.rb -
4
+ # $Release Version: 0.9.6$
5
+ # $Revision$
6
+ # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+
13
+ while true
14
+ IRB::BINDING_QUEUE.push _ = binding
15
+ end
@@ -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: []