pry 0.9.4pre1-i386-mingw32 → 0.9.4pre2-i386-mingw32

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 (39) hide show
  1. data/CHANGELOG +23 -0
  2. data/CONTRIBUTORS +13 -11
  3. data/README.markdown +2 -0
  4. data/Rakefile +16 -2
  5. data/TODO +8 -0
  6. data/lib/pry.rb +58 -9
  7. data/lib/pry/command_context.rb +11 -0
  8. data/lib/pry/command_processor.rb +43 -6
  9. data/lib/pry/command_set.rb +14 -4
  10. data/lib/pry/completion.rb +5 -5
  11. data/lib/pry/config.rb +6 -2
  12. data/lib/pry/default_commands/context.rb +83 -35
  13. data/lib/pry/default_commands/documentation.rb +37 -31
  14. data/lib/pry/default_commands/easter_eggs.rb +5 -0
  15. data/lib/pry/default_commands/input.rb +13 -10
  16. data/lib/pry/default_commands/introspection.rb +54 -40
  17. data/lib/pry/default_commands/shell.rb +9 -5
  18. data/lib/pry/helpers/base_helpers.rb +16 -5
  19. data/lib/pry/helpers/command_helpers.rb +41 -17
  20. data/lib/pry/helpers/text.rb +2 -1
  21. data/lib/pry/history.rb +61 -0
  22. data/lib/pry/plugins.rb +19 -8
  23. data/lib/pry/pry_class.rb +25 -62
  24. data/lib/pry/pry_instance.rb +105 -120
  25. data/lib/pry/version.rb +1 -1
  26. data/pry.gemspec +15 -14
  27. data/test/helper.rb +31 -0
  28. data/test/test_command_set.rb +7 -2
  29. data/test/test_completion.rb +7 -3
  30. data/test/test_default_commands/test_context.rb +185 -1
  31. data/test/test_default_commands/test_documentation.rb +10 -0
  32. data/test/test_default_commands/test_input.rb +16 -11
  33. data/test/test_default_commands/test_introspection.rb +10 -0
  34. data/test/test_default_commands/test_shell.rb +18 -0
  35. data/test/test_pry.rb +189 -40
  36. data/test/test_pry_history.rb +13 -13
  37. data/test/test_pry_output.rb +44 -0
  38. data/test/test_special_locals.rb +35 -0
  39. metadata +182 -173
@@ -11,7 +11,7 @@ class Pry
11
11
  target = target()
12
12
 
13
13
  opts = Slop.parse!(args) do |opt|
14
- opt.banner = "Usage: show-doc [OPTIONS] [METH]\n" \
14
+ opt.banner = "Usage: show-doc [OPTIONS] [METH 1] [METH 2] [METH N]\n" \
15
15
  "Show the comments above method METH. Tries instance methods first and then methods by default.\n" \
16
16
  "e.g show-doc hello_method"
17
17
 
@@ -28,25 +28,26 @@ class Pry
28
28
 
29
29
  next if opts.help?
30
30
 
31
- meth_name = args.shift
32
- if (meth = get_method_object(meth_name, target, opts.to_hash(true))).nil?
33
- output.puts "Invalid method name: #{meth_name}. Type `show-doc --help` for help"
34
- next
35
- end
31
+ args = [nil] if args.empty?
32
+ args.each do |method_name|
33
+ meth_name = method_name
34
+ if (meth = get_method_object(meth_name, target, opts.to_hash(true))).nil?
35
+ output.puts "Invalid method name: #{meth_name}. Type `show-doc --help` for help"
36
+ next
37
+ end
36
38
 
37
- doc, code_type = doc_and_code_type_for(meth)
38
- next if !doc
39
+ doc, code_type = doc_and_code_type_for(meth)
40
+ next if !doc
39
41
 
40
- next output.puts("No documentation found.") if doc.empty?
41
- doc = process_comment_markup(doc, code_type)
42
- output.puts make_header(meth, code_type, doc)
43
- output.puts "#{text.bold("visibility: ")} #{method_visibility(meth).to_s}"
44
- if meth.respond_to?(:parameters)
42
+ next output.puts("No documentation found.") if doc.empty?
43
+ doc = process_comment_markup(doc, code_type)
44
+ output.puts make_header(meth, code_type, doc)
45
+ output.puts "#{text.bold("visibility: ")} #{method_visibility(meth).to_s}"
45
46
  output.puts "#{text.bold("signature: ")} #{signature_for(meth)}"
46
47
  output.puts
48
+ render_output(opts.flood?, false, doc)
49
+ doc
47
50
  end
48
- render_output(opts.flood?, false, doc)
49
- doc
50
51
  end
51
52
 
52
53
  alias_command "?", "show-doc", ""
@@ -88,11 +89,9 @@ class Pry
88
89
  output.puts "Visibility: " + method_visibility(meth).to_s
89
90
  output.puts "Type: " + (meth.is_a?(Method) ? "Bound" : "Unbound")
90
91
  output.puts "Arity: " + meth.arity.to_s
92
+ output.puts "Method Signature: " + signature_for(meth)
91
93
 
92
- if meth.respond_to?(:parameters)
93
- output.puts "Method Signature: " + signature_for(meth)
94
- end
95
-
94
+ output.puts "Source location: " + (meth.source_location ? meth.source_location.join(":") : "Not found.")
96
95
  end
97
96
 
98
97
  command "gist-method", "Gist a method to github. Type `gist-method --help` for more info.", :requires_gem => "gist" do |*args|
@@ -144,21 +143,28 @@ class Pry
144
143
  end
145
144
 
146
145
  helpers do
147
- def signature_for(meth)
148
- param_strings = []
149
- meth.parameters.each do |kind, name|
150
- case kind
151
- when :req
152
- param_strings << name
153
- when :opt
154
- param_strings << "#{name}=?"
155
- when :rest
156
- param_strings << "*#{name}"
146
+
147
+ # paraphrased from awesome_print gem
148
+ def signature_for(method)
149
+ if method.respond_to?(:parameters)
150
+
151
+ args = method.parameters.inject([]) do |arr, (type, name)|
152
+ name ||= (type == :block ? 'block' : "arg#{arr.size + 1}")
153
+ arr << case type
154
+ when :req then name.to_s
155
+ when :opt, :rest then "*#{name}"
156
+ when :block then "&#{name}"
157
+ else '?'
158
+ end
157
159
  end
160
+ else
161
+ args = (1..method.arity.abs).map { |i| "arg#{i}" }
162
+ args[-1] = "*#{args[-1]}" if method.arity < 0
158
163
  end
159
- "#{meth.name}(#{param_strings.join(", ")})"
160
- end
161
164
 
165
+ "#{method.name}(#{args.join(', ')})"
166
+ end
167
+
162
168
  def method_visibility(meth)
163
169
  if meth.owner.public_instance_methods.include? meth.name
164
170
  :public
@@ -3,6 +3,11 @@ class Pry
3
3
 
4
4
  EasterEggs = Pry::CommandSet.new do
5
5
 
6
+ command(/!s\/(.*?)\/(.*?)/, "") do |source, dest|
7
+ eval_string.gsub!(/#{source}/) { dest }
8
+ run "show-input"
9
+ end
10
+
6
11
  command "east-coker", "" do
7
12
  text = %{
8
13
  --
@@ -54,9 +54,9 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
54
54
 
55
55
  alias_command(/%.?(-?\d+)?(?:\.\.(-?\d+))?/, /amend-line.?(-?\d+)?(?:\.\.(-?\d+))?/, "")
56
56
 
57
- command "play", "Play back a string or a method or a file as input. Type `play --help` for more information." do |*args|
57
+ command "play", "Play back a string variable or a method or a file as input. Type `play --help` for more information." do |*args|
58
58
  opts = Slop.parse!(args) do |opt|
59
- opt.banner "Usage: play [OPTIONS] [--help]\nDefault action (no options) is to play the provided string\ne.g `play puts 'hello world'` #=> \"hello world\"\ne.g `play -m Pry#repl --lines 1..-1`\ne.g `play -f Rakefile --lines 5`"
59
+ opt.banner "Usage: play [OPTIONS] [--help]\nDefault action (no options) is to play the provided string variable\ne.g `play _in_[20] --lines 1..3`\ne.g `play -m Pry#repl --lines 1..-1`\ne.g `play -f Rakefile --lines 5`"
60
60
 
61
61
  opt.on :l, :lines, 'The line (or range of lines) to replay.', true, :as => Range
62
62
  opt.on :m, :method, 'Play a method.', true
@@ -65,8 +65,6 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
65
65
  opt.on :h, :help, "This message." do
66
66
  output.puts opt
67
67
  end
68
-
69
- opt.on_noopts { _pry_.input = StringIO.new(arg_string) }
70
68
  end
71
69
 
72
70
  if opts.m?
@@ -82,9 +80,7 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
82
80
  range = (0..-2) if opts.o?
83
81
 
84
82
  _pry_.input = StringIO.new(Array(code.each_line.to_a[range]).join)
85
- end
86
-
87
- if opts.f?
83
+ elsif opts.f?
88
84
  file_name = File.expand_path(opts[:f])
89
85
  next output.puts "No such file: #{opts[:f]}" if !File.exists?(file_name)
90
86
  text_array = File.readlines(file_name)
@@ -92,12 +88,19 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
92
88
  range = (0..-2) if opts.o?
93
89
 
94
90
  _pry_.input = StringIO.new(Array(text_array[range]).join)
91
+ else
92
+ code = target.eval(args.first)
93
+
94
+ range = opts.l? ? one_index_range_or_number(opts[:l]) : (0..-1)
95
+ range = (0..-2) if opts.o?
96
+
97
+ eval_string << Array(code.each_line.to_a[range]).join
95
98
  end
96
99
  end
97
100
 
98
101
  command "hist", "Show and replay Readline history. Type `hist --help` for more info. Aliases: history" do |*args|
99
102
  # exclude the current command from history.
100
- history = Readline::HISTORY.to_a[0..-2]
103
+ history = Pry.history.to_a[0..-2]
101
104
 
102
105
  opts = Slop.parse!(args) do |opt|
103
106
  opt.banner "Usage: hist [--replay START..END] [--clear] [--grep PATTERN] [--head N] [--tail N] [--help] [--save [START..END] file.txt]\n"
@@ -132,7 +135,7 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
132
135
  :unless => :grep do |limit|
133
136
 
134
137
  limit ||= 10
135
- offset = history.size-limit
138
+ offset = history.size - limit
136
139
  offset = offset < 0 ? 0 : offset
137
140
 
138
141
  list = history.last limit
@@ -170,7 +173,7 @@ e.g amend-line puts 'hello again' # no line number modifies immediately preced
170
173
  opt.on "save", "Save history to a file. --save [start..end] output.txt. Pry commands are excluded from saved history.", true, :as => Range
171
174
 
172
175
  opt.on :c, :clear, 'Clear the history', :unless => :grep do
173
- Readline::HISTORY.shift until Readline::HISTORY.empty?
176
+ Pry.history.clear
174
177
  output.puts 'History cleared.'
175
178
  end
176
179
 
@@ -9,7 +9,7 @@ class Pry
9
9
  target = target()
10
10
 
11
11
  opts = Slop.parse!(args) do |opt|
12
- opt.banner "Usage: show-method [OPTIONS] [METH]\n" \
12
+ opt.banner "Usage: show-method [OPTIONS] [METH 1] [METH 2] [METH N]\n" \
13
13
  "Show the source for method METH. Tries instance methods first and then methods by default.\n" \
14
14
  "e.g: show-method hello_method"
15
15
 
@@ -29,30 +29,33 @@ class Pry
29
29
 
30
30
  next if opts.help?
31
31
 
32
- meth_name = args.shift
33
- if (meth = get_method_object(meth_name, target, opts.to_hash(true))).nil?
34
- output.puts "Invalid method name: #{meth_name}. Type `show-method --help` for help"
35
- next
36
- end
32
+ args = [nil] if args.empty?
33
+ args.each do |method_name|
34
+ meth_name = method_name
35
+ if (meth = get_method_object(meth_name, target, opts.to_hash(true))).nil?
36
+ output.puts "Invalid method name: #{meth_name}. Type `show-method --help` for help"
37
+ next
38
+ end
37
39
 
38
- code, code_type = code_and_code_type_for(meth)
39
- next if !code
40
+ code, code_type = code_and_code_type_for(meth)
41
+ next if !code
40
42
 
41
- output.puts make_header(meth, code_type, code)
42
- if Pry.color
43
- code = CodeRay.scan(code, code_type).term
44
- end
43
+ output.puts make_header(meth, code_type, code)
44
+ if Pry.color
45
+ code = CodeRay.scan(code, code_type).term
46
+ end
45
47
 
46
- start_line = false
47
- if opts.l?
48
- start_line = meth.source_location ? meth.source_location.last : 1
49
- end
48
+ start_line = false
49
+ if opts.l?
50
+ start_line = meth.source_location ? meth.source_location.last : 1
51
+ end
50
52
 
51
- start_line = opts.b? ? 1 : start_line
53
+ start_line = opts.b? ? 1 : start_line
52
54
 
53
55
 
54
- render_output(opts.flood?, start_line, code)
55
- code
56
+ render_output(opts.flood?, start_line, code)
57
+ code
58
+ end
56
59
  end
57
60
 
58
61
  alias_command "show-source", "show-method", ""
@@ -108,13 +111,14 @@ class Pry
108
111
  command "edit", "Invoke the default editor on a file. Type `edit --help` for more info" do |*args|
109
112
  opts = Slop.parse!(args) do |opt|
110
113
  opt.banner "Usage: edit [OPTIONS] [FILE]\n" \
111
- "Edit the method FILE in an editor.\n" \
112
- "Ensure #{text.bold("Pry.editor")} is set to your editor of choice.\n" \
114
+ "Edit the method FILE in an editor.\nWhen no file given, opens editor with contents of input buffer and evals after closing." \
115
+ "\nEnsure #{text.bold("Pry.config.editor")} is set to your editor of choice.\n" \
113
116
  "e.g: edit sample.rb"
114
117
 
115
118
  opt.on :r, "reload", "Eval file content after editing (evals at top level)"
116
- opt.on :ex, "Open an editor at the line and file that generated the most recent Exception."
117
- opt.on :t, "temp", "Open a temporary file in an editor and eval it in current context after closing."
119
+ opt.on :n, "no-reload", "Do not automatically reload the file after editing (only applies to --ex and -t)."
120
+ opt.on :ex, "Open an editor at the line and file that generated the most recent Exception, reloads file after editing."
121
+ opt.on :t, "temp", "Open a temporary file in an editor with contents of input buffer and eval it in current context after closing (same as `edit` with no args)"
118
122
  opt.on :p, "play", "Use the pry `play` command to eval the file content after editing."
119
123
  opt.on :l, "line", "Specify line number to jump to in file", true, :as => Integer
120
124
  opt.on :h, :help, "This message." do
@@ -123,26 +127,32 @@ class Pry
123
127
  end
124
128
  next if opts.h?
125
129
 
126
- # the context the file will be eval'd in after closing
127
- context = TOPLEVEL_BINDING
128
- should_reload = opts[:r]
130
+ should_reload_at_top_level = opts[:r]
131
+ should_reload_locally = false
129
132
 
130
133
  if opts.ex?
131
- next output.puts "No Exception found." if Pry.last_exception.nil?
134
+ next output.puts "No Exception found." if _pry_.last_exception.nil?
135
+
136
+ if is_core_rbx_path?(_pry_.last_exception.file)
137
+ file_name = rbx_convert_path_to_full(_pry_.last_exception.file)
138
+ else
139
+ file_name = _pry_.last_exception.file
140
+ end
132
141
 
133
- file_name = Pry.last_exception.file
134
- line = Pry.last_exception.line
142
+ line = _pry_.last_exception.line
135
143
  next output.puts "Exception has no associated file." if file_name.nil?
136
144
  next output.puts "Cannot edit exceptions raised in REPL." if Pry.eval_path == file_name
137
- elsif opts.t?
145
+
146
+ should_reload_at_top_level = opts[:n] ? false : true
147
+
148
+ elsif opts.t? || args.first.nil?
138
149
  file_name = Tempfile.new(["tmp", ".rb"]).tap(&:close).path
139
- line = 0
140
- should_reload = true
141
- context = target
150
+ File.open(file_name, "w") { |f| f.puts eval_string } if !eval_string.empty?
151
+ line = eval_string.lines.count + 1
152
+ should_reload_locally = opts[:n] ? false : true
142
153
  else
143
- next output.puts("Need to specify a file.") if !args.first
144
- file_name = File.expand_path(args.first)
145
- line = opts[:l].to_i
154
+ file_name, line = File.expand_path(args.first).split(/:/)
155
+ line = line ? line.to_i : opts[:l].to_i
146
156
  end
147
157
 
148
158
  invoke_editor(file_name, line)
@@ -152,9 +162,13 @@ class Pry
152
162
  silence_warnings do
153
163
  _pry_.input = StringIO.new(File.readlines(file_name).join)
154
164
  end
155
- elsif should_reload
165
+ elsif should_reload_locally
166
+ silence_warnings do
167
+ eval_string.replace(File.read(file_name))
168
+ end
169
+ elsif should_reload_at_top_level
156
170
  silence_warnings do
157
- context.eval(File.read(file_name), file_name)
171
+ TOPLEVEL_BINDING.eval(File.read(file_name), file_name)
158
172
  end
159
173
  end
160
174
  end
@@ -165,7 +179,7 @@ class Pry
165
179
  opts = Slop.parse!(args) do |opt|
166
180
  opt.banner "Usage: edit-method [OPTIONS] [METH]\n" \
167
181
  "Edit the method METH in an editor.\n" \
168
- "Ensure #{text.bold("Pry.editor")} is set to your editor of choice.\n" \
182
+ "Ensure #{text.bold("Pry.config.editor")} is set to your editor of choice.\n" \
169
183
  "e.g: edit-method hello_method"
170
184
 
171
185
  opt.on :M, "instance-methods", "Operate on instance methods."
@@ -188,7 +202,7 @@ class Pry
188
202
  next
189
203
  end
190
204
 
191
- next output.puts "Error: No editor set!\nEnsure that #{text.bold("Pry.editor")} is set to your editor of choice." if !Pry.editor
205
+ next output.puts "Error: No editor set!\nEnsure that #{text.bold("Pry.config.editor")} is set to your editor of choice." if !Pry.config.editor
192
206
 
193
207
  if is_a_c_method?(meth)
194
208
  output.puts "Error: Can't edit a C method."
@@ -50,12 +50,16 @@ class Pry
50
50
 
51
51
  opt.on :ex, "Show a window of N lines either side of the last exception (defaults to 5).", :optional => true, :as => Integer do |window_size|
52
52
  window_size ||= 5
53
- ex = Pry.last_exception
53
+ ex = _pry_.last_exception
54
54
  next if !ex
55
55
  start_line = (ex.line - 1) - window_size
56
56
  start_line = start_line < 0 ? 0 : start_line
57
57
  end_line = (ex.line - 1) + window_size
58
- file_name = ex.file
58
+ if is_core_rbx_path?(ex.file)
59
+ file_name = rbx_convert_path_to_full(ex.file)
60
+ else
61
+ file_name = ex.file
62
+ end
59
63
  end
60
64
 
61
65
  opt.on :l, "line-numbers", "Show line numbers."
@@ -93,7 +97,7 @@ class Pry
93
97
 
94
98
  contents = contents.lines.each_with_index.map do |line, idx|
95
99
  l = idx + start_line
96
- if l == (Pry.last_exception.line - 1)
100
+ if l == (_pry_.last_exception.line - 1)
97
101
  " =>#{line}"
98
102
  else
99
103
  " #{line}"
@@ -101,8 +105,8 @@ class Pry
101
105
  end.join
102
106
 
103
107
  # header for exceptions
104
- output.puts "\n#{Pry::Helpers::Text.bold('Exception:')}: #{Pry.last_exception.class}: #{Pry.last_exception.message}"
105
- output.puts "#{Pry::Helpers::Text.bold('From:')} #{file_name} @ line #{Pry.last_exception.line}\n\n"
108
+ output.puts "\n#{Pry::Helpers::Text.bold('Exception:')} #{_pry_.last_exception.class}: #{_pry_.last_exception.message}\n--"
109
+ output.puts "#{Pry::Helpers::Text.bold('From:')} #{file_name} @ line #{_pry_.last_exception.line}\n\n"
106
110
  end
107
111
 
108
112
  set_file_and_dir_locals(file_name)
@@ -36,10 +36,11 @@ class Pry
36
36
 
37
37
  def set_file_and_dir_locals(file_name)
38
38
  return if !target
39
- $_file_temp = File.expand_path(file_name)
40
- $_dir_temp = File.dirname($_file_temp)
41
- target.eval("_file_ = $_file_temp")
42
- target.eval("_dir_ = $_dir_temp")
39
+ _pry_.last_file = File.expand_path(file_name)
40
+ _pry_.inject_local("_file_", _pry_.last_file, target)
41
+
42
+ _pry_.last_dir = File.dirname(_pry_.last_file)
43
+ _pry_.inject_local("_dir_", _pry_.last_dir, target)
43
44
  end
44
45
 
45
46
  def stub_proc(name, options)
@@ -86,6 +87,16 @@ class Pry
86
87
  27
87
88
  end
88
89
 
90
+ # are we on Jruby platform?
91
+ def jruby?
92
+ defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
93
+ end
94
+
95
+ # are we on rbx platform?
96
+ def rbx?
97
+ defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /rbx/
98
+ end
99
+
89
100
  # a simple pager for systems without `less`. A la windows.
90
101
  def simple_pager(text, output=output())
91
102
  text_array = text.lines.to_a
@@ -109,7 +120,7 @@ class Pry
109
120
  end
110
121
 
111
122
  # FIXME! Another JRuby hack
112
- if Object.const_defined?(:RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
123
+ if jruby?
113
124
  simple_pager(text, output)
114
125
  else
115
126
  lesspipe { |less| less.puts text }
@@ -40,11 +40,14 @@ class Pry
40
40
  end
41
41
 
42
42
  ########### RBX HELPERS #############
43
+ def is_core_rbx_path?(path)
44
+ rbx? &&
45
+ path.start_with?("kernel")
46
+ end
47
+
43
48
  def rbx_core?(meth)
44
- defined?(RUBY_ENGINE) &&
45
- RUBY_ENGINE =~ /rbx/ &&
46
49
  meth.source_location &&
47
- meth.source_location.first.start_with?("kernel")
50
+ is_core_rbx_path?(meth.source_location.first)
48
51
  end
49
52
 
50
53
  def rvm_ruby?(path)
@@ -70,6 +73,28 @@ class Pry
70
73
  end
71
74
  end
72
75
 
76
+ def rbx_convert_path_to_full(path)
77
+ if rvm_ruby?(Rubinius::BIN_PATH)
78
+ rbx_rvm_convert_path_to_full(path)
79
+ else
80
+ rbx_std_convert_path_to_full(path)
81
+ end
82
+ end
83
+
84
+ def rbx_rvm_convert_path_to_full(path)
85
+ ruby_name = File.dirname(Rubinius::BIN_PATH).split("/").last
86
+ source_path = File.join(File.dirname(File.dirname(File.dirname(Rubinius::BIN_PATH))), "src", ruby_name)
87
+ file_name = File.join(source_path, path)
88
+ raise "Cannot find rbx core source" if !File.exists?(file_name)
89
+ file_name
90
+ end
91
+
92
+ def rbx_std_convert_path_to_full(path)
93
+ file_name = File.join(Rubinius::BIN_PATH, "..", path)
94
+ raise "Cannot find rbx core source" if !File.exists?(file_name)
95
+ file_name
96
+ end
97
+
73
98
  def rbx_core_path_line_for(meth)
74
99
  if rvm_ruby?(Rubinius::BIN_PATH)
75
100
  rvm_rbx_core_path_line_for(meth)
@@ -79,21 +104,14 @@ class Pry
79
104
  end
80
105
 
81
106
  def std_rbx_core_path_line_for(meth)
82
- file_name = File.join(Rubinius::BIN_PATH, "..", meth.source_location.first)
83
- raise "Cannot find rbx core source" if !File.exists?(file_name)
84
-
107
+ file_name = rbx_std_convert_path_to_full(meth.source_location.first)
85
108
  start_line = meth.source_location.last
86
109
 
87
110
  [file_name, start_line]
88
111
  end
89
112
 
90
113
  def rvm_rbx_core_path_line_for(meth)
91
- ruby_name = File.dirname(Rubinius::BIN_PATH).split("/").last
92
- source_path = File.join(File.dirname(File.dirname(File.dirname(Rubinius::BIN_PATH))), "src", ruby_name)
93
-
94
- file_name = File.join(source_path, meth.source_location.first)
95
- raise "Cannot find rbx core source" if !File.exists?(file_name)
96
-
114
+ file_name = rbx_rvm_convert_path_to_full(meth.source_location.first)
97
115
  start_line = meth.source_location.last
98
116
 
99
117
  [file_name, start_line]
@@ -333,19 +351,25 @@ class Pry
333
351
  end
334
352
 
335
353
  def invoke_editor(file, line)
336
- if Pry.editor.respond_to?(:call)
337
- editor_invocation = Pry.editor.call(file, line)
354
+ if Pry.config.editor.respond_to?(:call)
355
+ editor_invocation = Pry.config.editor.call(file, line)
338
356
  else
339
- editor_invocation = "#{Pry.editor} #{start_line_syntax_for_editor(file, line)}"
357
+ editor_invocation = "#{Pry.config.editor} #{start_line_syntax_for_editor(file, line)}"
340
358
  end
341
359
 
342
- run ".#{editor_invocation}"
360
+ if jruby?
361
+ require 'spoon'
362
+ pid = Spoon.spawnp(*editor_invocation.split)
363
+ Process.waitpid(pid)
364
+ else
365
+ run ".#{editor_invocation}"
366
+ end
343
367
  end
344
368
 
345
369
  def start_line_syntax_for_editor(file_name, line_number)
346
370
  file_name = file_name.gsub(/\//, '\\') if RUBY_PLATFORM =~ /mswin|mingw/
347
371
 
348
- case Pry.editor
372
+ case Pry.config.editor
349
373
  when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
350
374
  "+#{line_number} #{file_name}"
351
375
  when /^mate/, /^geany/