mini_readline 0.9.0 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.reek.yml +17 -0
- data/README.md +127 -47
- data/bin/sire +218 -0
- data/lib/mini_readline.rb +0 -6
- data/lib/mini_readline/options.rb +22 -17
- data/lib/mini_readline/read_line.rb +4 -3
- data/lib/mini_readline/read_line/edit.rb +2 -1
- data/lib/mini_readline/read_line/edit/edit_window.rb +1 -0
- data/lib/mini_readline/read_line/edit/unmapped.rb +1 -0
- data/lib/mini_readline/read_line/history.rb +9 -2
- data/lib/mini_readline/version.rb +2 -2
- data/mini_readline.gemspec +9 -9
- data/tests/history_tests.rb +35 -0
- data/tests/mini_readline_tests.rb +4 -8
- metadata +20 -33
- data/mini_readline.reek +0 -115
- data/sire.rb +0 -145
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 33cf8359aa2da932030ed129ee92904857f87e85fb7e5b12d819b1a5029cbff6
|
4
|
+
data.tar.gz: 165b10fc4c40b9a22b213530d065300d3f5404b8f6cf7cd738546db27bd149d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbf6fe9f4bc027f2a8d45ed09837c61f01a247a25e446e4eb04ed81865460f726c6ada4bee7c0c5abad9fea20baddf7a510f5170ba62c02163095df7232f33ff
|
7
|
+
data.tar.gz: 5b4efbf6bb03be62b5ffa9214c41ec4f0db467dafcf1b7db7fa5a120454f495c6997777536c22ee9ac8ab2fb07c840f8a4c206a85e59b20181f7eb8657b6000f
|
data/.reek.yml
ADDED
data/README.md
CHANGED
@@ -6,11 +6,24 @@ inline editing, command history, and stock or customizable auto-complete.
|
|
6
6
|
The mini readline gem is an experiment in replacing the standard readline gem
|
7
7
|
that is part of Ruby. The mini readline project will try to focus on the needs
|
8
8
|
of Ruby programs. It will also try to correct a number of irritating issues
|
9
|
-
encountered when running cross platform environments.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
encountered when running cross platform environments. This is achieved through
|
10
|
+
the use of the mini_term gem that deals with the mess of getting proper access
|
11
|
+
to the low-level "terminal".
|
12
|
+
|
13
|
+
While the standard readline gem tries its best to be compatible with the GNU
|
14
|
+
Readline library written in "C", mini_readline does not. Instead it takes on
|
15
|
+
the goal of being best suited to the needs of Ruby programmers. While this
|
16
|
+
makes it much less useful to those porting over Unix/Linux utilities, it makes
|
17
|
+
it more useful to Ruby programmers creating CLI utilities in that language.
|
18
|
+
|
19
|
+
Further, while spread out over a much larger number of smaller, manageable
|
20
|
+
files, mini readline has only 1238 lines of code. In fact, only two files have
|
21
|
+
more than 100 lines in total. The rb-readline gem has a much larger 9480 lines
|
22
|
+
of code with 8920 of them in a single, monster file. While the smaller files do
|
23
|
+
have some downsides, bloated files are, in my opinion, worse.
|
24
|
+
|
25
|
+
Finally, I know this whole effort must seem to give off a sort of angry birds
|
26
|
+
vibe against the original rb-readline gem. That is not my intent at all. I owe
|
14
27
|
a great debt of gratitude to the authors and maintainers of that vital code.
|
15
28
|
Their getting around the whole Win32API, dl obsolescence debacle saved me so
|
16
29
|
much time and frustration that words do not suffice. Thanks!
|
@@ -64,6 +77,8 @@ replaced by Escape followed by the appropriate letter.
|
|
64
77
|
* References to Pad keys under Windows assume that Num Lock is not engaged.
|
65
78
|
* Support for End of Input is controlled by the eoi_detect option. See options
|
66
79
|
below.
|
80
|
+
* These keyboard mappings are the standard ones included with mini_readline.
|
81
|
+
See the section Adding Custom Key Maps below for more info.
|
67
82
|
|
68
83
|
## Usage
|
69
84
|
|
@@ -203,30 +218,35 @@ entries.
|
|
203
218
|
|
204
219
|
<br>The available options are described below:
|
205
220
|
```ruby
|
221
|
+
# The base options shared by all instances.
|
206
222
|
BASE_OPTIONS = {
|
207
|
-
:scroll_step => 12, #The amount
|
223
|
+
:scroll_step => 12, # The amount scrolled.
|
224
|
+
|
225
|
+
:prompt => ">", # The default prompt.
|
226
|
+
:alt_prompt => "<< ", # The prompt when scrolled.
|
227
|
+
# Set to nil to use main prompt.
|
208
228
|
|
209
|
-
:
|
210
|
-
:
|
211
|
-
#
|
229
|
+
:auto_complete => false, # Is auto complete enabled?
|
230
|
+
:auto_source => nil, # Filled in by auto_complete.rb
|
231
|
+
# MiniReadline::QuotedFileFolderSource
|
212
232
|
|
213
|
-
:
|
214
|
-
:auto_source => nil, #Filled in by auto_complete.rb
|
215
|
-
#MiniReadline::QuotedFileFolderSource
|
233
|
+
:chomp => false, # Remove the trailing new-line?
|
216
234
|
|
217
|
-
:eoi_detect => false, #Is end of input detection enabled?
|
235
|
+
:eoi_detect => false, # Is end of input detection enabled?
|
218
236
|
|
219
|
-
:history => false, #Is the history buffer enabled?
|
220
|
-
:log => [], #Default is no previous history
|
221
|
-
:no_blanks => true, #No empty lines in history.
|
222
|
-
:no_dups => true, #No duplicate lines in history.
|
237
|
+
:history => false, # Is the history buffer enabled?
|
238
|
+
:log => [], # Default is no previous history
|
239
|
+
:no_blanks => true, # No empty lines in history.
|
240
|
+
:no_dups => true, # No duplicate lines in history.
|
241
|
+
:no_move => false, # Don't move history entries.
|
223
242
|
|
224
|
-
:secret_mask => nil, #No secret password mask. Use the
|
225
|
-
#string "*" to use stars or " "
|
226
|
-
#for invisible secrets.
|
243
|
+
:secret_mask => nil, # No secret password mask. Use the
|
244
|
+
# string "*" to use stars or " "
|
245
|
+
# for invisible secrets.
|
227
246
|
|
228
|
-
:initial => ""
|
229
|
-
#An empty string for none.
|
247
|
+
:initial => "" # The initial text for the entry.
|
248
|
+
# An empty string for none.
|
249
|
+
}
|
230
250
|
```
|
231
251
|
|
232
252
|
<br>While most of these options are self explanatory, a few could stand some
|
@@ -247,9 +267,17 @@ MiniReadline::BASE_OPTION[:auto_complete] = true
|
|
247
267
|
this is MiniReadline::QuotedFileFolderSource. This option can be changed up to
|
248
268
|
get auto-complete data other than files and folders. See Auto-Compete below for
|
249
269
|
more details.
|
270
|
+
* :chomp is used to remove the trailing new-line character that garnishes the
|
271
|
+
text from the user. Set to true for clean text, and to false for parsley to
|
272
|
+
throw out.
|
250
273
|
* :eoi_detect is used to control the end of input detection logic. If disabled,
|
251
274
|
eoi inputs are treated as unmapped. If enabled, they raise a MiniReadlineEOI
|
252
275
|
exception.
|
276
|
+
* A few options control the history buffer. With the history option on, lines
|
277
|
+
entered are retained in a buffer. Otherwise, no record is kept of entered text.
|
278
|
+
When no_blanks is set, blank lines are not saved. When no_dups is set,
|
279
|
+
duplicate lines are not saved. If so, when duplicates do occur, the no_move
|
280
|
+
option keeps the older copy. Otherwise the newer copy is retained.
|
253
281
|
* :secret_mask is a masking character to be used for sensitive input like a
|
254
282
|
password or missile launch code. This should be exactly one character long.
|
255
283
|
Typical values are "\*" or " ". Also, any secret entries should be done with
|
@@ -261,11 +289,6 @@ specified text. Leave as an empty string to default to the empty edit area.
|
|
261
289
|
Finally the :window_width option is now ignored. Screen width now automatically
|
262
290
|
determined.
|
263
291
|
|
264
|
-
|
265
|
-
#### Notes
|
266
|
-
* Since the compatibility mode does not accept an options hash, the only way to
|
267
|
-
affect options in this case is to modify the MiniReadline::BASE_OPTIONS hash.
|
268
|
-
|
269
292
|
### Auto-Complete
|
270
293
|
The mini readline gem comes with four auto-complete engines. These are:
|
271
294
|
|
@@ -346,7 +369,55 @@ statement to permit the use of clearer, easier to read access to regular
|
|
346
369
|
expression results.
|
347
370
|
|
348
371
|
<br> An example of a custom auto-complete facility may be found in the mysh
|
349
|
-
gem located at: https://github.com/PeterCamilleri/mysh/blob/master/lib/mysh/
|
372
|
+
gem located at: https://github.com/PeterCamilleri/mysh/blob/master/lib/mysh/sources/smart_auto_complete.rb
|
373
|
+
|
374
|
+
### Adding Custom Key Maps
|
375
|
+
It is possible to override the default keyboard maps used by the mini_readline
|
376
|
+
gem. The following shows the installation of a retro, WordStar™ inspired
|
377
|
+
keyboard mapping for a Windows system:
|
378
|
+
|
379
|
+
```ruby
|
380
|
+
MiniTerm.add_map(:windows) do |map|
|
381
|
+
map[" ".."~"] = :insert_text
|
382
|
+
|
383
|
+
#Left Arrows
|
384
|
+
map["\x13"] = :go_left
|
385
|
+
map["\x01"] = :word_left
|
386
|
+
|
387
|
+
#Right Arrows
|
388
|
+
map["\x04"] = :go_right
|
389
|
+
map["\x06"] = :word_right
|
390
|
+
|
391
|
+
#Up Arrows
|
392
|
+
map["\x05"] = :previous_history
|
393
|
+
|
394
|
+
#Down Arrows
|
395
|
+
map["\x18"] = :next_history
|
396
|
+
|
397
|
+
#The Home and End keys
|
398
|
+
map["\x17"] = :go_home
|
399
|
+
map["\x12"] = :go_end
|
400
|
+
|
401
|
+
#The Backspace and Delete keys
|
402
|
+
map["\x08"] = :delete_left
|
403
|
+
map["\x7F"] = :delete_right
|
404
|
+
map["\x11\x13"] = :delete_all_left
|
405
|
+
map["\x11\x04"] = :delete_all_right
|
406
|
+
|
407
|
+
#Auto-completion.
|
408
|
+
map["\t"] = :auto_complete
|
409
|
+
|
410
|
+
#The Enter key
|
411
|
+
map["\x0D"] = :enter
|
412
|
+
|
413
|
+
#The Escape key
|
414
|
+
map["\e"] = :cancel
|
415
|
+
|
416
|
+
#End of Input
|
417
|
+
map["\x1A"] = :end_of_input
|
418
|
+
end
|
419
|
+
```
|
420
|
+
|
350
421
|
|
351
422
|
### Important Security Note
|
352
423
|
|
@@ -357,24 +428,25 @@ command line itself. Untrusted users should **never** be given such access!
|
|
357
428
|
|
358
429
|
## Demo
|
359
430
|
A simple demo of mini_readline in action is available. To access this demo use
|
360
|
-
the following
|
431
|
+
the following:
|
361
432
|
|
362
|
-
$
|
433
|
+
$ sire
|
363
434
|
|
364
435
|
This will launch SIRE, a Simple Interactive Ruby Environment, a sort of
|
365
|
-
simple minded irb knock-off.
|
366
|
-
|
367
|
-
if all fails, it will load the "classic" Readline gem. Here is a typical run:
|
436
|
+
simple minded irb knock-off. The utility supports a number of options that
|
437
|
+
allow the behaviour of the gem to be explored. These are:
|
368
438
|
|
369
|
-
|
439
|
+
Option | Effect
|
440
|
+
-------|-------
|
441
|
+
local | Use the mini_readline in the lib folder. For testing.
|
442
|
+
gem | Use the mini_readline installed as a gem. The default.
|
443
|
+
old | Use the old readline facility.
|
444
|
+
map1 | Install a Wordstar keyboard map.
|
445
|
+
help | Display usage info and exit.
|
446
|
+
-? | Same thing.
|
370
447
|
|
448
|
+
#### Testing Shell Out Bugs
|
371
449
|
|
372
|
-
Loaded mini_readline from the local code folder.
|
373
|
-
|
374
|
-
Welcome to a Simple Interactive Ruby Environment
|
375
|
-
Use the command 'quit' to exit.
|
376
|
-
|
377
|
-
SIRE>
|
378
450
|
Of note, the run method can be used to test for the shell process bug. For
|
379
451
|
example:
|
380
452
|
|
@@ -391,15 +463,12 @@ example:
|
|
391
463
|
"sire.rb",
|
392
464
|
"tests"]
|
393
465
|
SIRE>
|
394
|
-
After this command is run, the program should continue to operate correctly
|
395
|
-
and not go bannanas. To test the behavior of the standard readline library, use:
|
396
|
-
|
397
|
-
$ ruby sire.rb old
|
398
466
|
|
399
|
-
|
400
|
-
|
467
|
+
After this command is run, the program should continue to operate correctly
|
468
|
+
and not go bannanas. To test the behavior of the (currently broken) standard
|
469
|
+
readline library, use:
|
401
470
|
|
402
|
-
$
|
471
|
+
$ sire.rb old
|
403
472
|
|
404
473
|
## Cross Platform Portability Progress
|
405
474
|
|
@@ -433,3 +502,14 @@ aspect that could use some TLC or a suggestion or an idea. Please see
|
|
433
502
|
( https://github.com/PeterCamilleri/mini_readline/issues )
|
434
503
|
|
435
504
|
This is a low pressure environment. All are welcome!
|
505
|
+
|
506
|
+
## License
|
507
|
+
|
508
|
+
The gem is available as open source under the terms of the
|
509
|
+
[MIT License](./LICENSE.txt).
|
510
|
+
|
511
|
+
## Code of Conduct
|
512
|
+
|
513
|
+
Everyone interacting in the fully_freeze project’s codebases, issue trackers,
|
514
|
+
chat rooms and mailing lists is expected to follow the
|
515
|
+
[code of conduct](./CODE_OF_CONDUCT.md).
|
data/bin/sire
ADDED
@@ -0,0 +1,218 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# A Simple Interactive Ruby Environment
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'pp'
|
7
|
+
|
8
|
+
# Capture a binding for code evaluation.
|
9
|
+
sire_binding = binding
|
10
|
+
|
11
|
+
# Process command line arguments.
|
12
|
+
valid_options = {'local' => :reader,
|
13
|
+
'gem' => :reader,
|
14
|
+
'old' => :reader,
|
15
|
+
'map1' => :map,
|
16
|
+
'help' => :help,
|
17
|
+
'?' => :help}
|
18
|
+
|
19
|
+
options = {reader: 'gem'}
|
20
|
+
|
21
|
+
# Display help for SIRE and exit.
|
22
|
+
def display_help(error=nil)
|
23
|
+
puts "SIRE: a Simple Interactive Ruby Environment\n"
|
24
|
+
|
25
|
+
puts "Invalid option: #{error}" if error
|
26
|
+
|
27
|
+
puts "", "Usage: sire <options>",
|
28
|
+
" local Use the local mini_readline code.",
|
29
|
+
" gem Use the mini_readline installed gem.",
|
30
|
+
" old Use the standard readline gem.",
|
31
|
+
" map1 Use the alternate key mapping in Windows.",
|
32
|
+
" help -? Display this help and exit."
|
33
|
+
|
34
|
+
exit
|
35
|
+
end
|
36
|
+
|
37
|
+
ARGV.each do |arg|
|
38
|
+
key = valid_options[arg]
|
39
|
+
display_help(arg) unless key
|
40
|
+
options[key] = arg
|
41
|
+
end
|
42
|
+
|
43
|
+
display_help if options[:help]
|
44
|
+
|
45
|
+
case options[:reader]
|
46
|
+
when 'local'
|
47
|
+
require_relative '../lib/mini_readline'
|
48
|
+
puts "", "Option(local). Loaded mini_readline from the local code folder. Version #{MiniReadline::VERSION}"
|
49
|
+
when 'gem'
|
50
|
+
require 'mini_readline'
|
51
|
+
puts "", "Loaded mini_readline from the system gem. Version #{MiniReadline::VERSION}"
|
52
|
+
when 'old'
|
53
|
+
require 'readline'
|
54
|
+
class MiniReadlineEOI < StandardError; end #Compatibility stub.
|
55
|
+
puts "", "Loaded the standard readline gem. Version #{Readline::VERSION}"
|
56
|
+
end
|
57
|
+
|
58
|
+
MiniReadline = Readline unless defined?(MiniReadline)
|
59
|
+
|
60
|
+
class Object
|
61
|
+
# Generate the class lineage of the object.
|
62
|
+
def classes
|
63
|
+
begin
|
64
|
+
result = ""
|
65
|
+
klass = self.instance_of?(Class) ? self : self.class
|
66
|
+
|
67
|
+
begin
|
68
|
+
result << klass.to_s
|
69
|
+
klass = klass.superclass
|
70
|
+
result << " < " if klass
|
71
|
+
end while klass
|
72
|
+
|
73
|
+
result
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
# Quit the interactive session.
|
80
|
+
def quit
|
81
|
+
puts "Quit command.", ""
|
82
|
+
exit
|
83
|
+
end
|
84
|
+
|
85
|
+
# Get a mapped keystroke.
|
86
|
+
def get_mapped
|
87
|
+
if old?
|
88
|
+
puts 'The get_mapped method is not supported by old readline.'
|
89
|
+
else
|
90
|
+
print 'Press a key: '
|
91
|
+
MiniTerm.get_mapped_char
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Test spawning a process. This breaks the regular readline gem.
|
96
|
+
def run(command)
|
97
|
+
IO.popen(command, "r+") do |io|
|
98
|
+
io.close_write
|
99
|
+
return io.read
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def old?
|
104
|
+
defined?(Readline)
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
if options[:map] == 'map1'
|
110
|
+
if old?
|
111
|
+
puts 'Remapping is not supported by old readline.'
|
112
|
+
exit
|
113
|
+
end
|
114
|
+
|
115
|
+
puts "Remapping keyboard to WordStar(TM)."
|
116
|
+
|
117
|
+
[:windows, :ansi].each do |target|
|
118
|
+
MiniTerm.add_map(target) do |map|
|
119
|
+
map[" ".."~"] = :insert_text
|
120
|
+
|
121
|
+
#Left Arrows
|
122
|
+
map["\x13"] = :go_left
|
123
|
+
map["\x01"] = :word_left
|
124
|
+
|
125
|
+
#Right Arrows
|
126
|
+
map["\x04"] = :go_right
|
127
|
+
map["\x06"] = :word_right
|
128
|
+
|
129
|
+
#Up Arrows
|
130
|
+
map["\x05"] = :previous_history
|
131
|
+
|
132
|
+
#Down Arrows
|
133
|
+
map["\x18"] = :next_history
|
134
|
+
|
135
|
+
#The Home and End keys
|
136
|
+
map["\x17"] = :go_home
|
137
|
+
map["\x12"] = :go_end
|
138
|
+
|
139
|
+
#The Backspace and Delete keys
|
140
|
+
map["\x08"] = :delete_left
|
141
|
+
map["\x7F"] = :delete_right
|
142
|
+
map["\x11\x13"] = :delete_all_left
|
143
|
+
map["\x11\x04"] = :delete_all_right
|
144
|
+
|
145
|
+
#Auto-completion.
|
146
|
+
map["\t"] = :auto_complete
|
147
|
+
|
148
|
+
#The Enter key
|
149
|
+
map["\x0D"] = :enter
|
150
|
+
|
151
|
+
#The Escape key
|
152
|
+
map["\e"] = :cancel
|
153
|
+
|
154
|
+
#End of Input
|
155
|
+
map["\x1A"] = :end_of_input
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
#The SIRE module contains a simplistic R.E.P.L. to test out mini_readline.
|
161
|
+
module SIRE
|
162
|
+
|
163
|
+
# Run the interactive session.
|
164
|
+
def self.run_sire(evaluator)
|
165
|
+
@evaluator = evaluator
|
166
|
+
|
167
|
+
unless old?
|
168
|
+
MiniReadline::BASE_OPTIONS[:auto_complete] = true
|
169
|
+
MiniReadline::BASE_OPTIONS[:eoi_detect] = true
|
170
|
+
end
|
171
|
+
|
172
|
+
puts
|
173
|
+
puts "Welcome to a Simple Interactive Ruby Environment\n"
|
174
|
+
puts "Use the command 'quit' to exit.\n\n"
|
175
|
+
|
176
|
+
loop do
|
177
|
+
exec_line(get_line)
|
178
|
+
end
|
179
|
+
|
180
|
+
puts "\n\n"
|
181
|
+
|
182
|
+
rescue MiniReadlineEOI, Interrupt => e
|
183
|
+
puts "\n"
|
184
|
+
end
|
185
|
+
|
186
|
+
private
|
187
|
+
|
188
|
+
# Get a line of input from the user.
|
189
|
+
def self.get_line
|
190
|
+
initial_input = MiniReadline.readline("SIRE>", true)
|
191
|
+
get_extra_input(initial_input)
|
192
|
+
end
|
193
|
+
|
194
|
+
# Get any continuations of the inputs
|
195
|
+
def self.get_extra_input(str)
|
196
|
+
if /\\\s*$/ =~ str
|
197
|
+
get_extra_input($PREMATCH + "\n" + MiniReadline.readline("SIRE\\", true))
|
198
|
+
else
|
199
|
+
str
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
# Execute a single line.
|
204
|
+
def self.exec_line(line)
|
205
|
+
result = @evaluator.eval(line)
|
206
|
+
pp result unless line.length == 0
|
207
|
+
|
208
|
+
rescue Interrupt => e
|
209
|
+
puts "", "Execution Interrupted!",
|
210
|
+
"", "#{e.class} detected: #{e}", ""
|
211
|
+
|
212
|
+
rescue StandardError, ScriptError => e
|
213
|
+
puts "", "#{e.class} detected: #{e}", ""
|
214
|
+
end
|
215
|
+
|
216
|
+
end
|
217
|
+
|
218
|
+
SIRE.run_sire(sire_binding)
|
data/lib/mini_readline.rb
CHANGED
@@ -14,12 +14,6 @@ require_relative "mini_readline/read_line"
|
|
14
14
|
# The MiniReadline main module.
|
15
15
|
module MiniReadline
|
16
16
|
|
17
|
-
private_constant :Prompt
|
18
|
-
private_constant :Edit
|
19
|
-
private_constant :EditWindow
|
20
|
-
private_constant :History
|
21
|
-
private_constant :NoHistory
|
22
|
-
|
23
17
|
# The (limited) compatibility module function.
|
24
18
|
def self.readline(prompt = "", history = nil, options = {})
|
25
19
|
get_reader.readline(options.merge({prompt: prompt, history: history}))
|
@@ -4,27 +4,32 @@
|
|
4
4
|
module MiniReadline
|
5
5
|
|
6
6
|
# The base options shared by all instances.
|
7
|
-
BASE_OPTIONS = {
|
7
|
+
BASE_OPTIONS = {
|
8
|
+
:scroll_step => 12, # The amount scrolled.
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
:prompt => ">", # The default prompt.
|
11
|
+
:alt_prompt => "<< ", # The prompt when scrolled.
|
12
|
+
# Set to nil to use main prompt.
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
:auto_complete => false, # Is auto complete enabled?
|
15
|
+
:auto_source => nil, # Filled in by auto_complete.rb
|
16
|
+
# MiniReadline::QuotedFileFolderSource
|
16
17
|
|
17
|
-
|
18
|
+
:chomp => false, # Remove the trailing new-line?
|
18
19
|
|
19
|
-
|
20
|
-
:log => [], #Default is no previous history
|
21
|
-
:no_blanks => true, #No empty lines in history.
|
22
|
-
:no_dups => true, #No duplicate lines in history.
|
20
|
+
:eoi_detect => false, # Is end of input detection enabled?
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
:history => false, # Is the history buffer enabled?
|
23
|
+
:log => [], # Default is no previous history
|
24
|
+
:no_blanks => true, # No empty lines in history.
|
25
|
+
:no_dups => true, # No duplicate lines in history.
|
26
|
+
:no_move => false, # Don't move history entries.
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
:secret_mask => nil, # No secret password mask. Use the
|
29
|
+
# string "*" to use stars or " "
|
30
|
+
# for invisible secrets.
|
31
|
+
|
32
|
+
:initial => "" # The initial text for the entry.
|
33
|
+
# An empty string for none.
|
34
|
+
}
|
30
35
|
end
|
@@ -8,9 +8,10 @@ require_relative 'read_line/no_history'
|
|
8
8
|
# The ReadLine class that does the actual work.
|
9
9
|
module MiniReadline
|
10
10
|
|
11
|
-
#The Readline class that does the actual work of getting lines from the
|
12
|
-
#user. Note that each instance of this class maintains its own copy of
|
13
|
-
#the optional command history.
|
11
|
+
# The Readline class that does the actual work of getting lines from the
|
12
|
+
# user. Note that each instance of this class maintains its own copy of
|
13
|
+
# the optional command history.
|
14
|
+
# :reek:TooManyInstanceVariables -- Yes and it needs them!
|
14
15
|
class Readline
|
15
16
|
|
16
17
|
# The options specifically associated with this instance.
|
@@ -32,6 +32,7 @@ require_relative 'edit/unmapped'
|
|
32
32
|
module MiniReadline
|
33
33
|
|
34
34
|
# The line editor.
|
35
|
+
# :reek:TooManyInstanceVariables -- Yes and it needs them!
|
35
36
|
class Edit
|
36
37
|
|
37
38
|
# Set up the edit instance.
|
@@ -60,7 +61,7 @@ module MiniReadline
|
|
60
61
|
def edit_process
|
61
62
|
result = edit_loop
|
62
63
|
@history.append_history(result)
|
63
|
-
result + "\n"
|
64
|
+
result + (@options[:chomp] ? "" : "\n")
|
64
65
|
end
|
65
66
|
|
66
67
|
# The line editor processing loop.
|
@@ -45,8 +45,15 @@ module MiniReadline
|
|
45
45
|
|
46
46
|
# Append a string to the history buffer if enabled.
|
47
47
|
def append_history(str)
|
48
|
-
return
|
49
|
-
|
48
|
+
return if @options[:no_blanks] && str.strip.empty?
|
49
|
+
|
50
|
+
if history.include?(str)
|
51
|
+
if @options[:no_dups]
|
52
|
+
return if @options[:no_move]
|
53
|
+
|
54
|
+
history.delete(str)
|
55
|
+
end
|
56
|
+
end
|
50
57
|
|
51
58
|
history << str
|
52
59
|
end
|
@@ -3,8 +3,8 @@
|
|
3
3
|
# Version info for the gem.
|
4
4
|
module MiniReadline
|
5
5
|
#The current version of the mini_readline gem.
|
6
|
-
VERSION = "0.9.
|
6
|
+
VERSION = "0.9.5".freeze
|
7
7
|
|
8
8
|
# A brief description.
|
9
|
-
DESCRIPTION = "Get console input with edit, history, and auto-complete.".freeze
|
9
|
+
DESCRIPTION = "mini_readline: Get console input with edit, history, and auto-complete.".freeze
|
10
10
|
end
|
data/mini_readline.gemspec
CHANGED
@@ -9,12 +9,13 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Peter Camilleri"]
|
10
10
|
spec.email = ["peter.c.camilleri@gmail.com"]
|
11
11
|
|
12
|
-
spec.summary = "Get console input with edit, history, and auto-complete."
|
13
|
-
spec.description = %{A
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
spec.summary = "mini_readline: Get console input with edit, history, and auto-complete."
|
13
|
+
spec.description = %{mini_readline: A compact, little gem for console
|
14
|
+
command entry with line edit and history, inspired by
|
15
|
+
the standard readline gem. Also included are four
|
16
|
+
sample auto-complete agents and the irbm utility,
|
17
|
+
which is irb + mini_readline and not an Intermediate
|
18
|
+
Range Ballistic Missile.
|
18
19
|
}.gsub(/\s+/, ' ').strip
|
19
20
|
|
20
21
|
spec.homepage = "https://github.com/PeterCamilleri/mini_readline"
|
@@ -29,10 +30,9 @@ Gem::Specification.new do |spec|
|
|
29
30
|
|
30
31
|
spec.add_runtime_dependency 'mini_term', "~> 0.1.0"
|
31
32
|
|
32
|
-
spec.add_development_dependency "rake", "
|
33
|
-
spec.add_development_dependency "bundler", "
|
33
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
34
|
+
spec.add_development_dependency "bundler", ">= 2.1.0"
|
34
35
|
spec.add_development_dependency 'minitest', "~> 5.7"
|
35
|
-
spec.add_development_dependency 'minitest_visible', "~> 0.1"
|
36
36
|
spec.add_development_dependency 'reek', ">= 5.0.2"
|
37
37
|
|
38
38
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require_relative '../lib/mini_readline'
|
4
|
+
gem 'minitest'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
|
7
|
+
class SomeHistoryTester < Minitest::Test
|
8
|
+
|
9
|
+
def test_some_history_options
|
10
|
+
buffer = ["one", "two", "three"]
|
11
|
+
options = {:no_blanks => true,
|
12
|
+
:no_dups => true,
|
13
|
+
:no_move => false}
|
14
|
+
|
15
|
+
history = MiniReadline::History.new(buffer)
|
16
|
+
history.initialize_parms(options)
|
17
|
+
|
18
|
+
assert_equal(3, history.history.length)
|
19
|
+
assert_equal(["one", "two", "three"], history.history)
|
20
|
+
|
21
|
+
history.append_history("four")
|
22
|
+
assert_equal(4, history.history.length)
|
23
|
+
assert_equal(["one", "two", "three", "four"], history.history)
|
24
|
+
|
25
|
+
history.append_history("two")
|
26
|
+
assert_equal(4, history.history.length)
|
27
|
+
assert_equal(["one", "three", "four", "two"], history.history)
|
28
|
+
|
29
|
+
options[:no_move] = true
|
30
|
+
history.append_history("three")
|
31
|
+
assert_equal(4, history.history.length)
|
32
|
+
assert_equal(["one", "three", "four", "two"], history.history)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -3,14 +3,10 @@
|
|
3
3
|
require_relative '../lib/mini_readline'
|
4
4
|
gem 'minitest'
|
5
5
|
require 'minitest/autorun'
|
6
|
-
require 'minitest_visible'
|
7
6
|
|
8
7
|
#Test the monkey patches applied to the Object class.
|
9
8
|
class MiniReadlineTester < Minitest::Test
|
10
9
|
|
11
|
-
#Track mini-test progress.
|
12
|
-
include MinitestVisible
|
13
|
-
|
14
10
|
def test_that_it_has_a_version_number
|
15
11
|
refute_nil ::MiniReadline::VERSION
|
16
12
|
assert(::MiniReadline::VERSION.frozen?)
|
@@ -47,7 +43,7 @@ class MiniReadlineTester < Minitest::Test
|
|
47
43
|
result = ''
|
48
44
|
|
49
45
|
loop do
|
50
|
-
result = edit.readline(prompt: ">", history: true)
|
46
|
+
result = edit.readline(prompt: ">", chomp: true, history: true)
|
51
47
|
puts result.inspect
|
52
48
|
break unless result != "quit"
|
53
49
|
end
|
@@ -64,12 +60,12 @@ class MiniReadlineTester < Minitest::Test
|
|
64
60
|
result = ''
|
65
61
|
|
66
62
|
loop do
|
67
|
-
result = edit.readline(prompt: ">")
|
63
|
+
result = edit.readline(prompt: ">")
|
68
64
|
puts result.inspect
|
69
|
-
break unless result != "quit"
|
65
|
+
break unless result != "quit\n"
|
70
66
|
end
|
71
67
|
|
72
|
-
assert_equal("quit", result)
|
68
|
+
assert_equal("quit\n", result)
|
73
69
|
end
|
74
70
|
|
75
71
|
def test_reading_with_a_default
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_readline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Camilleri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mini_term
|
@@ -28,30 +28,30 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 12.3.3
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 12.3.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 2.1.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 2.1.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: minitest
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,20 +66,6 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '5.7'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: minitest_visible
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0.1'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0.1'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: reek
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,23 +80,26 @@ dependencies:
|
|
94
80
|
- - ">="
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: 5.0.2
|
97
|
-
description: A
|
98
|
-
by the standard readline gem. Also included are
|
99
|
-
and the irbm utility, which is irb + mini_readline
|
100
|
-
Ballistic Missile.
|
83
|
+
description: 'mini_readline: A compact, little gem for console command entry with
|
84
|
+
line edit and history, inspired by the standard readline gem. Also included are
|
85
|
+
four sample auto-complete agents and the irbm utility, which is irb + mini_readline
|
86
|
+
and not an Intermediate Range Ballistic Missile.'
|
101
87
|
email:
|
102
88
|
- peter.c.camilleri@gmail.com
|
103
89
|
executables:
|
104
90
|
- irbm
|
91
|
+
- sire
|
105
92
|
extensions: []
|
106
93
|
extra_rdoc_files: []
|
107
94
|
files:
|
108
95
|
- ".gitignore"
|
96
|
+
- ".reek.yml"
|
109
97
|
- CODE_OF_CONDUCT.md
|
110
98
|
- Gemfile
|
111
99
|
- LICENSE.txt
|
112
100
|
- README.md
|
113
101
|
- bin/irbm
|
102
|
+
- bin/sire
|
114
103
|
- irbt.rb
|
115
104
|
- lib/mini_readline.rb
|
116
105
|
- lib/mini_readline/exceptions.rb
|
@@ -149,10 +138,9 @@ files:
|
|
149
138
|
- lib/mini_readline/read_line/prompt.rb
|
150
139
|
- lib/mini_readline/version.rb
|
151
140
|
- mini_readline.gemspec
|
152
|
-
- mini_readline.reek
|
153
141
|
- rakefile.rb
|
154
142
|
- reek.txt
|
155
|
-
-
|
143
|
+
- tests/history_tests.rb
|
156
144
|
- tests/mini_readline_tests.rb
|
157
145
|
homepage: https://github.com/PeterCamilleri/mini_readline
|
158
146
|
licenses:
|
@@ -173,9 +161,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
161
|
- !ruby/object:Gem::Version
|
174
162
|
version: '0'
|
175
163
|
requirements: []
|
176
|
-
|
177
|
-
rubygems_version: 2.5.2
|
164
|
+
rubygems_version: 3.2.17
|
178
165
|
signing_key:
|
179
166
|
specification_version: 4
|
180
|
-
summary: Get console input with edit, history, and auto-complete.
|
167
|
+
summary: 'mini_readline: Get console input with edit, history, and auto-complete.'
|
181
168
|
test_files: []
|
data/mini_readline.reek
DELETED
@@ -1,115 +0,0 @@
|
|
1
|
-
---
|
2
|
-
Attribute:
|
3
|
-
enabled: false
|
4
|
-
exclude: []
|
5
|
-
BooleanParameter:
|
6
|
-
enabled: true
|
7
|
-
exclude: []
|
8
|
-
ClassVariable:
|
9
|
-
enabled: true
|
10
|
-
exclude: []
|
11
|
-
ControlParameter:
|
12
|
-
enabled: true
|
13
|
-
exclude: []
|
14
|
-
DataClump:
|
15
|
-
enabled: true
|
16
|
-
exclude: []
|
17
|
-
max_copies: 2
|
18
|
-
min_clump_size: 2
|
19
|
-
DuplicateMethodCall:
|
20
|
-
enabled: true
|
21
|
-
exclude: []
|
22
|
-
max_calls: 1
|
23
|
-
allow_calls: []
|
24
|
-
FeatureEnvy:
|
25
|
-
enabled: true
|
26
|
-
exclude: []
|
27
|
-
InstanceVariableAssumption:
|
28
|
-
enabled: false
|
29
|
-
exclude: []
|
30
|
-
IrresponsibleModule:
|
31
|
-
enabled: true
|
32
|
-
exclude: []
|
33
|
-
LongParameterList:
|
34
|
-
enabled: true
|
35
|
-
exclude: []
|
36
|
-
max_params: 3
|
37
|
-
overrides:
|
38
|
-
initialize:
|
39
|
-
max_params: 5
|
40
|
-
LongYieldList:
|
41
|
-
enabled: true
|
42
|
-
exclude: []
|
43
|
-
max_params: 3
|
44
|
-
NestedIterators:
|
45
|
-
enabled: true
|
46
|
-
exclude: []
|
47
|
-
max_allowed_nesting: 1
|
48
|
-
ignore_iterators: []
|
49
|
-
NilCheck:
|
50
|
-
enabled: true
|
51
|
-
exclude: []
|
52
|
-
PrimaDonnaMethod:
|
53
|
-
enabled: true
|
54
|
-
exclude: []
|
55
|
-
RepeatedConditional:
|
56
|
-
enabled: true
|
57
|
-
exclude: []
|
58
|
-
max_ifs: 2
|
59
|
-
TooManyInstanceVariables:
|
60
|
-
enabled: true
|
61
|
-
exclude: []
|
62
|
-
max_instance_variables: 9
|
63
|
-
TooManyMethods:
|
64
|
-
enabled: true
|
65
|
-
exclude: []
|
66
|
-
max_methods: 25
|
67
|
-
TooManyStatements:
|
68
|
-
enabled: true
|
69
|
-
exclude:
|
70
|
-
- initialize
|
71
|
-
max_statements: 7
|
72
|
-
UncommunicativeMethodName:
|
73
|
-
enabled: true
|
74
|
-
exclude: []
|
75
|
-
reject:
|
76
|
-
- !ruby/regexp /^[a-z]$/
|
77
|
-
- !ruby/regexp /[0-9]$/
|
78
|
-
- !ruby/regexp /[A-Z]/
|
79
|
-
accept: []
|
80
|
-
UncommunicativeModuleName:
|
81
|
-
enabled: true
|
82
|
-
exclude: []
|
83
|
-
reject:
|
84
|
-
- !ruby/regexp /^.$/
|
85
|
-
- !ruby/regexp /[0-9]$/
|
86
|
-
accept:
|
87
|
-
- Inline::C
|
88
|
-
UncommunicativeParameterName:
|
89
|
-
enabled: true
|
90
|
-
exclude: []
|
91
|
-
reject:
|
92
|
-
- !ruby/regexp /^.$/
|
93
|
-
- !ruby/regexp /[0-9]$/
|
94
|
-
- !ruby/regexp /[A-Z]/
|
95
|
-
- !ruby/regexp /^_/
|
96
|
-
accept: []
|
97
|
-
UncommunicativeVariableName:
|
98
|
-
enabled: true
|
99
|
-
exclude: []
|
100
|
-
reject:
|
101
|
-
- !ruby/regexp /^.$/
|
102
|
-
- !ruby/regexp /[0-9]$/
|
103
|
-
- !ruby/regexp /[A-Z]/
|
104
|
-
accept:
|
105
|
-
- _
|
106
|
-
UnusedParameters:
|
107
|
-
enabled: true
|
108
|
-
exclude: []
|
109
|
-
UnusedPrivateMethod:
|
110
|
-
enabled: false
|
111
|
-
exclude: []
|
112
|
-
UtilityFunction:
|
113
|
-
enabled: true
|
114
|
-
exclude: []
|
115
|
-
max_helper_calls: 1
|
data/sire.rb
DELETED
@@ -1,145 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
# A Simple Interactive Ruby Environment
|
3
|
-
|
4
|
-
require 'pp'
|
5
|
-
|
6
|
-
#Some SIRE control variables.
|
7
|
-
$sire_done = false
|
8
|
-
$sire_binding = binding
|
9
|
-
$sire_old = (ARGV[0] == 'old') || defined?(Readline)
|
10
|
-
|
11
|
-
if $sire_old
|
12
|
-
require 'readline'
|
13
|
-
class MiniReadlineEOI < StandardError; end #Compatibility stub.
|
14
|
-
puts "\nLoaded the standard readline gem. Version #{Readline::VERSION}"
|
15
|
-
elsif ARGV[0] == 'local'
|
16
|
-
require './lib/mini_readline'
|
17
|
-
puts "\nOption(local). Loaded mini_readline from the local code folder. Version #{MiniReadline::VERSION}"
|
18
|
-
elsif defined?(MiniReadline)
|
19
|
-
puts "\nThe mini_readline gem is already loaded. Version #{MiniReadline::VERSION}"
|
20
|
-
else
|
21
|
-
begin
|
22
|
-
require 'mini_readline'
|
23
|
-
puts "\nLoaded mini_readline from the system gem. Version #{MiniReadline::VERSION}"
|
24
|
-
rescue LoadError
|
25
|
-
begin
|
26
|
-
require './lib/mini_readline'
|
27
|
-
puts "\nLoaded mini_readline from the local code folder. Version #{MiniReadline::VERSION}"
|
28
|
-
rescue LoadError
|
29
|
-
require 'readline'
|
30
|
-
puts "\nLoaded the standard readline gem. Version #{Readline::VERSION}"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
Readline = MiniReadline unless defined?(Readline)
|
36
|
-
|
37
|
-
class Object
|
38
|
-
#Generate the class lineage of the object.
|
39
|
-
def classes
|
40
|
-
begin
|
41
|
-
result = ""
|
42
|
-
klass = self.instance_of?(Class) ? self : self.class
|
43
|
-
|
44
|
-
begin
|
45
|
-
result << klass.to_s
|
46
|
-
klass = klass.superclass
|
47
|
-
result << " < " if klass
|
48
|
-
end while klass
|
49
|
-
|
50
|
-
result
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
#Quit the interactive session.
|
57
|
-
def quit
|
58
|
-
$sire_done = true
|
59
|
-
puts
|
60
|
-
"Quit command."
|
61
|
-
end
|
62
|
-
|
63
|
-
#Get a mapped keystroke.
|
64
|
-
def get_mapped
|
65
|
-
if $sire_old
|
66
|
-
puts 'Not supported by old readline.'
|
67
|
-
else
|
68
|
-
print 'Press a key:'
|
69
|
-
MiniTerm.get_mapped_char
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
#Test spawning a process. This breaks the regular readline gem.
|
74
|
-
def run(command)
|
75
|
-
IO.popen(command, "r+") do |io|
|
76
|
-
io.close_write
|
77
|
-
return io.read
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
#The SIRE class contains the simplistic R.E.P.L.
|
84
|
-
class SIRE
|
85
|
-
|
86
|
-
#Run the interactive session.
|
87
|
-
def run_sire
|
88
|
-
unless $sire_old
|
89
|
-
MiniReadline::BASE_OPTIONS[:auto_complete] = true
|
90
|
-
MiniReadline::BASE_OPTIONS[:eoi_detect] = true
|
91
|
-
end
|
92
|
-
|
93
|
-
puts
|
94
|
-
puts "Welcome to a Simple Interactive Ruby Environment\n"
|
95
|
-
puts "Use the command 'quit' to exit.\n\n"
|
96
|
-
|
97
|
-
until $sire_done
|
98
|
-
exec_line(get_line)
|
99
|
-
end
|
100
|
-
|
101
|
-
puts "\n\n"
|
102
|
-
|
103
|
-
rescue MiniReadlineEOI, Interrupt => e
|
104
|
-
puts "\n"
|
105
|
-
end
|
106
|
-
|
107
|
-
private
|
108
|
-
|
109
|
-
#Get a line of input from the user.
|
110
|
-
def get_line
|
111
|
-
initial_input = Readline.readline("SIRE>", true)
|
112
|
-
get_extra_input(initial_input)
|
113
|
-
end
|
114
|
-
|
115
|
-
#Get any continuations of the inputs
|
116
|
-
def get_extra_input(str)
|
117
|
-
if /\\\s*$/ =~ str
|
118
|
-
get_extra_input($PREMATCH + "\n" + Readline.readline("SIRE\\", true))
|
119
|
-
else
|
120
|
-
str
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
#Execute a single line.
|
125
|
-
def exec_line(line)
|
126
|
-
result = $sire_binding.eval(line)
|
127
|
-
pp result unless line.length == 0
|
128
|
-
|
129
|
-
rescue Interrupt => e
|
130
|
-
puts "\nExecution Interrupted!"
|
131
|
-
puts "\n#{e.class} detected: #{e}\n"
|
132
|
-
puts e.backtrace
|
133
|
-
puts "\n"
|
134
|
-
|
135
|
-
rescue Exception => e
|
136
|
-
puts "\n#{e.class} detected: #{e}\n"
|
137
|
-
puts e.backtrace
|
138
|
-
puts
|
139
|
-
end
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
if __FILE__ == $0
|
144
|
-
SIRE.new.run_sire
|
145
|
-
end
|