pry 0.9.5-i386-mingw32 → 0.9.6-i386-mingw32

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.
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
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
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
- **Note that JRuby is not yet supported in this release, but will be
8
- soon.**
9
-
10
- **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!
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 nearly as powerful as tools like [SLIME](http://en.wikipedia.org/wiki/SLIME) for lisp, but that is the
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
- The Pry team consists of:
392
-
393
- * [banisterfiend](http://github.com/banister)
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
@@ -30,7 +30,7 @@ end
30
30
 
31
31
  desc "Run tests"
32
32
  task :test do
33
- sh "bacon -Itest -rubygems -a"
33
+ sh "bacon -Itest -rubygems -a -q"
34
34
  end
35
35
 
36
36
  desc "run pry"
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
- # run code passed with `-e`, if there is any.
84
- if opts.exec?
85
- Pry.new(:input => StringIO.new(opts[:exec]), :print => proc {}).rep(context)
83
+ if opts[:exec]
84
+ exec_string = opts[:exec] + "\n"
85
+ else
86
+ exec_string = ""
86
87
  end
87
88
 
88
- # start the session
89
- context.pry
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 => ex
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 SystemExit, SignalException
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'
@@ -11,6 +11,7 @@ class Pry
11
11
 
12
12
  attr_accessor :output
13
13
  attr_accessor :target
14
+ attr_accessor :target_self
14
15
  attr_accessor :captures
15
16
  attr_accessor :eval_string
16
17
  attr_accessor :arg_string
@@ -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]
@@ -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 = nil)
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 if 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 = "Usage: show-doc [OPTIONS] [METH 1] [METH 2] [METH N]\n" \
15
- "Show the comments above method METH. Tries instance methods first and then methods by default.\n" \
16
- "e.g show-doc hello_method"
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 "Usage: stat [OPTIONS] [METH]\n" \
60
- "Show method information for method METH and set _file_ and _dir_ locals." \
61
- "e.g: stat hello_method"
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 "Usage: gist-method [OPTIONS] [METH]\n" \
104
- "Gist the method (doc or source) to github.\n" \
105
- "Ensure the `gist` gem is properly working before use. http://github.com/defunkt/gist for instructions.\n" \
106
- "e.g: gist -m my_method\n" \
107
- "e.g: gist -d my_method\n"
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 %{Amend a line of input in multi-line mode. `amend-line N`, where the N in `amend-line N` represents line to replace.
21
-
22
- Can also specify a range of lines using `amend-line N..M` syntax. Passing '!' as replacement content deletes the line(s) instead. Aliases: %N
23
- e.g amend-line 1 puts 'hello world! # replace line 1'
24
- e.g amend-line 1..4 ! # delete lines 1..4
25
- e.g amend-line 3 >puts 'goodbye' # insert before line 3
26
- e.g amend-line puts 'hello again' # no line number modifies immediately preceding line
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 "Usage: play [OPTIONS] [--help]\nDefault action (no options) is to play the provided string variable\ne.g `play _in_[20] --lines 1..3`\ne.g `play -m Pry#repl --lines 1..-1`\ne.g `play -f Rakefile --lines 5`"
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
- _pry_.input = StringIO.new(Array(code.each_line.to_a[range]).join)
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 :g, :grep, 'A pattern to match against the history.', true do |pattern|
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
- history.map!.with_index do |element, index|
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
- stagger_output history.compact.join "\n"
120
- end
124
+ opt.on :head, 'Display the first N items of history.',
125
+ :optional => true,
126
+ :as => Integer
121
127
 
122
- opt.on :head, 'Display the first N items of history',
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
- limit ||= 10
128
- list = history.first limit
129
- lines = text.with_line_numbers list.join("\n"), 0
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 :t, :tail, 'Display the last N items of history',
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
- limit ||= 10
139
- offset = history.size - limit
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
- list = history.last limit
143
- lines = text.with_line_numbers list.join("\n"), offset
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 :s, :show, 'Show the history corresponding to the history line (or range of lines).',
148
- true,
149
- :as => Range,
150
- :unless => :grep do |range|
144
+ opt.on :c, :clear, 'Clear the history.', :unless => :grep
151
145
 
152
- start_line = range.is_a?(Range) ? range.first : range
153
- lines = text.with_line_numbers Array(history[range]).join("\n"), start_line
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
- opt.on :e, :exclude, 'Exclude pry commands from the history.', :unless => :grep do
158
- history.map!.with_index do |element, index|
159
- unless command_processor.valid_command? element
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
- opt.on :r, :replay, 'The line (or range of lines) to replay.',
167
- true,
168
- :as => Range,
169
- :unless => :grep do |range|
170
- actions = Array(history[range]).join("\n") + "\n"
171
- _pry_.input = StringIO.new(actions)
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
- opt.on "save", "Save history to a file. --save [start..end] output.txt. Pry commands are excluded from saved history.", true, :as => Range
182
+ if opts.tail?
183
+ limit = opts['tail'] || 10
184
+ offset = history.size - limit
185
+ offset = offset < 0 ? 0 : offset
175
186
 
176
- opt.on :c, :clear, 'Clear the history', :unless => :grep do
177
- Pry.history.clear
178
- output.puts 'History cleared.'
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
- opt.on :h, :help, 'Show this message.', :tail => true, :unless => :grep do
182
- output.puts opt.help
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
- opt.on_empty do
186
- lines = text.with_line_numbers history.join("\n"), 0
187
- stagger_output lines
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)