pry 0.9.12.6-java → 0.10.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +702 -0
  3. data/LICENSE +2 -2
  4. data/{README.markdown → README.md} +37 -31
  5. data/lib/pry.rb +38 -151
  6. data/lib/pry/cli.rb +35 -17
  7. data/lib/pry/code.rb +19 -63
  8. data/lib/pry/code/code_file.rb +103 -0
  9. data/lib/pry/code/code_range.rb +2 -1
  10. data/lib/pry/code/loc.rb +2 -2
  11. data/lib/pry/code_object.rb +40 -21
  12. data/lib/pry/color_printer.rb +55 -0
  13. data/lib/pry/command.rb +12 -9
  14. data/lib/pry/command_set.rb +81 -38
  15. data/lib/pry/commands.rb +1 -1
  16. data/lib/pry/commands/amend_line.rb +2 -2
  17. data/lib/pry/commands/bang.rb +1 -1
  18. data/lib/pry/commands/cat.rb +11 -2
  19. data/lib/pry/commands/cat/exception_formatter.rb +6 -7
  20. data/lib/pry/commands/cat/file_formatter.rb +15 -32
  21. data/lib/pry/commands/cat/input_expression_formatter.rb +1 -1
  22. data/lib/pry/commands/cd.rb +14 -3
  23. data/lib/pry/commands/change_inspector.rb +27 -0
  24. data/lib/pry/commands/change_prompt.rb +26 -0
  25. data/lib/pry/commands/code_collector.rb +4 -4
  26. data/lib/pry/commands/easter_eggs.rb +3 -3
  27. data/lib/pry/commands/edit.rb +10 -22
  28. data/lib/pry/commands/edit/exception_patcher.rb +2 -2
  29. data/lib/pry/commands/edit/file_and_line_locator.rb +0 -2
  30. data/lib/pry/commands/exit_program.rb +0 -1
  31. data/lib/pry/commands/find_method.rb +16 -22
  32. data/lib/pry/commands/gem_install.rb +5 -2
  33. data/lib/pry/commands/gem_open.rb +1 -1
  34. data/lib/pry/commands/gist.rb +10 -11
  35. data/lib/pry/commands/help.rb +14 -14
  36. data/lib/pry/commands/hist.rb +27 -8
  37. data/lib/pry/commands/install_command.rb +14 -12
  38. data/lib/pry/commands/list_inspectors.rb +35 -0
  39. data/lib/pry/commands/list_prompts.rb +35 -0
  40. data/lib/pry/commands/ls.rb +72 -296
  41. data/lib/pry/commands/ls/constants.rb +47 -0
  42. data/lib/pry/commands/ls/formatter.rb +49 -0
  43. data/lib/pry/commands/ls/globals.rb +48 -0
  44. data/lib/pry/commands/ls/grep.rb +21 -0
  45. data/lib/pry/commands/ls/instance_vars.rb +39 -0
  46. data/lib/pry/commands/ls/interrogatable.rb +18 -0
  47. data/lib/pry/commands/ls/jruby_hacks.rb +49 -0
  48. data/lib/pry/commands/ls/local_names.rb +35 -0
  49. data/lib/pry/commands/ls/local_vars.rb +39 -0
  50. data/lib/pry/commands/ls/ls_entity.rb +70 -0
  51. data/lib/pry/commands/ls/methods.rb +57 -0
  52. data/lib/pry/commands/ls/methods_helper.rb +46 -0
  53. data/lib/pry/commands/ls/self_methods.rb +32 -0
  54. data/lib/pry/commands/play.rb +44 -10
  55. data/lib/pry/commands/pry_backtrace.rb +1 -2
  56. data/lib/pry/commands/raise_up.rb +2 -2
  57. data/lib/pry/commands/reload_code.rb +16 -19
  58. data/lib/pry/commands/ri.rb +7 -3
  59. data/lib/pry/commands/shell_command.rb +18 -13
  60. data/lib/pry/commands/shell_mode.rb +2 -4
  61. data/lib/pry/commands/show_doc.rb +5 -0
  62. data/lib/pry/commands/show_info.rb +8 -13
  63. data/lib/pry/commands/show_source.rb +15 -3
  64. data/lib/pry/commands/simple_prompt.rb +1 -1
  65. data/lib/pry/commands/toggle_color.rb +8 -4
  66. data/lib/pry/commands/watch_expression.rb +105 -0
  67. data/lib/pry/commands/watch_expression/expression.rb +38 -0
  68. data/lib/pry/commands/whereami.rb +18 -10
  69. data/lib/pry/commands/wtf.rb +3 -3
  70. data/lib/pry/config.rb +20 -254
  71. data/lib/pry/config/behavior.rb +139 -0
  72. data/lib/pry/config/convenience.rb +26 -0
  73. data/lib/pry/config/default.rb +165 -0
  74. data/lib/pry/core_extensions.rb +31 -21
  75. data/lib/pry/editor.rb +107 -103
  76. data/lib/pry/exceptions.rb +77 -0
  77. data/lib/pry/helpers/base_helpers.rb +22 -109
  78. data/lib/pry/helpers/command_helpers.rb +10 -8
  79. data/lib/pry/helpers/documentation_helpers.rb +1 -2
  80. data/lib/pry/helpers/text.rb +4 -5
  81. data/lib/pry/history.rb +46 -45
  82. data/lib/pry/history_array.rb +6 -1
  83. data/lib/pry/hooks.rb +9 -29
  84. data/lib/pry/indent.rb +6 -6
  85. data/lib/pry/input_completer.rb +242 -0
  86. data/lib/pry/input_lock.rb +132 -0
  87. data/lib/pry/inspector.rb +27 -0
  88. data/lib/pry/last_exception.rb +61 -0
  89. data/lib/pry/method.rb +82 -87
  90. data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +41 -38
  91. data/lib/pry/module_candidate.rb +4 -14
  92. data/lib/pry/object_path.rb +82 -0
  93. data/lib/pry/output.rb +50 -0
  94. data/lib/pry/pager.rb +193 -48
  95. data/lib/pry/plugins.rb +1 -1
  96. data/lib/pry/prompt.rb +26 -0
  97. data/lib/pry/pry_class.rb +149 -230
  98. data/lib/pry/pry_instance.rb +302 -413
  99. data/lib/pry/rbx_path.rb +1 -1
  100. data/lib/pry/repl.rb +202 -0
  101. data/lib/pry/repl_file_loader.rb +20 -26
  102. data/lib/pry/rubygem.rb +13 -5
  103. data/lib/pry/terminal.rb +2 -1
  104. data/lib/pry/test/helper.rb +26 -41
  105. data/lib/pry/version.rb +1 -1
  106. data/lib/pry/wrapped_module.rb +45 -59
  107. metadata +62 -225
  108. data/.document +0 -2
  109. data/.gitignore +0 -16
  110. data/.travis.yml +0 -25
  111. data/.yardopts +0 -1
  112. data/CHANGELOG +0 -534
  113. data/CONTRIBUTORS +0 -55
  114. data/Gemfile +0 -12
  115. data/Rakefile +0 -140
  116. data/TODO +0 -117
  117. data/lib/pry/completion.rb +0 -321
  118. data/lib/pry/custom_completions.rb +0 -6
  119. data/lib/pry/rbx_method.rb +0 -13
  120. data/man/pry.1 +0 -195
  121. data/man/pry.1.html +0 -204
  122. data/man/pry.1.ronn +0 -141
  123. data/pry.gemspec +0 -29
  124. data/spec/Procfile +0 -3
  125. data/spec/cli_spec.rb +0 -78
  126. data/spec/code_object_spec.rb +0 -277
  127. data/spec/code_spec.rb +0 -219
  128. data/spec/command_helpers_spec.rb +0 -29
  129. data/spec/command_integration_spec.rb +0 -644
  130. data/spec/command_set_spec.rb +0 -627
  131. data/spec/command_spec.rb +0 -821
  132. data/spec/commands/amend_line_spec.rb +0 -247
  133. data/spec/commands/bang_spec.rb +0 -19
  134. data/spec/commands/cat_spec.rb +0 -164
  135. data/spec/commands/cd_spec.rb +0 -250
  136. data/spec/commands/disable_pry_spec.rb +0 -25
  137. data/spec/commands/edit_spec.rb +0 -727
  138. data/spec/commands/exit_all_spec.rb +0 -34
  139. data/spec/commands/exit_program_spec.rb +0 -19
  140. data/spec/commands/exit_spec.rb +0 -34
  141. data/spec/commands/find_method_spec.rb +0 -70
  142. data/spec/commands/gem_list_spec.rb +0 -26
  143. data/spec/commands/gist_spec.rb +0 -79
  144. data/spec/commands/help_spec.rb +0 -56
  145. data/spec/commands/hist_spec.rb +0 -181
  146. data/spec/commands/jump_to_spec.rb +0 -15
  147. data/spec/commands/ls_spec.rb +0 -181
  148. data/spec/commands/play_spec.rb +0 -140
  149. data/spec/commands/raise_up_spec.rb +0 -56
  150. data/spec/commands/save_file_spec.rb +0 -177
  151. data/spec/commands/show_doc_spec.rb +0 -510
  152. data/spec/commands/show_input_spec.rb +0 -17
  153. data/spec/commands/show_source_spec.rb +0 -782
  154. data/spec/commands/whereami_spec.rb +0 -203
  155. data/spec/completion_spec.rb +0 -241
  156. data/spec/control_d_handler_spec.rb +0 -58
  157. data/spec/documentation_helper_spec.rb +0 -73
  158. data/spec/editor_spec.rb +0 -79
  159. data/spec/exception_whitelist_spec.rb +0 -21
  160. data/spec/fixtures/candidate_helper1.rb +0 -11
  161. data/spec/fixtures/candidate_helper2.rb +0 -8
  162. data/spec/fixtures/example.erb +0 -5
  163. data/spec/fixtures/example_nesting.rb +0 -33
  164. data/spec/fixtures/show_source_doc_examples.rb +0 -15
  165. data/spec/fixtures/testrc +0 -2
  166. data/spec/fixtures/testrcbad +0 -2
  167. data/spec/fixtures/whereami_helper.rb +0 -6
  168. data/spec/helper.rb +0 -34
  169. data/spec/helpers/bacon.rb +0 -86
  170. data/spec/helpers/mock_pry.rb +0 -43
  171. data/spec/helpers/table_spec.rb +0 -105
  172. data/spec/history_array_spec.rb +0 -67
  173. data/spec/hooks_spec.rb +0 -522
  174. data/spec/indent_spec.rb +0 -301
  175. data/spec/input_stack_spec.rb +0 -90
  176. data/spec/method_spec.rb +0 -482
  177. data/spec/prompt_spec.rb +0 -60
  178. data/spec/pry_defaults_spec.rb +0 -419
  179. data/spec/pry_history_spec.rb +0 -99
  180. data/spec/pry_output_spec.rb +0 -95
  181. data/spec/pry_spec.rb +0 -515
  182. data/spec/run_command_spec.rb +0 -25
  183. data/spec/sticky_locals_spec.rb +0 -157
  184. data/spec/syntax_checking_spec.rb +0 -81
  185. data/spec/wrapped_module_spec.rb +0 -261
  186. data/wiki/Customizing-pry.md +0 -397
  187. data/wiki/Home.md +0 -4
@@ -2,7 +2,7 @@ class Pry
2
2
  module RbxPath
3
3
  module_function
4
4
  def is_core_path?(path)
5
- path.start_with?("kernel") || path.start_with?("lib")
5
+ Pry::Helpers::BaseHelpers.rbx? && (path.start_with?("kernel") || path.start_with?("lib")) && File.exist?(convert_path_to_full(path))
6
6
  end
7
7
 
8
8
  def convert_path_to_full(path)
@@ -0,0 +1,202 @@
1
+ require 'forwardable'
2
+
3
+ class Pry
4
+ class REPL
5
+ extend Forwardable
6
+ def_delegators :@pry, :input, :output
7
+
8
+ # @return [Pry] The instance of {Pry} that the user is controlling.
9
+ attr_accessor :pry
10
+
11
+ # Instantiate a new {Pry} instance with the given options, then start a
12
+ # {REPL} instance wrapping it.
13
+ # @option options See {Pry#initialize}
14
+ def self.start(options)
15
+ new(Pry.new(options)).start
16
+ end
17
+
18
+ # Create an instance of {REPL} wrapping the given {Pry}.
19
+ # @param [Pry] pry The instance of {Pry} that this {REPL} will control.
20
+ # @param [Hash] options Options for this {REPL} instance.
21
+ # @option options [Object] :target The initial target of the session.
22
+ def initialize(pry, options = {})
23
+ @pry = pry
24
+ @indent = Pry::Indent.new
25
+
26
+ if options[:target]
27
+ @pry.push_binding options[:target]
28
+ end
29
+ end
30
+
31
+ # Start the read-eval-print loop.
32
+ # @return [Object?] If the session throws `:breakout`, return the value
33
+ # thrown with it.
34
+ # @raise [Exception] If the session throws `:raise_up`, raise the exception
35
+ # thrown with it.
36
+ def start
37
+ prologue
38
+ Pry::InputLock.for(:all).with_ownership { repl }
39
+ ensure
40
+ epilogue
41
+ end
42
+
43
+ private
44
+
45
+ # Set up the repl session.
46
+ # @return [void]
47
+ def prologue
48
+ pry.exec_hook :before_session, pry.output, pry.current_binding, pry
49
+
50
+ # Clear the line before starting Pry. This fixes issue #566.
51
+ if pry.config.correct_indent
52
+ Kernel.print Pry::Helpers::BaseHelpers.windows_ansi? ? "\e[0F" : "\e[0G"
53
+ end
54
+ end
55
+
56
+ # The actual read-eval-print loop.
57
+ #
58
+ # The {REPL} instance is responsible for reading and looping, whereas the
59
+ # {Pry} instance is responsible for evaluating user input and printing
60
+ # return values and command output.
61
+ #
62
+ # @return [Object?] If the session throws `:breakout`, return the value
63
+ # thrown with it.
64
+ # @raise [Exception] If the session throws `:raise_up`, raise the exception
65
+ # thrown with it.
66
+ def repl
67
+ loop do
68
+ case val = read
69
+ when :control_c
70
+ output.puts ""
71
+ pry.reset_eval_string
72
+ when :no_more_input
73
+ output.puts "" if output.tty?
74
+ break
75
+ else
76
+ output.puts "" if val.nil? && output.tty?
77
+ return pry.exit_value unless pry.eval(val)
78
+ end
79
+ end
80
+ end
81
+
82
+ # Clean up after the repl session.
83
+ # @return [void]
84
+ def epilogue
85
+ pry.exec_hook :after_session, pry.output, pry.current_binding, pry
86
+ end
87
+
88
+ # Read a line of input from the user.
89
+ # @return [String] The line entered by the user.
90
+ # @return [nil] On `<Ctrl-D>`.
91
+ # @return [:control_c] On `<Ctrl+C>`.
92
+ # @return [:no_more_input] On EOF.
93
+ def read
94
+ @indent.reset if pry.eval_string.empty?
95
+ current_prompt = pry.select_prompt
96
+ indentation = pry.config.auto_indent ? @indent.current_prefix : ''
97
+
98
+ val = read_line("#{current_prompt}#{indentation}")
99
+
100
+ # Return nil for EOF, :no_more_input for error, or :control_c for <Ctrl-C>
101
+ return val unless String === val
102
+
103
+ if pry.config.auto_indent
104
+ original_val = "#{indentation}#{val}"
105
+ indented_val = @indent.indent(val)
106
+
107
+ if output.tty? && pry.config.correct_indent && Pry::Helpers::BaseHelpers.use_ansi_codes?
108
+ output.print @indent.correct_indentation(
109
+ current_prompt, indented_val,
110
+ original_val.length - indented_val.length
111
+ )
112
+ output.flush
113
+ end
114
+ else
115
+ indented_val = val
116
+ end
117
+
118
+ indented_val
119
+ end
120
+
121
+ # Manage switching of input objects on encountering `EOFError`s.
122
+ # @return [Object] Whatever the given block returns.
123
+ # @return [:no_more_input] Indicates that no more input can be read.
124
+ def handle_read_errors
125
+ should_retry = true
126
+ exception_count = 0
127
+
128
+ begin
129
+ yield
130
+ rescue EOFError
131
+ pry.config.input = Pry.config.input
132
+ if !should_retry
133
+ output.puts "Error: Pry ran out of things to read from! " \
134
+ "Attempting to break out of REPL."
135
+ return :no_more_input
136
+ end
137
+ should_retry = false
138
+ retry
139
+
140
+ # Handle <Ctrl+C> like Bash: empty the current input buffer, but don't
141
+ # quit. This is only for MRI 1.9; other versions of Ruby don't let you
142
+ # send Interrupt from within Readline.
143
+ rescue Interrupt
144
+ return :control_c
145
+
146
+ # If we get a random error when trying to read a line we don't want to
147
+ # automatically retry, as the user will see a lot of error messages
148
+ # scroll past and be unable to do anything about it.
149
+ rescue RescuableException => e
150
+ puts "Error: #{e.message}"
151
+ output.puts e.backtrace
152
+ exception_count += 1
153
+ if exception_count < 5
154
+ retry
155
+ end
156
+ puts "FATAL: Pry failed to get user input using `#{input}`."
157
+ puts "To fix this you may be able to pass input and output file " \
158
+ "descriptors to pry directly. e.g."
159
+ puts " Pry.config.input = STDIN"
160
+ puts " Pry.config.output = STDOUT"
161
+ puts " binding.pry"
162
+ return :no_more_input
163
+ end
164
+ end
165
+
166
+ # Returns the next line of input to be sent to the {Pry} instance.
167
+ # @param [String] current_prompt The prompt to use for input.
168
+ # @return [String?] The next line of input, or `nil` on <Ctrl-D>.
169
+ def read_line(current_prompt)
170
+ handle_read_errors do
171
+ if defined? Coolline and input.is_a? Coolline
172
+ input.completion_proc = proc do |cool|
173
+ completions = @pry.complete cool.completed_word
174
+ completions.compact
175
+ end
176
+ elsif input.respond_to? :completion_proc=
177
+ input.completion_proc = proc do |input|
178
+ @pry.complete input
179
+ end
180
+ end
181
+
182
+ if defined?(Readline) and input == Readline
183
+ input_readline(current_prompt, false) # false since we'll add it manually
184
+ elsif defined? Coolline and input.is_a? Coolline
185
+ input_readline(current_prompt)
186
+ else
187
+ if input.method(:readline).arity == 1
188
+ input_readline(current_prompt)
189
+ else
190
+ input_readline
191
+ end
192
+ end
193
+ end
194
+ end
195
+
196
+ def input_readline(*args)
197
+ Pry::InputLock.for(:all).interruptible_region do
198
+ input.readline(*args)
199
+ end
200
+ end
201
+ end
202
+ end
@@ -15,29 +15,40 @@ class Pry
15
15
  full_name = File.expand_path(file_name)
16
16
  raise RuntimeError, "No such file: #{full_name}" if !File.exists?(full_name)
17
17
 
18
- @content = StringIO.new(File.read(full_name))
18
+ define_additional_commands
19
+ @content = File.read(full_name)
19
20
  end
20
21
 
21
22
  # Switch to interactive mode, i.e take input from the user
22
23
  # and use the regular print and exception handlers.
23
24
  # @param [Pry] _pry_ the Pry instance to make interactive.
24
25
  def interactive_mode(_pry_)
25
- _pry_.input = Pry.config.input
26
- _pry_.print = Pry.config.print
27
- _pry_.exception_handler = Pry.config.exception_handler
26
+ _pry_.config.input = Pry.config.input
27
+ _pry_.config.print = Pry.config.print
28
+ _pry_.config.exception_handler = Pry.config.exception_handler
29
+ Pry::REPL.new(_pry_).start
28
30
  end
29
31
 
30
32
  # Switch to non-interactive mode. Essentially
31
33
  # this means there is no result output
32
34
  # and that the session becomes interactive when an exception is encountered.
33
35
  # @param [Pry] _pry_ the Pry instance to make non-interactive.
34
- def non_interactive_mode(_pry_)
36
+ def non_interactive_mode(_pry_, content)
35
37
  _pry_.print = proc {}
36
- _pry_.exception_handler = proc do |o, e, _pry_|
37
- _pry_.run_command "cat --ex"
38
+ _pry_.exception_handler = proc do |o, e, _p_|
39
+ _p_.run_command "cat --ex"
38
40
  o.puts "...exception encountered, going interactive!"
39
41
  interactive_mode(_pry_)
40
42
  end
43
+
44
+ content.lines.each do |line|
45
+ break unless _pry_.eval line, :generated => true
46
+ end
47
+
48
+ unless _pry_.eval_string.empty?
49
+ _pry_.output.puts "#{_pry_.eval_string}...exception encountered, going interactive!"
50
+ interactive_mode(_pry_)
51
+ end
41
52
  end
42
53
 
43
54
  # Define a few extra commands useful for flipping back & forth
@@ -46,35 +57,18 @@ class Pry
46
57
  s = self
47
58
 
48
59
  Pry::Commands.command "make-interactive", "Make the session interactive" do
49
- _pry_.input_stack.push _pry_.input
50
60
  s.interactive_mode(_pry_)
51
61
  end
52
62
 
53
- Pry::Commands.command "make-non-interactive", "Make the session non-interactive" do
54
- _pry_.input = _pry_.input_stack.pop
55
- s.non_interactive_mode(_pry_)
56
- end
57
-
58
63
  Pry::Commands.command "load-file", "Load another file through the repl" do |file_name|
59
- content = StringIO.new(File.read(File.expand_path(file_name)))
60
- _pry_.input_stack.push(_pry_.input)
61
- _pry_.input = content
64
+ s.non_interactive_mode(_pry_, File.read(File.expand_path(file_name)))
62
65
  end
63
66
  end
64
67
 
65
68
  # Actually load the file through the REPL by setting file content
66
69
  # as the REPL input stream.
67
70
  def load
68
- Pry.initial_session_setup
69
- define_additional_commands
70
-
71
- Pry.config.hooks.add_hook(:when_started, :start_non_interactively) do |o, t, _pry_|
72
- non_interactive_mode(_pry_)
73
- end
74
-
75
- Pry.start(Pry.toplevel_binding,
76
- :input => @content,
77
- :input_stack => [StringIO.new("exit-all\n")])
71
+ non_interactive_mode(Pry.new, @content)
78
72
  end
79
73
  end
80
74
  end
@@ -23,9 +23,9 @@ class Pry
23
23
  Gem.source_index.find_name(name)
24
24
  end
25
25
 
26
- spec = specs.sort_by{ |spec| Gem::Version.new(spec.version) }.first
26
+ first_spec = specs.sort_by{ |spec| Gem::Version.new(spec.version) }.last
27
27
 
28
- spec or raise CommandError, "Gem `#{name}` not found"
28
+ first_spec or raise CommandError, "Gem `#{name}` not found"
29
29
  end
30
30
 
31
31
  # List gems matching a pattern.
@@ -57,14 +57,22 @@ class Pry
57
57
  # @param [String] name
58
58
  # @return [void]
59
59
  def install(name)
60
- destination = File.writable?(Gem.dir) ? Gem.dir : Gem.user_dir
60
+ gemrc_opts = Gem.configuration['gem'].split(' ')
61
+ destination = if gemrc_opts.include?('--user-install')
62
+ Gem.user_dir
63
+ elsif File.writable?(Gem.dir)
64
+ Gem.dir
65
+ else
66
+ Gem.user_dir
67
+ end
61
68
  installer = Gem::DependencyInstaller.new(:install_dir => destination)
62
69
  installer.install(name)
63
70
  rescue Errno::EACCES
64
71
  raise CommandError,
65
- "Insufficient permissions to install `#{ text.green(name) }`."
72
+ "Insufficient permissions to install #{ Pry::Helpers::Text.green(name) }."
66
73
  rescue Gem::GemNotFoundException
67
- raise CommandError, "Gem `#{ text.green(name) }` not found."
74
+ raise CommandError,
75
+ "Gem #{ Pry::Helpers::Text.green(name) } not found. Aborting installation."
68
76
  else
69
77
  Gem.refresh
70
78
  end
@@ -44,7 +44,8 @@ class Pry::Terminal
44
44
  require 'io/console'
45
45
  $stdout.winsize if $stdout.tty? and $stdout.respond_to?(:winsize)
46
46
  rescue LoadError
47
- # They're probably on 1.8 without the io-console gem. We'll keep trying.
47
+ # They probably don't have the io/console stdlib or the io-console gem.
48
+ # We'll keep trying.
48
49
  end
49
50
 
50
51
  def screen_size_according_to_env
@@ -7,14 +7,14 @@ class << Pry
7
7
  def reset_defaults
8
8
  orig_reset_defaults
9
9
 
10
- Pry.color = false
11
- Pry.pager = false
10
+ Pry.config.color = false
11
+ Pry.config.pager = false
12
12
  Pry.config.should_load_rc = false
13
13
  Pry.config.should_load_local_rc= false
14
14
  Pry.config.should_load_plugins = false
15
15
  Pry.config.history.should_load = false
16
16
  Pry.config.history.should_save = false
17
- Pry.config.auto_indent = false
17
+ Pry.config.correct_indent = false
18
18
  Pry.config.hooks = Pry::Hooks.new
19
19
  Pry.config.collision_warning = false
20
20
  end
@@ -47,10 +47,6 @@ module PryTestHelpers
47
47
  end
48
48
  end
49
49
 
50
- def mri18_and_no_real_source_location?
51
- Pry::Helpers::BaseHelpers.mri_18? && !(Method.instance_method(:source_location).owner == Method)
52
- end
53
-
54
50
  # Open a temp file and yield it to the block, closing it after
55
51
  # @return [String] The path of the temp file
56
52
  def temp_file(ext='.rb')
@@ -67,16 +63,15 @@ module PryTestHelpers
67
63
 
68
64
  def mock_command(cmd, args=[], opts={})
69
65
  output = StringIO.new
70
- ret = cmd.new(opts.merge(:output => output)).call_safely(*args)
66
+ pry = Pry.new(output: output)
67
+ ret = cmd.new(opts.merge(pry_instance: pry, :output => output)).call_safely(*args)
71
68
  Struct.new(:output, :return).new(output.string, ret)
72
69
  end
73
70
 
74
71
  def mock_exception(*mock_backtrace)
75
- e = StandardError.new("mock exception")
76
- (class << e; self; end).class_eval do
77
- define_method(:backtrace) { mock_backtrace }
72
+ StandardError.new.tap do |e|
73
+ e.define_singleton_method(:backtrace) { mock_backtrace }
78
74
  end
79
- e
80
75
  end
81
76
  end
82
77
 
@@ -101,18 +96,17 @@ def pry_eval(*eval_strs)
101
96
  end
102
97
 
103
98
  class PryTester
99
+ extend Forwardable
100
+
104
101
  attr_reader :pry, :out
105
102
 
106
- def initialize(context = TOPLEVEL_BINDING, options = {})
107
- @pry = Pry.new(options)
103
+ def_delegators :@pry, :eval_string, :eval_string=
108
104
 
109
- if context
110
- target = Pry.binding_for(context)
111
- @pry.binding_stack << target
112
- @pry.inject_sticky_locals(target)
113
- end
105
+ def initialize(target = TOPLEVEL_BINDING, options = {})
106
+ @pry = Pry.new(options.merge(:target => target))
107
+ @history = options[:history]
114
108
 
115
- @pry.input_array << nil # TODO: shouldn't need this
109
+ @pry.inject_sticky_locals!
116
110
  reset_output
117
111
  end
118
112
 
@@ -122,6 +116,8 @@ class PryTester
122
116
 
123
117
  strs.flatten.each do |str|
124
118
  str = "#{str.strip}\n"
119
+ @history.push str if @history
120
+
125
121
  if @pry.process_command(str)
126
122
  result = last_command_result_or_output
127
123
  else
@@ -132,43 +128,32 @@ class PryTester
132
128
  result
133
129
  end
134
130
 
135
- def context=(context)
136
- @pry.binding_stack << Pry.binding_for(context)
137
- end
138
-
139
- # TODO: eliminate duplication with Pry#repl
140
- def simulate_repl
141
- didnt_exit = nil
142
- break_data = nil
143
-
144
- didnt_exit = catch(:didnt_exit) do
145
- break_data = catch(:breakout) do
146
- yield self
147
- throw(:didnt_exit, true)
148
- end
149
- nil
131
+ def push(*lines)
132
+ Array(lines).flatten.each do |line|
133
+ @pry.eval(line)
150
134
  end
135
+ end
151
136
 
152
- raise "Failed to exit REPL" if didnt_exit
153
- break_data
137
+ def push_binding(context)
138
+ @pry.push_binding context
154
139
  end
155
140
 
156
141
  def last_output
157
142
  @out.string if @out
158
143
  end
159
144
 
160
- def process_command(command_str, eval_str = '')
161
- @pry.process_command(command_str, eval_str) or raise "Not a valid command"
145
+ def process_command(command_str)
146
+ @pry.process_command(command_str) or raise "Not a valid command"
162
147
  last_command_result_or_output
163
148
  end
164
149
 
165
- protected
166
-
167
150
  def last_command_result
168
151
  result = Pry.current[:pry_cmd_result]
169
152
  result.retval if result
170
153
  end
171
154
 
155
+ protected
156
+
172
157
  def last_command_result_or_output
173
158
  result = last_command_result
174
159
  if result != Pry::Command::VOID_VALUE