pry 0.9.5-i386-mingw32 → 0.9.6-i386-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +21 -0
- data/Gemfile +2 -0
- data/README.markdown +15 -17
- data/Rakefile +1 -1
- data/bin/pry +8 -6
- data/examples/example_command_override.rb +1 -1
- data/lib/pry.rb +19 -4
- data/lib/pry/command_context.rb +1 -0
- data/lib/pry/command_processor.rb +1 -0
- data/lib/pry/command_set.rb +2 -2
- data/lib/pry/config.rb +15 -0
- data/lib/pry/default_commands/context.rb +8 -4
- data/lib/pry/default_commands/documentation.rb +18 -12
- data/lib/pry/default_commands/input.rb +120 -67
- data/lib/pry/default_commands/introspection.rb +112 -67
- data/lib/pry/default_commands/shell.rb +28 -17
- data/lib/pry/helpers/command_helpers.rb +73 -40
- data/lib/pry/history_array.rb +4 -0
- data/lib/pry/pry_class.rb +10 -6
- data/lib/pry/pry_instance.rb +57 -25
- data/lib/pry/version.rb +1 -1
- data/pry.gemspec +8 -8
- data/test/helper.rb +35 -1
- data/test/test_command_set.rb +1 -1
- data/test/test_default_commands/test_input.rb +30 -17
- data/test/test_default_commands/test_introspection.rb +334 -1
- data/test/test_default_commands/test_shell.rb +100 -5
- data/test/test_exception_whitelist.rb +17 -0
- data/test/test_input_stack.rb +70 -0
- data/test/test_pry.rb +26 -22
- data/test/test_pry_output.rb +2 -6
- metadata +73 -74
data/CHANGELOG
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
19/9/2011 version 0.9.6
|
2
|
+
* restored previous behavior of command-line switches (allowing "-rfilename")
|
3
|
+
* removed -p option (--play) from edit command
|
4
|
+
* `edit` with no arguments now edits the current or most recent expression
|
5
|
+
* `edit` auto-reloads .rb files (need to specify -n to suppress)
|
6
|
+
* added -p option (--patch) to edit-method command, which allows
|
7
|
+
monkeypatching methods without touching the original file
|
8
|
+
* edit-method can now edit REPL-defined methods
|
9
|
+
* cat --ex now works on exceptions in REPL-defined code
|
10
|
+
* play -m now uses eval_string.replace()
|
11
|
+
* play -m --open uses show-input to show play'd code
|
12
|
+
* added "unindent" helper to make adding help to commands easier
|
13
|
+
* local ./.pryrc now loaded after ~/.pryrc if it exists
|
14
|
+
* cat --ex N and edit --ex N now can navigate through backtrace, where cat --ex (with no args) moves throuh successive levels of the backtrace automatically with state stored on the exceptino object itself
|
15
|
+
* new option Pry.config.exception_window_size determines window size for cat --ex
|
16
|
+
* input_stack now implemented - pushing objects onto a pry instance's input_stack causes the instance to read from those objects in turn as it encounters EOF on the previous object. On finishing the input_stack the input object for the pry instance is set back to Pry.config.input, if this fails, pry breaks out of the REPL (throw(:breakout)) with an error message
|
17
|
+
* Pry.config.system() defines how pry runs system commands
|
18
|
+
* now injecting target_self method into command scope
|
19
|
+
* play now performs 'show-input' always unless eval_string contains a valid expression (i.e it's about to be eval'd)
|
20
|
+
* play and hist --replay now push the current input object onto the input_stack before redirecting input to a StringIO (works much better with pry-remote now)
|
21
|
+
|
1
22
|
8/9/2011 version 0.9.5
|
2
23
|
|
3
24
|
MAJOR NEW FEATURES:
|
data/Gemfile
ADDED
data/README.markdown
CHANGED
@@ -1,16 +1,20 @@
|
|
1
|
+
<center>
|
1
2
|
![Alt text](http://dl.dropbox.com/u/26521875/pry_logo_350.png)
|
2
3
|
|
3
4
|
(C) John Mair (banisterfiend) 2011
|
4
5
|
|
5
|
-
_Get to the code_
|
6
6
|
|
7
|
-
**
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
**Please** [DONATE](http://www.pledgie.com/campaigns/15899) to the Pry project - Pry was a **huge** amount of work and every donation received is encouraging and supports Pry's continued development!
|
8
|
+
|
9
|
+
**Sponsors**
|
10
|
+
|
11
|
+
[Atomic Object](http://www.atomicobject.com/)
|
12
|
+
|
13
|
+
**Other Resources**
|
11
14
|
|
12
15
|
[Skip to the website (recommended)](http://pry.github.com) <br />
|
13
16
|
[Skip to the wiki](https://github.com/pry/pry/wiki)
|
17
|
+
</center>
|
14
18
|
|
15
19
|
Pry is a powerful alternative to the standard IRB shell for Ruby. It is
|
16
20
|
written from scratch to provide a number of advanced features, some of
|
@@ -28,11 +32,11 @@ these include:
|
|
28
32
|
* Exotic object support (BasicObject instances, IClasses, ...)
|
29
33
|
* A Powerful and flexible command system
|
30
34
|
* Ability to view and replay history
|
31
|
-
* Many convenience commands inspired by IPython and other advanced REPLs
|
35
|
+
* Many convenience commands inspired by IPython, Smalltalk and other advanced REPLs
|
32
36
|
|
33
37
|
Pry also aims to be more than an IRB replacement; it is an
|
34
38
|
attempt to bring REPL driven programming to the Ruby language. It is
|
35
|
-
currently not
|
39
|
+
currently not as powerful as tools like [SLIME](http://en.wikipedia.org/wiki/SLIME) for lisp, but that is the
|
36
40
|
general direction Pry is heading.
|
37
41
|
|
38
42
|
Pry is also fairly flexible and allows significant user
|
@@ -352,14 +356,12 @@ avaiable.
|
|
352
356
|
|
353
357
|
### Use Pry as your Rails Console
|
354
358
|
|
355
|
-
pry -r./config/environment
|
359
|
+
pry -r ./config/environment
|
356
360
|
|
357
361
|
MyArtChannel has kindly provided a hack to replace the `rails console` command in Rails 3: [https://gist.github.com/941174](https://gist.github.com/941174) This is not recommended for code bases with multiple developers, as they may not all want to use Pry.
|
358
362
|
|
359
363
|
### Limitations:
|
360
364
|
|
361
|
-
* JRuby not officially supported due to currently too many quirks and
|
362
|
-
strange behaviour. This will be fixed soon.
|
363
365
|
* Tab completion is currently a bit broken/limited this will have a
|
364
366
|
major overhaul in a future version.
|
365
367
|
|
@@ -376,7 +378,6 @@ Many new features are planned such as:
|
|
376
378
|
|
377
379
|
* Increase modularity (rely more on plugin system)
|
378
380
|
* Much improved tab completion (using [Bond](http://github.com/cldwalker/bond))
|
379
|
-
* Improved JRuby support
|
380
381
|
* Much improved documentation system, better support for YARD
|
381
382
|
* Better support for code and method reloading and saving code
|
382
383
|
* Extended and more sophisticated command system, allowing piping
|
@@ -388,9 +389,6 @@ Problems or questions contact me at [github](http://github.com/banister)
|
|
388
389
|
|
389
390
|
### Contributors
|
390
391
|
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
* [Rob Gleeson](https://github.com/robgleeson)
|
395
|
-
* [Mon_Ouie](http://github.com/mon-ouie)
|
396
|
-
* [injekt](http://github.com/injekt)
|
392
|
+
Pry is primarily the work of [John Mair (banisterfiend)]((http://github.com/banister)), for full list
|
393
|
+
of contributors see the
|
394
|
+
[CONTRIBUTORS](https://github.com/pry/pry/blob/master/CONTRIBUTORS) file.
|
data/Rakefile
CHANGED
data/bin/pry
CHANGED
@@ -12,7 +12,7 @@ rescue LoadError
|
|
12
12
|
require 'pry'
|
13
13
|
end
|
14
14
|
|
15
|
-
opts = Slop.parse(:help => true) do
|
15
|
+
opts = Slop.parse(:help => true, :multiple_switches => false) do
|
16
16
|
banner %{Usage: pry [OPTIONS]
|
17
17
|
Start a Pry session.
|
18
18
|
See: `https://github.com/banister` for more information.
|
@@ -80,10 +80,12 @@ Pry.cli = true
|
|
80
80
|
# create the actual context
|
81
81
|
context = Pry.binding_for(eval(opts[:context]))
|
82
82
|
|
83
|
-
|
84
|
-
|
85
|
-
|
83
|
+
if opts[:exec]
|
84
|
+
exec_string = opts[:exec] + "\n"
|
85
|
+
else
|
86
|
+
exec_string = ""
|
86
87
|
end
|
87
88
|
|
88
|
-
#
|
89
|
-
context.
|
89
|
+
# Start the session (running any code passed with -e, if there is any)
|
90
|
+
Pry.start(context, :input => StringIO.new(exec_string), :input_stack => [Readline])
|
91
|
+
|
@@ -14,7 +14,7 @@ class MyCommands < Pry::CommandBase
|
|
14
14
|
import_from Pry::Commands, "status"
|
15
15
|
|
16
16
|
# analogy to Ruby's native alias_method idiom for decorating a method
|
17
|
-
alias_command "old_status", "status"
|
17
|
+
alias_command "old_status", "status"
|
18
18
|
|
19
19
|
# Invoke one command from within another using `run`
|
20
20
|
command "status", "Modified status." do |x|
|
data/lib/pry.rb
CHANGED
@@ -21,7 +21,7 @@ class Pry
|
|
21
21
|
DEFAULT_PRINT = proc do |output, value|
|
22
22
|
stringified = begin
|
23
23
|
value.pretty_inspect
|
24
|
-
rescue RescuableException
|
24
|
+
rescue RescuableException
|
25
25
|
nil
|
26
26
|
end
|
27
27
|
|
@@ -29,7 +29,6 @@ class Pry
|
|
29
29
|
# Read the class name off of the singleton class to provide a default inspect.
|
30
30
|
klass = (class << value; self; end).ancestors.first
|
31
31
|
stringified = "#<#{klass}:0x#{value.__id__.to_s(16)}>"
|
32
|
-
Helpers::BaseHelpers.stagger_output("output error: #{ex.inspect}", output) if ex
|
33
32
|
end
|
34
33
|
|
35
34
|
Helpers::BaseHelpers.stagger_output("=> #{Helpers::BaseHelpers.colorize_code(stringified)}", output)
|
@@ -51,11 +50,14 @@ class Pry
|
|
51
50
|
end
|
52
51
|
|
53
52
|
# Will only show the first line of the backtrace
|
54
|
-
DEFAULT_EXCEPTION_HANDLER = proc do |output, exception|
|
53
|
+
DEFAULT_EXCEPTION_HANDLER = proc do |output, exception, _|
|
55
54
|
output.puts "#{exception.class}: #{exception.message}"
|
56
55
|
output.puts "from #{exception.backtrace.first}"
|
57
56
|
end
|
58
57
|
|
58
|
+
# Don't catch these exceptions
|
59
|
+
DEFAULT_EXCEPTION_WHITELIST = [SystemExit, SignalException]
|
60
|
+
|
59
61
|
# The default prompt; includes the target and nesting level
|
60
62
|
DEFAULT_PROMPT = [
|
61
63
|
proc { |target_self, nest_level, _|
|
@@ -115,6 +117,11 @@ class Pry
|
|
115
117
|
end,
|
116
118
|
]
|
117
119
|
|
120
|
+
DEFAULT_SYSTEM = proc do |output, cmd, _|
|
121
|
+
if !system(cmd)
|
122
|
+
output.puts "Error: there was a problem executing system command: #{cmd}"
|
123
|
+
end
|
124
|
+
end
|
118
125
|
|
119
126
|
# As a REPL, we often want to catch any unexpected exceptions that may have
|
120
127
|
# been raised; however we don't want to go overboard and prevent the user
|
@@ -128,7 +135,7 @@ class Pry
|
|
128
135
|
true
|
129
136
|
# Don't catch signals (particularly not SIGTERM) as these are unlikely to be
|
130
137
|
# intended for pry itself. We should also make sure that Kernel#exit works.
|
131
|
-
when
|
138
|
+
when *Pry.config.exception_whitelist
|
132
139
|
false
|
133
140
|
# All other exceptions will be caught.
|
134
141
|
else
|
@@ -148,6 +155,14 @@ require "optparse"
|
|
148
155
|
require "slop"
|
149
156
|
require "rubygems/dependency_installer"
|
150
157
|
|
158
|
+
if RUBY_PLATFORM =~ /jruby/
|
159
|
+
begin
|
160
|
+
require 'ffi'
|
161
|
+
rescue LoadError
|
162
|
+
$stderr.puts "Need to `gem install ffi`"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
151
166
|
if RUBY_PLATFORM =~ /mswin/ || RUBY_PLATFORM =~ /mingw/
|
152
167
|
begin
|
153
168
|
require 'win32console'
|
data/lib/pry/command_context.rb
CHANGED
@@ -154,6 +154,7 @@ class Pry
|
|
154
154
|
# set some useful methods to be used by the action blocks
|
155
155
|
context.opts = options
|
156
156
|
context.target = target
|
157
|
+
context.target_self = target.eval('self')
|
157
158
|
context.output = output
|
158
159
|
context.captures = options[:captures]
|
159
160
|
context.eval_string = options[:eval_string]
|
data/lib/pry/command_set.rb
CHANGED
@@ -168,10 +168,10 @@ class Pry
|
|
168
168
|
# @param [String] new_name New name of the command.
|
169
169
|
# @param [String] old_name Old name of the command.
|
170
170
|
# @param [String, nil] desc New description of the command.
|
171
|
-
def alias_command(new_name, old_name, desc
|
171
|
+
def alias_command(new_name, old_name, desc="")
|
172
172
|
commands[new_name] = commands[old_name].dup
|
173
173
|
commands[new_name].name = new_name
|
174
|
-
commands[new_name].description = desc
|
174
|
+
commands[new_name].description = desc
|
175
175
|
end
|
176
176
|
|
177
177
|
# Runs a command.
|
data/lib/pry/config.rb
CHANGED
@@ -29,6 +29,9 @@ class Pry
|
|
29
29
|
# Pry instances.
|
30
30
|
attr_accessor :exception_handler
|
31
31
|
|
32
|
+
# @return [Array] The classes of exception that will not be caught by Pry.
|
33
|
+
attr_accessor :exception_whitelist
|
34
|
+
|
32
35
|
# Get/Set the Hash that defines Pry hooks used by default by all Pry
|
33
36
|
# instances.
|
34
37
|
# @return [Hash] The hooks used by default by all Pry instances.
|
@@ -37,6 +40,13 @@ class Pry
|
|
37
40
|
# :after_session => proc { puts "goodbye" }
|
38
41
|
attr_accessor :hooks
|
39
42
|
|
43
|
+
# Get/Set the stack of input objects that a Pry instance switches
|
44
|
+
# to when its current input object encounters EOF.
|
45
|
+
# @return [Array] The array of input objects.
|
46
|
+
# @example
|
47
|
+
# Pry.config.input_stack = [StringIO.new("puts 'hello world'\nexit")]
|
48
|
+
attr_accessor :input_stack
|
49
|
+
|
40
50
|
# Get the array of Procs to be used for the prompts by default by
|
41
51
|
# all Pry instances.
|
42
52
|
# @return [Array<Proc>] The array of Procs to be used for the
|
@@ -111,6 +121,11 @@ class Pry
|
|
111
121
|
# @return [Proc] The proc that manages ^D presses in the REPL.
|
112
122
|
# The proc is passed the current eval_string and the current pry instance.
|
113
123
|
attr_accessor :control_d_handler
|
124
|
+
|
125
|
+
# @return [Proc] The proc that runs system commands
|
126
|
+
# The proc is passed the pry output object, the command string
|
127
|
+
# to eval, and a reference to the pry instance
|
128
|
+
attr_accessor :system
|
114
129
|
end
|
115
130
|
end
|
116
131
|
|
@@ -91,7 +91,7 @@ class Pry
|
|
91
91
|
throw(:breakout, target.eval(arg_string))
|
92
92
|
end
|
93
93
|
|
94
|
-
alias_command "!!@", "exit-all"
|
94
|
+
alias_command "!!@", "exit-all"
|
95
95
|
|
96
96
|
command "exit", "Pop the current binding and return to the one immediately prior. Note this does NOT exit the program. Aliases: quit", :keep_retval => true do
|
97
97
|
if _pry_.binding_stack.one?
|
@@ -111,15 +111,15 @@ class Pry
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
-
alias_command "quit", "exit"
|
114
|
+
alias_command "quit", "exit"
|
115
115
|
|
116
116
|
command "exit-program", "End the current program. Aliases: quit-program, !!!" do
|
117
117
|
Pry.save_history if Pry.config.history.should_save
|
118
118
|
Kernel.exit target.eval(arg_string).to_i
|
119
119
|
end
|
120
120
|
|
121
|
-
alias_command "quit-program", "exit-program"
|
122
|
-
alias_command "!!!", "exit-program"
|
121
|
+
alias_command "quit-program", "exit-program"
|
122
|
+
alias_command "!!!", "exit-program"
|
123
123
|
|
124
124
|
command "!pry", "Start a Pry session on current self; this even works mid multi-line expression." do
|
125
125
|
target.pry
|
@@ -147,6 +147,10 @@ class Pry
|
|
147
147
|
set_file_and_dir_locals(file)
|
148
148
|
output.puts "\n#{text.bold('From:')} #{file} @ line #{line_num} in #{klass}##{meth_name}:\n\n"
|
149
149
|
|
150
|
+
unless File.readable?(file)
|
151
|
+
output.puts "Cannot open #{file.inspect} for reading."
|
152
|
+
next
|
153
|
+
end
|
150
154
|
|
151
155
|
# This method inspired by http://rubygems.org/gems/ir_b
|
152
156
|
File.open(file).each_with_index do |line, index|
|
@@ -11,9 +11,11 @@ class Pry
|
|
11
11
|
target = target()
|
12
12
|
|
13
13
|
opts = Slop.parse!(args) do |opt|
|
14
|
-
opt.banner
|
15
|
-
|
16
|
-
|
14
|
+
opt.banner unindent <<-USAGE
|
15
|
+
Usage: show-doc [OPTIONS] [METH 1] [METH 2] [METH N]
|
16
|
+
Show the comments above method METH. Tries instance methods first and then methods by default.
|
17
|
+
e.g show-doc hello_method
|
18
|
+
USAGE
|
17
19
|
|
18
20
|
opt.on :M, "instance-methods", "Operate on instance methods."
|
19
21
|
opt.on :m, :methods, "Operate on methods."
|
@@ -50,15 +52,17 @@ class Pry
|
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
53
|
-
alias_command "?", "show-doc"
|
55
|
+
alias_command "?", "show-doc"
|
54
56
|
|
55
57
|
command "stat", "View method information and set _file_ and _dir_ locals. Type `stat --help` for more info." do |*args|
|
56
58
|
target = target()
|
57
59
|
|
58
60
|
opts = Slop.parse!(args) do |opt|
|
59
|
-
opt.banner
|
60
|
-
|
61
|
-
|
61
|
+
opt.banner unindent <<-USAGE
|
62
|
+
Usage: stat [OPTIONS] [METH]
|
63
|
+
Show method information for method METH and set _file_ and _dir_ locals.
|
64
|
+
e.g: stat hello_method
|
65
|
+
USAGE
|
62
66
|
|
63
67
|
opt.on :M, "instance-methods", "Operate on instance methods."
|
64
68
|
opt.on :m, :methods, "Operate on methods."
|
@@ -100,11 +104,13 @@ class Pry
|
|
100
104
|
target = target()
|
101
105
|
|
102
106
|
opts = Slop.parse!(args) do |opt|
|
103
|
-
opt.banner
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
107
|
+
opt.banner unindent <<-USAGE
|
108
|
+
Usage: gist-method [OPTIONS] [METH]
|
109
|
+
Gist the method (doc or source) to github.
|
110
|
+
Ensure the `gist` gem is properly working before use. http://github.com/defunkt/gist for instructions.
|
111
|
+
e.g: gist -m my_method
|
112
|
+
e.g: gist -d my_method
|
113
|
+
USAGE
|
108
114
|
|
109
115
|
opt.on :m, :method, "Gist a method's source."
|
110
116
|
opt.on :d, :doc, "Gist a method's documentation."
|
@@ -17,14 +17,16 @@ class Pry
|
|
17
17
|
start_line_number, end_line_number, replacement_line = *args
|
18
18
|
|
19
19
|
opts = Slop.parse!(args.compact) do |opt|
|
20
|
-
opt.banner
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
e.g amend-line 1
|
25
|
-
e.g amend-line
|
26
|
-
e.g amend-line puts '
|
27
|
-
|
20
|
+
opt.banner unindent <<-USAGE
|
21
|
+
Amend a line of input in multi-line mode. `amend-line N`, where the N in `amend-line N` represents line to replace.
|
22
|
+
|
23
|
+
Can also specify a range of lines using `amend-line N..M` syntax. Passing '!' as replacement content deletes the line(s) instead. Aliases: %N
|
24
|
+
e.g amend-line 1 puts 'hello world! # replace line 1'
|
25
|
+
e.g amend-line 1..4 ! # delete lines 1..4
|
26
|
+
e.g amend-line 3 >puts 'goodbye' # insert before line 3
|
27
|
+
e.g amend-line puts 'hello again' # no line number modifies immediately preceding line
|
28
|
+
USAGE
|
29
|
+
|
28
30
|
opt.on :h, :help, "This message." do
|
29
31
|
output.puts opt
|
30
32
|
end
|
@@ -52,11 +54,17 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
|
|
52
54
|
run "show-input"
|
53
55
|
end
|
54
56
|
|
55
|
-
alias_command(/%.?(-?\d+)?(?:\.\.(-?\d+))?/, /amend-line(?: (-?\d+)(?:\.\.(-?\d+))?)
|
57
|
+
alias_command(/%.?(-?\d+)?(?:\.\.(-?\d+))?/, /amend-line(?: (-?\d+)(?:\.\.(-?\d+))?)?/)
|
56
58
|
|
57
59
|
command "play", "Play back a string variable or a method or a file as input. Type `play --help` for more information." do |*args|
|
58
60
|
opts = Slop.parse!(args) do |opt|
|
59
|
-
opt.banner
|
61
|
+
opt.banner unindent <<-USAGE
|
62
|
+
Usage: play [OPTIONS] [--help]
|
63
|
+
Default action (no options) is to play the provided string variable
|
64
|
+
e.g `play _in_[20] --lines 1..3`
|
65
|
+
e.g `play -m Pry#repl --lines 1..-1`
|
66
|
+
e.g `play -f Rakefile --lines 5`
|
67
|
+
USAGE
|
60
68
|
|
61
69
|
opt.on :l, :lines, 'The line (or range of lines) to replay.', true, :as => Range
|
62
70
|
opt.on :m, :method, 'Play a method.', true
|
@@ -79,7 +87,7 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
|
|
79
87
|
range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
|
80
88
|
range = (0..-2) if opts.o?
|
81
89
|
|
82
|
-
|
90
|
+
eval_string << Array(code.each_line.to_a[range]).join
|
83
91
|
elsif opts.f?
|
84
92
|
file_name = File.expand_path(opts[:f])
|
85
93
|
next output.puts "No such file: #{opts[:f]}" if !File.exists?(file_name)
|
@@ -87,6 +95,7 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
|
|
87
95
|
range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
|
88
96
|
range = (0..-2) if opts.o?
|
89
97
|
|
98
|
+
_pry_.input_stack << _pry_.input
|
90
99
|
_pry_.input = StringIO.new(Array(text_array[range]).join)
|
91
100
|
else
|
92
101
|
next output.puts "Error: no input to play command" if !args.first
|
@@ -97,6 +106,8 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
|
|
97
106
|
|
98
107
|
eval_string << Array(code.each_line.to_a[range]).join
|
99
108
|
end
|
109
|
+
|
110
|
+
run "show-input" if !_pry_.valid_expression?(eval_string)
|
100
111
|
end
|
101
112
|
|
102
113
|
command "hist", "Show and replay Readline history. Type `hist --help` for more info. Aliases: history" do |*args|
|
@@ -106,86 +117,121 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
|
|
106
117
|
opts = Slop.parse!(args) do |opt|
|
107
118
|
opt.banner "Usage: hist [--replay START..END] [--clear] [--grep PATTERN] [--head N] [--tail N] [--help] [--save [START..END] file.txt]\n"
|
108
119
|
|
109
|
-
opt.on :
|
110
|
-
pattern = Regexp.new arg_string.strip.split(/ /, 2).last.strip
|
111
|
-
history.pop
|
120
|
+
opt.on :n, 'no-numbers', 'Omit line numbers.'
|
112
121
|
|
113
|
-
|
114
|
-
if element =~ pattern
|
115
|
-
"#{text.blue index}: #{element}"
|
116
|
-
end
|
117
|
-
end
|
122
|
+
opt.on :g, :grep, 'A pattern to match against the history.', true
|
118
123
|
|
119
|
-
|
120
|
-
|
124
|
+
opt.on :head, 'Display the first N items of history.',
|
125
|
+
:optional => true,
|
126
|
+
:as => Integer
|
121
127
|
|
122
|
-
opt.on :
|
128
|
+
opt.on :t, :tail, 'Display the last N items of history.',
|
123
129
|
:optional => true,
|
124
|
-
:as => Integer
|
125
|
-
:unless => :grep do |limit|
|
130
|
+
:as => Integer
|
126
131
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
stagger_output lines
|
131
|
-
end
|
132
|
+
opt.on :s, :show, 'Show the history corresponding to the history line (or range of lines).',
|
133
|
+
:optional => true,
|
134
|
+
:as => Range
|
132
135
|
|
133
|
-
opt.on :
|
134
|
-
:optional => true,
|
135
|
-
:as => Integer,
|
136
|
-
:unless => :grep do |limit|
|
136
|
+
opt.on :e, :exclude, 'Exclude pry commands from the history.'
|
137
137
|
|
138
|
-
|
139
|
-
|
140
|
-
offset = offset < 0 ? 0 : offset
|
138
|
+
opt.on :r, :replay, 'The line (or range of lines) to replay.', true,
|
139
|
+
:as => Range
|
141
140
|
|
142
|
-
|
143
|
-
|
144
|
-
stagger_output lines
|
145
|
-
end
|
141
|
+
opt.on "save", "Save history to a file. --save [start..end] output.txt. Pry commands are excluded from saved history.", true,
|
142
|
+
:as => Range
|
146
143
|
|
147
|
-
opt.on :
|
148
|
-
true,
|
149
|
-
:as => Range,
|
150
|
-
:unless => :grep do |range|
|
144
|
+
opt.on :c, :clear, 'Clear the history.', :unless => :grep
|
151
145
|
|
152
|
-
|
153
|
-
|
154
|
-
stagger_output lines
|
146
|
+
opt.on :h, :help, 'Show this message.', :tail => true, :unless => :grep do
|
147
|
+
output.puts opt.help
|
155
148
|
end
|
149
|
+
end
|
150
|
+
next if opts.help?
|
156
151
|
|
157
|
-
|
158
|
-
|
159
|
-
|
152
|
+
if opts.grep?
|
153
|
+
pattern = Regexp.new(arg_string.strip.split(/ /, 2).last.strip)
|
154
|
+
history.pop
|
155
|
+
|
156
|
+
history.map!.with_index do |element, index|
|
157
|
+
if element =~ pattern
|
158
|
+
if opts.n?
|
159
|
+
element
|
160
|
+
else
|
160
161
|
"#{text.blue index}: #{element}"
|
161
162
|
end
|
162
163
|
end
|
163
|
-
stagger_output history.compact.join "\n"
|
164
164
|
end
|
165
165
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
166
|
+
stagger_output history.compact.join "\n"
|
167
|
+
next
|
168
|
+
end
|
169
|
+
|
170
|
+
if opts.head?
|
171
|
+
limit = opts['head'] || 10
|
172
|
+
list = history.first limit
|
173
|
+
lines = list.join("\n")
|
174
|
+
if opts.n?
|
175
|
+
stagger_output lines
|
176
|
+
else
|
177
|
+
stagger_output text.with_line_numbers(lines, 0)
|
172
178
|
end
|
179
|
+
next
|
180
|
+
end
|
173
181
|
|
174
|
-
|
182
|
+
if opts.tail?
|
183
|
+
limit = opts['tail'] || 10
|
184
|
+
offset = history.size - limit
|
185
|
+
offset = offset < 0 ? 0 : offset
|
175
186
|
|
176
|
-
|
177
|
-
|
178
|
-
|
187
|
+
list = history.last limit
|
188
|
+
lines = list.join("\n")
|
189
|
+
if opts.n?
|
190
|
+
stagger_output lines
|
191
|
+
else
|
192
|
+
stagger_output text.with_line_numbers(lines, offset)
|
179
193
|
end
|
194
|
+
next
|
195
|
+
end
|
180
196
|
|
181
|
-
|
182
|
-
|
197
|
+
if opts.show?
|
198
|
+
range = opts['show']
|
199
|
+
start_line = range.is_a?(Range) ? range.first : range
|
200
|
+
lines = Array(history[range]).join("\n")
|
201
|
+
if opts.n?
|
202
|
+
stagger_output lines
|
203
|
+
else
|
204
|
+
stagger_output text.with_line_numbers(lines, start_line)
|
183
205
|
end
|
206
|
+
next
|
207
|
+
end
|
184
208
|
|
185
|
-
|
186
|
-
|
187
|
-
|
209
|
+
if opts.exclude?
|
210
|
+
history.map!.with_index do |element, index|
|
211
|
+
unless command_processor.valid_command? element
|
212
|
+
if opts.n?
|
213
|
+
element
|
214
|
+
else
|
215
|
+
"#{text.blue index}: #{element}"
|
216
|
+
end
|
217
|
+
end
|
188
218
|
end
|
219
|
+
stagger_output history.compact.join "\n"
|
220
|
+
next
|
221
|
+
end
|
222
|
+
|
223
|
+
if opts.replay?
|
224
|
+
range = opts['replay']
|
225
|
+
actions = Array(history[range]).join("\n") + "\n"
|
226
|
+
_pry_.input_stack << _pry_.input
|
227
|
+
_pry_.input = StringIO.new(actions)
|
228
|
+
next
|
229
|
+
end
|
230
|
+
|
231
|
+
if opts.clear?
|
232
|
+
Pry.history.clear
|
233
|
+
output.puts 'History cleared.'
|
234
|
+
next
|
189
235
|
end
|
190
236
|
|
191
237
|
# FIXME: hack to save history (this must be refactored)
|
@@ -214,11 +260,18 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
|
|
214
260
|
end
|
215
261
|
|
216
262
|
output.puts "... history saved."
|
263
|
+
next
|
217
264
|
end
|
218
265
|
|
266
|
+
lines = history.join("\n")
|
267
|
+
if opts.n?
|
268
|
+
stagger_output lines
|
269
|
+
else
|
270
|
+
stagger_output text.with_line_numbers(lines, 0)
|
271
|
+
end
|
219
272
|
end
|
220
273
|
|
221
|
-
alias_command "history", "hist"
|
274
|
+
alias_command "history", "hist"
|
222
275
|
|
223
276
|
helpers do
|
224
277
|
def one_index_number(line_number)
|