pry 0.9.5-java → 0.9.6-java

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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.
@@ -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)