pry 0.9.8pre5-i386-mswin32 → 0.9.8pre6-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.
@@ -9,9 +9,10 @@ class Pry
9
9
  end
10
10
 
11
11
  command "show-input", "Show the contents of the input buffer for the current multi-line expression." do
12
- render_output(false, 1, colorize_code(eval_string))
12
+ output.puts Code.new(eval_string).with_line_numbers
13
13
  end
14
14
 
15
+ # TODO: refactor to command_class
15
16
  command(/amend-line(?: (-?\d+)(?:\.\.(-?\d+))?)?/, "Amend a line of input in multi-line mode. Type `amend-line --help` for more information. Aliases %",
16
17
  :interpolate => false, :listing => "amend-line") do |*args|
17
18
  start_line_number, end_line_number, replacement_line = *args
@@ -59,35 +60,54 @@ class Pry
59
60
 
60
61
  alias_command(/%.?(-?\d+)?(?:\.\.(-?\d+))?/, "amend-line")
61
62
 
62
- command "play", "Play back a string variable or a method or a file as input. Type `play --help` for more information." do |*args|
63
- opts = Slop.parse!(args) do |opt|
64
- opt.banner unindent <<-USAGE
65
- Usage: play [OPTIONS] [--help]
66
- Default action (no options) is to play the provided string variable
67
- e.g `play _in_[20] --lines 1..3`
68
- e.g `play -m Pry#repl --lines 1..-1`
69
- e.g `play -f Rakefile --lines 5`
70
- USAGE
63
+ command_class "play" do
64
+ description "Play back a string variable or a method or a file as input. Type `play --help` for more information."
65
+
66
+ banner <<-BANNER
67
+ Usage: play [OPTIONS] [--help]
68
+
69
+ The play command enables you to replay code from files and methods as
70
+ if they were entered directly in the Pry REPL. Default action (no
71
+ options) is to play the provided string variable
71
72
 
73
+ e.g: `play _in_[20] --lines 1..3`
74
+ e.g: `play -m Pry#repl --lines 1..-1`
75
+ e.g: `play -f Rakefile --lines 5`
76
+
77
+ https://github.com/pry/pry/wiki/User-Input#wiki-Play
78
+ BANNER
79
+
80
+ def options(opt)
72
81
  opt.on :l, :lines, 'The line (or range of lines) to replay.', true, :as => Range
73
82
  opt.on :m, :method, 'Play a method.', true
74
83
  opt.on :f, "file", 'The file to replay in context.', true
75
84
  opt.on :o, "open", 'When used with the -m switch, it plays the entire method except the last line, leaving the method definition "open". `amend-line` can then be used to modify the method.'
76
- opt.on :h, :help, "This message." do
77
- output.puts opt.help
85
+ end
86
+
87
+ def process
88
+ if opts.present?(:method)
89
+ process_method
90
+ elsif opts.present?(:file)
91
+ process_file
92
+ else
93
+ process_input
78
94
  end
95
+
96
+ run "show-input" unless _pry_.complete_expression?(eval_string)
79
97
  end
80
98
 
81
- if opts.present?(:method)
99
+ def process_method
82
100
  meth_name = opts[:m]
83
101
  meth = get_method_or_raise(meth_name, target, {}, :omit_help)
84
- next unless meth.source
102
+ return unless meth.source
85
103
 
86
104
  range = opts.present?(:lines) ? one_index_range_or_number(opts[:l]) : (0..-1)
87
105
  range = (0..-2) if opts.present?(:open)
88
106
 
89
107
  eval_string << Array(meth.source.each_line.to_a[range]).join
90
- elsif opts.present?(:file)
108
+ end
109
+
110
+ def process_file
91
111
  file_name = File.expand_path(opts[:f])
92
112
 
93
113
  if !File.exists?(file_name)
@@ -98,9 +118,10 @@ class Pry
98
118
  range = opts.present?(:lines) ? one_index_range_or_number(opts[:l]) : (0..-1)
99
119
  range = (0..-2) if opts.present?(:open)
100
120
 
101
- _pry_.input_stack << _pry_.input
102
- _pry_.input = StringIO.new(Array(text_array[range]).join)
103
- else
121
+ eval_string << Array(text_array[range]).join
122
+ end
123
+
124
+ def process_input
104
125
  if !args.first
105
126
  raise CommandError, "No input to play command."
106
127
  end
@@ -113,177 +134,109 @@ class Pry
113
134
  eval_string << Array(code.each_line.to_a[range]).join
114
135
  end
115
136
 
116
- run "show-input" if !_pry_.complete_expression?(eval_string)
117
137
  end
118
138
 
119
- command "hist", "Show and replay Readline history. Type `hist --help` for more info. Aliases: history" do |*args|
120
- # exclude the current command from history.
121
- history = Pry.history.to_a[0..-2]
122
-
123
- opts = Slop.parse!(args) do |opt|
124
- opt.banner "Usage: hist [--replay START..END] [--clear] [--grep PATTERN] [--head N] [--tail N] [--help] [--save [START..END] file.txt]\n"
125
-
126
- opt.on :n, 'no-numbers', 'Omit line numbers.'
127
-
128
- opt.on :g, :grep, 'A pattern to match against the history.', true
129
-
130
- opt.on :head, 'Display the first N items of history.',
131
- :optional => true,
132
- :as => Integer
133
-
134
- opt.on :t, :tail, 'Display the last N items of history.',
135
- :optional => true,
136
- :as => Integer
137
-
138
- opt.on :s, :show, 'Show the history corresponding to the history line (or range of lines).',
139
- :optional => true,
140
- :as => Range
141
-
142
- opt.on :e, :exclude, 'Exclude pry commands from the history.'
143
-
144
- opt.on :r, :replay, 'The line (or range of lines) to replay.', true,
145
- :as => Range
146
-
147
- opt.on "save", "Save history to a file. --save [start..end] output.txt. Pry commands are excluded from saved history.", true,
148
- :as => Range
149
-
150
- opt.on :c, :clear, 'Clear the history.', :unless => :grep
151
-
152
- opt.on :h, :help, 'Show this message.', :tail => true, :unless => :grep do
153
- output.puts opt.help
154
- end
139
+ command_class "hist", "Show and replay Readline history. Aliases: history" do
140
+ banner <<-USAGE
141
+ Usage: hist
142
+ hist --head N
143
+ hist --tail N
144
+ hist --show START..END
145
+ hist --grep PATTERN
146
+ hist --clear
147
+ hist --replay START..END
148
+ hist --save [START..END] FILE
149
+ USAGE
150
+
151
+ def options(opt)
152
+ opt.on :h, :head, "Display the first N items.", :optional => true, :as => Integer
153
+ opt.on :t, :tail, "Display the last N items.", :optional => true, :as => Integer
154
+ opt.on :s, :show, "Show the given range of lines.", :optional => true, :as => Range
155
+ opt.on :g, :grep, "Show lines matching the given pattern.", true, :as => String
156
+ opt.on :c, :clear, "Clear the current session's history."
157
+ opt.on :r, :replay, "Replay a line or range of lines.", true, :as => Range
158
+ opt.on :save, "Save history to a file.", true, :as => Range
159
+
160
+ opt.on :e, :'exclude-pry', "Exclude Pry commands from the history."
161
+ opt.on :n, :'no-numbers', "Omit line numbers."
162
+ opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
155
163
  end
156
- next if opts.present?(:help)
157
164
 
158
- if opts.present?(:grep)
159
- pattern = Regexp.new(arg_string.strip.split(/ /, 2).last.strip)
160
- history.pop
161
-
162
- history.map!.with_index do |element, index|
163
- if element =~ pattern
164
- if opts.present?(:"no-numbers")
165
- element
166
- else
167
- "#{text.blue index}: #{element}"
168
- end
165
+ def process
166
+ @history = Pry::Code(Pry.history.to_a)
167
+
168
+ @history = case
169
+ when opts.present?(:head)
170
+ @history.between(1, opts[:head] || 10)
171
+ when opts.present?(:tail)
172
+ @history.between(-(opts[:tail] || 10), -1)
173
+ when opts.present?(:show)
174
+ @history.between(opts[:show])
175
+ else
176
+ @history
169
177
  end
170
- end
171
-
172
- stagger_output history.compact.join "\n"
173
- next
174
- end
175
178
 
176
- if opts.present?(:head)
177
- limit = opts['head'] || 10
178
- list = history.first limit
179
- lines = list.join("\n")
180
- if opts.present?(:"no-numbers")
181
- stagger_output lines
182
- else
183
- stagger_output text.with_line_numbers(lines, 0)
179
+ if opts.present?(:grep)
180
+ @history = @history.grep(opts[:grep])
184
181
  end
185
- next
186
- end
187
182
 
188
- if opts.present?(:tail)
189
- limit = opts['tail'] || 10
190
- offset = history.size - limit
191
- offset = offset < 0 ? 0 : offset
192
-
193
- list = history.last limit
194
- lines = list.join("\n")
195
- if opts.present?(:'no-numbers')
196
- stagger_output lines
197
- else
198
- stagger_output text.with_line_numbers(lines, offset)
183
+ if opts.present?(:'exclude-pry')
184
+ @history = @history.select { |l, ln| !command_set.valid_command?(l) }
199
185
  end
200
- next
201
- end
202
186
 
203
- if opts.present?(:show)
204
- range = opts['show']
205
- start_line = range.is_a?(Range) ? range.first : range
206
- lines = Array(history[range]).join("\n")
207
- if opts.present?(:'no-numbers')
208
- stagger_output lines
187
+ if opts.present?(:save)
188
+ process_save
189
+ elsif opts.present?(:clear)
190
+ process_clear
191
+ elsif opts.present?(:replay)
192
+ process_replay
209
193
  else
210
- stagger_output text.with_line_numbers(lines, start_line)
194
+ process_display
211
195
  end
212
- next
213
196
  end
214
197
 
215
- if opts.present?(:exclude)
216
- history.map!.with_index do |element, index|
217
- unless command_set.valid_command? element
218
- if opts.present?(:'no-numbers')
219
- element
220
- else
221
- "#{text.blue index}: #{element}"
222
- end
223
- end
198
+ def process_display
199
+ unless opts.present?(:'no-numbers')
200
+ @history = @history.with_line_numbers
224
201
  end
225
- stagger_output history.compact.join "\n"
226
- next
227
- end
228
202
 
229
- if opts.present?(:replay)
230
- range = opts['replay']
231
- actions = Array(history[range]).join("\n") + "\n"
232
- _pry_.input_stack << _pry_.input
233
- _pry_.input = StringIO.new(actions)
234
- next
235
- end
236
-
237
- if opts.present?(:clear)
238
- Pry.history.clear
239
- output.puts 'History cleared.'
240
- next
203
+ render_output(@history, opts)
241
204
  end
242
205
 
243
- # FIXME: hack to save history (this must be refactored)
244
- if opts["save"]
245
- file_name = nil
246
- hist_array = nil
247
-
248
- case opts["save"]
206
+ def process_save
207
+ case opts[:save]
249
208
  when Range
250
- hist_array = Array(history[opts["save"]])
209
+ @history = @history.between(opts[:save])
251
210
 
252
- if !args.first
211
+ unless args.first
253
212
  raise CommandError, "Must provide a file name."
254
213
  end
255
214
 
256
215
  file_name = File.expand_path(args.first)
257
216
  when String
258
- hist_array = history
259
- file_name = File.expand_path(opts["save"])
217
+ file_name = File.expand_path(opts[:save])
260
218
  end
261
219
 
262
- output.puts "Saving history in #{file_name} ..."
263
- # exclude pry commands
264
- hist_array.reject! do |element|
265
- command_set.valid_command?(element)
266
- end
220
+ output.puts "Saving history in #{file_name}..."
267
221
 
268
- File.open(file_name, 'w') do |f|
269
- f.write hist_array.join("\n")
270
- end
222
+ File.open(file_name, 'w') { |f| f.write(@history.to_s) }
271
223
 
272
- output.puts "... history saved."
273
- next
224
+ output.puts "History saved."
274
225
  end
275
226
 
276
- lines = history.join("\n")
277
- if opts.present?(:'no-numbers')
278
- stagger_output lines
279
- else
280
- stagger_output text.with_line_numbers(lines, 0)
227
+ def process_clear
228
+ Pry.history.clear
229
+ output.puts "History cleared."
230
+ end
231
+
232
+ def process_replay
233
+ @history = @history.between(opts[:r])
234
+ _pry_.input_stack << _pry_.input
235
+ _pry_.input = StringIO.new(@history.to_s)
281
236
  end
282
237
  end
283
238
 
284
239
  alias_command "history", "hist"
285
-
286
240
  end
287
-
288
241
  end
289
242
  end
@@ -5,13 +5,26 @@ class Pry
5
5
 
6
6
  Introspection = Pry::CommandSet.new do
7
7
 
8
- command_class "show-method", "Show the source for METH. Type `show-method --help` for more info. Aliases: $, show-source", :shellwords => false do |*args|
8
+ command_class "show-method" do
9
+ description "Show the source for METH. Type `show-method --help` for more info. Aliases: $, show-source"
10
+
9
11
  banner <<-BANNER
10
12
  Usage: show-method [OPTIONS] [METH]
13
+ Aliases: $, show-source
14
+
11
15
  Show the source for method METH. Tries instance methods first and then methods by default.
12
- e.g: show-method hello_method
16
+
17
+ e.g: `show-method hello_method`
18
+ e.g: `show-method -m hello_method`
19
+ e.g: `show-method Pry#rep`
20
+
21
+ https://github.com/pry/pry/wiki/Source-browsing#wiki-Show_method
13
22
  BANNER
14
23
 
24
+ command_options(
25
+ :shellwords => false
26
+ )
27
+
15
28
  def options(opt)
16
29
  method_options(opt)
17
30
  opt.on :l, "line-numbers", "Show line numbers."
@@ -28,20 +41,16 @@ class Pry
28
41
  output.puts "#{text.bold("Visibility:")} #{meth.visibility}"
29
42
  output.puts
30
43
 
31
- if Pry.color
32
- code = CodeRay.scan(meth.source, meth.source_type).term
33
- else
34
- code = meth.source
35
- end
36
-
37
- start_line = false
38
44
  if opts.present?(:'base-one')
39
45
  start_line = 1
40
- elsif opts.present?(:'line-numbers')
46
+ else
41
47
  start_line = meth.source_line || 1
42
48
  end
43
49
 
44
- render_output(opts.present?(:flood), start_line, code)
50
+ code = Code.from_method(meth, start_line).
51
+ with_line_numbers(opts.present?(:b) || opts.present?(:l))
52
+
53
+ render_output(code, opts)
45
54
  end
46
55
  end
47
56
 
@@ -81,68 +90,75 @@ class Pry
81
90
  output.puts make_header(block)
82
91
  output.puts
83
92
 
84
- if Pry.color
85
- code = CodeRay.scan(block.source, :ruby).term
86
- else
87
- code = block.source
88
- end
93
+ code = Code.from_method(block).with_line_numbers(opts.present?(:'line-numbers'))
89
94
 
90
- start_line = false
91
- if opts.present?(:'line-numbers')
92
- start_line = block.source_line || 1
93
- end
94
-
95
- render_output(opts.present?(:flood), opts.present?(:'line-numbers') ? block.source_line : false, code)
96
- code
95
+ render_output(code, opts)
97
96
  else
98
97
  raise CommandError, "No such command: #{command_name}."
99
98
  end
100
99
  end
101
100
 
102
- command "edit", "Invoke the default editor on a file. Type `edit --help` for more info" do |*args|
103
- opts = Slop.parse!(args) do |opt|
104
- opt.banner unindent <<-USAGE
105
- Usage: edit [--no-reload|--reload] [--line LINE] [--temp|--ex|FILE[:LINE]|--in N]
106
- Open a text editor. When no FILE is given, edits the pry input buffer.
107
- Ensure #{text.bold("Pry.config.editor")} is set to your editor of choice.
108
- e.g: edit sample.rb
109
- USAGE
101
+ command_class "edit" do
102
+ description "Invoke the default editor on a file. Type `edit --help` for more info"
103
+
104
+ banner <<-BANNER
105
+ Usage: edit [--no-reload|--reload] [--line LINE] [--temp|--ex|FILE[:LINE]|--in N]
110
106
 
107
+ Open a text editor. When no FILE is given, edits the pry input buffer.
108
+ Ensure Pry.config.editor is set to your editor of choice.
109
+
110
+ e.g: `edit sample.rb`
111
+ e.g: `edit sample.rb --line 105`
112
+ e.g: `edit --ex`
113
+
114
+ https://github.com/pry/pry/wiki/Editor-integration#wiki-Edit_command
115
+ BANNER
116
+
117
+ def options(opt)
111
118
  opt.on :e, :ex, "Open the file that raised the most recent exception (_ex_.file)", :optional => true, :as => Integer
112
119
  opt.on :i, :in, "Open a temporary file containing the Nth line of _in_. N may be a range.", :optional => true, :as => Range, :default => -1..-1
113
120
  opt.on :t, :temp, "Open an empty temporary file"
114
121
  opt.on :l, :line, "Jump to this line in the opened file", true, :as => Integer
115
122
  opt.on :n, :"no-reload", "Don't automatically reload the edited code"
116
123
  opt.on :r, :reload, "Reload the edited code immediately (default for ruby files)"
117
- opt.on :h, :help, "This message." do
118
- output.puts opt.help
124
+ end
125
+
126
+ def process
127
+ if [opts.present?(:ex), opts.present?(:temp), opts.present?(:in), !args.empty?].count(true) > 1
128
+ raise CommandError, "Only one of --ex, --temp, --in and FILE may be specified."
129
+ end
130
+
131
+ if !opts.present?(:ex) && args.empty?
132
+ # edit of local code, eval'd within pry.
133
+ process_local_edit
134
+ else
135
+ # edit of remote code, eval'd at top-level
136
+ process_remote_edit
119
137
  end
120
138
  end
121
- next if opts.present?(:help)
122
139
 
123
- if [opts.present?(:ex), opts.present?(:temp), opts.present?(:in), !args.empty?].count(true) > 1
124
- raise CommandError, "Only one of --ex, --temp, --in and FILE may be specified."
140
+ def process_i
141
+ case opts[:i]
142
+ when Range
143
+ (_pry_.input_array[opts[:i]] || []).join
144
+ when Fixnum
145
+ _pry_.input_array[opts[:i]] || ""
146
+ else
147
+ return output.puts "Not a valid range: #{opts[:i]}"
148
+ end
125
149
  end
126
150
 
127
- # edit of local code, eval'd within pry.
128
- if !opts.present?(:ex) && args.empty?
129
-
130
- content = if opts.present?(:temp)
131
- ""
132
- elsif opts.present?(:in)
133
- case opts[:i]
134
- when Range
135
- (_pry_.input_array[opts[:i]] || []).join
136
- when Fixnum
137
- _pry_.input_array[opts[:i]] || ""
138
- else
139
- next output.puts "Not a valid range: #{opts[:i]}"
140
- end
141
- elsif eval_string.strip != ""
142
- eval_string
143
- else
144
- _pry_.input_array.reverse_each.find{ |x| x && x.strip != "" } || ""
145
- end
151
+ def process_local_edit
152
+ content = case
153
+ when opts.present?(:temp)
154
+ ""
155
+ when opts.present?(:in)
156
+ process_i
157
+ when eval_string.strip != ""
158
+ eval_string
159
+ else
160
+ _pry_.input_array.reverse_each.find{ |x| x && x.strip != "" } || ""
161
+ end
146
162
 
147
163
  line = content.lines.count
148
164
 
@@ -156,9 +172,9 @@ class Pry
156
172
  end
157
173
  end
158
174
  end
175
+ end
159
176
 
160
- # edit of remote code, eval'd at top-level
161
- else
177
+ def process_remote_edit
162
178
  if opts.present?(:ex)
163
179
  if _pry_.last_exception.nil?
164
180
  raise CommandError, "No exception found."
@@ -203,15 +219,25 @@ class Pry
203
219
  end
204
220
  end
205
221
 
206
- command_class "edit-method", "Edit a method. Type `edit-method --help` for more info.", :shellwords => false do |*args|
222
+ command_class "edit-method" do
223
+ description "Edit a method. Type `edit-method --help` for more info."
224
+
225
+ banner <<-BANNER
226
+ Usage: edit-method [OPTIONS] [METH]
227
+
228
+ Edit the method METH in an editor.
229
+ Ensure Pry.config.editor is set to your editor of choice.
230
+
231
+ e.g: `edit-method hello_method`
232
+ e.g: `edit-method Pry#rep`
233
+ e.g: `edit-method`
234
+
235
+ https://github.com/pry/pry/wiki/Editor-integration#wiki-Edit_method
236
+ BANNER
237
+
238
+ command_options :shellwords => false
207
239
 
208
240
  def options(opt)
209
- opt.banner unindent <<-BANNER
210
- Usage: edit-method [OPTIONS] [METH]
211
- Edit the method METH in an editor.
212
- Ensure #{text.bold("Pry.config.editor")} is set to your editor of choice.
213
- e.g: edit-method hello_method
214
- BANNER
215
241
  method_options(opt)
216
242
  opt.on :n, "no-reload", "Do not automatically reload the method's file after editing."
217
243
  opt.on "no-jump", "Do not fast forward editor to first line of method."
@@ -219,62 +245,88 @@ class Pry
219
245
  end
220
246
 
221
247
  def process
222
- meth = method_object
223
248
  if !Pry.config.editor
224
249
  raise CommandError, "No editor set!\nEnsure that #{text.bold("Pry.config.editor")} is set to your editor of choice."
225
250
  end
226
251
 
227
- if opts.present?(:patch) || meth.dynamically_defined?
228
- lines = meth.source.lines.to_a
252
+ begin
253
+ @method = method_object
254
+ rescue NonMethodContextError => err
255
+ end
229
256
 
230
- if ((original_name = meth.original_name) &&
231
- lines[0] =~ /^def (?:.*?\.)?#{original_name}(?=[\(\s;]|$)/)
232
- lines[0] = "def #{original_name}#{$'}"
233
- else
234
- raise CommandError, "Pry can only patch methods created with the `def` keyword."
257
+ if opts.present?(:patch) || (@method && @method.dynamically_defined?)
258
+ if err
259
+ raise err # can't patch a non-method
235
260
  end
236
261
 
237
- temp_file do |f|
238
- f.puts lines.join
239
- f.flush
240
- invoke_editor(f.path, 0)
241
-
242
- if meth.alias?
243
- with_method_transaction(original_name, meth.owner) do
244
- Pry.new(:input => StringIO.new(File.read(f.path))).rep(meth.owner)
245
- Pry.binding_for(meth.owner).eval("alias #{meth.name} #{original_name}")
246
- end
247
- else
248
- Pry.new(:input => StringIO.new(File.read(f.path))).rep(meth.owner)
249
- end
262
+ process_patch
263
+ else
264
+ if err && !File.exist?(target.eval('__FILE__'))
265
+ raise err # can't edit a non-file
250
266
  end
251
- return
267
+
268
+ process_file
252
269
  end
270
+ end
271
+
272
+ def process_patch
273
+ lines = @method.source.lines.to_a
253
274
 
254
- if meth.source_type == :c
255
- raise CommandError, "Can't edit a C method."
275
+ if ((original_name = @method.original_name) &&
276
+ lines[0] =~ /^def (?:.*?\.)?#{original_name}(?=[\(\s;]|$)/)
277
+ lines[0] = "def #{original_name}#{$'}"
256
278
  else
257
- file, line = meth.source_file, meth.source_line
279
+ raise CommandError, "Pry can only patch methods created with the `def` keyword."
280
+ end
258
281
 
259
- invoke_editor(file, opts["no-jump"] ? 0 : line)
260
- silence_warnings do
261
- load file if !opts.present?(:'no-jump') && !Pry.config.disable_auto_reload
282
+ temp_file do |f|
283
+ f.puts lines.join
284
+ f.flush
285
+ invoke_editor(f.path, 0)
286
+
287
+ if @method.alias?
288
+ with_method_transaction(original_name, @method.owner) do
289
+ Pry.new(:input => StringIO.new(File.read(f.path))).rep(@method.owner)
290
+ Pry.binding_for(@method.owner).eval("alias #{@method.name} #{original_name}")
291
+ end
292
+ else
293
+ Pry.new(:input => StringIO.new(File.read(f.path))).rep(@method.owner)
262
294
  end
263
295
  end
264
296
  end
265
- end
266
297
 
267
- helpers do
268
- def with_method_transaction(meth_name, target=TOPLEVEL_BINDING)
269
- target = Pry.binding_for(target)
270
- temp_name = "__pry_#{meth_name}__"
298
+ def process_file
299
+ file, line = extract_file_and_line
271
300
 
272
- target.eval("alias #{temp_name} #{meth_name}")
273
- yield
274
- target.eval("alias #{meth_name} #{temp_name}")
275
- ensure
276
- target.eval("undef #{temp_name}") rescue nil
301
+ invoke_editor(file, opts["no-jump"] ? 0 : line)
302
+ silence_warnings do
303
+ load file unless opts.present?(:'no-jump') || Pry.config.disable_auto_reload
304
+ end
277
305
  end
306
+
307
+ protected
308
+ def extract_file_and_line
309
+ if @method
310
+ if @method.source_type == :c
311
+ raise CommandError, "Can't edit a C method."
312
+ else
313
+ [@method.source_file, @method.source_line]
314
+ end
315
+ else
316
+ [target.eval('__FILE__'), target.eval('__LINE__')]
317
+ end
318
+ end
319
+
320
+ def with_method_transaction(meth_name, target=TOPLEVEL_BINDING)
321
+ target = Pry.binding_for(target)
322
+ temp_name = "__pry_#{meth_name}__"
323
+
324
+ target.eval("alias #{temp_name} #{meth_name}")
325
+ yield
326
+ target.eval("alias #{meth_name} #{temp_name}")
327
+ ensure
328
+ target.eval("undef #{temp_name}") rescue nil
329
+ end
278
330
  end
279
331
  end
280
332
  end