pry 0.9.3pre1-i386-mswin32 → 0.9.4-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/CHANGELOG +53 -0
  2. data/CONTRIBUTORS +13 -0
  3. data/README.markdown +4 -2
  4. data/Rakefile +17 -3
  5. data/TODO +22 -0
  6. data/lib/pry.rb +102 -24
  7. data/lib/pry/command_context.rb +12 -0
  8. data/lib/pry/command_processor.rb +50 -19
  9. data/lib/pry/command_set.rb +17 -7
  10. data/lib/pry/completion.rb +6 -6
  11. data/lib/pry/config.rb +6 -2
  12. data/lib/pry/default_commands/basic.rb +8 -4
  13. data/lib/pry/default_commands/context.rb +84 -36
  14. data/lib/pry/default_commands/documentation.rb +50 -30
  15. data/lib/pry/default_commands/easter_eggs.rb +5 -0
  16. data/lib/pry/default_commands/input.rb +20 -16
  17. data/lib/pry/default_commands/introspection.rb +61 -77
  18. data/lib/pry/default_commands/ls.rb +22 -14
  19. data/lib/pry/default_commands/shell.rb +32 -17
  20. data/lib/pry/extended_commands/user_command_api.rb +32 -1
  21. data/lib/pry/helpers/base_helpers.rb +21 -9
  22. data/lib/pry/helpers/command_helpers.rb +99 -17
  23. data/lib/pry/helpers/text.rb +12 -11
  24. data/lib/pry/history.rb +61 -0
  25. data/lib/pry/plugins.rb +19 -8
  26. data/lib/pry/pry_class.rb +49 -60
  27. data/lib/pry/pry_instance.rb +122 -119
  28. data/lib/pry/version.rb +1 -1
  29. data/pry.gemspec +15 -14
  30. data/test/helper.rb +31 -0
  31. data/test/test_command_processor.rb +8 -87
  32. data/test/test_command_set.rb +40 -2
  33. data/test/test_completion.rb +26 -0
  34. data/test/test_default_commands/test_context.rb +185 -1
  35. data/test/test_default_commands/test_documentation.rb +10 -0
  36. data/test/test_default_commands/test_input.rb +39 -13
  37. data/test/test_default_commands/test_introspection.rb +11 -1
  38. data/test/test_default_commands/test_shell.rb +18 -0
  39. data/test/test_pry.rb +217 -47
  40. data/test/test_pry_history.rb +84 -0
  41. data/test/test_pry_output.rb +44 -0
  42. data/test/test_special_locals.rb +35 -0
  43. metadata +83 -77
@@ -10,10 +10,15 @@ class Pry
10
10
  attr_accessor :hooks
11
11
  attr_accessor :custom_completions
12
12
 
13
- # Returns the target binding for the session. Note that altering this
14
- # attribute will not change the target binding.
15
- # @return [Binding] The target object for the session
16
- attr_accessor :session_target
13
+ attr_accessor :binding_stack
14
+
15
+ attr_accessor :last_result
16
+ attr_accessor :last_exception
17
+ attr_accessor :last_file
18
+ attr_accessor :last_dir
19
+
20
+ attr_reader :input_array
21
+ attr_reader :output_array
17
22
 
18
23
  # Create a new `Pry` object.
19
24
  # @param [Hash] options The optional configuration parameters.
@@ -28,6 +33,7 @@ class Pry
28
33
  refresh(options)
29
34
 
30
35
  @command_processor = CommandProcessor.new(self)
36
+ @binding_stack = []
31
37
  end
32
38
 
33
39
  # Refresh the Pry instance settings from the Pry class.
@@ -73,6 +79,18 @@ class Pry
73
79
  end
74
80
  end
75
81
 
82
+ # Injects a local variable into the provided binding.
83
+ # @param [String] name The name of the local to inject.
84
+ # @param [Object] value The value to set the local to.
85
+ # @param [Binding] b The binding to set the local on.
86
+ # @return [Object] The value the local was set to.
87
+ def inject_local(name, value, b)
88
+ Thread.current[:__pry_local__] = value
89
+ b.eval("#{name} = Thread.current[:__pry_local__]")
90
+ ensure
91
+ Thread.current[:__pry_local__] = nil
92
+ end
93
+
76
94
  # @return [Integer] The maximum amount of objects remembered by the inp and
77
95
  # out arrays. Defaults to 100.
78
96
  def memory_size
@@ -84,32 +102,6 @@ class Pry
84
102
  @output_array = Pry::HistoryArray.new(size)
85
103
  end
86
104
 
87
- # Get nesting data.
88
- # This method should not need to be accessed directly.
89
- # @return [Array] The unparsed nesting information.
90
- def nesting
91
- self.class.nesting
92
- end
93
-
94
- # Set nesting data.
95
- # This method should not need to be accessed directly.
96
- # @param v nesting data.
97
- def nesting=(v)
98
- self.class.nesting = v
99
- end
100
-
101
- # @return [Boolean] Whether top-level session has ended.
102
- def finished_top_level_session?
103
- nesting.empty?
104
- end
105
-
106
- # Return parent of current Pry session.
107
- # @return [Pry] The parent of the current Pry session.
108
- def parent
109
- idx = Pry.sessions.index(self)
110
- Pry.sessions[idx - 1] if idx && idx > 0
111
- end
112
-
113
105
  # Execute the hook `hook_name`, if it is defined.
114
106
  # @param [Symbol] hook_name The hook to execute
115
107
  # @param [Array] args The arguments to pass to the hook.
@@ -117,41 +109,53 @@ class Pry
117
109
  hooks[hook_name].call(*args, &block) if hooks[hook_name]
118
110
  end
119
111
 
112
+ # Make sure special locals exist at start of session
113
+ def initialize_special_locals(target)
114
+ inject_local("_in_", @input_array, target)
115
+ inject_local("_out_", @output_array, target)
116
+ inject_local("_pry_", self, target)
117
+ inject_local("_ex_", nil, target)
118
+ inject_local("_file_", nil, target)
119
+ inject_local("_dir_", nil, target)
120
+
121
+ # without this line we get 1 test failure, ask Mon_Ouie
122
+ set_last_result(nil, target)
123
+ inject_local("_", nil, target)
124
+ end
125
+ private :initialize_special_locals
126
+
127
+ def inject_special_locals(target)
128
+ inject_local("_in_", @input_array, target)
129
+ inject_local("_out_", @output_array, target)
130
+ inject_local("_pry_", self, target)
131
+ inject_local("_ex_", self.last_exception, target)
132
+ inject_local("_file_", self.last_file, target)
133
+ inject_local("_dir_", self.last_dir, target)
134
+ inject_local("_", self.last_result, target)
135
+ end
136
+
120
137
  # Initialize the repl session.
121
138
  # @param [Binding] target The target binding for the session.
122
139
  def repl_prologue(target)
123
- exec_hook :before_session, output, target
124
- Pry.active_instance = self
140
+ exec_hook :before_session, output, target, self
141
+ initialize_special_locals(target)
125
142
 
126
- # Make sure special locals exist
127
- target.eval("inp = ::Pry.active_instance.instance_eval { @input_array }")
128
- target.eval("out = ::Pry.active_instance.instance_eval { @output_array }")
129
-
130
- set_active_instance(target)
131
143
  @input_array << nil # add empty input so inp and out match
132
- set_last_result(Pry.last_result, target)
133
144
 
134
- self.session_target = target
145
+ Pry.active_sessions += 1
146
+ binding_stack.push target
135
147
  end
136
148
 
137
149
  # Clean-up after the repl session.
138
150
  # @param [Binding] target The target binding for the session.
139
151
  # @return [Object] The return value of the repl session (if one exists).
140
- def repl_epilogue(target, nesting_level, break_data)
141
- nesting.pop
142
- exec_hook :after_session, output, target
143
-
144
- # If break_data is an array, then the last element is the return value
145
- break_level, return_value = Array(break_data)
146
-
147
- # keep throwing until we reach the desired nesting level
148
- if nesting_level != break_level
149
- throw :breakout, break_data
150
- end
151
-
152
- save_history if Pry.config.history.should_save && finished_top_level_session?
152
+ def repl_epilogue(target, break_data)
153
+ exec_hook :after_session, output, target, self
153
154
 
154
- return_value
155
+ Pry.active_sessions -= 1
156
+ binding_stack.pop
157
+ Pry.save_history if Pry.config.history.should_save && Pry.active_sessions == 0
158
+ break_data
155
159
  end
156
160
 
157
161
  # Start a read-eval-print-loop.
@@ -168,18 +172,13 @@ class Pry
168
172
 
169
173
  repl_prologue(target)
170
174
 
171
- # cannot rely on nesting.level as
172
- # nesting.level changes with new sessions
173
- nesting_level = nesting.size
174
-
175
175
  break_data = catch(:breakout) do
176
- nesting.push [nesting.size, target_self, self]
177
176
  loop do
178
- rep(target)
177
+ rep(binding_stack.last)
179
178
  end
180
179
  end
181
180
 
182
- return_value = repl_epilogue(target, nesting_level, break_data)
181
+ return_value = repl_epilogue(target, break_data)
183
182
  return_value || target_self
184
183
  end
185
184
 
@@ -211,29 +210,18 @@ class Pry
211
210
  Readline.completion_proc = Pry::InputCompleter.build_completion_proc target, instance_eval(&custom_completions)
212
211
  end
213
212
 
214
- # save the pry instance to active_instance
215
- Pry.active_instance = self
216
-
217
- target.eval("inp = ::Pry.active_instance.instance_eval { @input_array }")
218
- target.eval("out = ::Pry.active_instance.instance_eval { @output_array }")
219
-
220
- @last_result_is_exception = false
221
- set_active_instance(target)
213
+ # It's not actually redundant to inject them continually as we may have
214
+ # moved into the scope of a new Binding (e.g the user typed `cd`)
215
+ inject_special_locals(target)
222
216
 
223
217
  code = r(target)
224
218
 
225
- Pry.line_buffer.push(*code.each_line)
226
- res = set_last_result(target.eval(code, Pry.eval_path, Pry.current_line), target)
227
- res
228
- rescue SystemExit => e
229
- exit
230
- rescue Exception => e
231
- @last_result_is_exception = true
232
- @output_array << e
219
+ result = set_last_result(target.eval(code, Pry.eval_path, Pry.current_line), target)
220
+ result
221
+ rescue RescuableException => e
233
222
  set_last_exception(e, target)
234
223
  ensure
235
- @input_array << code
236
- Pry.current_line += code.each_line.count if code
224
+ update_input_history(code)
237
225
  end
238
226
 
239
227
  # Perform a read.
@@ -258,7 +246,7 @@ class Pry
258
246
  break if valid_expression?(eval_string)
259
247
  end
260
248
 
261
- @suppress_output = true if eval_string =~ /;\Z/ || null_input?(val)
249
+ @suppress_output = true if eval_string =~ /;\Z/ || eval_string.empty?
262
250
 
263
251
  eval_string
264
252
  end
@@ -270,14 +258,19 @@ class Pry
270
258
  else
271
259
  print.call output, result
272
260
  end
273
- end
274
-
275
- # Returns true if input is "" and a command is not returning a
276
- # value.
277
- # @param [String] val The input string.
278
- # @return [Boolean] Whether the input is null.
279
- def null_input?(val)
280
- val.empty? && !Pry.cmd_ret_value
261
+ rescue RescuableException => e
262
+ # Being uber-paranoid here, given that this exception arose because we couldn't
263
+ # serialize something in the user's program, let's not assume we can serialize
264
+ # the exception either.
265
+ begin
266
+ output.puts "output error: #{e.inspect}"
267
+ rescue RescuableException => e
268
+ if last_result_is_exception?
269
+ output.puts "output error: failed to show exception"
270
+ else
271
+ output.puts "output error: failed to show result"
272
+ end
273
+ end
281
274
  end
282
275
 
283
276
  # Read a line of input and check for ^d, also determine prompt to use.
@@ -289,13 +282,14 @@ class Pry
289
282
  current_prompt = select_prompt(eval_string.empty?, target.eval('self'))
290
283
  val = readline(current_prompt)
291
284
 
292
- # exit session if we receive EOF character
285
+ # exit session if we receive EOF character (^D)
293
286
  if !val
294
- output.puts
295
- throw(:breakout, nesting.level)
287
+ output.puts ""
288
+ Pry.config.control_d_handler.call(eval_string, self)
289
+ ""
290
+ else
291
+ val
296
292
  end
297
-
298
- val
299
293
  end
300
294
 
301
295
  # Process the line received.
@@ -304,12 +298,23 @@ class Pry
304
298
  # @param [String] eval_string The cumulative lines of input.
305
299
  # @param [Binding] target The target of the Pry session.
306
300
  def process_line(val, eval_string, target)
307
- Pry.cmd_ret_value = @command_processor.process_commands(val, eval_string, target)
301
+ result = @command_processor.process_commands(val, eval_string, target)
302
+
303
+ # set a temporary (just so we can inject the value we want into eval_string)
304
+ Thread.current[:__pry_cmd_result__] = result
308
305
 
309
- if Pry.cmd_ret_value
310
- eval_string << "Pry.cmd_ret_value\n"
306
+ # note that `result` wraps the result of command processing; if a
307
+ # command was matched and invoked then `result.command?` returns true,
308
+ # otherwise it returns false.
309
+ if result.command? && !result.void_command?
310
+
311
+ # the command that was invoked was non-void (had a return value) and so we make
312
+ # the value of the current expression equal to the return value
313
+ # of the command.
314
+ eval_string.replace "Thread.current[:__pry_cmd_result__].retval\n"
311
315
  else
312
- # only commands (with no ret_value) should have an empty `val` so this ignores their result
316
+ # only commands should have an empty `val`
317
+ # so this ignores their result
313
318
  eval_string << "#{val.rstrip}\n" if !val.empty?
314
319
  end
315
320
  end
@@ -319,9 +324,10 @@ class Pry
319
324
  # @param [Object] result The result.
320
325
  # @param [Binding] target The binding to set `_` on.
321
326
  def set_last_result(result, target)
322
- Pry.last_result = result
327
+ @last_result_is_exception = false
323
328
  @output_array << result
324
- target.eval("_ = ::Pry.last_result")
329
+
330
+ self.last_result = result
325
331
  end
326
332
 
327
333
  # Set the last exception for a session.
@@ -336,16 +342,22 @@ class Pry
336
342
  ex.backtrace.first =~ /(.*):(\d+)/
337
343
  ex.file, ex.line = $1, $2.to_i
338
344
 
339
- Pry.last_exception = ex
340
- target.eval("_ex_ = ::Pry.last_exception")
345
+ @last_result_is_exception = true
346
+ @output_array << ex
347
+
348
+ self.last_exception = ex
341
349
  end
342
350
 
343
- # Set the active instance for a session.
351
+ # Update Pry's internal state after evalling code.
344
352
  # This method should not need to be invoked directly.
345
- # @param [Binding] target The binding to set `_ex_` on.
346
- def set_active_instance(target)
347
- Pry.active_instance = self
348
- target.eval("_pry_ = ::Pry.active_instance")
353
+ # @param [String] code The code we just eval'd
354
+ def update_input_history(code)
355
+ # Always push to the @input_array as the @output_array is always pushed to.
356
+ @input_array << code
357
+ if code
358
+ Pry.line_buffer.push(*code.each_line)
359
+ Pry.current_line += code.each_line.count
360
+ end
349
361
  end
350
362
 
351
363
  # @return [Boolean] True if the last result is an exception that was raised,
@@ -362,10 +374,9 @@ class Pry
362
374
  def readline(current_prompt="> ")
363
375
 
364
376
  if input == Readline
365
-
366
- # Readline must be treated differently
367
- # as it has a second parameter.
368
- input.readline(current_prompt, true)
377
+ line = input.readline(current_prompt, false)
378
+ Pry.history << line.dup if line
379
+ line
369
380
  else
370
381
  begin
371
382
  if input.method(:readline).arity == 1
@@ -389,14 +400,6 @@ class Pry
389
400
  !@suppress_output || last_result_is_exception?
390
401
  end
391
402
 
392
- # Save readline history to a file.
393
- def save_history
394
- history_file = File.expand_path(Pry.config.history.file)
395
- File.open(history_file, 'w') do |f|
396
- f.write Readline::HISTORY.to_a.join("\n")
397
- end
398
- end
399
-
400
403
  # Returns the appropriate prompt to use.
401
404
  # This method should not need to be invoked directly.
402
405
  # @param [Boolean] first_line Whether this is the first line of input
@@ -406,9 +409,9 @@ class Pry
406
409
  def select_prompt(first_line, target_self)
407
410
 
408
411
  if first_line
409
- Array(prompt).first.call(target_self, nesting.level)
412
+ Array(prompt).first.call(target_self, binding_stack.size - 1, self)
410
413
  else
411
- Array(prompt).last.call(target_self, nesting.level)
414
+ Array(prompt).last.call(target_self, binding_stack.size - 1, self)
412
415
  end
413
416
  end
414
417
 
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.9.3pre1"
2
+ VERSION = "0.9.4"
3
3
  end
@@ -1,20 +1,21 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.unshift File.expand_path('../lib', __FILE__)
3
- require 'pry/version'
4
2
 
5
3
  Gem::Specification.new do |s|
6
4
  s.name = %q{pry}
7
- s.version = Pry::VERSION
5
+ s.version = "0.9.4pre1"
8
6
 
9
7
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
10
8
  s.authors = [%q{John Mair (banisterfiend)}]
11
- s.description = %q{an IRB alternative and runtime developer console}
9
+ s.date = %q{2011-09-07}
10
+ s.description = %q{An IRB alternative and runtime developer console}
12
11
  s.email = %q{jrmair@gmail.com}
13
12
  s.executables = [%q{pry}]
14
- s.files = [%q{.document}, %q{.gemtest}, %q{.gitignore}, %q{.yardopts}, %q{CHANGELOG}, %q{LICENSE}, %q{README.markdown}, %q{Rakefile}, %q{TODO}, %q{bin/pry}, %q{examples/example_basic.rb}, %q{examples/example_command_override.rb}, %q{examples/example_commands.rb}, %q{examples/example_hooks.rb}, %q{examples/example_image_edit.rb}, %q{examples/example_input.rb}, %q{examples/example_input2.rb}, %q{examples/example_output.rb}, %q{examples/example_print.rb}, %q{examples/example_prompt.rb}, %q{examples/helper.rb}, %q{lib/pry.rb}, %q{lib/pry/command_context.rb}, %q{lib/pry/command_processor.rb}, %q{lib/pry/command_set.rb}, %q{lib/pry/commands.rb}, %q{lib/pry/completion.rb}, %q{lib/pry/config.rb}, %q{lib/pry/core_extensions.rb}, %q{lib/pry/custom_completions.rb}, %q{lib/pry/default_commands/basic.rb}, %q{lib/pry/default_commands/context.rb}, %q{lib/pry/default_commands/documentation.rb}, %q{lib/pry/default_commands/easter_eggs.rb}, %q{lib/pry/default_commands/gems.rb}, %q{lib/pry/default_commands/input.rb}, %q{lib/pry/default_commands/introspection.rb}, %q{lib/pry/default_commands/ls.rb}, %q{lib/pry/default_commands/shell.rb}, %q{lib/pry/extended_commands/experimental.rb}, %q{lib/pry/extended_commands/user_command_api.rb}, %q{lib/pry/helpers.rb}, %q{lib/pry/helpers/base_helpers.rb}, %q{lib/pry/helpers/command_helpers.rb}, %q{lib/pry/helpers/text.rb}, %q{lib/pry/history_array.rb}, %q{lib/pry/plugins.rb}, %q{lib/pry/pry_class.rb}, %q{lib/pry/pry_instance.rb}, %q{lib/pry/version.rb}, %q{pry.gemspec}, %q{test/helper.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_processor.rb}, %q{test/test_command_set.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_history_array.rb}, %q{test/test_pry.rb}, %q{test/testrc}, %q{wiki/Customizing-pry.md}, %q{wiki/Home.md}]
15
- s.homepage = %q{http://banisterfiend.wordpress.com}
16
- s.summary = %q{an IRB alternative and runtime developer console}
17
- s.test_files = [%q{test/helper.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_processor.rb}, %q{test/test_command_set.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_history_array.rb}, %q{test/test_pry.rb}, %q{test/testrc}]
13
+ s.files = [%q{.document}, %q{.gemtest}, %q{.gitignore}, %q{.yardopts}, %q{CHANGELOG}, %q{CONTRIBUTORS}, %q{LICENSE}, %q{README.markdown}, %q{Rakefile}, %q{TODO}, %q{bin/pry}, %q{examples/example_basic.rb}, %q{examples/example_command_override.rb}, %q{examples/example_commands.rb}, %q{examples/example_hooks.rb}, %q{examples/example_image_edit.rb}, %q{examples/example_input.rb}, %q{examples/example_input2.rb}, %q{examples/example_output.rb}, %q{examples/example_print.rb}, %q{examples/example_prompt.rb}, %q{examples/helper.rb}, %q{lib/pry.rb}, %q{lib/pry/command_context.rb}, %q{lib/pry/command_processor.rb}, %q{lib/pry/command_set.rb}, %q{lib/pry/commands.rb}, %q{lib/pry/completion.rb}, %q{lib/pry/config.rb}, %q{lib/pry/core_extensions.rb}, %q{lib/pry/custom_completions.rb}, %q{lib/pry/default_commands/basic.rb}, %q{lib/pry/default_commands/context.rb}, %q{lib/pry/default_commands/documentation.rb}, %q{lib/pry/default_commands/easter_eggs.rb}, %q{lib/pry/default_commands/gems.rb}, %q{lib/pry/default_commands/input.rb}, %q{lib/pry/default_commands/introspection.rb}, %q{lib/pry/default_commands/ls.rb}, %q{lib/pry/default_commands/shell.rb}, %q{lib/pry/extended_commands/experimental.rb}, %q{lib/pry/extended_commands/user_command_api.rb}, %q{lib/pry/helpers.rb}, %q{lib/pry/helpers/base_helpers.rb}, %q{lib/pry/helpers/command_helpers.rb}, %q{lib/pry/helpers/text.rb}, %q{lib/pry/history.rb}, %q{lib/pry/history_array.rb}, %q{lib/pry/plugins.rb}, %q{lib/pry/pry_class.rb}, %q{lib/pry/pry_instance.rb}, %q{lib/pry/version.rb}, %q{pry.gemspec}, %q{test/helper.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_processor.rb}, %q{test/test_command_set.rb}, %q{test/test_completion.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_default_commands/test_shell.rb}, %q{test/test_history_array.rb}, %q{test/test_pry.rb}, %q{test/test_pry_history.rb}, %q{test/test_pry_output.rb}, %q{test/test_special_locals.rb}, %q{test/testrc}, %q{wiki/Customizing-pry.md}, %q{wiki/Home.md}]
14
+ s.homepage = %q{http://pry.github.com}
15
+ s.require_paths = [%q{lib}]
16
+ s.rubygems_version = %q{1.8.6}
17
+ s.summary = %q{An IRB alternative and runtime developer console}
18
+ s.test_files = [%q{test/helper.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_processor.rb}, %q{test/test_command_set.rb}, %q{test/test_completion.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_default_commands/test_shell.rb}, %q{test/test_history_array.rb}, %q{test/test_pry.rb}, %q{test/test_pry_history.rb}, %q{test/test_pry_output.rb}, %q{test/test_special_locals.rb}, %q{test/testrc}]
18
19
 
19
20
  if s.respond_to? :specification_version then
20
21
  s.specification_version = 3
@@ -22,23 +23,23 @@ Gem::Specification.new do |s|
22
23
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
23
24
  s.add_runtime_dependency(%q<ruby_parser>, [">= 2.0.5"])
24
25
  s.add_runtime_dependency(%q<coderay>, [">= 0.9.8"])
25
- s.add_runtime_dependency(%q<slop>, ["~> 1.7.0"])
26
- s.add_runtime_dependency(%q<method_source>, [">= 0.4.0"])
26
+ s.add_runtime_dependency(%q<slop>, ["~> 2.1.0"])
27
+ s.add_runtime_dependency(%q<method_source>, [">= 0.6.0"])
27
28
  s.add_development_dependency(%q<bacon>, [">= 1.1.0"])
28
29
  s.add_development_dependency(%q<open4>, ["~> 1.0.1"])
29
30
  else
30
31
  s.add_dependency(%q<ruby_parser>, [">= 2.0.5"])
31
32
  s.add_dependency(%q<coderay>, [">= 0.9.8"])
32
- s.add_dependency(%q<slop>, ["~> 1.7.0"])
33
- s.add_dependency(%q<method_source>, [">= 0.4.0"])
33
+ s.add_dependency(%q<slop>, ["~> 2.1.0"])
34
+ s.add_dependency(%q<method_source>, [">= 0.6.0"])
34
35
  s.add_dependency(%q<bacon>, [">= 1.1.0"])
35
36
  s.add_dependency(%q<open4>, ["~> 1.0.1"])
36
37
  end
37
38
  else
38
39
  s.add_dependency(%q<ruby_parser>, [">= 2.0.5"])
39
40
  s.add_dependency(%q<coderay>, [">= 0.9.8"])
40
- s.add_dependency(%q<slop>, ["~> 1.7.0"])
41
- s.add_dependency(%q<method_source>, [">= 0.4.0"])
41
+ s.add_dependency(%q<slop>, ["~> 2.1.0"])
42
+ s.add_dependency(%q<method_source>, [">= 0.6.0"])
42
43
  s.add_dependency(%q<bacon>, [">= 1.1.0"])
43
44
  s.add_dependency(%q<open4>, ["~> 1.0.1"])
44
45
  end
@@ -25,13 +25,33 @@ class << Pry
25
25
  end
26
26
  end
27
27
 
28
+ # are we on Jruby platform?
29
+ def jruby?
30
+ defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
31
+ end
32
+
33
+ # are we on rbx platform?
34
+ def rbx?
35
+ defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /rbx/
36
+ end
37
+
28
38
  Pry.reset_defaults
29
39
 
40
+ # this is to test exception code (cat --ex)
41
+ def broken_method
42
+ this method is broken
43
+ end
44
+
30
45
  # sample doc
31
46
  def sample_method
32
47
  :sample
33
48
  end
34
49
 
50
+ # another sample doc
51
+ def another_sample_method
52
+ :another_sample
53
+ end
54
+
35
55
  def redirect_pry_io(new_in, new_out)
36
56
  old_in = Pry.input
37
57
  old_out = Pry.output
@@ -46,6 +66,17 @@ def redirect_pry_io(new_in, new_out)
46
66
  end
47
67
  end
48
68
 
69
+ def mock_pry(*args)
70
+ input = InputTester.new(*args)
71
+ output = StringIO.new
72
+
73
+ redirect_pry_io(input, output) do
74
+ Pry.start
75
+ end
76
+
77
+ output.string
78
+ end
79
+
49
80
  def redirect_global_pry_input(new_io)
50
81
  old_io = Pry.input
51
82
  Pry.input = new_io