pry 0.8.4pre1-i386-mingw32 → 0.9.0-i386-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/.gitignore +1 -0
  2. data/CHANGELOG +25 -6
  3. data/README.markdown +11 -4
  4. data/Rakefile +15 -19
  5. data/TODO +28 -2
  6. data/bin/pry +28 -11
  7. data/examples/example_basic.rb +2 -4
  8. data/examples/example_command_override.rb +2 -5
  9. data/examples/example_commands.rb +1 -4
  10. data/examples/example_hooks.rb +2 -5
  11. data/examples/example_image_edit.rb +4 -8
  12. data/examples/example_input.rb +1 -4
  13. data/examples/example_input2.rb +1 -4
  14. data/examples/example_output.rb +1 -4
  15. data/examples/example_print.rb +2 -5
  16. data/examples/example_prompt.rb +2 -5
  17. data/examples/helper.rb +6 -0
  18. data/lib/pry.rb +59 -3
  19. data/lib/pry/command_context.rb +10 -9
  20. data/lib/pry/command_processor.rb +51 -73
  21. data/lib/pry/command_set.rb +79 -28
  22. data/lib/pry/commands.rb +9 -123
  23. data/lib/pry/completion.rb +30 -29
  24. data/lib/pry/config.rb +100 -0
  25. data/lib/pry/default_commands/basic.rb +37 -0
  26. data/lib/pry/default_commands/context.rb +16 -15
  27. data/lib/pry/default_commands/documentation.rb +73 -54
  28. data/lib/pry/default_commands/easter_eggs.rb +1 -20
  29. data/lib/pry/default_commands/gems.rb +31 -40
  30. data/lib/pry/default_commands/input.rb +223 -15
  31. data/lib/pry/default_commands/introspection.rb +108 -73
  32. data/lib/pry/default_commands/ls.rb +25 -11
  33. data/lib/pry/default_commands/shell.rb +29 -39
  34. data/lib/pry/extended_commands/experimental.rb +17 -0
  35. data/lib/pry/extended_commands/user_command_api.rb +22 -0
  36. data/lib/pry/helpers.rb +1 -0
  37. data/lib/pry/helpers/base_helpers.rb +15 -104
  38. data/lib/pry/helpers/command_helpers.rb +96 -59
  39. data/lib/pry/helpers/text.rb +83 -0
  40. data/lib/pry/history_array.rb +105 -0
  41. data/lib/pry/plugins.rb +79 -0
  42. data/lib/pry/pry_class.rb +102 -114
  43. data/lib/pry/pry_instance.rb +123 -55
  44. data/lib/pry/version.rb +1 -1
  45. data/pry.gemspec +45 -0
  46. data/test/helper.rb +57 -7
  47. data/test/test_command_processor.rb +205 -0
  48. data/test/{test_commandset.rb → test_command_set.rb} +18 -12
  49. data/test/test_default_commands.rb +59 -0
  50. data/test/test_default_commands/test_context.rb +64 -0
  51. data/test/test_default_commands/test_documentation.rb +31 -0
  52. data/test/test_default_commands/test_gems.rb +14 -0
  53. data/test/test_default_commands/test_input.rb +327 -0
  54. data/test/test_default_commands/test_introspection.rb +155 -0
  55. data/test/test_history_array.rb +65 -0
  56. data/test/test_pry.rb +548 -313
  57. metadata +48 -15
  58. data/lib/pry/hooks.rb +0 -17
  59. data/lib/pry/print.rb +0 -16
  60. data/lib/pry/prompts.rb +0 -31
@@ -2,12 +2,13 @@ require "pry/command_processor.rb"
2
2
 
3
3
  class Pry
4
4
 
5
- # The list of configuration options.
6
- CONFIG_OPTIONS = [:input, :output, :commands, :print,
7
- :exception_handler, :prompt, :hooks,
8
- :custom_completions]
9
-
10
- attr_accessor *CONFIG_OPTIONS
5
+ attr_accessor :input
6
+ attr_accessor :output
7
+ attr_accessor :commands
8
+ attr_accessor :print
9
+ attr_accessor :exception_handler
10
+ attr_accessor :hooks
11
+ attr_accessor :custom_completions
11
12
 
12
13
  # Returns the target binding for the session. Note that altering this
13
14
  # attribute will not change the target binding.
@@ -18,22 +19,69 @@ class Pry
18
19
  # @param [Hash] options The optional configuration parameters.
19
20
  # @option options [#readline] :input The object to use for input.
20
21
  # @option options [#puts] :output The object to use for output.
21
- # @option options [Pry::CommandBase] :commands The object to use for commands. (see commands.rb)
22
- # @option options [Hash] :hooks The defined hook Procs (see hooks.rb)
23
- # @option options [Array<Proc>] :default_prompt The array of Procs to use for the prompts. (see prompts.rb)
22
+ # @option options [Pry::CommandBase] :commands The object to use for commands.
23
+ # @option options [Hash] :hooks The defined hook Procs
24
+ # @option options [Array<Proc>] :prompt The array of Procs to use for the prompts.
24
25
  # @option options [Proc] :print The Proc to use for the 'print'
25
26
  # component of the REPL. (see print.rb)
26
27
  def initialize(options={})
28
+ refresh(options)
27
29
 
28
- default_options = {}
29
- CONFIG_OPTIONS.each { |v| default_options[v] = Pry.send(v) }
30
- default_options.merge!(options)
30
+ @command_processor = CommandProcessor.new(self)
31
+ end
31
32
 
32
- CONFIG_OPTIONS.each do |key|
33
- send "#{key}=", default_options[key]
33
+ # Refresh the Pry instance settings from the Pry class.
34
+ # Allows options to be specified to override settings from Pry class.
35
+ # @param [Hash] options The options to override Pry class settings
36
+ # for this instance.
37
+ def refresh(options={})
38
+ defaults = {}
39
+ attributes = [
40
+ :input, :output, :commands, :print,
41
+ :exception_handler, :hooks, :custom_completions,
42
+ :prompt, :memory_size
43
+ ]
44
+
45
+ attributes.each do |attribute|
46
+ defaults[attribute] = Pry.send attribute
34
47
  end
35
48
 
36
- @command_processor = CommandProcessor.new(self)
49
+ defaults.merge!(options).each do |key, value|
50
+ send "#{key}=", value
51
+ end
52
+
53
+ true
54
+ end
55
+
56
+ # The current prompt.
57
+ # This is the prompt at the top of the prompt stack.
58
+ #
59
+ # @example
60
+ # self.prompt = Pry::SIMPLE_PROMPT
61
+ # self.prompt # => Pry::SIMPLE_PROMPT
62
+ #
63
+ # @return [Array<Proc>] Current prompt.
64
+ def prompt
65
+ prompt_stack.last
66
+ end
67
+
68
+ def prompt=(new_prompt)
69
+ if prompt_stack.empty?
70
+ push_prompt new_prompt
71
+ else
72
+ prompt_stack[-1] = new_prompt
73
+ end
74
+ end
75
+
76
+ # @return [Integer] The maximum amount of objects remembered by the inp and
77
+ # out arrays. Defaults to 100.
78
+ def memory_size
79
+ @output_array.max_size
80
+ end
81
+
82
+ def memory_size=(size)
83
+ @input_array = Pry::HistoryArray.new(size)
84
+ @output_array = Pry::HistoryArray.new(size)
37
85
  end
38
86
 
39
87
  # Get nesting data.
@@ -50,6 +98,11 @@ class Pry
50
98
  self.class.nesting = v
51
99
  end
52
100
 
101
+ # @return [Boolean] Whether top-level session has ended.
102
+ def finished_top_level_session?
103
+ nesting.empty?
104
+ end
105
+
53
106
  # Return parent of current Pry session.
54
107
  # @return [Pry] The parent of the current Pry session.
55
108
  def parent
@@ -71,8 +124,13 @@ class Pry
71
124
  Pry.active_instance = self
72
125
 
73
126
  # Make sure special locals exist
74
- target.eval("_pry_ = ::Pry.active_instance")
75
- target.eval("_ = ::Pry.last_result")
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
+ @input_array << nil # add empty input so inp and out match
132
+ set_last_result(Pry.last_result, target)
133
+
76
134
  self.session_target = target
77
135
  end
78
136
 
@@ -91,6 +149,8 @@ class Pry
91
149
  throw :breakout, break_data
92
150
  end
93
151
 
152
+ save_history if Pry.config.history.should_save && finished_top_level_session?
153
+
94
154
  return_value
95
155
  end
96
156
 
@@ -153,20 +213,27 @@ class Pry
153
213
 
154
214
  # save the pry instance to active_instance
155
215
  Pry.active_instance = self
156
- target.eval("_pry_ = ::Pry.active_instance")
216
+
217
+ target.eval("inp = ::Pry.active_instance.instance_eval { @input_array }")
218
+ target.eval("out = ::Pry.active_instance.instance_eval { @output_array }")
157
219
 
158
220
  @last_result_is_exception = false
221
+ set_active_instance(target)
222
+
223
+ code = r(target)
159
224
 
160
- # eval the expression and save to last_result
161
- # Do not want __FILE__, __LINE__ here because we need to distinguish
162
- # (eval) methods for show-method and friends.
163
- # This also sets the `_` local for the session.
164
- set_last_result(target.eval(r(target)), target)
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
165
228
  rescue SystemExit => e
166
229
  exit
167
230
  rescue Exception => e
168
231
  @last_result_is_exception = true
232
+ @output_array << e
169
233
  set_last_exception(e, target)
234
+ ensure
235
+ @input_array << code
236
+ Pry.current_line += code.each_line.count if code
170
237
  end
171
238
 
172
239
  # Perform a read.
@@ -175,18 +242,19 @@ class Pry
175
242
  # Ruby expression is received.
176
243
  # Pry commands are also accepted here and operate on the target.
177
244
  # @param [Object, Binding] target The receiver of the read.
245
+ # @param [String] eval_string Optionally Prime `eval_string` with a start value.
178
246
  # @return [String] The Ruby expression.
179
247
  # @example
180
248
  # Pry.new.r(Object.new)
181
- def r(target=TOPLEVEL_BINDING)
249
+ def r(target=TOPLEVEL_BINDING, eval_string="")
182
250
  target = Pry.binding_for(target)
183
251
  @suppress_output = false
184
- eval_string = ""
185
252
 
186
253
  val = ""
187
254
  loop do
188
255
  val = retrieve_line(eval_string, target)
189
256
  process_line(val, eval_string, target)
257
+
190
258
  break if valid_expression?(eval_string)
191
259
  end
192
260
 
@@ -195,7 +263,7 @@ class Pry
195
263
  eval_string
196
264
  end
197
265
 
198
- # FIXME should delete this method? it's exposing an implementation detail!
266
+ # Output the result or pass to an exception handler (if result is an exception).
199
267
  def show_result(result)
200
268
  if last_result_is_exception?
201
269
  exception_handler.call output, result
@@ -234,15 +302,15 @@ class Pry
234
302
  # This method should not need to be invoked directly.
235
303
  # @param [String] val The line to process.
236
304
  # @param [String] eval_string The cumulative lines of input.
237
- # @target [Binding] target The target of the Pry session.
305
+ # @param [Binding] target The target of the Pry session.
238
306
  def process_line(val, eval_string, target)
239
- val.rstrip!
240
307
  Pry.cmd_ret_value = @command_processor.process_commands(val, eval_string, target)
241
308
 
242
309
  if Pry.cmd_ret_value
243
310
  eval_string << "Pry.cmd_ret_value\n"
244
311
  else
245
- eval_string << "#{val}\n" if !val.empty?
312
+ # only commands (with no ret_value) should have an empty `val` so this ignores their result
313
+ eval_string << "#{val.rstrip}\n" if !val.empty?
246
314
  end
247
315
  end
248
316
 
@@ -252,6 +320,7 @@ class Pry
252
320
  # @param [Binding] target The binding to set `_` on.
253
321
  def set_last_result(result, target)
254
322
  Pry.last_result = result
323
+ @output_array << result
255
324
  target.eval("_ = ::Pry.last_result")
256
325
  end
257
326
 
@@ -260,10 +329,25 @@ class Pry
260
329
  # @param [Exception] ex The exception.
261
330
  # @param [Binding] target The binding to set `_ex_` on.
262
331
  def set_last_exception(ex, target)
332
+ class << ex
333
+ attr_accessor :file, :line
334
+ end
335
+
336
+ ex.backtrace.first =~ /(.*):(\d+)/
337
+ ex.file, ex.line = $1, $2.to_i
338
+
263
339
  Pry.last_exception = ex
264
340
  target.eval("_ex_ = ::Pry.last_exception")
265
341
  end
266
342
 
343
+ # Set the active instance for a session.
344
+ # 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")
349
+ end
350
+
267
351
  # @return [Boolean] True if the last result is an exception that was raised,
268
352
  # as opposed to simply an instance of Exception (like the result of
269
353
  # Exception.new)
@@ -291,7 +375,7 @@ class Pry
291
375
  end
292
376
 
293
377
  rescue EOFError
294
- self.input = Readline
378
+ self.input = Pry.input
295
379
  ""
296
380
  end
297
381
  end
@@ -305,6 +389,14 @@ class Pry
305
389
  !@suppress_output || last_result_is_exception?
306
390
  end
307
391
 
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
+
308
400
  # Returns the appropriate prompt to use.
309
401
  # This method should not need to be invoked directly.
310
402
  # @param [Boolean] first_line Whether this is the first line of input
@@ -326,30 +418,6 @@ class Pry
326
418
  end
327
419
  private :prompt_stack
328
420
 
329
- # The current prompt, this is the prompt at the top of the prompt stack.
330
- # @return [Array<Proc>] Current prompt.
331
- # @example
332
- # push_prompt(Pry::SIMPLE_PROMPT)
333
- # prompt # => Pry::SIMPLE_PROMPT
334
- def prompt
335
- prompt_stack.last
336
- end
337
-
338
- # Replaces the current prompt with the new prompt.
339
- # Does not change the rest of the prompt stack.
340
- # @param [Array<Proc>] new_prompt
341
- # @return [Array<Proc>] new_prompt
342
- # @example
343
- # pry.prompt = Pry::SIMPLE_PROMPT # => Pry::SIMPLE_PROMPT
344
- # pry.prompt # => Pry::SIMPLE_PROMPT
345
- def prompt=(new_prompt)
346
- if prompt_stack.empty?
347
- push_prompt new_prompt
348
- else
349
- prompt_stack[-1] = new_prompt
350
- end
351
- end
352
-
353
421
  # Pushes the current prompt onto a stack that it can be restored from later.
354
422
  # Use this if you wish to temporarily change the prompt.
355
423
  # @param [Array<Proc>] new_prompt
@@ -374,7 +442,7 @@ class Pry
374
442
  # pry.pop_prompt # => prompt1
375
443
  # pry.pop_prompt # => prompt1
376
444
  def pop_prompt
377
- if prompt_stack.size > 1 then prompt_stack.pop else prompt end
445
+ prompt_stack.size > 1 ? prompt_stack.pop : prompt
378
446
  end
379
447
 
380
448
  if RUBY_VERSION =~ /1.9/ && RUBY_ENGINE == "ruby"
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.8.4pre1"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -0,0 +1,45 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.unshift File.expand_path('../lib', __FILE__)
3
+ require 'pry/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = %q{pry}
7
+ s.version = Pry::VERSION
8
+
9
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
10
+ s.authors = [%q{John Mair (banisterfiend)}]
11
+ s.description = %q{an IRB alternative and runtime developer console}
12
+ s.email = %q{jrmair@gmail.com}
13
+ 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}]
18
+
19
+ if s.respond_to? :specification_version then
20
+ s.specification_version = 3
21
+
22
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
23
+ s.add_runtime_dependency(%q<ruby_parser>, [">= 2.0.5"])
24
+ 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"])
27
+ s.add_development_dependency(%q<bacon>, [">= 1.1.0"])
28
+ s.add_development_dependency(%q<open4>, ["~> 1.0.1"])
29
+ else
30
+ s.add_dependency(%q<ruby_parser>, [">= 2.0.5"])
31
+ 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"])
34
+ s.add_dependency(%q<bacon>, [">= 1.1.0"])
35
+ s.add_dependency(%q<open4>, ["~> 1.0.1"])
36
+ end
37
+ else
38
+ s.add_dependency(%q<ruby_parser>, [">= 2.0.5"])
39
+ 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"])
42
+ s.add_dependency(%q<bacon>, [">= 1.1.0"])
43
+ s.add_dependency(%q<open4>, ["~> 1.0.1"])
44
+ end
45
+ end
@@ -4,24 +4,74 @@ unless Object.const_defined? 'Pry'
4
4
  end
5
5
 
6
6
  require 'bacon'
7
+ require 'open4'
7
8
 
8
9
  # Ensure we do not execute any rc files
9
10
  Pry::RC_FILES.clear
10
- Pry.color = false
11
- Pry.should_load_rc = false
12
-
13
- class Module
14
- public :remove_const
15
- end
16
11
 
12
+ # in case the tests call reset_defaults, ensure we reset them to
13
+ # amended (test friendly) values
17
14
  class << Pry
18
15
  alias_method :orig_reset_defaults, :reset_defaults
19
16
  def reset_defaults
20
17
  orig_reset_defaults
18
+
21
19
  Pry.color = false
20
+ Pry.pager = false
21
+ Pry.config.should_load_rc = false
22
+ Pry.config.plugins.enabled = false
23
+ Pry.config.history.should_load = false
24
+ Pry.config.history.should_save = false
22
25
  end
23
26
  end
24
27
 
28
+ Pry.reset_defaults
29
+
30
+ # sample doc
31
+ def sample_method
32
+ :sample
33
+ end
34
+
35
+ def redirect_pry_io(new_in, new_out)
36
+ old_in = Pry.input
37
+ old_out = Pry.output
38
+
39
+ Pry.input = new_in
40
+ Pry.output = new_out
41
+ begin
42
+ yield
43
+ ensure
44
+ Pry.input = old_in
45
+ Pry.output = old_out
46
+ end
47
+ end
48
+
49
+ def redirect_global_pry_input(new_io)
50
+ old_io = Pry.input
51
+ Pry.input = new_io
52
+ begin
53
+ yield
54
+ ensure
55
+ Pry.input = old_io
56
+ end
57
+ end
58
+
59
+ def redirect_global_pry_output(new_io)
60
+ old_io = Pry.output
61
+ Pry.output = new_io
62
+ begin
63
+ yield
64
+ ensure
65
+ Pry.output = old_io
66
+ end
67
+ end
68
+
69
+ class Module
70
+ public :remove_const
71
+ public :remove_method
72
+ end
73
+
74
+
25
75
  class InputTester
26
76
  def initialize(*actions)
27
77
  @orig_actions = actions.dup
@@ -47,7 +97,7 @@ class Pry
47
97
  end
48
98
 
49
99
 
50
- CommandTester = Pry::CommandSet.new :test do
100
+ CommandTester = Pry::CommandSet.new do
51
101
  command "command1", "command 1 test" do
52
102
  output.puts "command1"
53
103
  end