pry 0.9.10pre1-i386-mswin32 → 0.9.11-i386-mswin32

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.
Files changed (194) hide show
  1. data/.travis.yml +3 -1
  2. data/CHANGELOG +63 -2
  3. data/CONTRIBUTORS +43 -25
  4. data/Gemfile +7 -0
  5. data/Guardfile +62 -0
  6. data/README.markdown +4 -4
  7. data/Rakefile +34 -35
  8. data/lib/pry.rb +107 -54
  9. data/lib/pry/cli.rb +34 -11
  10. data/lib/pry/code.rb +165 -182
  11. data/lib/pry/code/code_range.rb +70 -0
  12. data/lib/pry/code/loc.rb +92 -0
  13. data/lib/pry/code_object.rb +153 -0
  14. data/lib/pry/command.rb +160 -22
  15. data/lib/pry/command_set.rb +37 -26
  16. data/lib/pry/commands.rb +4 -27
  17. data/lib/pry/commands/amend_line.rb +99 -0
  18. data/lib/pry/commands/bang.rb +20 -0
  19. data/lib/pry/commands/bang_pry.rb +17 -0
  20. data/lib/pry/commands/cat.rb +53 -0
  21. data/lib/pry/commands/cat/abstract_formatter.rb +27 -0
  22. data/lib/pry/commands/cat/exception_formatter.rb +78 -0
  23. data/lib/pry/commands/cat/file_formatter.rb +84 -0
  24. data/lib/pry/commands/cat/input_expression_formatter.rb +43 -0
  25. data/lib/pry/commands/cd.rb +30 -0
  26. data/lib/pry/commands/code_collector.rb +165 -0
  27. data/lib/pry/commands/deprecated_commands.rb +2 -0
  28. data/lib/pry/commands/disable_pry.rb +27 -0
  29. data/lib/pry/commands/easter_eggs.rb +112 -0
  30. data/lib/pry/commands/edit.rb +206 -0
  31. data/lib/pry/commands/edit/exception_patcher.rb +25 -0
  32. data/lib/pry/commands/edit/file_and_line_locator.rb +38 -0
  33. data/lib/pry/commands/edit/method_patcher.rb +122 -0
  34. data/lib/pry/commands/exit.rb +42 -0
  35. data/lib/pry/commands/exit_all.rb +29 -0
  36. data/lib/pry/commands/exit_program.rb +24 -0
  37. data/lib/pry/commands/find_method.rb +199 -0
  38. data/lib/pry/commands/fix_indent.rb +19 -0
  39. data/lib/pry/commands/gem_cd.rb +26 -0
  40. data/lib/pry/commands/gem_install.rb +29 -0
  41. data/lib/pry/commands/gem_list.rb +33 -0
  42. data/lib/pry/commands/gem_open.rb +29 -0
  43. data/lib/pry/commands/gist.rb +95 -0
  44. data/lib/pry/commands/help.rb +164 -0
  45. data/lib/pry/commands/hist.rb +161 -0
  46. data/lib/pry/commands/import_set.rb +22 -0
  47. data/lib/pry/commands/install_command.rb +51 -0
  48. data/lib/pry/commands/jump_to.rb +29 -0
  49. data/lib/pry/commands/ls.rb +339 -0
  50. data/lib/pry/commands/nesting.rb +25 -0
  51. data/lib/pry/commands/play.rb +69 -0
  52. data/lib/pry/commands/pry_backtrace.rb +26 -0
  53. data/lib/pry/commands/pry_version.rb +17 -0
  54. data/lib/pry/commands/raise_up.rb +32 -0
  55. data/lib/pry/commands/reload_code.rb +39 -0
  56. data/lib/pry/commands/reset.rb +18 -0
  57. data/lib/pry/commands/ri.rb +56 -0
  58. data/lib/pry/commands/save_file.rb +61 -0
  59. data/lib/pry/commands/shell_command.rb +43 -0
  60. data/lib/pry/commands/shell_mode.rb +27 -0
  61. data/lib/pry/commands/show_doc.rb +78 -0
  62. data/lib/pry/commands/show_info.rb +139 -0
  63. data/lib/pry/commands/show_input.rb +17 -0
  64. data/lib/pry/commands/show_source.rb +37 -0
  65. data/lib/pry/commands/simple_prompt.rb +22 -0
  66. data/lib/pry/commands/stat.rb +40 -0
  67. data/lib/pry/commands/switch_to.rb +23 -0
  68. data/lib/pry/commands/toggle_color.rb +20 -0
  69. data/lib/pry/commands/whereami.rb +114 -0
  70. data/lib/pry/commands/wtf.rb +57 -0
  71. data/lib/pry/completion.rb +120 -46
  72. data/lib/pry/config.rb +11 -0
  73. data/lib/pry/core_extensions.rb +30 -19
  74. data/lib/pry/editor.rb +129 -0
  75. data/lib/pry/helpers.rb +1 -0
  76. data/lib/pry/helpers/base_helpers.rb +89 -119
  77. data/lib/pry/helpers/command_helpers.rb +7 -122
  78. data/lib/pry/helpers/table.rb +100 -0
  79. data/lib/pry/helpers/text.rb +4 -4
  80. data/lib/pry/history_array.rb +5 -0
  81. data/lib/pry/hooks.rb +1 -3
  82. data/lib/pry/indent.rb +104 -30
  83. data/lib/pry/method.rb +66 -22
  84. data/lib/pry/module_candidate.rb +26 -15
  85. data/lib/pry/pager.rb +70 -0
  86. data/lib/pry/plugins.rb +1 -2
  87. data/lib/pry/pry_class.rb +63 -22
  88. data/lib/pry/pry_instance.rb +58 -37
  89. data/lib/pry/rubygem.rb +74 -0
  90. data/lib/pry/terminal_info.rb +43 -0
  91. data/lib/pry/test/helper.rb +185 -0
  92. data/lib/pry/version.rb +1 -1
  93. data/lib/pry/wrapped_module.rb +58 -24
  94. data/pry.gemspec +21 -37
  95. data/{test/test_cli.rb → spec/cli_spec.rb} +0 -0
  96. data/spec/code_object_spec.rb +277 -0
  97. data/{test/test_code.rb → spec/code_spec.rb} +19 -1
  98. data/{test/test_command_helpers.rb → spec/command_helpers_spec.rb} +0 -0
  99. data/{test/test_command_integration.rb → spec/command_integration_spec.rb} +38 -46
  100. data/{test/test_command_set.rb → spec/command_set_spec.rb} +18 -1
  101. data/{test/test_command.rb → spec/command_spec.rb} +250 -149
  102. data/spec/commands/amend_line_spec.rb +247 -0
  103. data/spec/commands/bang_spec.rb +19 -0
  104. data/spec/commands/cat_spec.rb +164 -0
  105. data/spec/commands/cd_spec.rb +250 -0
  106. data/spec/commands/disable_pry_spec.rb +25 -0
  107. data/spec/commands/edit_spec.rb +727 -0
  108. data/spec/commands/exit_all_spec.rb +34 -0
  109. data/spec/commands/exit_program_spec.rb +19 -0
  110. data/spec/commands/exit_spec.rb +34 -0
  111. data/{test/test_default_commands/test_find_method.rb → spec/commands/find_method_spec.rb} +27 -7
  112. data/spec/commands/gem_list_spec.rb +26 -0
  113. data/spec/commands/gist_spec.rb +75 -0
  114. data/{test/test_default_commands/test_help.rb → spec/commands/help_spec.rb} +8 -9
  115. data/spec/commands/hist_spec.rb +181 -0
  116. data/spec/commands/jump_to_spec.rb +15 -0
  117. data/spec/commands/ls_spec.rb +177 -0
  118. data/spec/commands/play_spec.rb +140 -0
  119. data/spec/commands/raise_up_spec.rb +56 -0
  120. data/spec/commands/save_file_spec.rb +177 -0
  121. data/spec/commands/show_doc_spec.rb +378 -0
  122. data/spec/commands/show_input_spec.rb +17 -0
  123. data/spec/commands/show_source_spec.rb +597 -0
  124. data/spec/commands/whereami_spec.rb +154 -0
  125. data/spec/completion_spec.rb +233 -0
  126. data/spec/control_d_handler_spec.rb +58 -0
  127. data/spec/editor_spec.rb +79 -0
  128. data/{test/test_exception_whitelist.rb → spec/exception_whitelist_spec.rb} +0 -0
  129. data/{test → spec/fixtures}/candidate_helper1.rb +0 -0
  130. data/{test → spec/fixtures}/candidate_helper2.rb +0 -0
  131. data/{test/test_default_commands → spec/fixtures}/example.erb +0 -0
  132. data/spec/fixtures/example_nesting.rb +33 -0
  133. data/spec/fixtures/show_source_doc_examples.rb +15 -0
  134. data/{test → spec/fixtures}/testrc +0 -0
  135. data/{test → spec/fixtures}/testrcbad +0 -0
  136. data/spec/helper.rb +34 -0
  137. data/spec/helpers/bacon.rb +86 -0
  138. data/spec/helpers/mock_pry.rb +43 -0
  139. data/spec/helpers/table_spec.rb +83 -0
  140. data/{test/test_history_array.rb → spec/history_array_spec.rb} +21 -19
  141. data/{test/test_hooks.rb → spec/hooks_spec.rb} +0 -0
  142. data/{test/test_indent.rb → spec/indent_spec.rb} +24 -0
  143. data/{test/test_input_stack.rb → spec/input_stack_spec.rb} +4 -0
  144. data/{test/test_method.rb → spec/method_spec.rb} +65 -1
  145. data/{test/test_prompt.rb → spec/prompt_spec.rb} +0 -0
  146. data/{test/test_pry_defaults.rb → spec/pry_defaults_spec.rb} +14 -14
  147. data/{test/test_pry_history.rb → spec/pry_history_spec.rb} +15 -0
  148. data/spec/pry_output_spec.rb +95 -0
  149. data/{test/test_pry.rb → spec/pry_spec.rb} +74 -32
  150. data/{test/test_sticky_locals.rb → spec/sticky_locals_spec.rb} +27 -25
  151. data/{test/test_syntax_checking.rb → spec/syntax_checking_spec.rb} +17 -1
  152. data/{test/test_wrapped_module.rb → spec/wrapped_module_spec.rb} +92 -5
  153. metadata +239 -115
  154. data/examples/example_basic.rb +0 -15
  155. data/examples/example_command_override.rb +0 -32
  156. data/examples/example_commands.rb +0 -36
  157. data/examples/example_hooks.rb +0 -9
  158. data/examples/example_image_edit.rb +0 -67
  159. data/examples/example_input.rb +0 -7
  160. data/examples/example_input2.rb +0 -29
  161. data/examples/example_output.rb +0 -11
  162. data/examples/example_print.rb +0 -6
  163. data/examples/example_prompt.rb +0 -9
  164. data/examples/helper.rb +0 -6
  165. data/lib/pry/default_commands/cd.rb +0 -81
  166. data/lib/pry/default_commands/commands.rb +0 -62
  167. data/lib/pry/default_commands/context.rb +0 -98
  168. data/lib/pry/default_commands/easter_eggs.rb +0 -95
  169. data/lib/pry/default_commands/editing.rb +0 -420
  170. data/lib/pry/default_commands/find_method.rb +0 -169
  171. data/lib/pry/default_commands/gems.rb +0 -84
  172. data/lib/pry/default_commands/gist.rb +0 -187
  173. data/lib/pry/default_commands/help.rb +0 -127
  174. data/lib/pry/default_commands/hist.rb +0 -120
  175. data/lib/pry/default_commands/input_and_output.rb +0 -306
  176. data/lib/pry/default_commands/introspection.rb +0 -410
  177. data/lib/pry/default_commands/ls.rb +0 -272
  178. data/lib/pry/default_commands/misc.rb +0 -38
  179. data/lib/pry/default_commands/navigating_pry.rb +0 -110
  180. data/lib/pry/default_commands/whereami.rb +0 -92
  181. data/lib/pry/extended_commands/experimental.rb +0 -7
  182. data/test/helper.rb +0 -223
  183. data/test/test_completion.rb +0 -62
  184. data/test/test_control_d_handler.rb +0 -45
  185. data/test/test_default_commands/test_cd.rb +0 -321
  186. data/test/test_default_commands/test_context.rb +0 -288
  187. data/test/test_default_commands/test_documentation.rb +0 -315
  188. data/test/test_default_commands/test_gems.rb +0 -18
  189. data/test/test_default_commands/test_input.rb +0 -428
  190. data/test/test_default_commands/test_introspection.rb +0 -511
  191. data/test/test_default_commands/test_ls.rb +0 -151
  192. data/test/test_default_commands/test_shell.rb +0 -343
  193. data/test/test_default_commands/test_show_source.rb +0 -432
  194. data/test/test_pry_output.rb +0 -41
@@ -0,0 +1,70 @@
1
+ class Pry::Pager
2
+ # @param [String] text
3
+ # A piece of text to run through a pager.
4
+ # @param [Symbol?] pager
5
+ # `:simple` -- Use the pure ruby pager.
6
+ # `:system` -- Use the system pager (less) or the environment variable
7
+ # $PAGER if set.
8
+ # `nil` -- Infer what pager to use from the environment. What this
9
+ # really means is that JRuby and systems that do not have
10
+ # access to 'less' will run through the pure ruby pager.
11
+ def self.page(text, pager = nil)
12
+ case pager
13
+ when nil
14
+ no_pager = !SystemPager.available?
15
+ is_jruby = defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
16
+ (is_jruby || no_pager) ? SimplePager.new(text).page : SystemPager.new(text).page
17
+ when :simple
18
+ SimplePager.new(text).page
19
+ when :system
20
+ SystemPager.new(text).page
21
+ else
22
+ raise "'#{pager}' is not a recognized pager."
23
+ end
24
+ end
25
+
26
+ def self.page_size
27
+ 27
28
+ end
29
+
30
+ def initialize(text)
31
+ @text = text
32
+ end
33
+
34
+ class SimplePager < Pry::Pager
35
+ def page
36
+ text_array = @text.lines.to_a
37
+ text_array.each_slice(Pry::Pager.page_size) do |chunk|
38
+ puts chunk.join
39
+ break if chunk.size < Pry::Pager.page_size
40
+ if text_array.size > Pry::Pager.page_size
41
+ puts "\n<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>"
42
+ break if $stdin.gets.chomp == "q"
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ class SystemPager < Pry::Pager
49
+ def self.default_pager
50
+ ENV["PAGER"] || "less -R -S -F -X"
51
+ end
52
+
53
+ def self.available?
54
+ pager_executable = default_pager.split(' ').first
55
+ `which #{ pager_executable }`
56
+ rescue
57
+ end
58
+
59
+ def initialize(*)
60
+ super
61
+ @pager = SystemPager.default_pager
62
+ end
63
+
64
+ def page
65
+ IO.popen(@pager, 'w') do |io|
66
+ io.write @text
67
+ end
68
+ end
69
+ end
70
+ end
@@ -48,7 +48,7 @@ class Pry
48
48
  begin
49
49
  require gem_name if !active?
50
50
  rescue LoadError => e
51
- warn "Warning: The plugin '#{gem_name}' was not found! (gem found but could not be loaded)"
51
+ warn "Found plugin #{gem_name}, but could not require '#{gem_name}'"
52
52
  warn e
53
53
  end
54
54
 
@@ -99,4 +99,3 @@ class Pry
99
99
  end
100
100
 
101
101
  end
102
-
@@ -5,9 +5,14 @@ require 'pry/config'
5
5
  class Pry
6
6
 
7
7
  # The RC Files to load.
8
- RC_FILES = ["~/.pryrc"]
8
+ HOME_RC_FILE = "~/.pryrc"
9
9
  LOCAL_RC_FILE = "./.pryrc"
10
10
 
11
+ # @return [Hash] Pry's `Thread.current` hash
12
+ def self.current
13
+ Thread.current[:__pry__] ||= {}
14
+ end
15
+
11
16
  # class accessors
12
17
  class << self
13
18
  extend Forwardable
@@ -57,29 +62,28 @@ class Pry
57
62
  :hooks, :color, :pager, :editor, :memory_size, :input_stack, :extra_sticky_locals
58
63
  end
59
64
 
60
-
61
65
  # Load the given file in the context of `Pry.toplevel_binding`
62
66
  # @param [String] file_name The unexpanded file path.
63
67
  def self.load_file_at_toplevel(file_name)
64
68
  full_name = File.expand_path(file_name)
65
69
  begin
66
- toplevel_binding.eval(File.read(full_name)) if File.exists?(full_name)
70
+ toplevel_binding.eval(File.read(full_name), full_name) if File.exists?(full_name)
67
71
  rescue RescuableException => e
68
- puts "Error loading #{file_name}: #{e}"
72
+ puts "Error loading #{file_name}: #{e}\n#{e.backtrace.first}"
69
73
  end
70
74
  end
71
75
 
72
76
  # Load the rc files given in the `Pry::RC_FILES` array.
73
77
  # This method can also be used to reload the files if they have changed.
74
78
  def self.load_rc
75
- RC_FILES.uniq.each do |file_name|
76
- load_file_at_toplevel(file_name)
77
- end
79
+ load_file_at_toplevel(HOME_RC_FILE)
78
80
  end
79
81
 
80
82
  # Load the local RC file (./.pryrc)
81
83
  def self.load_local_rc
82
- load_file_at_toplevel(LOCAL_RC_FILE)
84
+ unless File.expand_path(HOME_RC_FILE) == File.expand_path(LOCAL_RC_FILE)
85
+ load_file_at_toplevel(LOCAL_RC_FILE)
86
+ end
83
87
  end
84
88
 
85
89
  # Load any Ruby files specified with the -r flag on the command line.
@@ -115,15 +119,23 @@ class Pry
115
119
  end
116
120
 
117
121
  # Start a Pry REPL.
118
- # This method also loads the files specified in `Pry::RC_FILES` the
122
+ # This method also loads the ~/.pryrc and ./.pryrc as necessary
119
123
  # first time it is invoked.
120
124
  # @param [Object, Binding] target The receiver of the Pry session
121
125
  # @param [Hash] options
122
126
  # @option options (see Pry#initialize)
123
127
  # @example
124
128
  # Pry.start(Object.new, :input => MyInput.new)
125
- def self.start(target=toplevel_binding, options={})
126
- target = Pry.binding_for(target)
129
+ def self.start(target=nil, options={})
130
+ return if ENV['DISABLE_PRY']
131
+
132
+ if in_critical_section?
133
+ output.puts "ERROR: Pry started inside Pry."
134
+ output.puts "This can happen if you have a binding.pry inside a #to_s or #inspect function."
135
+ return
136
+ end
137
+
138
+ target = Pry.binding_for(target || toplevel_binding)
127
139
  initial_session_setup
128
140
 
129
141
  # create the Pry instance to manage the session
@@ -152,6 +164,9 @@ class Pry
152
164
 
153
165
  # Enter the matrix
154
166
  pry_instance.repl(head)
167
+ rescue Pry::TooSafeException
168
+ puts "ERROR: Pry cannot work with $SAFE > 0"
169
+ raise
155
170
  end
156
171
 
157
172
  # Execute the file through the REPL loop, non-interactively.
@@ -244,6 +259,7 @@ class Pry
244
259
  config.input = Readline
245
260
  config.output = $stdout
246
261
  config.commands = Pry::Commands
262
+ config.prompt_name = DEFAULT_PROMPT_NAME
247
263
  config.prompt = DEFAULT_PROMPT
248
264
  config.print = DEFAULT_PRINT
249
265
  config.exception_handler = DEFAULT_EXCEPTION_HANDLER
@@ -263,6 +279,13 @@ class Pry
263
279
  config.auto_indent = Helpers::BaseHelpers.use_ansi_codes?
264
280
  config.correct_indent = true
265
281
  config.collision_warning = false
282
+ config.output_prefix = "=> "
283
+
284
+ if defined?(Bond) && Readline::VERSION !~ /editline/i
285
+ config.completer = Pry::BondCompleter
286
+ else
287
+ config.completer = Pry::InputCompleter
288
+ end
266
289
 
267
290
  config.gist ||= OpenStruct.new
268
291
  config.gist.inspecter = proc(&:pretty_inspect)
@@ -297,8 +320,8 @@ class Pry
297
320
  :protected_method_color => :yellow,
298
321
  :method_missing_color => :bright_red,
299
322
 
300
- :local_var_color => :default,
301
- :pry_var_color => :red, # e.g. _, _pry_, _file_
323
+ :local_var_color => :yellow,
324
+ :pry_var_color => :default, # e.g. _, _pry_, _file_
302
325
 
303
326
  :instance_var_color => :blue, # e.g. @foo
304
327
  :class_var_color => :bright_blue, # e.g. @@foo
@@ -383,16 +406,34 @@ class Pry
383
406
  end
384
407
  end
385
408
  end
386
- end
387
409
 
388
- # Grab a copy of the TOPLEVEL_BINDING without any local variables.
389
- # This binding has a default definee of Object, and new methods are
390
- # private (just as in TOPLEVEL_BINDING).
391
- def self.__binding_impl__
392
- binding
410
+ def self.toplevel_binding
411
+ unless @toplevel_binding
412
+ # Grab a copy of the TOPLEVEL_BINDING without any local variables.
413
+ # This binding has a default definee of Object, and new methods are
414
+ # private (just as in TOPLEVEL_BINDING).
415
+ TOPLEVEL_BINDING.eval <<-RUBY
416
+ def self.__pry__
417
+ binding
418
+ end
419
+ Pry.toplevel_binding = __pry__
420
+ class << self; undef __pry__; end
421
+ RUBY
422
+ end
423
+ @toplevel_binding.eval('private')
424
+ @toplevel_binding
425
+ end
426
+
427
+ def self.in_critical_section?
428
+ @critical_section.to_i > 0
429
+ end
430
+
431
+ def self.critical_section(&block)
432
+ @critical_section = @critical_section.to_i + 1
433
+ yield
434
+ ensure
435
+ @critical_section -= 1
436
+ end
393
437
  end
394
- Pry.toplevel_binding = __binding_impl__
395
- Pry.toplevel_binding.eval("private")
396
- class << self; undef __binding_impl__; end
397
438
 
398
439
  Pry.init
@@ -97,13 +97,15 @@ class Pry
97
97
  attributes = [
98
98
  :input, :output, :commands, :print, :quiet,
99
99
  :exception_handler, :hooks, :custom_completions,
100
- :prompt, :memory_size, :input_stack, :extra_sticky_locals
100
+ :prompt, :memory_size, :extra_sticky_locals
101
101
  ]
102
102
 
103
103
  attributes.each do |attribute|
104
104
  defaults[attribute] = Pry.send attribute
105
105
  end
106
106
 
107
+ defaults[:input_stack] = Pry.input_stack.dup
108
+
107
109
  defaults.merge!(options).each do |key, value|
108
110
  send("#{key}=", value) if respond_to?("#{key}=")
109
111
  end
@@ -143,10 +145,10 @@ class Pry
143
145
  # @param [Binding] b The binding to set the local on.
144
146
  # @return [Object] The value the local was set to.
145
147
  def inject_local(name, value, b)
146
- Thread.current[:__pry_local__] = value.is_a?(Proc) ? value.call : value
147
- b.eval("#{name} = ::Thread.current[:__pry_local__]")
148
+ Pry.current[:pry_local] = value.is_a?(Proc) ? value.call : value
149
+ b.eval("#{name} = ::Pry.current[:pry_local]")
148
150
  ensure
149
- Thread.current[:__pry_local__] = nil
151
+ Pry.current[:pry_local] = nil
150
152
  end
151
153
 
152
154
  # @return [Integer] The maximum amount of objects remembered by the inp and
@@ -186,7 +188,8 @@ class Pry
186
188
  :_ex_ => proc { last_exception },
187
189
  :_file_ => proc { last_file },
188
190
  :_dir_ => proc { last_dir },
189
- :_ => proc { last_result }
191
+ :_ => proc { last_result },
192
+ :__ => proc { @output_array[-2] }
190
193
  }.merge(extra_sticky_locals)
191
194
  end
192
195
 
@@ -196,7 +199,6 @@ class Pry
196
199
  exec_hook :before_session, output, target, self
197
200
  set_last_result(nil, target)
198
201
 
199
-
200
202
  @input_array << nil # add empty input so _in_ and _out_ match
201
203
 
202
204
  binding_stack.push target
@@ -228,6 +230,7 @@ class Pry
228
230
  exception = catch(:raise_up) do
229
231
  break_data = catch(:breakout) do
230
232
  loop do
233
+ throw(:breakout) if binding_stack.empty?
231
234
  rep(binding_stack.last)
232
235
  end
233
236
  end
@@ -250,7 +253,9 @@ class Pry
250
253
  target = Pry.binding_for(target)
251
254
  result = re(target)
252
255
 
253
- show_result(result) if should_print?
256
+ Pry.critical_section do
257
+ show_result(result)
258
+ end
254
259
  end
255
260
 
256
261
  # Perform a read-eval
@@ -265,23 +270,15 @@ class Pry
265
270
  target = Pry.binding_for(target)
266
271
 
267
272
  # It's not actually redundant to inject them continually as we may have
268
- # moved into the scope of a new Binding (e.g the user typed `cd`)
273
+ # moved into the scope of a new Binding (e.g the user typed `cd`).
269
274
  inject_sticky_locals(target)
270
275
 
271
276
  code = r(target)
272
277
 
273
- exec_hook :before_eval, code, self
274
-
275
- result = target.eval(code, Pry.eval_path, Pry.current_line)
276
- set_last_result(result, target, code)
277
-
278
- result
278
+ evaluate_ruby(code, target)
279
279
  rescue RescuableException => e
280
280
  self.last_exception = e
281
281
  e
282
- ensure
283
- update_input_history(code)
284
- exec_hook :after_eval, result, self
285
282
  end
286
283
 
287
284
  # Perform a read.
@@ -309,23 +306,39 @@ class Pry
309
306
  begin
310
307
  break if Pry::Code.complete_expression?(eval_string)
311
308
  rescue SyntaxError => e
312
- output.puts "SyntaxError: #{e.message.sub(/.*syntax error, */m, '')}"
309
+ exception_handler.call(output, e.extend(UserError), self)
313
310
  eval_string = ""
314
311
  end
315
312
  end
316
313
 
317
- @suppress_output = true if eval_string =~ /;\Z/ || eval_string.empty?
314
+ if eval_string =~ /;\Z/ || eval_string.empty? || eval_string =~ /\A *#.*\n\z/
315
+ @suppress_output = true
316
+ end
318
317
 
319
318
  exec_hook :after_read, eval_string, self
320
319
  eval_string
321
320
  end
322
321
 
322
+ def evaluate_ruby(code, target = binding_stack.last)
323
+ target = Pry.binding_for(target)
324
+ inject_sticky_locals(target)
325
+ exec_hook :before_eval, code, self
326
+
327
+ result = target.eval(code, Pry.eval_path, Pry.current_line)
328
+ set_last_result(result, target, code)
329
+ ensure
330
+ update_input_history(code)
331
+ exec_hook :after_eval, result, self
332
+ end
333
+
323
334
  # Output the result or pass to an exception handler (if result is an exception).
324
335
  def show_result(result)
325
336
  if last_result_is_exception?
326
337
  exception_handler.call(output, result, self)
327
- else
338
+ elsif should_print?
328
339
  print.call(output, result)
340
+ else
341
+ # nothin'
329
342
  end
330
343
  rescue RescuableException => e
331
344
  # Being uber-paranoid here, given that this exception arose because we couldn't
@@ -359,14 +372,15 @@ class Pry
359
372
  @indent.reset if eval_string.empty?
360
373
 
361
374
  current_prompt = select_prompt(eval_string, target)
362
- completion_proc = Pry::InputCompleter.build_completion_proc(target,
375
+ completion_proc = Pry.config.completer.build_completion_proc(target, self,
363
376
  instance_eval(&custom_completions))
364
377
 
378
+ safe_completion_proc = proc{ |*a| Pry.critical_section{ completion_proc.call(*a) } }
365
379
 
366
380
  indentation = Pry.config.auto_indent ? @indent.current_prefix : ''
367
381
 
368
382
  begin
369
- val = readline("#{current_prompt}#{indentation}", completion_proc)
383
+ val = readline("#{current_prompt}#{indentation}", safe_completion_proc)
370
384
 
371
385
  # Handle <Ctrl+C> like Bash, empty the current input buffer but do not quit.
372
386
  # This is only for ruby-1.9; other versions of ruby do not let you send Interrupt
@@ -403,12 +417,16 @@ class Pry
403
417
  indented_val = val
404
418
  end
405
419
 
420
+ # Check this before processing the line, because a command might change
421
+ # Pry's input.
422
+ interactive = !input.is_a?(StringIO)
423
+
406
424
  begin
407
425
  if !process_command(val, eval_string, target)
408
- eval_string << "#{indented_val.rstrip}\n" unless val.empty?
426
+ eval_string << "#{indented_val.chomp}\n" unless val.empty?
409
427
  end
410
428
  ensure
411
- Pry.history << indented_val unless input.is_a?(StringIO)
429
+ Pry.history << indented_val if interactive
412
430
  end
413
431
  end
414
432
 
@@ -419,7 +437,8 @@ class Pry
419
437
  # @param [String] eval_string The cumulative lines of input.
420
438
  # @param [Binding] target The target of the Pry session.
421
439
  # @return [Boolean] `true` if `val` is a command, `false` otherwise
422
- def process_command(val, eval_string, target)
440
+ def process_command(val, eval_string = '', target = binding_stack.last)
441
+ val = val.chomp
423
442
  result = commands.process_line(val, {
424
443
  :target => target,
425
444
  :output => output,
@@ -428,7 +447,7 @@ class Pry
428
447
  })
429
448
 
430
449
  # set a temporary (just so we can inject the value we want into eval_string)
431
- Thread.current[:__pry_cmd_result__] = result
450
+ Pry.current[:pry_cmd_result] = result
432
451
 
433
452
  # note that `result` wraps the result of command processing; if a
434
453
  # command was matched and invoked then `result.command?` returns true,
@@ -438,7 +457,7 @@ class Pry
438
457
  # the command that was invoked was non-void (had a return value) and so we make
439
458
  # the value of the current expression equal to the return value
440
459
  # of the command.
441
- eval_string.replace "Thread.current[:__pry_cmd_result__].retval\n"
460
+ eval_string.replace "::Pry.current[:pry_cmd_result].retval\n"
442
461
  end
443
462
  true
444
463
  else
@@ -590,7 +609,8 @@ class Pry
590
609
 
591
610
  if defined? Coolline and input.is_a? Coolline
592
611
  input.completion_proc = proc do |cool|
593
- completion_proc.call cool.completed_word
612
+ completions = completion_proc.call cool.completed_word
613
+ completions.compact
594
614
  end
595
615
  elsif input.respond_to? :completion_proc=
596
616
  input.completion_proc = completion_proc
@@ -611,11 +631,10 @@ class Pry
611
631
  end
612
632
 
613
633
  # Whether the print proc should be invoked.
614
- # Currently only invoked if the output is not suppressed OR the last result
615
- # is an exception regardless of suppression.
634
+ # Currently only invoked if the output is not suppressed.
616
635
  # @return [Boolean] Whether the print proc should be invoked.
617
636
  def should_print?
618
- !@suppress_output || last_result_is_exception?
637
+ !@suppress_output
619
638
  end
620
639
 
621
640
  # Returns the appropriate prompt to use.
@@ -642,13 +661,15 @@ class Pry
642
661
  :eval_string => eval_string,
643
662
  :cont => !eval_string.empty?)
644
663
 
645
- # If input buffer is empty then use normal prompt
646
- if eval_string.empty?
647
- generate_prompt(Array(prompt).first, c)
664
+ Pry.critical_section do
665
+ # If input buffer is empty then use normal prompt
666
+ if eval_string.empty?
667
+ generate_prompt(Array(prompt).first, c)
648
668
 
649
- # Otherwise use the wait prompt (indicating multi-line expression)
650
- else
651
- generate_prompt(Array(prompt).last, c)
669
+ # Otherwise use the wait prompt (indicating multi-line expression)
670
+ else
671
+ generate_prompt(Array(prompt).last, c)
672
+ end
652
673
  end
653
674
  end
654
675