pry 0.7.7.2-i386-mswin32 → 0.8.0-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,7 +6,7 @@ class Pry
6
6
 
7
7
  # Implements tab completion for Readline in Pry
8
8
  module InputCompleter
9
-
9
+
10
10
  if Readline.respond_to?("basic_word_break_characters=")
11
11
  Readline.basic_word_break_characters= " \t\n\"\\'`><=;|&{("
12
12
  end
@@ -0,0 +1,6 @@
1
+ class Pry
2
+
3
+ # This proc will be instance_eval's against the active Pry instance
4
+ DEFAULT_CUSTOM_COMPLETIONS = proc { commands.commands.keys }
5
+ FILE_COMPLETIONS = proc { commands.commands.keys + Dir.entries('.') }
6
+ end
data/lib/pry/hooks.rb CHANGED
@@ -2,20 +2,16 @@ class Pry
2
2
 
3
3
  # The default hooks - display messages when beginning and ending Pry sessions.
4
4
  DEFAULT_HOOKS = {
5
-
6
- :before_session => proc do |out, target|
7
- out.puts "Beginning Pry session for #{Pry.view_clip(target.eval('self'))}"
8
5
 
6
+ :before_session => proc do |out, target|
9
7
  # ensure we're actually in a method
10
8
  meth_name = target.eval('__method__')
11
9
  file = target.eval('__FILE__')
12
10
 
13
11
  # /unknown/ for rbx
14
- if file !~ /(\(.*\))|<.*>/ && file !~ /__unknown__/ && file != ""
15
- Pry.run_command "whereami", :output => out, :show_output => true, :context => target, :commands => Pry::Commands
12
+ if file !~ /(\(.*\))|<.*>/ && file !~ /__unknown__/ && file != "" && file != "-e"
13
+ Pry.run_command "whereami 5", :output => out, :show_output => true, :context => target, :commands => Pry::Commands
16
14
  end
17
15
  end,
18
-
19
- :after_session => proc { |out, target| out.puts "Ending Pry session for #{Pry.view_clip(target.eval('self'))}" }
20
16
  }
21
17
  end
data/lib/pry/print.rb CHANGED
@@ -1,19 +1,16 @@
1
1
  class Pry
2
-
3
- # The default print object - only show first line of backtrace and
4
- # prepend output with `=>`
5
2
  DEFAULT_PRINT = proc do |output, value|
6
- case value
7
- when Exception
8
- output.puts "#{value.class}: #{value.message}"
9
- output.puts "from #{value.backtrace.first}"
3
+ if Pry.color
4
+ output.puts "=> #{CodeRay.scan(Pry.view(value), :ruby).term}"
10
5
  else
11
- if Pry.color
12
- output.puts "=> #{CodeRay.scan(Pry.view(value), :ruby).term}"
13
- else
14
- output.puts "=> #{Pry.view(value)}"
15
- end
6
+ output.puts "=> #{Pry.view(value)}"
16
7
  end
17
8
  end
9
+
10
+ # Will only show the first line of the backtrace
11
+ DEFAULT_EXCEPTION_HANDLER = proc do |output, exception|
12
+ output.puts "#{exception.class}: #{exception.message}"
13
+ output.puts "from #{exception.backtrace.first}"
14
+ end
18
15
  end
19
-
16
+
data/lib/pry/prompts.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  class Pry
2
2
 
3
-
3
+
4
4
  # The default prompt; includes the target and nesting level
5
5
  DEFAULT_PROMPT = [
6
6
  proc do |target_self, nest_level|
@@ -11,7 +11,7 @@ class Pry
11
11
  "pry(#{Pry.view_clip(target_self)}):#{Pry.view_clip(nest_level)}> "
12
12
  end
13
13
  end,
14
-
14
+
15
15
  proc do |target_self, nest_level|
16
16
  if nest_level == 0
17
17
  "pry(#{Pry.view_clip(target_self)})* "
@@ -23,4 +23,9 @@ class Pry
23
23
 
24
24
  # A simple prompt - doesn't display target or nesting level
25
25
  SIMPLE_PROMPT = [proc { ">> " }, proc { ">* " }]
26
+
27
+ SHELL_PROMPT = [
28
+ proc { |target_self, _| "pry #{Pry.view_clip(target_self)}:#{Dir.pwd} $ " },
29
+ proc { |target_self, _| "pry #{Pry.view_clip(target_self)}:#{Dir.pwd} * " }
30
+ ]
26
31
  end
data/lib/pry/pry_class.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  # @author John Mair (banisterfiend)
2
2
  class Pry
3
3
 
4
- # The RC Files to load.
4
+ # The RC Files to load.
5
5
  RC_FILES = ["~/.pryrc"]
6
-
6
+
7
7
  # class accessors
8
8
  class << self
9
9
 
@@ -49,6 +49,10 @@ class Pry
49
49
  # Pry instances.
50
50
  attr_accessor :print
51
51
 
52
+ # @return [Proc] The Proc to use for printing exceptions by default by all
53
+ # Pry instances.
54
+ attr_accessor :exception_handler
55
+
52
56
  # Get/Set the Hash that defines Pry hooks used by default by all Pry
53
57
  # instances.
54
58
  # @return [Hash] The hooks used by default by all Pry instances.
@@ -57,6 +61,14 @@ class Pry
57
61
  # :after_session => proc { puts "goodbye" }
58
62
  attr_accessor :hooks
59
63
 
64
+
65
+ # Get/Set the Proc that defines extra Readline completions (on top
66
+ # of the ones defined for IRB).
67
+ # @return [Proc] The Proc that defines extra Readline completions (on top
68
+ # @example Add file names to completion list
69
+ # Pry.custom_completions = proc { Dir.entries('.') }
70
+ attr_accessor :custom_completions
71
+
60
72
  # Get the array of Procs to be used for the prompts by default by
61
73
  # all Pry instances.
62
74
  # @return [Array<Proc>] The array of Procs to be used for the
@@ -68,11 +80,15 @@ class Pry
68
80
  attr_accessor :cmd_ret_value
69
81
 
70
82
  # Determines whether colored output is enabled.
71
- # @return [Boolean]
83
+ # @return [Boolean]
72
84
  attr_accessor :color
73
85
 
86
+ # Determines whether paging (of long blocks of text) is enabled.
87
+ # @return [Boolean]
88
+ attr_accessor :pager
89
+
74
90
  # Determines whether the rc file (~/.pryrc) should be loaded.
75
- # @return [Boolean]
91
+ # @return [Boolean]
76
92
  attr_accessor :should_load_rc
77
93
 
78
94
  # Set to true if Pry is invoked from command line using `pry` executable
@@ -93,7 +109,7 @@ class Pry
93
109
  load(file_name) if File.exists?(file_name)
94
110
  end
95
111
  end
96
-
112
+
97
113
  # Start a Pry REPL.
98
114
  # This method also loads the files specified in `Pry::RC_FILES` the
99
115
  # first time it is invoked.
@@ -107,7 +123,7 @@ class Pry
107
123
  load_rc
108
124
  @rc_loaded = true
109
125
  end
110
-
126
+
111
127
  new(options).repl(target)
112
128
  end
113
129
 
@@ -117,11 +133,14 @@ class Pry
117
133
  # @return [String] The string representation of `obj`.
118
134
  def self.view(obj)
119
135
  case obj
120
- when String, Hash, Array, Symbol, nil
136
+ when String, Hash, Array, Symbol, Exception, nil
121
137
  obj.inspect
122
138
  else
123
139
  obj.to_s
124
140
  end
141
+
142
+ rescue NoMethodError
143
+ "unknown"
125
144
  end
126
145
 
127
146
  # A version of `Pry.view` that clips the output to `max_size` chars.
@@ -158,17 +177,18 @@ class Pry
158
177
  def self.run_command(arg_string, options={})
159
178
  name, arg_string = arg_string.split(/\s+/, 2)
160
179
  arg_string = "" if !arg_string
161
-
180
+
162
181
  options = {
163
182
  :context => TOPLEVEL_BINDING,
164
183
  :show_output => false,
165
184
  :output => Pry.output,
166
185
  :commands => Pry.commands
167
186
  }.merge!(options)
168
-
187
+
169
188
  null_output = Object.new.tap { |v| v.instance_eval { def puts(*) end } }
170
-
171
- commands = options[:commands].clone
189
+
190
+ commands = options[:commands]
191
+
172
192
  commands.output = options[:show_output] ? options[:output] : null_output
173
193
  commands.target = Pry.binding_for(options[:context])
174
194
 
@@ -188,8 +208,11 @@ class Pry
188
208
  @commands = Pry::Commands
189
209
  @prompt = DEFAULT_PROMPT
190
210
  @print = DEFAULT_PRINT
211
+ @exception_handler = DEFAULT_EXCEPTION_HANDLER
191
212
  @hooks = DEFAULT_HOOKS
213
+ @custom_completions = DEFAULT_CUSTOM_COMPLETIONS
192
214
  @color = true
215
+ @pager = true
193
216
  @should_load_rc = true
194
217
  @rc_loaded = false
195
218
  @cli = false
@@ -1,8 +1,13 @@
1
+ direc = File.dirname(__FILE__)
2
+
3
+ require "#{direc}/command_processor.rb"
4
+
1
5
  class Pry
2
6
 
3
7
  # The list of configuration options.
4
8
  CONFIG_OPTIONS = [:input, :output, :commands, :print,
5
- :prompt, :hooks]
9
+ :exception_handler, :prompt, :hooks,
10
+ :custom_completions]
6
11
 
7
12
  attr_accessor *CONFIG_OPTIONS
8
13
 
@@ -13,8 +18,8 @@ class Pry
13
18
 
14
19
  # Create a new `Pry` object.
15
20
  # @param [Hash] options The optional configuration parameters.
16
- # @option options [#readline] :input The object to use for input.
17
- # @option options [#puts] :output The object to use for output.
21
+ # @option options [#readline] :input The object to use for input.
22
+ # @option options [#puts] :output The object to use for output.
18
23
  # @option options [Pry::CommandBase] :commands The object to use for commands. (see commands.rb)
19
24
  # @option options [Hash] :hooks The defined hook Procs (see hooks.rb)
20
25
  # @option options [Array<Proc>] :default_prompt The array of Procs to use for the prompts. (see prompts.rb)
@@ -29,6 +34,8 @@ class Pry
29
34
  CONFIG_OPTIONS.each do |key|
30
35
  instance_variable_set("@#{key}", default_options[key])
31
36
  end
37
+
38
+ @command_processor = CommandProcessor.new(self)
32
39
  end
33
40
 
34
41
  # Get nesting data.
@@ -71,8 +78,8 @@ class Pry
71
78
  Pry.active_instance = self
72
79
 
73
80
  # Make sure special locals exist
74
- target.eval("_pry_ = Pry.active_instance")
75
- target.eval("_ = Pry.last_result")
81
+ target.eval("_pry_ = ::Pry.active_instance")
82
+ target.eval("_ = ::Pry.last_result")
76
83
  self.session_target = target
77
84
  end
78
85
 
@@ -85,7 +92,7 @@ class Pry
85
92
 
86
93
  # If break_data is an array, then the last element is the return value
87
94
  break_level, return_value = Array(break_data)
88
-
95
+
89
96
  # keep throwing until we reach the desired nesting level
90
97
  if nesting_level != break_level
91
98
  throw :breakout, break_data
@@ -93,7 +100,7 @@ class Pry
93
100
 
94
101
  return_value
95
102
  end
96
-
103
+
97
104
  # Start a read-eval-print-loop.
98
105
  # If no parameter is given, default to top-level (main).
99
106
  # @param [Object, Binding] target The receiver of the Pry session
@@ -107,7 +114,7 @@ class Pry
107
114
  target_self = target.eval('self')
108
115
 
109
116
  repl_prologue(target)
110
-
117
+
111
118
  # cannot rely on nesting.level as
112
119
  # nesting.level changes with new sessions
113
120
  nesting_level = nesting.size
@@ -123,7 +130,7 @@ class Pry
123
130
 
124
131
  # if one was provided, return the return value
125
132
  return return_value if return_value
126
-
133
+
127
134
  # otherwise return the target_self
128
135
  target_self
129
136
  end
@@ -135,13 +142,17 @@ class Pry
135
142
  # Pry.new.rep(Object.new)
136
143
  def rep(target=TOPLEVEL_BINDING)
137
144
  target = Pry.binding_for(target)
138
- print.call output, re(target)
145
+ result = re(target)
146
+
147
+ show_result(result) if should_print?
139
148
  end
140
149
 
141
150
  # Perform a read-eval
142
151
  # If no parameter is given, default to top-level (main).
143
152
  # @param [Object, Binding] target The receiver of the read-eval-print
144
- # @return [Object] The result of the eval or an `Exception` object in case of error.
153
+ # @return [Object] The result of the eval or an `Exception` object in case of
154
+ # error. In the latter case, you can check whether the exception was raised
155
+ # or is just the result of the expression using #last_result_is_exception?
145
156
  # @example
146
157
  # Pry.new.re(Object.new)
147
158
  def re(target=TOPLEVEL_BINDING)
@@ -149,13 +160,14 @@ class Pry
149
160
 
150
161
  if input == Readline
151
162
  # Readline tab completion
152
- Readline.completion_proc = Pry::InputCompleter.build_completion_proc(target, commands.commands.keys)
163
+ Readline.completion_proc = Pry::InputCompleter.build_completion_proc target, instance_eval(&custom_completions)
153
164
  end
154
165
 
155
-
156
166
  # save the pry instance to active_instance
157
167
  Pry.active_instance = self
158
- target.eval("_pry_ = Pry.active_instance")
168
+ target.eval("_pry_ = ::Pry.active_instance")
169
+
170
+ @last_result_is_exception = false
159
171
 
160
172
  # eval the expression and save to last_result
161
173
  # Do not want __FILE__, __LINE__ here because we need to distinguish
@@ -165,6 +177,7 @@ class Pry
165
177
  rescue SystemExit => e
166
178
  exit
167
179
  rescue Exception => e
180
+ @last_result_is_exception = true
168
181
  set_last_exception(e, target)
169
182
  end
170
183
 
@@ -179,15 +192,38 @@ class Pry
179
192
  # Pry.new.r(Object.new)
180
193
  def r(target=TOPLEVEL_BINDING)
181
194
  target = Pry.binding_for(target)
195
+ @suppress_output = false
182
196
  eval_string = ""
183
197
 
198
+ val = ""
184
199
  loop do
185
200
  val = retrieve_line(eval_string, target)
186
201
  process_line(val, eval_string, target)
187
- break eval_string if valid_expression?(eval_string)
202
+ break if valid_expression?(eval_string)
203
+ end
204
+
205
+ @suppress_output = true if eval_string =~ /;\Z/ || null_input?(val)
206
+
207
+ eval_string
208
+ end
209
+
210
+ # FIXME should delete this method? it's exposing an implementation detail!
211
+ def show_result(result)
212
+ if last_result_is_exception?
213
+ exception_handler.call output, result
214
+ else
215
+ print.call output, result
188
216
  end
189
217
  end
190
218
 
219
+ # Returns true if input is "" and a command is not returning a
220
+ # value.
221
+ # @param [String] val The input string.
222
+ # @return [Boolean] Whether the input is null.
223
+ def null_input?(val)
224
+ val.empty? && !Pry.cmd_ret_value
225
+ end
226
+
191
227
  # Read a line of input and check for ^d, also determine prompt to use.
192
228
  # This method should not need to be invoked directly.
193
229
  # @param [String] eval_string The cumulative lines of input.
@@ -200,9 +236,9 @@ class Pry
200
236
  # exit session if we receive EOF character
201
237
  if !val
202
238
  output.puts
203
- throw(:breakout, nesting.level)
239
+ throw(:breakout, nesting.level)
204
240
  end
205
-
241
+
206
242
  val
207
243
  end
208
244
 
@@ -212,13 +248,13 @@ class Pry
212
248
  # @param [String] eval_string The cumulative lines of input.
213
249
  # @target [Binding] target The target of the Pry session.
214
250
  def process_line(val, eval_string, target)
215
- val.chomp!
216
- Pry.cmd_ret_value = process_commands(val, eval_string, target)
217
-
251
+ val.rstrip!
252
+ Pry.cmd_ret_value = @command_processor.process_commands(val, eval_string, target)
253
+
218
254
  if Pry.cmd_ret_value
219
255
  eval_string << "Pry.cmd_ret_value\n"
220
256
  else
221
- eval_string << "#{val}\n"
257
+ eval_string << "#{val}\n" if !val.empty?
222
258
  end
223
259
  end
224
260
 
@@ -228,7 +264,7 @@ class Pry
228
264
  # @param [Binding] target The binding to set `_` on.
229
265
  def set_last_result(result, target)
230
266
  Pry.last_result = result
231
- target.eval("_ = Pry.last_result")
267
+ target.eval("_ = ::Pry.last_result")
232
268
  end
233
269
 
234
270
  # Set the last exception for a session.
@@ -237,87 +273,14 @@ class Pry
237
273
  # @param [Binding] target The binding to set `_ex_` on.
238
274
  def set_last_exception(ex, target)
239
275
  Pry.last_exception = ex
240
- target.eval("_ex_ = Pry.last_exception")
241
- end
242
-
243
- # Determine whether a Pry command was matched and return command data
244
- # and argument string.
245
- # This method should not need to be invoked directly.
246
- # @param [String] val The line of input.
247
- # @return [Array] The command data and arg string pair
248
- def command_matched(val)
249
- _, cmd_data = commands.commands.find do |name, cmd_data|
250
- /^#{name}(?!\S)(?:\s+(.+))?/ =~ val
251
- end
252
-
253
- [cmd_data, $1]
254
- end
255
-
256
- # Process Pry commands. Pry commands are not Ruby methods and are evaluated
257
- # prior to Ruby expressions.
258
- # Commands can be modified/configured by the user: see `Pry::Commands`
259
- # This method should not need to be invoked directly - it is called
260
- # by `Pry#r`.
261
- # @param [String] val The current line of input.
262
- # @param [String] eval_string The cumulative lines of input for
263
- # multi-line input.
264
- # @param [Binding] target The receiver of the commands.
265
- def process_commands(val, eval_string, target)
266
- def val.clear() replace("") end
267
- def eval_string.clear() replace("") end
268
-
269
- cmd_data, args_string = command_matched(val)
270
-
271
- # no command was matched, so return to caller
272
- return if !cmd_data
273
-
274
- args = args_string ? Shellwords.shellwords(args_string) : []
275
- action = cmd_data[:action]
276
- keep_retval = cmd_data[:keep_retval]
277
-
278
- options = {
279
- :val => val,
280
- :eval_string => eval_string,
281
- :nesting => nesting,
282
- :commands => commands.commands
283
- }
284
-
285
- ret_value = execute_command(target, action, options, *args)
286
-
287
- # return value of block only if :keep_retval is true
288
- ret_value if keep_retval
276
+ target.eval("_ex_ = ::Pry.last_exception")
289
277
  end
290
278
 
291
- # Execute a Pry command.
292
- # This method should not need to be invoked directly.
293
- # @param [Binding] target The target of the Pry session.
294
- # @param [Proc] action The proc that implements the command.
295
- # @param [Hash] options The options to set on the Commands object.
296
- # @param [Array] args The command arguments.
297
- def execute_command(target, action, options, *args)
298
-
299
- # set some useful methods to be used by the action blocks
300
- commands.opts = options
301
- commands.target = target
302
- commands.output = output
303
-
304
- case action.arity <=> 0
305
- when -1
306
-
307
- # Use instance_exec() to make the `opts` method, etc available
308
- ret_val = commands.instance_exec(*args, &action)
309
- when 1, 0
310
-
311
- # ensure that we get the right number of parameters
312
- # since 1.8.7 complains about incorrect arity (1.9.2
313
- # doesn't care)
314
- args_with_corrected_arity = args.values_at *0..(action.arity - 1)
315
- ret_val = commands.instance_exec(*args_with_corrected_arity, &action)
316
- end
317
-
318
- options[:val].clear
319
-
320
- ret_val
279
+ # @return [Boolean] True if the last result is an exception that was raised,
280
+ # as opposed to simply an instance of Exception (like the result of
281
+ # Exception.new)
282
+ def last_result_is_exception?
283
+ @last_result_is_exception
321
284
  end
322
285
 
323
286
  # Returns the next line of input to be used by the pry instance.
@@ -332,14 +295,28 @@ class Pry
332
295
  # as it has a second parameter.
333
296
  input.readline(current_prompt, true)
334
297
  else
335
- if input.method(:readline).arity == 1
336
- input.readline(current_prompt)
337
- else
338
- input.readline
298
+ begin
299
+ if input.method(:readline).arity == 1
300
+ input.readline(current_prompt)
301
+ else
302
+ input.readline
303
+ end
304
+
305
+ rescue EOFError
306
+ self.input = Readline
307
+ ""
339
308
  end
340
309
  end
341
310
  end
342
311
 
312
+ # Whether the print proc should be invoked.
313
+ # Currently only invoked if the output is not suppressed OR the last result
314
+ # is an exception regardless of suppression.
315
+ # @return [Boolean] Whether the print proc should be invoked.
316
+ def should_print?
317
+ !@suppress_output || last_result_is_exception?
318
+ end
319
+
343
320
  # Returns the appropriate prompt to use.
344
321
  # This method should not need to be invoked directly.
345
322
  # @param [Boolean] first_line Whether this is the first line of input
@@ -355,7 +332,7 @@ class Pry
355
332
  end
356
333
  end
357
334
 
358
- if RUBY_VERSION =~ /1.9/
335
+ if RUBY_VERSION =~ /1.9/ && RUBY_ENGINE == "ruby"
359
336
  require 'ripper'
360
337
 
361
338
  # Determine if a string of code is a valid Ruby expression.